Files
tyapi-server/internal/domains/article/entities/scheduled_task.go
2025-09-03 13:51:52 +08:00

114 lines
3.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}