Files
pig-farm-controller/internal/domain/task/alarm_notification_task.go

99 lines
3.3 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 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
}
// NewAlarmNotificationTask 创建一个新的告警通知发送任务实例
func NewAlarmNotificationTask(ctx context.Context, taskLog *models.TaskExecutionLog) plan.Task {
return &AlarmNotificationTask{
ctx: ctx,
taskLog: taskLog,
}
}
// Execute 执行告警通知发送任务
func (t *AlarmNotificationTask) Execute(ctx context.Context) error {
taskCtx, logger := logs.Trace(ctx, t.ctx, "Execute")
logger.Infof("开始执行告警通知发送任务, 任务ID: %d", t.taskLog.TaskID)
if err := t.parseParameters(taskCtx); err != nil {
return err
}
// TODO: 实现告警通知发送逻辑,可以使用 t.params.NotificationIntervals 来获取不同等级的发送间隔
logger.Infof("告警通知发送任务执行完成, 任务ID: %d", t.taskLog.TaskID)
return nil
}
// OnFailure 告警通知发送任务失败时的处理逻辑
func (t *AlarmNotificationTask) OnFailure(ctx context.Context, executeErr error) {
logger := logs.TraceLogger(ctx, t.ctx, "OnFailure")
logger.Errorf("告警通知发送任务执行失败, 任务ID: %d, 错误: %v", t.taskLog.TaskID, executeErr)
// TODO: 实现告警通知发送失败时的回滚或清理逻辑
}
// 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(&params)
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 = &params
})
return err
}