68 lines
1.6 KiB
Go
68 lines
1.6 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"
|
||
)
|
||
|
||
// AsyncTask 异步任务实体
|
||
type AsyncTask struct {
|
||
ID string `gorm:"type:char(36);primaryKey"`
|
||
Type string `gorm:"not null;index"`
|
||
Payload string `gorm:"type:text"`
|
||
Status TaskStatus `gorm:"not null;index"`
|
||
ScheduledAt *time.Time `gorm:"index"`
|
||
StartedAt *time.Time
|
||
CompletedAt *time.Time
|
||
ErrorMsg string
|
||
RetryCount int `gorm:"default:0"`
|
||
MaxRetries int `gorm:"default:5"`
|
||
CreatedAt time.Time
|
||
UpdatedAt time.Time
|
||
}
|
||
|
||
// TableName 指定表名
|
||
func (AsyncTask) TableName() string {
|
||
return "async_tasks"
|
||
}
|
||
|
||
// BeforeCreate GORM钩子,在创建前生成UUID
|
||
func (t *AsyncTask) BeforeCreate(tx *gorm.DB) error {
|
||
if t.ID == "" {
|
||
t.ID = uuid.New().String()
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// IsCompleted 检查任务是否已完成
|
||
func (t *AsyncTask) IsCompleted() bool {
|
||
return t.Status == TaskStatusCompleted
|
||
}
|
||
|
||
// IsFailed 检查任务是否失败
|
||
func (t *AsyncTask) IsFailed() bool {
|
||
return t.Status == TaskStatusFailed
|
||
}
|
||
|
||
// IsCancelled 检查任务是否已取消
|
||
func (t *AsyncTask) IsCancelled() bool {
|
||
return t.Status == TaskStatusCancelled
|
||
}
|
||
|
||
// CanRetry 检查任务是否可以重试
|
||
func (t *AsyncTask) CanRetry() bool {
|
||
return t.Status == TaskStatusFailed && t.RetryCount < t.MaxRetries
|
||
} |