diff --git a/design/verification-before-device-deletion/index.md b/design/verification-before-device-deletion/index.md index 9d97ded..d83052d 100644 --- a/design/verification-before-device-deletion/index.md +++ b/design/verification-before-device-deletion/index.md @@ -21,4 +21,4 @@ http://git.huangwc.com/pig/pig-farm-controller/issues/50 5. [增加任务增删改查时对设备任务关联表的维护](./device_task_association_maintenance.md) 6. [删除设备时检查](./check_before_device_deletion.md) 7. [删除设备模板时检查和删除区域主控时检查](./refactor_deletion_check.md) -8. [优化设备服务方法的入参]() +8. [优化设备服务方法的入参](./refactor_id_conversion.md) diff --git a/design/verification-before-device-deletion/refactor_id_conversion.md b/design/verification-before-device-deletion/refactor_id_conversion.md new file mode 100644 index 0000000..4671be8 --- /dev/null +++ b/design/verification-before-device-deletion/refactor_id_conversion.md @@ -0,0 +1,106 @@ +# 重构方案:将 ID 类型转换逻辑迁移至 Controller 层 + +## 1. 目标 + +将所有通过 URL 路径传入的 `id`(`string` 类型),其到 `uint` 类型的转换和验证逻辑,从 Service(业务逻辑)层统一迁移至 Controller(控制器)层。 + +## 2. 动机 + +当前实现中,Controller 将从 URL 获取的 `string` 类型的 ID 直接传递给 Service 层,由 Service 层负责使用 `strconv.ParseUint` 进行类型转换。 + +这种模式存在以下问题: +- **职责不清**:Service 层被迫处理了本应属于输入验证和转换的逻辑,而这部分工作更贴近 Controller 的职责。 +- **Service 不纯粹**:业务核心逻辑与原始输入(字符串)耦合,降低了 Service 的可复用性。理想情况下,Service 的接口应该只处理内部定义的、类型安全的数据。 +- **延迟的错误处理**:对于一个无效的 ID(如 "abc"),请求会穿透到 Service 层才会失败,而这种格式错误在 Controller 层就应该被拦截。 + +通过本次重构,我们将实现: +- **职责分离**:Controller 负责处理 HTTP 请求的原始数据(验证、转换),Service 负责处理核心业务。 +- **接口清晰**:Service 层的所有方法将只接受类型安全的 `uint` 作为 ID,使其意图更加明确。 +- **快速失败**:无效的 ID 将在 Controller 层被立即拒绝,并返回 `400 Bad Request`,提高了系统的健壮性。 + +## 3. 详细实施步骤 + +### 第 1 步:修改 `device_service.go` + +#### 3.1 修改 `DeviceService` 接口 +所有接收 `id string` 参数的方法签名,全部修改为接收 `id uint`。 + +**受影响的方法列表:** +- `GetDevice(id string)` -> `GetDevice(id uint)` +- `UpdateDevice(id string, ...)` -> `UpdateDevice(id uint, ...)` +- `DeleteDevice(id string)` -> `DeleteDevice(id uint)` +- `ManualControl(id string, ...)` -> `ManualControl(id uint, ...)` +- `GetAreaController(id string)` -> `GetAreaController(id uint)` +- `UpdateAreaController(id string, ...)` -> `UpdateAreaController(id uint, ...)` +- `DeleteAreaController(id string)` -> `DeleteAreaController(id uint)` +- `GetDeviceTemplate(id string)` -> `GetDeviceTemplate(id uint)` +- `UpdateDeviceTemplate(id string, ...)` -> `UpdateDeviceTemplate(id uint, ...)` +- `DeleteDeviceTemplate(id string)` -> `DeleteDeviceTemplate(id uint)` + +#### 3.2 修改 `deviceService` 实现 +在 `deviceService` 的方法实现中,移除所有 `strconv.ParseUint` 的调用,直接使用传入的 `uint` 类型的 ID。 + +**示例 (`DeleteDeviceTemplate`):** + +**修改前:** +```go +func (s *deviceService) DeleteDeviceTemplate(id string) error { + idUint, err := strconv.ParseUint(id, 10, 64) + if err != nil { + return fmt.Errorf("无效的ID格式: %w", err) + } + dtID := uint(idUint) + // ... 业务逻辑 +} +``` + +**修改后:** +```go +func (s *deviceService) DeleteDeviceTemplate(id uint) error { + // 直接使用 id + // ... 业务逻辑 +} +``` + +### 第 2 步:修改 `device_controller.go` + +在所有调用受影响 Service 方法的 Controller 方法中,增加 ID 的转换和错误处理逻辑。 + +**示例 (`DeleteDeviceTemplate`):** + +**修改前:** +```go +func (c *Controller) DeleteDeviceTemplate(ctx echo.Context) error { + const actionType = "删除设备模板" + dtID := ctx.Param("id") // dtID is a string + + if err := c.deviceService.DeleteDeviceTemplate(dtID); err != nil { + // ... 错误处理 + } + // ... 成功处理 +} +``` + +**修改后:** +```go +func (c *Controller) DeleteDeviceTemplate(ctx echo.Context) error { + const actionType = "删除设备模板" + idStr := ctx.Param("id") + + // 在 Controller 层进行转换和验证 + idUint, err := strconv.ParseUint(idStr, 10, 64) + if err != nil { + c.logger.Warnf("%s: 无效的ID格式: %s", actionType, idStr) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID格式", actionType, "ID格式错误", idStr) + } + dtID := uint(idUint) + + // 调用 Service,传入 uint 类型的 ID + if err := c.deviceService.DeleteDeviceTemplate(dtID); err != nil { + // ... 错误处理 (保持不变) + } + + // ... 成功处理 +} +``` +此模式将应用于所有受影响的 Controller 方法。 diff --git a/internal/app/controller/device/device_controller.go b/internal/app/controller/device/device_controller.go index 9e20228..e3eca11 100644 --- a/internal/app/controller/device/device_controller.go +++ b/internal/app/controller/device/device_controller.go @@ -2,6 +2,7 @@ package device import ( "errors" + "strconv" "git.huangwc.com/pig/pig-farm-controller/internal/app/controller" "git.huangwc.com/pig/pig-farm-controller/internal/app/dto" @@ -71,7 +72,13 @@ func (c *Controller) GetDevice(ctx echo.Context) error { const actionType = "获取设备" deviceID := ctx.Param("id") - resp, err := c.deviceService.GetDevice(deviceID) + id, err := strconv.ParseUint(deviceID, 10, 64) + if err != nil { + c.logger.Errorf("%s: 无效的ID: %s", actionType, deviceID) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID: "+deviceID, actionType, "无效的ID", deviceID) + } + + resp, err := c.deviceService.GetDevice(uint(id)) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { c.logger.Warnf("%s: 设备不存在, ID: %s", actionType, deviceID) @@ -126,7 +133,13 @@ func (c *Controller) UpdateDevice(ctx echo.Context) error { return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体: "+err.Error(), actionType, "请求体绑定失败", req) } - resp, err := c.deviceService.UpdateDevice(deviceID, &req) + id, err := strconv.ParseUint(deviceID, 10, 64) + if err != nil { + c.logger.Errorf("%s: 无效的ID: %s", actionType, deviceID) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID: "+deviceID, actionType, "无效的ID", deviceID) + } + + resp, err := c.deviceService.UpdateDevice(uint(id), &req) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { c.logger.Warnf("%s: 设备不存在, ID: %s", actionType, deviceID) @@ -153,7 +166,13 @@ func (c *Controller) DeleteDevice(ctx echo.Context) error { const actionType = "删除设备" deviceID := ctx.Param("id") - if err := c.deviceService.DeleteDevice(deviceID); err != nil { + id, err := strconv.ParseUint(deviceID, 10, 64) + if err != nil { + c.logger.Errorf("%s: 无效的ID: %s", actionType, deviceID) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID: "+deviceID, actionType, "无效的ID", deviceID) + } + + if err := c.deviceService.DeleteDevice(uint(id)); err != nil { switch { case errors.Is(err, gorm.ErrRecordNotFound): c.logger.Warnf("%s: 设备不存在, ID: %s", actionType, deviceID) @@ -193,7 +212,13 @@ func (c *Controller) ManualControl(ctx echo.Context) error { return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体: "+err.Error(), actionType, "请求体绑定失败", req) } - if err := c.deviceService.ManualControl(deviceID, &req); err != nil { + id, err := strconv.ParseUint(deviceID, 10, 64) + if err != nil { + c.logger.Errorf("%s: 无效的ID: %s", actionType, deviceID) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID: "+deviceID, actionType, "无效的ID", deviceID) + } + + if err := c.deviceService.ManualControl(uint(id), &req); err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { c.logger.Warnf("%s: 设备不存在, ID: %s", actionType, deviceID) return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, "设备未找到", actionType, "设备不存在", deviceID) @@ -248,7 +273,13 @@ func (c *Controller) GetAreaController(ctx echo.Context) error { const actionType = "获取区域主控" acID := ctx.Param("id") - resp, err := c.deviceService.GetAreaController(acID) + id, err := strconv.ParseUint(acID, 10, 64) + if err != nil { + c.logger.Errorf("%s: 无效的ID: %s", actionType, acID) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID: "+acID, actionType, "无效的ID", acID) + } + + resp, err := c.deviceService.GetAreaController(uint(id)) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { c.logger.Warnf("%s: 区域主控不存在, ID: %s", actionType, acID) @@ -302,8 +333,13 @@ func (c *Controller) UpdateAreaController(ctx echo.Context) error { c.logger.Errorf("%s: 参数绑定失败: %v", actionType, err) return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体: "+err.Error(), actionType, "请求体绑定失败", req) } + id, err := strconv.ParseUint(acID, 10, 64) + if err != nil { + c.logger.Errorf("%s: 无效的ID: %s", actionType, acID) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID: "+acID, actionType, "无效的ID", acID) + } - resp, err := c.deviceService.UpdateAreaController(acID, &req) + resp, err := c.deviceService.UpdateAreaController(uint(id), &req) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { c.logger.Warnf("%s: 区域主控不存在, ID: %s", actionType, acID) @@ -330,7 +366,13 @@ func (c *Controller) DeleteAreaController(ctx echo.Context) error { const actionType = "删除区域主控" acID := ctx.Param("id") - if err := c.deviceService.DeleteAreaController(acID); err != nil { + id, err := strconv.ParseUint(acID, 10, 64) + if err != nil { + c.logger.Errorf("%s: 无效的ID: %s", actionType, acID) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID: "+acID, actionType, "无效的ID", acID) + } + + if err := c.deviceService.DeleteAreaController(uint(id)); err != nil { switch { case errors.Is(err, gorm.ErrRecordNotFound): c.logger.Warnf("%s: 区域主控不存在, ID: %s", actionType, acID) @@ -391,7 +433,13 @@ func (c *Controller) GetDeviceTemplate(ctx echo.Context) error { const actionType = "获取设备模板" dtID := ctx.Param("id") - resp, err := c.deviceService.GetDeviceTemplate(dtID) + id, err := strconv.ParseUint(dtID, 10, 64) + if err != nil { + c.logger.Errorf("%s: 无效的ID: %s", actionType, dtID) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID: "+dtID, actionType, "无效的ID", dtID) + } + + resp, err := c.deviceService.GetDeviceTemplate(uint(id)) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { c.logger.Warnf("%s: 设备模板不存在, ID: %s", actionType, dtID) @@ -446,7 +494,13 @@ func (c *Controller) UpdateDeviceTemplate(ctx echo.Context) error { return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体: "+err.Error(), actionType, "请求体绑定失败", req) } - resp, err := c.deviceService.UpdateDeviceTemplate(dtID, &req) + id, err := strconv.ParseUint(dtID, 10, 64) + if err != nil { + c.logger.Errorf("%s: 无效的ID: %s", actionType, dtID) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID: "+dtID, actionType, "无效的ID", dtID) + } + + resp, err := c.deviceService.UpdateDeviceTemplate(uint(id), &req) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { c.logger.Warnf("%s: 设备模板不存在, ID: %s", actionType, dtID) @@ -473,7 +527,13 @@ func (c *Controller) DeleteDeviceTemplate(ctx echo.Context) error { const actionType = "删除设备模板" dtID := ctx.Param("id") - if err := c.deviceService.DeleteDeviceTemplate(dtID); err != nil { + id, err := strconv.ParseUint(dtID, 10, 64) + if err != nil { + c.logger.Errorf("%s: 无效的ID: %s", actionType, dtID) + return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的ID: "+dtID, actionType, "无效的ID", dtID) + } + + if err := c.deviceService.DeleteDeviceTemplate(uint(id)); err != nil { switch { case errors.Is(err, gorm.ErrRecordNotFound): c.logger.Warnf("%s: 设备模板不存在, ID: %s", actionType, dtID) diff --git a/internal/app/service/device_service.go b/internal/app/service/device_service.go index 8530d98..82733a2 100644 --- a/internal/app/service/device_service.go +++ b/internal/app/service/device_service.go @@ -4,7 +4,6 @@ import ( "encoding/json" "errors" "fmt" - "strconv" "git.huangwc.com/pig/pig-farm-controller/internal/app/dto" "git.huangwc.com/pig/pig-farm-controller/internal/domain/device" @@ -23,26 +22,27 @@ var ( ErrDeviceTemplateInUse = errors.New("设备模板正在被一个或多个设备使用,无法删除") ) +// DeviceService 定义了应用层的设备服务接口,用于协调设备相关的业务逻辑。 // DeviceService 定义了应用层的设备服务接口,用于协调设备相关的业务逻辑。 type DeviceService interface { CreateDevice(req *dto.CreateDeviceRequest) (*dto.DeviceResponse, error) - GetDevice(id string) (*dto.DeviceResponse, error) + GetDevice(id uint) (*dto.DeviceResponse, error) ListDevices() ([]*dto.DeviceResponse, error) - UpdateDevice(id string, req *dto.UpdateDeviceRequest) (*dto.DeviceResponse, error) - DeleteDevice(id string) error - ManualControl(id string, req *dto.ManualControlDeviceRequest) error + UpdateDevice(id uint, req *dto.UpdateDeviceRequest) (*dto.DeviceResponse, error) + DeleteDevice(id uint) error + ManualControl(id uint, req *dto.ManualControlDeviceRequest) error CreateAreaController(req *dto.CreateAreaControllerRequest) (*dto.AreaControllerResponse, error) - GetAreaController(id string) (*dto.AreaControllerResponse, error) + GetAreaController(id uint) (*dto.AreaControllerResponse, error) ListAreaControllers() ([]*dto.AreaControllerResponse, error) - UpdateAreaController(id string, req *dto.UpdateAreaControllerRequest) (*dto.AreaControllerResponse, error) - DeleteAreaController(id string) error + UpdateAreaController(id uint, req *dto.UpdateAreaControllerRequest) (*dto.AreaControllerResponse, error) + DeleteAreaController(id uint) error CreateDeviceTemplate(req *dto.CreateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) - GetDeviceTemplate(id string) (*dto.DeviceTemplateResponse, error) + GetDeviceTemplate(id uint) (*dto.DeviceTemplateResponse, error) ListDeviceTemplates() ([]*dto.DeviceTemplateResponse, error) - UpdateDeviceTemplate(id string, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) - DeleteDeviceTemplate(id string) error + UpdateDeviceTemplate(id uint, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) + DeleteDeviceTemplate(id uint) error } // deviceService 是 DeviceService 接口的具体实现。 @@ -100,8 +100,8 @@ func (s *deviceService) CreateDevice(req *dto.CreateDeviceRequest) (*dto.DeviceR return dto.NewDeviceResponse(createdDevice) } -func (s *deviceService) GetDevice(id string) (*dto.DeviceResponse, error) { - device, err := s.deviceRepo.FindByIDString(id) +func (s *deviceService) GetDevice(id uint) (*dto.DeviceResponse, error) { + device, err := s.deviceRepo.FindByID(id) if err != nil { return nil, err } @@ -116,8 +116,8 @@ func (s *deviceService) ListDevices() ([]*dto.DeviceResponse, error) { return dto.NewListDeviceResponse(devices) } -func (s *deviceService) UpdateDevice(id string, req *dto.UpdateDeviceRequest) (*dto.DeviceResponse, error) { - existingDevice, err := s.deviceRepo.FindByIDString(id) +func (s *deviceService) UpdateDevice(id uint, req *dto.UpdateDeviceRequest) (*dto.DeviceResponse, error) { + existingDevice, err := s.deviceRepo.FindByID(id) if err != nil { return nil, err } @@ -149,21 +149,16 @@ func (s *deviceService) UpdateDevice(id string, req *dto.UpdateDeviceRequest) (* return dto.NewDeviceResponse(updatedDevice) } -func (s *deviceService) DeleteDevice(id string) error { - idUint, err := strconv.ParseUint(id, 10, 64) - if err != nil { - return err - } - deviceID := uint(idUint) +func (s *deviceService) DeleteDevice(id uint) error { // 检查设备是否存在 - _, err = s.deviceRepo.FindByID(deviceID) + _, err := s.deviceRepo.FindByID(id) if err != nil { return err // 如果未找到,会返回 gorm.ErrRecordNotFound } // 在删除前检查设备是否被任务使用 - inUse, err := s.deviceRepo.IsDeviceInUse(deviceID) + inUse, err := s.deviceRepo.IsDeviceInUse(id) if err != nil { // 如果检查过程中发生数据库错误,则返回错误 return fmt.Errorf("检查设备使用情况失败: %w", err) @@ -174,11 +169,11 @@ func (s *deviceService) DeleteDevice(id string) error { } // 只有在未被使用时,才执行删除操作 - return s.deviceRepo.Delete(deviceID) + return s.deviceRepo.Delete(id) } -func (s *deviceService) ManualControl(id string, req *dto.ManualControlDeviceRequest) error { - dev, err := s.deviceRepo.FindByIDString(id) +func (s *deviceService) ManualControl(id uint, req *dto.ManualControlDeviceRequest) error { + dev, err := s.deviceRepo.FindByID(id) if err != nil { return err } @@ -225,12 +220,8 @@ func (s *deviceService) CreateAreaController(req *dto.CreateAreaControllerReques return dto.NewAreaControllerResponse(ac) } -func (s *deviceService) GetAreaController(id string) (*dto.AreaControllerResponse, error) { - idUint, err := strconv.ParseUint(id, 10, 64) - if err != nil { - return nil, err - } - ac, err := s.areaControllerRepo.FindByID(uint(idUint)) +func (s *deviceService) GetAreaController(id uint) (*dto.AreaControllerResponse, error) { + ac, err := s.areaControllerRepo.FindByID(id) if err != nil { return nil, err } @@ -245,13 +236,8 @@ func (s *deviceService) ListAreaControllers() ([]*dto.AreaControllerResponse, er return dto.NewListAreaControllerResponse(acs) } -func (s *deviceService) UpdateAreaController(id string, req *dto.UpdateAreaControllerRequest) (*dto.AreaControllerResponse, error) { - idUint, err := strconv.ParseUint(id, 10, 64) - if err != nil { - return nil, err - } - - existingAC, err := s.areaControllerRepo.FindByID(uint(idUint)) +func (s *deviceService) UpdateAreaController(id uint, req *dto.UpdateAreaControllerRequest) (*dto.AreaControllerResponse, error) { + existingAC, err := s.areaControllerRepo.FindByID(id) if err != nil { return nil, err } @@ -277,21 +263,16 @@ func (s *deviceService) UpdateAreaController(id string, req *dto.UpdateAreaContr return dto.NewAreaControllerResponse(existingAC) } -func (s *deviceService) DeleteAreaController(id string) error { - idUint, err := strconv.ParseUint(id, 10, 64) - if err != nil { - return fmt.Errorf("无效的ID格式: %w", err) - } - acID := uint(idUint) +func (s *deviceService) DeleteAreaController(id uint) error { // 1. 检查是否存在 - _, err = s.areaControllerRepo.FindByID(acID) + _, err := s.areaControllerRepo.FindByID(id) if err != nil { return err // 如果未找到,gorm会返回 ErrRecordNotFound } // 2. 检查是否被使用(业务逻辑) - inUse, err := s.deviceRepo.IsAreaControllerInUse(acID) + inUse, err := s.deviceRepo.IsAreaControllerInUse(id) if err != nil { return err // 返回数据库检查错误 } @@ -300,7 +281,7 @@ func (s *deviceService) DeleteAreaController(id string) error { } // 3. 执行删除 - return s.areaControllerRepo.Delete(acID) + return s.areaControllerRepo.Delete(id) } // --- Device Templates --- @@ -336,12 +317,8 @@ func (s *deviceService) CreateDeviceTemplate(req *dto.CreateDeviceTemplateReques return dto.NewDeviceTemplateResponse(deviceTemplate) } -func (s *deviceService) GetDeviceTemplate(id string) (*dto.DeviceTemplateResponse, error) { - idUint, err := strconv.ParseUint(id, 10, 64) - if err != nil { - return nil, err - } - deviceTemplate, err := s.deviceTemplateRepo.FindByID(uint(idUint)) +func (s *deviceService) GetDeviceTemplate(id uint) (*dto.DeviceTemplateResponse, error) { + deviceTemplate, err := s.deviceTemplateRepo.FindByID(id) if err != nil { return nil, err } @@ -356,13 +333,8 @@ func (s *deviceService) ListDeviceTemplates() ([]*dto.DeviceTemplateResponse, er return dto.NewListDeviceTemplateResponse(deviceTemplates) } -func (s *deviceService) UpdateDeviceTemplate(id string, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) { - idUint, err := strconv.ParseUint(id, 10, 64) - if err != nil { - return nil, err - } - - existingDeviceTemplate, err := s.deviceTemplateRepo.FindByID(uint(idUint)) +func (s *deviceService) UpdateDeviceTemplate(id uint, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) { + existingDeviceTemplate, err := s.deviceTemplateRepo.FindByID(id) if err != nil { return nil, err } @@ -395,21 +367,16 @@ func (s *deviceService) UpdateDeviceTemplate(id string, req *dto.UpdateDeviceTem return dto.NewDeviceTemplateResponse(existingDeviceTemplate) } -func (s *deviceService) DeleteDeviceTemplate(id string) error { - idUint, err := strconv.ParseUint(id, 10, 64) - if err != nil { - return fmt.Errorf("无效的ID格式: %w", err) - } - dtID := uint(idUint) +func (s *deviceService) DeleteDeviceTemplate(id uint) error { // 1. 检查是否存在 - _, err = s.deviceTemplateRepo.FindByID(dtID) + _, err := s.deviceTemplateRepo.FindByID(id) if err != nil { return err } // 2. 检查是否被使用(业务逻辑) - inUse, err := s.deviceTemplateRepo.IsInUse(dtID) + inUse, err := s.deviceTemplateRepo.IsInUse(id) if err != nil { return err } @@ -418,5 +385,5 @@ func (s *deviceService) DeleteDeviceTemplate(id string) error { } // 3. 执行删除 - return s.deviceTemplateRepo.Delete(dtID) + return s.deviceTemplateRepo.Delete(id) } diff --git a/project_structure.txt b/project_structure.txt index ea77ee3..767be01 100644 --- a/project_structure.txt +++ b/project_structure.txt @@ -11,9 +11,14 @@ TODO-List.txt config.example.yml config.yml design/verification-before-device-deletion/add_get_device_id_configs_to_task.md +design/verification-before-device-deletion/check_before_device_deletion.md +design/verification-before-device-deletion/device_task_association_maintenance.md +design/verification-before-device-deletion/device_task_many_to_many_design.md design/verification-before-device-deletion/index.md design/verification-before-device-deletion/plan_service_refactor.md design/verification-before-device-deletion/plan_service_refactor_to_domain.md +design/verification-before-device-deletion/refactor_deletion_check.md +design/verification-before-device-deletion/refactor_id_conversion.md docs/docs.go docs/swagger.json docs/swagger.yaml @@ -73,6 +78,7 @@ internal/domain/pig/pig_batch_service_pig_trade.go internal/domain/pig/pig_sick_manager.go internal/domain/pig/pig_trade_manager.go internal/domain/plan/analysis_plan_task_manager.go +internal/domain/plan/device_id_extractor.go internal/domain/plan/plan_execution_manager.go internal/domain/plan/plan_service.go internal/domain/plan/task.go