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; }