diff --git a/internal/domain/task/alarm_notification_task.go b/internal/domain/task/alarm_notification_task.go index 26f4174..8481d17 100644 --- a/internal/domain/task/alarm_notification_task.go +++ b/internal/domain/task/alarm_notification_task.go @@ -2,16 +2,30 @@ package task import ( "context" + "fmt" + "sync" + "time" "git.huangwc.com/pig/pig-farm-controller/internal/domain/plan" "git.huangwc.com/pig/pig-farm-controller/internal/infra/logs" "git.huangwc.com/pig/pig-farm-controller/internal/infra/models" ) +// AlarmNotificationTaskParams 定义了 AlarmNotificationTask 的参数结构 +// 如果用户没有指定某个等级的配置, 则默认为该等级消息只发送一次 +type AlarmNotificationTaskParams struct { + // NotificationIntervals 告警通知的发送间隔时间,键为告警等级,值为时间间隔 + NotificationIntervals map[models.SeverityLevel]time.Duration `json:"notification_intervals"` +} + // AlarmNotificationTask 告警通知发送任务 type AlarmNotificationTask struct { ctx context.Context taskLog *models.TaskExecutionLog + params *AlarmNotificationTaskParams + + onceParse sync.Once // 保证解析参数只执行一次 + // TODO: 根据实际需求添加告警通知相关的依赖,例如: // notificationService notification.Service // alarmRepository repository.AlarmRepository @@ -27,10 +41,14 @@ func NewAlarmNotificationTask(ctx context.Context, taskLog *models.TaskExecution // Execute 执行告警通知发送任务 func (t *AlarmNotificationTask) Execute(ctx context.Context) error { - logger := logs.TraceLogger(ctx, t.ctx, "Execute") + taskCtx, logger := logs.Trace(ctx, t.ctx, "Execute") logger.Infof("开始执行告警通知发送任务, 任务ID: %d", t.taskLog.TaskID) - // TODO: 实现告警通知发送逻辑 + if err := t.parseParameters(taskCtx); err != nil { + return err + } + + // TODO: 实现告警通知发送逻辑,可以使用 t.params.NotificationIntervals 来获取不同等级的发送间隔 logger.Infof("告警通知发送任务执行完成, 任务ID: %d", t.taskLog.TaskID) return nil @@ -46,6 +64,35 @@ func (t *AlarmNotificationTask) OnFailure(ctx context.Context, executeErr error) // ResolveDeviceIDs 从任务配置中解析并返回所有关联的设备ID列表 func (t *AlarmNotificationTask) ResolveDeviceIDs(ctx context.Context) ([]uint, error) { - // 这个任务是个与设备无关的任务 + // 告警通知任务与设备无关 return []uint{}, nil } + +// parseParameters 解析任务参数 +func (t *AlarmNotificationTask) parseParameters(ctx context.Context) error { + logger := logs.TraceLogger(ctx, t.ctx, "parseParameters") + var err error + t.onceParse.Do(func() { + if t.taskLog.Task.Parameters == nil { + logger.Errorf("任务 %v: 缺少参数", t.taskLog.TaskID) + err = fmt.Errorf("任务 %v: 参数不全", t.taskLog.TaskID) + return + } + + var params AlarmNotificationTaskParams + err = t.taskLog.Task.ParseParameters(¶ms) + if err != nil { + logger.Errorf("任务 %v: 解析参数失败: %v", t.taskLog.TaskID, err) + err = fmt.Errorf("任务 %v: 解析参数失败: %v", t.taskLog.TaskID, err) + return + } + + // 如果 NotificationIntervals 为 nil,则初始化它 + if params.NotificationIntervals == nil { + params.NotificationIntervals = make(map[models.SeverityLevel]time.Duration) + } + + t.params = ¶ms + }) + return err +}