package service import ( "context" "encoding/json" "git.huangwc.com/pig/pig-farm-controller/internal/app/dto" "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" ) // DeviceTemplateService 定义了应用层的设备模板服务接口。 type DeviceTemplateService interface { CreateDeviceTemplate(ctx context.Context, req *dto.CreateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) GetDeviceTemplate(ctx context.Context, id uint32) (*dto.DeviceTemplateResponse, error) ListDeviceTemplates(ctx context.Context) ([]*dto.DeviceTemplateResponse, error) UpdateDeviceTemplate(ctx context.Context, id uint32, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) DeleteDeviceTemplate(ctx context.Context, id uint32) error } // deviceTemplateService 是 DeviceTemplateService 接口的具体实现。 type deviceTemplateService struct { ctx context.Context deviceTemplateRepo repository.DeviceTemplateRepository } // NewDeviceTemplateService 创建一个新的 DeviceTemplateService 实例。 func NewDeviceTemplateService( ctx context.Context, deviceTemplateRepo repository.DeviceTemplateRepository, ) DeviceTemplateService { return &deviceTemplateService{ ctx: ctx, deviceTemplateRepo: deviceTemplateRepo, } } func (s *deviceTemplateService) CreateDeviceTemplate(ctx context.Context, req *dto.CreateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) { serviceCtx := logs.AddFuncName(ctx, s.ctx, "CreateDeviceTemplate") commandsJSON, err := json.Marshal(req.Commands) if err != nil { return nil, err } valuesJSON, err := json.Marshal(req.Values) if err != nil { return nil, err } deviceTemplate := &models.DeviceTemplate{ Name: req.Name, Manufacturer: req.Manufacturer, Description: req.Description, Category: req.Category, Commands: commandsJSON, Values: valuesJSON, } if err := deviceTemplate.SelfCheck(); err != nil { return nil, err } if err := s.deviceTemplateRepo.Create(serviceCtx, deviceTemplate); err != nil { return nil, err } return dto.NewDeviceTemplateResponse(deviceTemplate) } func (s *deviceTemplateService) GetDeviceTemplate(ctx context.Context, id uint32) (*dto.DeviceTemplateResponse, error) { serviceCtx := logs.AddFuncName(ctx, s.ctx, "GetDeviceTemplate") deviceTemplate, err := s.deviceTemplateRepo.FindByID(serviceCtx, id) if err != nil { return nil, err } return dto.NewDeviceTemplateResponse(deviceTemplate) } func (s *deviceTemplateService) ListDeviceTemplates(ctx context.Context) ([]*dto.DeviceTemplateResponse, error) { serviceCtx := logs.AddFuncName(ctx, s.ctx, "ListDeviceTemplates") deviceTemplates, err := s.deviceTemplateRepo.ListAll(serviceCtx) if err != nil { return nil, err } return dto.NewListDeviceTemplateResponse(deviceTemplates) } func (s *deviceTemplateService) UpdateDeviceTemplate(ctx context.Context, id uint32, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) { serviceCtx := logs.AddFuncName(ctx, s.ctx, "UpdateDeviceTemplate") existingDeviceTemplate, err := s.deviceTemplateRepo.FindByID(serviceCtx, id) if err != nil { return nil, err } commandsJSON, err := json.Marshal(req.Commands) if err != nil { return nil, err } valuesJSON, err := json.Marshal(req.Values) if err != nil { return nil, err } existingDeviceTemplate.Name = req.Name existingDeviceTemplate.Manufacturer = req.Manufacturer existingDeviceTemplate.Description = req.Description existingDeviceTemplate.Category = req.Category existingDeviceTemplate.Commands = commandsJSON existingDeviceTemplate.Values = valuesJSON if err := existingDeviceTemplate.SelfCheck(); err != nil { return nil, err } if err := s.deviceTemplateRepo.Update(serviceCtx, existingDeviceTemplate); err != nil { return nil, err } return dto.NewDeviceTemplateResponse(existingDeviceTemplate) } func (s *deviceTemplateService) DeleteDeviceTemplate(ctx context.Context, id uint32) error { serviceCtx := logs.AddFuncName(ctx, s.ctx, "DeleteDeviceTemplate") // 1. 检查是否存在 _, err := s.deviceTemplateRepo.FindByID(serviceCtx, id) if err != nil { return err } // 2. 检查是否被使用(业务逻辑) inUse, err := s.deviceTemplateRepo.IsInUse(serviceCtx, id) if err != nil { return err } if inUse { return ErrDeviceTemplateInUse // 返回业务错误 } // 3. 执行删除 return s.deviceTemplateRepo.Delete(serviceCtx, id) }