2025-09-13 12:25:27 +08:00
|
|
|
package task
|
|
|
|
|
|
|
|
|
|
import (
|
2025-11-05 21:40:19 +08:00
|
|
|
"context"
|
2025-09-13 12:25:27 +08:00
|
|
|
"fmt"
|
|
|
|
|
"time"
|
2025-09-17 16:17:36 +08:00
|
|
|
|
2025-11-02 18:16:44 +08:00
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/domain/plan"
|
2025-09-17 16:17:36 +08:00
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
|
|
|
|
|
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
|
|
|
|
|
)
|
|
|
|
|
|
2025-09-25 11:28:38 +08:00
|
|
|
type DelayTaskParams struct {
|
2025-11-10 21:42:46 +08:00
|
|
|
DelayDuration float32 `json:"delay_duration"`
|
2025-09-25 11:28:38 +08:00
|
|
|
}
|
2025-09-13 12:25:27 +08:00
|
|
|
|
|
|
|
|
// DelayTask 是一个用于模拟延迟的 Task 实现
|
|
|
|
|
type DelayTask struct {
|
2025-11-05 21:40:19 +08:00
|
|
|
ctx context.Context
|
2025-09-17 16:17:36 +08:00
|
|
|
executionTask *models.TaskExecutionLog
|
|
|
|
|
duration time.Duration
|
2025-09-13 12:25:27 +08:00
|
|
|
}
|
|
|
|
|
|
2025-11-05 21:40:19 +08:00
|
|
|
func NewDelayTask(ctx context.Context, executionTask *models.TaskExecutionLog) plan.Task {
|
2025-09-25 09:44:32 +08:00
|
|
|
return &DelayTask{
|
2025-11-05 21:40:19 +08:00
|
|
|
ctx: ctx,
|
2025-09-25 09:44:32 +08:00
|
|
|
executionTask: executionTask,
|
|
|
|
|
}
|
2025-09-25 09:07:32 +08:00
|
|
|
}
|
|
|
|
|
|
2025-09-13 12:25:27 +08:00
|
|
|
// Execute 执行延迟任务,等待指定的时间
|
2025-11-05 21:40:19 +08:00
|
|
|
func (d *DelayTask) Execute(ctx context.Context) error {
|
|
|
|
|
taskCtx, logger := logs.Trace(ctx, d.ctx, "Execute")
|
|
|
|
|
if err := d.parseParameters(taskCtx); err != nil {
|
2025-09-25 11:28:38 +08:00
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-05 21:40:19 +08:00
|
|
|
logger.Infof("任务 %v: 开始延迟 %v...", d.executionTask.TaskID, d.duration)
|
2025-09-25 11:28:38 +08:00
|
|
|
time.Sleep(d.duration)
|
2025-11-05 21:40:19 +08:00
|
|
|
logger.Infof("任务 %v: 延迟结束。", d.executionTask.TaskID)
|
2025-09-25 11:28:38 +08:00
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-05 21:40:19 +08:00
|
|
|
func (d *DelayTask) parseParameters(ctx context.Context) error {
|
|
|
|
|
logger := logs.TraceLogger(ctx, d.ctx, "parseParameters")
|
2025-09-17 16:17:36 +08:00
|
|
|
if d.executionTask.Task.Parameters == nil {
|
2025-11-05 21:40:19 +08:00
|
|
|
logger.Errorf("任务 %v: 缺少参数", d.executionTask.TaskID)
|
2025-09-17 16:17:36 +08:00
|
|
|
return fmt.Errorf("任务 %v: 参数不全", d.executionTask.TaskID)
|
|
|
|
|
}
|
2025-09-13 12:25:27 +08:00
|
|
|
|
2025-09-25 11:28:38 +08:00
|
|
|
var params DelayTaskParams
|
2025-09-27 00:58:22 +08:00
|
|
|
err := d.executionTask.Task.ParseParameters(¶ms)
|
2025-09-25 11:28:38 +08:00
|
|
|
if err != nil {
|
2025-11-05 21:40:19 +08:00
|
|
|
logger.Errorf("任务 %v: 解析参数失败: %v", d.executionTask.TaskID, err)
|
2025-09-17 16:17:36 +08:00
|
|
|
return fmt.Errorf("任务 %v: 解析参数失败: %v", d.executionTask.TaskID, err)
|
|
|
|
|
}
|
|
|
|
|
|
2025-09-25 11:28:38 +08:00
|
|
|
if params.DelayDuration <= 0 {
|
2025-11-05 21:40:19 +08:00
|
|
|
logger.Errorf("任务 %v: 参数 delay_duration 缺失或无效 (必须大于0)", d.executionTask.TaskID)
|
2025-09-25 11:28:38 +08:00
|
|
|
return fmt.Errorf("任务 %v: 参数 delay_duration 缺失或无效 (必须大于0)", d.executionTask.TaskID)
|
2025-09-17 16:17:36 +08:00
|
|
|
}
|
|
|
|
|
|
2025-09-25 11:28:38 +08:00
|
|
|
d.duration = time.Duration(params.DelayDuration) * time.Second
|
2025-09-25 09:44:32 +08:00
|
|
|
|
2025-09-17 16:17:36 +08:00
|
|
|
return nil
|
2025-09-13 12:25:27 +08:00
|
|
|
}
|
|
|
|
|
|
2025-11-05 21:40:19 +08:00
|
|
|
func (d *DelayTask) OnFailure(ctx context.Context, executeErr error) {
|
|
|
|
|
logger := logs.TraceLogger(ctx, d.ctx, "OnFailure")
|
|
|
|
|
logger.Errorf("任务 %v: 执行失败: %v", d.executionTask.TaskID, executeErr)
|
2025-09-13 12:25:27 +08:00
|
|
|
}
|
2025-11-02 20:47:25 +08:00
|
|
|
|
2025-11-10 22:23:31 +08:00
|
|
|
func (d *DelayTask) ResolveDeviceIDs(ctx context.Context) ([]uint32, error) {
|
|
|
|
|
return []uint32{}, nil
|
2025-11-02 20:47:25 +08:00
|
|
|
}
|