80 lines
2.5 KiB
TypeScript
80 lines
2.5 KiB
TypeScript
import { Column, DataType, ForeignKey, Model, PrimaryKey, Table, BelongsTo, HasMany } from 'sequelize-typescript';
|
|
import { TrainingPlan } from '../../training-plans/models/training-plan.model';
|
|
import { WorkoutExercise } from './workout-exercise.model';
|
|
|
|
export type WorkoutStatus = 'planned' | 'in_progress' | 'completed' | 'skipped';
|
|
|
|
@Table({
|
|
tableName: 't_workout_sessions',
|
|
underscored: true,
|
|
})
|
|
export class WorkoutSession extends Model {
|
|
@PrimaryKey
|
|
@Column({
|
|
type: DataType.UUID,
|
|
defaultValue: DataType.UUIDV4,
|
|
})
|
|
declare id: string;
|
|
|
|
@Column({ type: DataType.STRING, allowNull: false })
|
|
declare userId: string;
|
|
|
|
@ForeignKey(() => TrainingPlan)
|
|
@Column({ type: DataType.UUID, allowNull: true, comment: '关联的训练计划模板' })
|
|
declare trainingPlanId: string;
|
|
|
|
@BelongsTo(() => TrainingPlan)
|
|
declare trainingPlan: TrainingPlan;
|
|
|
|
@HasMany(() => WorkoutExercise)
|
|
declare exercises: WorkoutExercise[];
|
|
|
|
@Column({ type: DataType.STRING, allowNull: false, comment: '训练会话名称' })
|
|
declare name: string;
|
|
|
|
@Column({ type: DataType.DATE, allowNull: false, comment: '计划训练日期' })
|
|
declare scheduledDate: Date;
|
|
|
|
@Column({ type: DataType.DATE, allowNull: true, comment: '实际开始时间' })
|
|
declare startedAt: Date;
|
|
|
|
@Column({ type: DataType.DATE, allowNull: true, comment: '实际结束时间' })
|
|
declare completedAt: Date;
|
|
|
|
@Column({
|
|
type: DataType.ENUM('planned', 'in_progress', 'completed', 'skipped'),
|
|
allowNull: false,
|
|
defaultValue: 'planned',
|
|
comment: '训练状态'
|
|
})
|
|
declare status: WorkoutStatus;
|
|
|
|
@Column({ type: DataType.INTEGER, allowNull: true, comment: '总时长(秒)' })
|
|
declare totalDurationSec: number;
|
|
|
|
@Column({ type: DataType.TEXT, allowNull: true, comment: '训练总结/备注' })
|
|
declare summary: string;
|
|
|
|
@Column({ type: DataType.INTEGER, allowNull: true, comment: '消耗卡路里(估算)' })
|
|
declare caloriesBurned: number;
|
|
|
|
@Column({ type: DataType.JSON, allowNull: true, comment: '训练统计数据' })
|
|
declare stats: {
|
|
totalExercises?: number;
|
|
completedExercises?: number;
|
|
totalSets?: number;
|
|
completedSets?: number;
|
|
totalReps?: number;
|
|
completedReps?: number;
|
|
};
|
|
|
|
@Column({ type: DataType.DATE, defaultValue: DataType.NOW })
|
|
declare createdAt: Date;
|
|
|
|
@Column({ type: DataType.DATE, defaultValue: DataType.NOW })
|
|
declare updatedAt: Date;
|
|
|
|
@Column({ type: DataType.BOOLEAN, defaultValue: false, comment: '是否已删除' })
|
|
declare deleted: boolean;
|
|
}
|