package task import ( "fmt" "git.huangwc.com/pig/pig-farm-controller/internal/domain/device" "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" "git.huangwc.com/pig/pig-farm-controller/internal/infra/repository" ) type taskFactory struct { logger *logs.Logger sensorDataRepo repository.SensorDataRepository deviceRepo repository.DeviceRepository deviceService device.Service } func NewTaskFactory( logger *logs.Logger, sensorDataRepo repository.SensorDataRepository, deviceRepo repository.DeviceRepository, deviceService device.Service, ) plan.TaskFactory { return &taskFactory{ logger: logger, sensorDataRepo: sensorDataRepo, deviceRepo: deviceRepo, deviceService: deviceService, } } func (t *taskFactory) Production(claimedLog *models.TaskExecutionLog) plan.Task { switch claimedLog.Task.Type { case models.TaskTypeWaiting: return NewDelayTask(t.logger, claimedLog) case models.TaskTypeReleaseFeedWeight: return NewReleaseFeedWeightTask(claimedLog, t.sensorDataRepo, t.deviceRepo, t.deviceService, t.logger) case models.TaskTypeFullCollection: return NewFullCollectionTask(claimedLog, t.deviceRepo, t.deviceService, t.logger) default: // TODO 这里直接panic合适吗? 不过这个场景确实不该出现任何异常的任务类型 t.logger.Panicf("不支持的任务类型: %s", claimedLog.Task.Type) panic("不支持的任务类型") // 显式panic防编译器报错 } } // CreateTaskFromModel 实现了 TaskFactory 接口,用于从模型创建任务实例。 func (t *taskFactory) CreateTaskFromModel(taskModel *models.Task) (plan.TaskDeviceIDResolver, error) { // 这个方法不关心 claimedLog 的其他字段,所以可以构造一个临时的 // 它只用于访问那些不依赖于执行日志的方法,比如 ResolveDeviceIDs tempLog := &models.TaskExecutionLog{Task: *taskModel} switch taskModel.Type { case models.TaskTypeWaiting: return NewDelayTask(t.logger, tempLog), nil case models.TaskTypeReleaseFeedWeight: return NewReleaseFeedWeightTask( tempLog, t.sensorDataRepo, t.deviceRepo, t.deviceService, t.logger, ), nil case models.TaskTypeFullCollection: return NewFullCollectionTask(tempLog, t.deviceRepo, t.deviceService, t.logger), nil default: return nil, fmt.Errorf("不支持为类型 '%s' 的任务创建模型实例", taskModel.Type) } }