1. 将模块档位逻辑从 SysRoleServiceImpl 中抽离
Strongcrm-auth/.../service/impl/SysRoleServiceImpl.java (247 行)
crm-auth/.../domain/entity/SysRoleDataScope.java
crm-auth/.../domain/entity/SysDataScopeModule.java
Before — 数据可见性关注点渗入角色管理
5 个 mapper 注入
saveRole()
deleteRoleCascade()
saveRoleScopes()
校验 + 持久化
50 行
assignResources()
模块档位是 ADR-0018 引入的数据权限关注点
不属于「角色是什么」
SysRoleMapper + SysRoleMenuMapper + SysRoleDataScopeMapper + SysDataScopeModuleMapper + SysUserRoleMapper
After — RoleScopeStore 深模块接管档位
角色 CRUD
资源分配
delegates scope ops ↓
interface: 3 methods
save(roleId, scopes)
load(roleId): List<ModuleScopeDTO>
delete(roleId)
implementation 吸收:module code 合法性校验
dataScope 枚举校验 · 重复 code 检查 · 批量写入
Problem
ADR-0018 引入「每模块数据档位」后,SysRoleServiceImpl 承担了 两个不同演化轴:角色的基本属性(名称/编码/内置保护)和模块档位的校验规则(哪些 module code 合法、 dataScope 枚举范围)。saveRoleScopes 校验逻辑(50行)比 saveRole 本体更长。getRoleDetail 为了拼装档位展示名需串查 5 个 mapper。新增一个业务模块只需改 ADR-0018 的注册表, 但角色服务的测试也随之需要额外 mock。
Solution
提取 RoleScopeStore 深模块:接口暴露 save / load / delete 三个方法, implementation 内部持有 SysRoleDataScopeMapper + SysDataScopeModuleMapper, 完整吸收档位校验与持久化。SysRoleServiceImpl 只需注入 RoleScopeStore 而非两个 mapper, 测试时一个 mock 替代两个。
Wins