优化设备服务方法的入参
This commit is contained in:
		@@ -21,4 +21,4 @@ http://git.huangwc.com/pig/pig-farm-controller/issues/50
 | 
				
			|||||||
5. [增加任务增删改查时对设备任务关联表的维护](./device_task_association_maintenance.md)
 | 
					5. [增加任务增删改查时对设备任务关联表的维护](./device_task_association_maintenance.md)
 | 
				
			||||||
6. [删除设备时检查](./check_before_device_deletion.md)
 | 
					6. [删除设备时检查](./check_before_device_deletion.md)
 | 
				
			||||||
7. [删除设备模板时检查和删除区域主控时检查](./refactor_deletion_check.md)
 | 
					7. [删除设备模板时检查和删除区域主控时检查](./refactor_deletion_check.md)
 | 
				
			||||||
8. [优化设备服务方法的入参]()
 | 
					8. [优化设备服务方法的入参](./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 方法。
 | 
				
			||||||
@@ -2,6 +2,7 @@ package device
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"git.huangwc.com/pig/pig-farm-controller/internal/app/controller"
 | 
						"git.huangwc.com/pig/pig-farm-controller/internal/app/controller"
 | 
				
			||||||
	"git.huangwc.com/pig/pig-farm-controller/internal/app/dto"
 | 
						"git.huangwc.com/pig/pig-farm-controller/internal/app/dto"
 | 
				
			||||||
@@ -71,7 +72,13 @@ func (c *Controller) GetDevice(ctx echo.Context) error {
 | 
				
			|||||||
	const actionType = "获取设备"
 | 
						const actionType = "获取设备"
 | 
				
			||||||
	deviceID := ctx.Param("id")
 | 
						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 err != nil {
 | 
				
			||||||
		if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
							if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
				
			||||||
			c.logger.Warnf("%s: 设备不存在, ID: %s", actionType, deviceID)
 | 
								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)
 | 
							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 err != nil {
 | 
				
			||||||
		if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
							if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
				
			||||||
			c.logger.Warnf("%s: 设备不存在, ID: %s", actionType, deviceID)
 | 
								c.logger.Warnf("%s: 设备不存在, ID: %s", actionType, deviceID)
 | 
				
			||||||
@@ -153,7 +166,13 @@ func (c *Controller) DeleteDevice(ctx echo.Context) error {
 | 
				
			|||||||
	const actionType = "删除设备"
 | 
						const actionType = "删除设备"
 | 
				
			||||||
	deviceID := ctx.Param("id")
 | 
						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 {
 | 
							switch {
 | 
				
			||||||
		case errors.Is(err, gorm.ErrRecordNotFound):
 | 
							case errors.Is(err, gorm.ErrRecordNotFound):
 | 
				
			||||||
			c.logger.Warnf("%s: 设备不存在, ID: %s", actionType, deviceID)
 | 
								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)
 | 
							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) {
 | 
							if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
				
			||||||
			c.logger.Warnf("%s: 设备不存在, ID: %s", actionType, deviceID)
 | 
								c.logger.Warnf("%s: 设备不存在, ID: %s", actionType, deviceID)
 | 
				
			||||||
			return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, "设备未找到", actionType, "设备不存在", deviceID)
 | 
								return controller.SendErrorWithAudit(ctx, controller.CodeNotFound, "设备未找到", actionType, "设备不存在", deviceID)
 | 
				
			||||||
@@ -248,7 +273,13 @@ func (c *Controller) GetAreaController(ctx echo.Context) error {
 | 
				
			|||||||
	const actionType = "获取区域主控"
 | 
						const actionType = "获取区域主控"
 | 
				
			||||||
	acID := ctx.Param("id")
 | 
						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 err != nil {
 | 
				
			||||||
		if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
							if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
				
			||||||
			c.logger.Warnf("%s: 区域主控不存在, ID: %s", actionType, acID)
 | 
								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)
 | 
							c.logger.Errorf("%s: 参数绑定失败: %v", actionType, err)
 | 
				
			||||||
		return controller.SendErrorWithAudit(ctx, controller.CodeBadRequest, "无效的请求体: "+err.Error(), actionType, "请求体绑定失败", req)
 | 
							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 err != nil {
 | 
				
			||||||
		if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
							if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
				
			||||||
			c.logger.Warnf("%s: 区域主控不存在, ID: %s", actionType, acID)
 | 
								c.logger.Warnf("%s: 区域主控不存在, ID: %s", actionType, acID)
 | 
				
			||||||
@@ -330,7 +366,13 @@ func (c *Controller) DeleteAreaController(ctx echo.Context) error {
 | 
				
			|||||||
	const actionType = "删除区域主控"
 | 
						const actionType = "删除区域主控"
 | 
				
			||||||
	acID := ctx.Param("id")
 | 
						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 {
 | 
							switch {
 | 
				
			||||||
		case errors.Is(err, gorm.ErrRecordNotFound):
 | 
							case errors.Is(err, gorm.ErrRecordNotFound):
 | 
				
			||||||
			c.logger.Warnf("%s: 区域主控不存在, ID: %s", actionType, acID)
 | 
								c.logger.Warnf("%s: 区域主控不存在, ID: %s", actionType, acID)
 | 
				
			||||||
@@ -391,7 +433,13 @@ func (c *Controller) GetDeviceTemplate(ctx echo.Context) error {
 | 
				
			|||||||
	const actionType = "获取设备模板"
 | 
						const actionType = "获取设备模板"
 | 
				
			||||||
	dtID := ctx.Param("id")
 | 
						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 err != nil {
 | 
				
			||||||
		if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
							if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
				
			||||||
			c.logger.Warnf("%s: 设备模板不存在, ID: %s", actionType, dtID)
 | 
								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)
 | 
							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 err != nil {
 | 
				
			||||||
		if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
							if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
				
			||||||
			c.logger.Warnf("%s: 设备模板不存在, ID: %s", actionType, dtID)
 | 
								c.logger.Warnf("%s: 设备模板不存在, ID: %s", actionType, dtID)
 | 
				
			||||||
@@ -473,7 +527,13 @@ func (c *Controller) DeleteDeviceTemplate(ctx echo.Context) error {
 | 
				
			|||||||
	const actionType = "删除设备模板"
 | 
						const actionType = "删除设备模板"
 | 
				
			||||||
	dtID := ctx.Param("id")
 | 
						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 {
 | 
							switch {
 | 
				
			||||||
		case errors.Is(err, gorm.ErrRecordNotFound):
 | 
							case errors.Is(err, gorm.ErrRecordNotFound):
 | 
				
			||||||
			c.logger.Warnf("%s: 设备模板不存在, ID: %s", actionType, dtID)
 | 
								c.logger.Warnf("%s: 设备模板不存在, ID: %s", actionType, dtID)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,6 @@ import (
 | 
				
			|||||||
	"encoding/json"
 | 
						"encoding/json"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"strconv"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"git.huangwc.com/pig/pig-farm-controller/internal/app/dto"
 | 
						"git.huangwc.com/pig/pig-farm-controller/internal/app/dto"
 | 
				
			||||||
	"git.huangwc.com/pig/pig-farm-controller/internal/domain/device"
 | 
						"git.huangwc.com/pig/pig-farm-controller/internal/domain/device"
 | 
				
			||||||
@@ -23,26 +22,27 @@ var (
 | 
				
			|||||||
	ErrDeviceTemplateInUse = errors.New("设备模板正在被一个或多个设备使用,无法删除")
 | 
						ErrDeviceTemplateInUse = errors.New("设备模板正在被一个或多个设备使用,无法删除")
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DeviceService 定义了应用层的设备服务接口,用于协调设备相关的业务逻辑。
 | 
				
			||||||
// DeviceService 定义了应用层的设备服务接口,用于协调设备相关的业务逻辑。
 | 
					// DeviceService 定义了应用层的设备服务接口,用于协调设备相关的业务逻辑。
 | 
				
			||||||
type DeviceService interface {
 | 
					type DeviceService interface {
 | 
				
			||||||
	CreateDevice(req *dto.CreateDeviceRequest) (*dto.DeviceResponse, error)
 | 
						CreateDevice(req *dto.CreateDeviceRequest) (*dto.DeviceResponse, error)
 | 
				
			||||||
	GetDevice(id string) (*dto.DeviceResponse, error)
 | 
						GetDevice(id uint) (*dto.DeviceResponse, error)
 | 
				
			||||||
	ListDevices() ([]*dto.DeviceResponse, error)
 | 
						ListDevices() ([]*dto.DeviceResponse, error)
 | 
				
			||||||
	UpdateDevice(id string, req *dto.UpdateDeviceRequest) (*dto.DeviceResponse, error)
 | 
						UpdateDevice(id uint, req *dto.UpdateDeviceRequest) (*dto.DeviceResponse, error)
 | 
				
			||||||
	DeleteDevice(id string) error
 | 
						DeleteDevice(id uint) error
 | 
				
			||||||
	ManualControl(id string, req *dto.ManualControlDeviceRequest) error
 | 
						ManualControl(id uint, req *dto.ManualControlDeviceRequest) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CreateAreaController(req *dto.CreateAreaControllerRequest) (*dto.AreaControllerResponse, error)
 | 
						CreateAreaController(req *dto.CreateAreaControllerRequest) (*dto.AreaControllerResponse, error)
 | 
				
			||||||
	GetAreaController(id string) (*dto.AreaControllerResponse, error)
 | 
						GetAreaController(id uint) (*dto.AreaControllerResponse, error)
 | 
				
			||||||
	ListAreaControllers() ([]*dto.AreaControllerResponse, error)
 | 
						ListAreaControllers() ([]*dto.AreaControllerResponse, error)
 | 
				
			||||||
	UpdateAreaController(id string, req *dto.UpdateAreaControllerRequest) (*dto.AreaControllerResponse, error)
 | 
						UpdateAreaController(id uint, req *dto.UpdateAreaControllerRequest) (*dto.AreaControllerResponse, error)
 | 
				
			||||||
	DeleteAreaController(id string) error
 | 
						DeleteAreaController(id uint) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	CreateDeviceTemplate(req *dto.CreateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error)
 | 
						CreateDeviceTemplate(req *dto.CreateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error)
 | 
				
			||||||
	GetDeviceTemplate(id string) (*dto.DeviceTemplateResponse, error)
 | 
						GetDeviceTemplate(id uint) (*dto.DeviceTemplateResponse, error)
 | 
				
			||||||
	ListDeviceTemplates() ([]*dto.DeviceTemplateResponse, error)
 | 
						ListDeviceTemplates() ([]*dto.DeviceTemplateResponse, error)
 | 
				
			||||||
	UpdateDeviceTemplate(id string, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error)
 | 
						UpdateDeviceTemplate(id uint, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error)
 | 
				
			||||||
	DeleteDeviceTemplate(id string) error
 | 
						DeleteDeviceTemplate(id uint) error
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// deviceService 是 DeviceService 接口的具体实现。
 | 
					// deviceService 是 DeviceService 接口的具体实现。
 | 
				
			||||||
@@ -100,8 +100,8 @@ func (s *deviceService) CreateDevice(req *dto.CreateDeviceRequest) (*dto.DeviceR
 | 
				
			|||||||
	return dto.NewDeviceResponse(createdDevice)
 | 
						return dto.NewDeviceResponse(createdDevice)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *deviceService) GetDevice(id string) (*dto.DeviceResponse, error) {
 | 
					func (s *deviceService) GetDevice(id uint) (*dto.DeviceResponse, error) {
 | 
				
			||||||
	device, err := s.deviceRepo.FindByIDString(id)
 | 
						device, err := s.deviceRepo.FindByID(id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -116,8 +116,8 @@ func (s *deviceService) ListDevices() ([]*dto.DeviceResponse, error) {
 | 
				
			|||||||
	return dto.NewListDeviceResponse(devices)
 | 
						return dto.NewListDeviceResponse(devices)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *deviceService) UpdateDevice(id string, req *dto.UpdateDeviceRequest) (*dto.DeviceResponse, error) {
 | 
					func (s *deviceService) UpdateDevice(id uint, req *dto.UpdateDeviceRequest) (*dto.DeviceResponse, error) {
 | 
				
			||||||
	existingDevice, err := s.deviceRepo.FindByIDString(id)
 | 
						existingDevice, err := s.deviceRepo.FindByID(id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -149,21 +149,16 @@ func (s *deviceService) UpdateDevice(id string, req *dto.UpdateDeviceRequest) (*
 | 
				
			|||||||
	return dto.NewDeviceResponse(updatedDevice)
 | 
						return dto.NewDeviceResponse(updatedDevice)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *deviceService) DeleteDevice(id string) error {
 | 
					func (s *deviceService) DeleteDevice(id uint) error {
 | 
				
			||||||
	idUint, err := strconv.ParseUint(id, 10, 64)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	deviceID := uint(idUint)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 检查设备是否存在
 | 
						// 检查设备是否存在
 | 
				
			||||||
	_, err = s.deviceRepo.FindByID(deviceID)
 | 
						_, err := s.deviceRepo.FindByID(id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err // 如果未找到,会返回 gorm.ErrRecordNotFound
 | 
							return err // 如果未找到,会返回 gorm.ErrRecordNotFound
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 在删除前检查设备是否被任务使用
 | 
						// 在删除前检查设备是否被任务使用
 | 
				
			||||||
	inUse, err := s.deviceRepo.IsDeviceInUse(deviceID)
 | 
						inUse, err := s.deviceRepo.IsDeviceInUse(id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		// 如果检查过程中发生数据库错误,则返回错误
 | 
							// 如果检查过程中发生数据库错误,则返回错误
 | 
				
			||||||
		return fmt.Errorf("检查设备使用情况失败: %w", err)
 | 
							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 {
 | 
					func (s *deviceService) ManualControl(id uint, req *dto.ManualControlDeviceRequest) error {
 | 
				
			||||||
	dev, err := s.deviceRepo.FindByIDString(id)
 | 
						dev, err := s.deviceRepo.FindByID(id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -225,12 +220,8 @@ func (s *deviceService) CreateAreaController(req *dto.CreateAreaControllerReques
 | 
				
			|||||||
	return dto.NewAreaControllerResponse(ac)
 | 
						return dto.NewAreaControllerResponse(ac)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *deviceService) GetAreaController(id string) (*dto.AreaControllerResponse, error) {
 | 
					func (s *deviceService) GetAreaController(id uint) (*dto.AreaControllerResponse, error) {
 | 
				
			||||||
	idUint, err := strconv.ParseUint(id, 10, 64)
 | 
						ac, err := s.areaControllerRepo.FindByID(id)
 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ac, err := s.areaControllerRepo.FindByID(uint(idUint))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -245,13 +236,8 @@ func (s *deviceService) ListAreaControllers() ([]*dto.AreaControllerResponse, er
 | 
				
			|||||||
	return dto.NewListAreaControllerResponse(acs)
 | 
						return dto.NewListAreaControllerResponse(acs)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *deviceService) UpdateAreaController(id string, req *dto.UpdateAreaControllerRequest) (*dto.AreaControllerResponse, error) {
 | 
					func (s *deviceService) UpdateAreaController(id uint, req *dto.UpdateAreaControllerRequest) (*dto.AreaControllerResponse, error) {
 | 
				
			||||||
	idUint, err := strconv.ParseUint(id, 10, 64)
 | 
						existingAC, err := s.areaControllerRepo.FindByID(id)
 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	existingAC, err := s.areaControllerRepo.FindByID(uint(idUint))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -277,21 +263,16 @@ func (s *deviceService) UpdateAreaController(id string, req *dto.UpdateAreaContr
 | 
				
			|||||||
	return dto.NewAreaControllerResponse(existingAC)
 | 
						return dto.NewAreaControllerResponse(existingAC)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *deviceService) DeleteAreaController(id string) error {
 | 
					func (s *deviceService) DeleteAreaController(id uint) error {
 | 
				
			||||||
	idUint, err := strconv.ParseUint(id, 10, 64)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return fmt.Errorf("无效的ID格式: %w", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	acID := uint(idUint)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 1. 检查是否存在
 | 
						// 1. 检查是否存在
 | 
				
			||||||
	_, err = s.areaControllerRepo.FindByID(acID)
 | 
						_, err := s.areaControllerRepo.FindByID(id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err // 如果未找到,gorm会返回 ErrRecordNotFound
 | 
							return err // 如果未找到,gorm会返回 ErrRecordNotFound
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 2. 检查是否被使用(业务逻辑)
 | 
						// 2. 检查是否被使用(业务逻辑)
 | 
				
			||||||
	inUse, err := s.deviceRepo.IsAreaControllerInUse(acID)
 | 
						inUse, err := s.deviceRepo.IsAreaControllerInUse(id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err // 返回数据库检查错误
 | 
							return err // 返回数据库检查错误
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -300,7 +281,7 @@ func (s *deviceService) DeleteAreaController(id string) error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 3. 执行删除
 | 
						// 3. 执行删除
 | 
				
			||||||
	return s.areaControllerRepo.Delete(acID)
 | 
						return s.areaControllerRepo.Delete(id)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// --- Device Templates ---
 | 
					// --- Device Templates ---
 | 
				
			||||||
@@ -336,12 +317,8 @@ func (s *deviceService) CreateDeviceTemplate(req *dto.CreateDeviceTemplateReques
 | 
				
			|||||||
	return dto.NewDeviceTemplateResponse(deviceTemplate)
 | 
						return dto.NewDeviceTemplateResponse(deviceTemplate)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *deviceService) GetDeviceTemplate(id string) (*dto.DeviceTemplateResponse, error) {
 | 
					func (s *deviceService) GetDeviceTemplate(id uint) (*dto.DeviceTemplateResponse, error) {
 | 
				
			||||||
	idUint, err := strconv.ParseUint(id, 10, 64)
 | 
						deviceTemplate, err := s.deviceTemplateRepo.FindByID(id)
 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	deviceTemplate, err := s.deviceTemplateRepo.FindByID(uint(idUint))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -356,13 +333,8 @@ func (s *deviceService) ListDeviceTemplates() ([]*dto.DeviceTemplateResponse, er
 | 
				
			|||||||
	return dto.NewListDeviceTemplateResponse(deviceTemplates)
 | 
						return dto.NewListDeviceTemplateResponse(deviceTemplates)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *deviceService) UpdateDeviceTemplate(id string, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) {
 | 
					func (s *deviceService) UpdateDeviceTemplate(id uint, req *dto.UpdateDeviceTemplateRequest) (*dto.DeviceTemplateResponse, error) {
 | 
				
			||||||
	idUint, err := strconv.ParseUint(id, 10, 64)
 | 
						existingDeviceTemplate, err := s.deviceTemplateRepo.FindByID(id)
 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return nil, err
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	existingDeviceTemplate, err := s.deviceTemplateRepo.FindByID(uint(idUint))
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return nil, err
 | 
							return nil, err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -395,21 +367,16 @@ func (s *deviceService) UpdateDeviceTemplate(id string, req *dto.UpdateDeviceTem
 | 
				
			|||||||
	return dto.NewDeviceTemplateResponse(existingDeviceTemplate)
 | 
						return dto.NewDeviceTemplateResponse(existingDeviceTemplate)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (s *deviceService) DeleteDeviceTemplate(id string) error {
 | 
					func (s *deviceService) DeleteDeviceTemplate(id uint) error {
 | 
				
			||||||
	idUint, err := strconv.ParseUint(id, 10, 64)
 | 
					 | 
				
			||||||
	if err != nil {
 | 
					 | 
				
			||||||
		return fmt.Errorf("无效的ID格式: %w", err)
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	dtID := uint(idUint)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 1. 检查是否存在
 | 
						// 1. 检查是否存在
 | 
				
			||||||
	_, err = s.deviceTemplateRepo.FindByID(dtID)
 | 
						_, err := s.deviceTemplateRepo.FindByID(id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 2. 检查是否被使用(业务逻辑)
 | 
						// 2. 检查是否被使用(业务逻辑)
 | 
				
			||||||
	inUse, err := s.deviceTemplateRepo.IsInUse(dtID)
 | 
						inUse, err := s.deviceTemplateRepo.IsInUse(id)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -418,5 +385,5 @@ func (s *deviceService) DeleteDeviceTemplate(id string) error {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// 3. 执行删除
 | 
						// 3. 执行删除
 | 
				
			||||||
	return s.deviceTemplateRepo.Delete(dtID)
 | 
						return s.deviceTemplateRepo.Delete(id)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -11,9 +11,14 @@ TODO-List.txt
 | 
				
			|||||||
config.example.yml
 | 
					config.example.yml
 | 
				
			||||||
config.yml
 | 
					config.yml
 | 
				
			||||||
design/verification-before-device-deletion/add_get_device_id_configs_to_task.md
 | 
					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/index.md
 | 
				
			||||||
design/verification-before-device-deletion/plan_service_refactor.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/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/docs.go
 | 
				
			||||||
docs/swagger.json
 | 
					docs/swagger.json
 | 
				
			||||||
docs/swagger.yaml
 | 
					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_sick_manager.go
 | 
				
			||||||
internal/domain/pig/pig_trade_manager.go
 | 
					internal/domain/pig/pig_trade_manager.go
 | 
				
			||||||
internal/domain/plan/analysis_plan_task_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_execution_manager.go
 | 
				
			||||||
internal/domain/plan/plan_service.go
 | 
					internal/domain/plan/plan_service.go
 | 
				
			||||||
internal/domain/plan/task.go
 | 
					internal/domain/plan/task.go
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user