diff --git a/internal/app/service/task/delay_task.go b/internal/app/service/task/delay_task.go index ee62e64..5d96a36 100644 --- a/internal/app/service/task/delay_task.go +++ b/internal/app/service/task/delay_task.go @@ -9,9 +9,9 @@ import ( "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" ) -const ( - ParamsDelayDuration = "delay_duration" -) +type DelayTaskParams struct { + DelayDuration float64 `json:"delay_duration"` +} // DelayTask 是一个用于模拟延迟的 Task 实现 type DelayTask struct { @@ -29,32 +29,39 @@ func NewDelayTask(logger *logs.Logger, executionTask *models.TaskExecutionLog) T // Execute 执行延迟任务,等待指定的时间 func (d *DelayTask) Execute() error { - if d.executionTask.Task.Parameters == nil { - d.logger.Errorf("任务 %v: 缺少参数", d.executionTask.TaskID) - return fmt.Errorf("任务 %v: 参数不全", d.executionTask.TaskID) + if err := d.parseParameters(); err != nil { + return err } - // TODO 定义成结构体放model包中 - var params map[string]interface{} - if err := json.Unmarshal(d.executionTask.Task.Parameters, ¶ms); err != nil { - d.logger.Errorf("任务 %v: 解析参数失败: %v", d.executionTask.TaskID, err) - return fmt.Errorf("任务 %v: 解析参数失败: %v", d.executionTask.TaskID, err) - } - - duration, ok := params[ParamsDelayDuration].(float64) - if !ok { - d.logger.Errorf("任务 %v: 参数 %v 不是数字或不存在", d.executionTask.TaskID, ParamsDelayDuration) - return fmt.Errorf("任务 %v: 参数 %v 不是数字或不存在", d.executionTask.TaskID, ParamsDelayDuration) - } - - d.duration = time.Duration(duration) * time.Second - d.logger.Infof("任务 %v: 开始延迟 %v...", d.executionTask.TaskID, d.duration) time.Sleep(d.duration) d.logger.Infof("任务 %v: 延迟结束。", d.executionTask.TaskID) return nil } +func (d *DelayTask) parseParameters() error { + if d.executionTask.Task.Parameters == nil { + d.logger.Errorf("任务 %v: 缺少参数", d.executionTask.TaskID) + return fmt.Errorf("任务 %v: 参数不全", d.executionTask.TaskID) + } + + var params DelayTaskParams + err := json.Unmarshal(d.executionTask.Task.Parameters, ¶ms) + if err != nil { + d.logger.Errorf("任务 %v: 解析参数失败: %v", d.executionTask.TaskID, err) + return fmt.Errorf("任务 %v: 解析参数失败: %v", d.executionTask.TaskID, err) + } + + if params.DelayDuration <= 0 { + d.logger.Errorf("任务 %v: 参数 delay_duration 缺失或无效 (必须大于0)", d.executionTask.TaskID) + return fmt.Errorf("任务 %v: 参数 delay_duration 缺失或无效 (必须大于0)", d.executionTask.TaskID) + } + + d.duration = time.Duration(params.DelayDuration) * time.Second + + return nil +} + func (d *DelayTask) OnFailure(executeErr error) { d.logger.Errorf("任务 %v: 执行失败: %v", d.executionTask.TaskID, executeErr) }