114 lines
3.4 KiB
Go
114 lines
3.4 KiB
Go
|
|
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
|
|||
|
|
}
|