8.9 KiB
8.9 KiB
1. 准备工作
- 1.1 阅读并理解
openspec/changes/refactor-business-logic-layering/proposal.md。 - 1.2 确保本地环境干净,并拉取最新代码。
2. 统一服务层接口输入输出为 DTO
2.1 monitor 模块
- 2.1.1 修改
internal/app/service/monitor_service.go接口:- 将所有
List...方法的opts repository.ListOptions参数替换为服务层自定义的查询 DTO 或一系列基本参数。 - 将所有
List...方法的返回值[]models.Xxx替换为[]dto.XxxResponse。
- 将所有
- 2.1.2 修改
internal/app/service/impl/monitor_service_impl.go实现:- 调整
List...方法的签名以匹配接口变更。 - 在服务层内部将服务层查询 DTO 转换为
repository.ListOptions。 - 在服务层内部将
repository返回的models对象转换为dto.XxxResponse。
- 调整
- 2.1.3 修改
internal/app/controller/monitor/monitor_controller.go:- 移除控制器中构建
repository.ListOptions的逻辑。 - 移除控制器中将
models转换为dto.NewList...Response的逻辑。 - 移除控制器中直接使用
models进行枚举类型转换的逻辑,将其下沉到服务层或 DTO 转换逻辑中。 - 调整服务层方法的调用,使其接收新的服务层查询 DTO 或基本参数,并直接处理服务层返回的
dto.XxxResponse。
- 移除控制器中构建
2.2 device 模块
- 2.2.1 修改
internal/app/service/device_service.go接口:- 为
CreateDevice,UpdateDevice,CreateAreaController,UpdateAreaController,CreateDeviceTemplate,UpdateDeviceTemplate方法定义并接收 DTO 作为输入。 - 将
GetDevice,ListDevices,GetAreaController,ListAreaControllers,GetDeviceTemplate,ListDeviceTemplates方法的返回值models.Xxx或[]models.Xxx替换为dto.XxxResponse或[]dto.XxxResponse。 - 调整
ManualControl方法,使其接收 DTO 或基本参数,而不是models.Device。
- 为
- 2.2.2 修改
internal/app/service/impl/device_service_impl.go实现:- 调整方法签名以匹配接口变更。
- 在服务层内部将输入 DTO 转换为
models对象。 - 在服务层内部将
repository返回的models对象转换为dto.XxxResponse。 - 将
SelfCheck()验证逻辑从控制器移入服务层。 - 将
Properties,Commands,Values的 JSON 序列化逻辑从控制器移入服务层。 - 将
ManualControl中的业务逻辑(如动作映射)从控制器移入服务层。 - 将控制器中直接调用
repository方法的逻辑移入服务层。 - 将控制器中通过检查
repository错误信息处理业务规则的逻辑移入服务层。
- 2.2.3 修改
internal/app/controller/device/device_controller.go:- 移除控制器中直接创建
models.Device,models.AreaController,models.DeviceTemplate对象的逻辑。 - 移除控制器中直接调用
SelfCheck()的逻辑。 - 移除控制器中直接调用
repository方法的逻辑。 - 移除控制器中通过检查
repository错误信息处理业务规则的逻辑。 - 移除控制器中
Properties,Commands,Values的 JSON 序列化逻辑。 - 调整服务层方法的调用,使其接收新的服务层输入 DTO 或基本参数,并直接处理服务层返回的
dto.XxxResponse。
- 移除控制器中直接创建
2.3 pig-farm 模块
- 2.3.1 修改
internal/app/service/pig_farm_service.go接口:- 将
CreatePigHouse,GetPigHouseByID,ListPigHouses,UpdatePigHouse,CreatePen,GetPenByID,ListPens,UpdatePen,UpdatePenStatus方法的返回值models.Xxx或[]models.Xxx替换为dto.XxxResponse或[]dto.XxxResponse。
- 将
- 2.3.2 修改
internal/app/service/impl/pig_farm_service_impl.go实现:- 调整方法签名以匹配接口变更。
- 在服务层内部将
repository返回的models对象转换为dto.XxxResponse。 - 将控制器中处理服务层特定业务错误(如
service.ErrHouseNotFound)的逻辑移入服务层,服务层应返回更抽象的错误或直接返回 DTO。
- 2.3.3 修改
internal/app/controller/management/pig_farm_controller.go:- 移除控制器中手动将领域实体转换为 DTO 的逻辑。
- 移除控制器中直接处理服务层特定业务错误类型的逻辑。
- 调整服务层方法的调用,使其直接处理服务层返回的
dto.XxxResponse。
2.4 plan 模块
- 2.4.1 修改
internal/app/service/plan_service.go接口:- 为
CreatePlan,UpdatePlan方法定义并接收 DTO 作为输入。 - 将
GetPlanByID,ListPlans方法的返回值models.Plan或[]models.Plan替换为dto.PlanResponse或[]dto.PlanResponse。 - 调整
ListPlans方法的opts repository.ListPlansOptions参数替换为服务层自定义的查询 DTO 或一系列基本参数。 - 调整
DeletePlan,StartPlan,StopPlan方法,使其接收 DTO 或基本参数,并封装所有业务逻辑。
- 为
- 2.4.2 修改
internal/app/service/impl/plan_service_impl.go实现:- 调整方法签名以匹配接口变更。
- 在服务层内部将输入 DTO 转换为
models对象。 - 在服务层内部将
repository返回的models对象转换为dto.XxxResponse。 - 将控制器中所有的业务规则判断(计划类型检查、状态检查、执行计数器重置、ContentType 自动判断)移入服务层。
- 将控制器中对
repository方法的直接调用移入服务层。 - 将控制器中对
analysisPlanTaskManager的协调移入服务层。 - 将控制器中处理仓库层特有错误(
gorm.ErrRecordNotFound)的逻辑移入服务层。
- 2.4.3 修改
internal/app/controller/plan/plan_controller.go:- 移除控制器中直接创建
models.Plan对象和repository.ListPlansOptions的逻辑。 - 移除控制器中所有的业务规则判断。
- 移除控制器中直接调用
repository方法的逻辑。 - 移除控制器中直接协调
analysisPlanTaskManager的逻辑。 - 移除控制器中直接处理仓库层特有错误的逻辑。
- 调整服务层方法的调用,使其接收新的服务层输入 DTO 或基本参数,并直接处理服务层返回的
dto.XxxResponse。
- 移除控制器中直接创建
2.5 user 模块
- 2.5.1 修改
internal/app/service/user_service.go接口:- 为
CreateUser,Login方法定义并接收 DTO 作为输入。 - 将
CreateUser,Login方法的返回值models.User替换为dto.CreateUserResponse或dto.LoginResponse。 - 调整
ListUserHistory方法的opts repository.UserActionLogListOptions参数替换为服务层自定义的查询 DTO 或一系列基本参数,并将其返回值[]models.UserActionLog替换为[]dto.ListUserActionLogResponse。
- 为
- 2.5.2 修改
internal/app/service/impl/user_service_impl.go实现:- 调整方法签名以匹配接口变更。
- 在服务层内部将输入 DTO 转换为
models对象。 - 在服务层内部将
repository返回的models对象转换为dto.XxxResponse。 - 将
CreateUser中处理用户名重复的业务逻辑移入服务层。 - 将
Login中进行密码验证的业务逻辑和协调tokenService的逻辑移入服务层。 - 将
ListUserHistory中强制覆盖UserID、构建仓库层查询选项、枚举类型转换、以及处理服务层特定错误的逻辑移入服务层。 - 将控制器中通过检查底层(仓库层或服务层)的特定错误类型或错误信息来执行业务判断的逻辑移入服务层。
- 2.5.3 修改
internal/app/controller/user/user_controller.go:- 移除控制器中直接创建
models.User对象和repository.UserActionLogListOptions的逻辑。 - 移除控制器中处理用户名重复的业务逻辑。
- 移除控制器中进行密码验证的业务逻辑和协调
tokenService的逻辑。 - 移除控制器中强制覆盖
UserID、构建仓库层查询选项、枚举类型转换、以及处理服务层特定错误的逻辑。 - 移除控制器中通过检查底层(仓库层或服务层)的特定错误类型或错误信息来执行业务判断的逻辑。
- 调整服务层方法的调用,使其接收新的服务层输入 DTO 或基本参数,并直接处理服务层返回的
dto.XxxResponse。
- 移除控制器中直接创建
3. 验证与测试
- 3.1 运行所有单元测试和集成测试,确保重构没有引入新的问题。
- 3.2 针对受影响的 API 接口进行手动测试,验证功能是否正常。
- 3.3 确保日志输出和审计记录仍然准确无误。