package entities import ( "time" "github.com/google/uuid" "gorm.io/gorm" ) // TaskStatus 任务状态枚举 type TaskStatus string const ( TaskStatusPending TaskStatus = "pending" // 等待执行 TaskStatusRunning TaskStatus = "running" // 正在执行 TaskStatusCompleted TaskStatus = "completed" // 已完成 TaskStatusFailed TaskStatus = "failed" // 执行失败 TaskStatusCancelled TaskStatus = "cancelled" // 已取消 ) // ScheduledTask 定时任务状态管理实体 type ScheduledTask struct { // 基础标识 ID string `gorm:"primaryKey;type:varchar(36)" json:"id" comment:"任务唯一标识"` TaskID string `gorm:"type:varchar(100);not null;uniqueIndex" json:"task_id" comment:"Asynq任务ID"` TaskType string `gorm:"type:varchar(50);not null" json:"task_type" comment:"任务类型"` // 关联信息 ArticleID string `gorm:"type:varchar(36);not null;index" json:"article_id" comment:"关联的文章ID"` // 任务状态 Status TaskStatus `gorm:"type:varchar(20);not null;default:'pending'" json:"status" comment:"任务状态"` // 时间信息 ScheduledAt time.Time `gorm:"not null" json:"scheduled_at" comment:"计划执行时间"` StartedAt *time.Time `json:"started_at" comment:"开始执行时间"` CompletedAt *time.Time `json:"completed_at" comment:"完成时间"` // 执行结果 Error string `gorm:"type:text" json:"error" comment:"错误信息"` RetryCount int `gorm:"default:0" json:"retry_count" comment:"重试次数"` // 时间戳字段 CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at" comment:"创建时间"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at" comment:"更新时间"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-" comment:"软删除时间"` // 关联关系 Article *Article `gorm:"foreignKey:ArticleID" json:"article,omitempty" comment:"关联的文章"` } // TableName 指定表名 func (ScheduledTask) TableName() string { return "scheduled_tasks" } // BeforeCreate GORM钩子:创建前自动生成UUID func (st *ScheduledTask) BeforeCreate(tx *gorm.DB) error { if st.ID == "" { st.ID = uuid.New().String() } return nil } // MarkAsRunning 标记任务为正在执行 func (st *ScheduledTask) MarkAsRunning() { st.Status = TaskStatusRunning now := time.Now() st.StartedAt = &now } // MarkAsCompleted 标记任务为已完成 func (st *ScheduledTask) MarkAsCompleted() { st.Status = TaskStatusCompleted now := time.Now() st.CompletedAt = &now } // MarkAsFailed 标记任务为执行失败 func (st *ScheduledTask) MarkAsFailed(errorMsg string) { st.Status = TaskStatusFailed now := time.Now() st.CompletedAt = &now st.Error = errorMsg st.RetryCount++ } // MarkAsCancelled 标记任务为已取消 func (st *ScheduledTask) MarkAsCancelled() { st.Status = TaskStatusCancelled now := time.Now() st.CompletedAt = &now } // IsActive 判断任务是否处于活动状态 func (st *ScheduledTask) IsActive() bool { return st.Status == TaskStatusPending || st.Status == TaskStatusRunning } // IsCancelled 判断任务是否已取消 func (st *ScheduledTask) IsCancelled() bool { return st.Status == TaskStatusCancelled } // IsCompleted 判断任务是否已完成 func (st *ScheduledTask) IsCompleted() bool { return st.Status == TaskStatusCompleted } // IsFailed 判断任务是否执行失败 func (st *ScheduledTask) IsFailed() bool { return st.Status == TaskStatusFailed }