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