diff --git a/internal/domain/task/alarm_notification_task.go b/internal/domain/task/alarm_notification_task.go new file mode 100644 index 0000000..26f4174 --- /dev/null +++ b/internal/domain/task/alarm_notification_task.go @@ -0,0 +1,51 @@ +package task + +import ( + "context" + + "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" +) + +// AlarmNotificationTask 告警通知发送任务 +type AlarmNotificationTask struct { + ctx context.Context + taskLog *models.TaskExecutionLog + // 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 { + logger := logs.TraceLogger(ctx, t.ctx, "Execute") + logger.Infof("开始执行告警通知发送任务, 任务ID: %d", t.taskLog.TaskID) + + // TODO: 实现告警通知发送逻辑 + + 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 +} diff --git a/internal/domain/task/task.go b/internal/domain/task/task.go index dfc2d8b..a66570e 100644 --- a/internal/domain/task/task.go +++ b/internal/domain/task/task.go @@ -15,6 +15,7 @@ const ( CompNameDelayTask = "DelayTask" CompNameReleaseFeedWeight = "ReleaseFeedWeightTask" CompNameFullCollectionTask = "FullCollectionTask" + CompNameAlarmNotification = "AlarmNotificationTask" ) type taskFactory struct { @@ -48,6 +49,8 @@ func (t *taskFactory) Production(ctx context.Context, claimedLog *models.TaskExe return NewReleaseFeedWeightTask(logs.AddCompName(baseCtx, CompNameReleaseFeedWeight), claimedLog, t.sensorDataRepo, t.deviceRepo, t.deviceService) case models.TaskTypeFullCollection: return NewFullCollectionTask(logs.AddCompName(baseCtx, CompNameFullCollectionTask), claimedLog, t.deviceRepo, t.deviceService) + case models.TaskTypeAlarmNotification: + return NewAlarmNotificationTask(logs.AddCompName(baseCtx, CompNameAlarmNotification), claimedLog) default: // TODO 这里直接panic合适吗? 不过这个场景确实不该出现任何异常的任务类型 logger.Panicf("不支持的任务类型: %s", claimedLog.Task.Type) @@ -75,6 +78,8 @@ func (t *taskFactory) CreateTaskFromModel(ctx context.Context, taskModel *models ), nil case models.TaskTypeFullCollection: return NewFullCollectionTask(logs.AddCompName(baseCtx, CompNameFullCollectionTask), tempLog, t.deviceRepo, t.deviceService), nil + case models.TaskTypeAlarmNotification: + return NewAlarmNotificationTask(logs.AddCompName(baseCtx, CompNameAlarmNotification), tempLog), nil default: return nil, fmt.Errorf("不支持为类型 '%s' 的任务创建模型实例", taskModel.Type) } diff --git a/internal/infra/models/plan.go b/internal/infra/models/plan.go index 0c43fe4..3c7e5f7 100644 --- a/internal/infra/models/plan.go +++ b/internal/infra/models/plan.go @@ -35,6 +35,7 @@ const ( TaskTypeWaiting TaskType = "等待" // 等待任务 TaskTypeReleaseFeedWeight TaskType = "下料" // 下料口释放指定重量任务 TaskTypeFullCollection TaskType = "全量采集" // 新增的全量采集任务 + TaskTypeAlarmNotification TaskType = "告警通知" // 告警通知任务 ) // -- Task Parameters --