# 07 — SystemController 出入参规范化 **What to build:** 新建 DeptDTO(继承 BaseDTO,含 `children` 树结构,加 `fromEntity`/`toEntity`),新建 AssignDeptDTO(纯 POJO 不继承 BaseDTO,无主键语义)。menuTree 出参从 `List`(实体直出)改为 `List`。deptTree 出参从 `List`(实体直出)改为 `List`。saveDept(5 参数)从 `@RequestParam` 改为 `DeptDTO` 入参。assignUserDepts(3 参数)从 `@RequestParam` 改为 `AssignDeptDTO` 入参。userPage 去掉 `@RequestBody` 改表单绑定(前端破坏性变更——前端从 JSON body 改为 form-urlencoded)。UserStatsVO 改名为 UserStatsDTO。assignUserRoles(2 参数)、deleteDept(1 参数)保持 `@RequestParam`。 **Blocked by:** 01 (BaseDTO 重构), 02 (InitBinder), 05 (ResourceNodeDTO — menuTree 要用它) **Status:** ready-for-agent - [ ] 新建 `DeptDTO`(继承 `BaseDTO`,含 `children` 字段,`fromEntity(SysDept)` + `toEntity()`),放 `crm-auth/domain/dto/` - [ ] 新建 `AssignDeptDTO`(纯 POJO,字段 `userId`/`primaryDeptId`/`deptIds`),放 `crm-auth/domain/dto/` - [ ] `UserStatsVO` 改名为 `UserStatsDTO`(不继承 BaseDTO,无主键语义) - [ ] `SystemController.menuTree` 出参从 `List` 改为 `List` - [ ] `SystemController.deptTree` 出参从 `List` 改为 `List` - [ ] `SystemController.saveDept` 从 5 个 `@RequestParam` 改为 `DeptDTO` 入参 - [ ] `SystemController.assignUserDepts` 从 3 个 `@RequestParam` 改为 `AssignDeptDTO` 入参 - [ ] `SystemController.userPage` 去掉 `@RequestBody`,改为隐式表单绑定 - [ ] `SystemController.userStats` 出参类型从 `UserStatsVO` 改为 `UserStatsDTO` - [ ] `assignUserRoles`(2 参数)、`deleteDept`(1 参数)保持 `@RequestParam` 不变 - [ ] PermissionResolver.visibleMenuTree 返回类型从 `List` 改为 `List`(内部做 Entity→DTO 转换) - [ ] SystemController 不再 import `SysMenu`/`SysDept` 实体 - [ ] 测试:menuTree/deptTree 返回的 JSON 中不包含 `deleted`/`creatorId`/`updaterId` - [ ] 测试:saveDept 入参为 DeptDTO,提交 `createTime` 被 strip - [ ] 测试:assignUserDepts 入参为 AssignDeptDTO - [ ] 测试:userPage 表单绑定生效(不收 JSON body) - [ ] 前端对接文档同步更新 userPage 的请求格式变更(JSON body → form-urlencoded)