diff --git a/crm-app/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/crm-app/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
index dea1afb..49487b6 100644
--- a/crm-app/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
+++ b/crm-app/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -1 +1 @@
-D:\code\crm-backend-matt\crm-app\src\main\java\com\crm\app\CrmAppApplication.java
+E:\code\crm-backend-matt\crm-app\src\main\java\com\crm\app\CrmAppApplication.java
diff --git a/crm-auth/target/classes/com/crm/auth/config/AuthProperties$DingTalk.class b/crm-auth/target/classes/com/crm/auth/config/AuthProperties$DingTalk.class
index 0e3ff9d..e3f6496 100644
Binary files a/crm-auth/target/classes/com/crm/auth/config/AuthProperties$DingTalk.class and b/crm-auth/target/classes/com/crm/auth/config/AuthProperties$DingTalk.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/config/AuthProperties$Jwt.class b/crm-auth/target/classes/com/crm/auth/config/AuthProperties$Jwt.class
index d9be18f..b656349 100644
Binary files a/crm-auth/target/classes/com/crm/auth/config/AuthProperties$Jwt.class and b/crm-auth/target/classes/com/crm/auth/config/AuthProperties$Jwt.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/config/AuthProperties.class b/crm-auth/target/classes/com/crm/auth/config/AuthProperties.class
index 1721b95..53b1779 100644
Binary files a/crm-auth/target/classes/com/crm/auth/config/AuthProperties.class and b/crm-auth/target/classes/com/crm/auth/config/AuthProperties.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/config/DataInitializer.class b/crm-auth/target/classes/com/crm/auth/config/DataInitializer.class
index 92c18cd..15682bb 100644
Binary files a/crm-auth/target/classes/com/crm/auth/config/DataInitializer.class and b/crm-auth/target/classes/com/crm/auth/config/DataInitializer.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/config/SecurityConfig.class b/crm-auth/target/classes/com/crm/auth/config/SecurityConfig.class
index 11a2552..340436a 100644
Binary files a/crm-auth/target/classes/com/crm/auth/config/SecurityConfig.class and b/crm-auth/target/classes/com/crm/auth/config/SecurityConfig.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/controller/SystemController.class b/crm-auth/target/classes/com/crm/auth/controller/SystemController.class
index 2d3f25c..f386298 100644
Binary files a/crm-auth/target/classes/com/crm/auth/controller/SystemController.class and b/crm-auth/target/classes/com/crm/auth/controller/SystemController.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/dto/LoginResultDTO.class b/crm-auth/target/classes/com/crm/auth/domain/dto/LoginResultDTO.class
index 5ff9553..bec710a 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/dto/LoginResultDTO.class and b/crm-auth/target/classes/com/crm/auth/domain/dto/LoginResultDTO.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/dto/UserInfoDTO.class b/crm-auth/target/classes/com/crm/auth/domain/dto/UserInfoDTO.class
index 31e953e..4a2b74d 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/dto/UserInfoDTO.class and b/crm-auth/target/classes/com/crm/auth/domain/dto/UserInfoDTO.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$DeptRef.class b/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$DeptRef.class
index b09720e..7e9bc28 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$DeptRef.class and b/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$DeptRef.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$RoleRef.class b/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$RoleRef.class
index c56abad..9cd7336 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$RoleRef.class and b/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$RoleRef.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO.class b/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO.class
index 1e29409..9ff5e3c 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO.class and b/crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/dto/UserStatsVO.class b/crm-auth/target/classes/com/crm/auth/domain/dto/UserStatsVO.class
index 4f73c3c..d0782c6 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/dto/UserStatsVO.class and b/crm-auth/target/classes/com/crm/auth/domain/dto/UserStatsVO.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/entity/AuthIdentity.class b/crm-auth/target/classes/com/crm/auth/domain/entity/AuthIdentity.class
index c166579..f7af9ed 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/entity/AuthIdentity.class and b/crm-auth/target/classes/com/crm/auth/domain/entity/AuthIdentity.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/entity/AuthUser.class b/crm-auth/target/classes/com/crm/auth/domain/entity/AuthUser.class
index 95b80f5..083c20b 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/entity/AuthUser.class and b/crm-auth/target/classes/com/crm/auth/domain/entity/AuthUser.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/entity/SysDept.class b/crm-auth/target/classes/com/crm/auth/domain/entity/SysDept.class
index 92e7f8e..e85bad1 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/entity/SysDept.class and b/crm-auth/target/classes/com/crm/auth/domain/entity/SysDept.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/entity/SysMenu.class b/crm-auth/target/classes/com/crm/auth/domain/entity/SysMenu.class
index abddb0b..c7a8eca 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/entity/SysMenu.class and b/crm-auth/target/classes/com/crm/auth/domain/entity/SysMenu.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/entity/SysRole.class b/crm-auth/target/classes/com/crm/auth/domain/entity/SysRole.class
index 76659db..1af4b8a 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/entity/SysRole.class and b/crm-auth/target/classes/com/crm/auth/domain/entity/SysRole.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/entity/SysRoleMenu.class b/crm-auth/target/classes/com/crm/auth/domain/entity/SysRoleMenu.class
index 11da0f5..4753055 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/entity/SysRoleMenu.class and b/crm-auth/target/classes/com/crm/auth/domain/entity/SysRoleMenu.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/entity/SysUserDept.class b/crm-auth/target/classes/com/crm/auth/domain/entity/SysUserDept.class
index 10d2373..f00d4cc 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/entity/SysUserDept.class and b/crm-auth/target/classes/com/crm/auth/domain/entity/SysUserDept.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/entity/SysUserRole.class b/crm-auth/target/classes/com/crm/auth/domain/entity/SysUserRole.class
index f58fbc8..cdb32a8 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/entity/SysUserRole.class and b/crm-auth/target/classes/com/crm/auth/domain/entity/SysUserRole.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/domain/param/UserPageParam.class b/crm-auth/target/classes/com/crm/auth/domain/param/UserPageParam.class
index e4758b3..ae81526 100644
Binary files a/crm-auth/target/classes/com/crm/auth/domain/param/UserPageParam.class and b/crm-auth/target/classes/com/crm/auth/domain/param/UserPageParam.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/security/AuthLoginUser.class b/crm-auth/target/classes/com/crm/auth/security/AuthLoginUser.class
index a7c705b..f40d717 100644
Binary files a/crm-auth/target/classes/com/crm/auth/security/AuthLoginUser.class and b/crm-auth/target/classes/com/crm/auth/security/AuthLoginUser.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/security/DataScopeInterceptor.class b/crm-auth/target/classes/com/crm/auth/security/DataScopeInterceptor.class
index 394d17d..cf75a87 100644
Binary files a/crm-auth/target/classes/com/crm/auth/security/DataScopeInterceptor.class and b/crm-auth/target/classes/com/crm/auth/security/DataScopeInterceptor.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/security/TokenService.class b/crm-auth/target/classes/com/crm/auth/security/TokenService.class
index c7cd22c..047542f 100644
Binary files a/crm-auth/target/classes/com/crm/auth/security/TokenService.class and b/crm-auth/target/classes/com/crm/auth/security/TokenService.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/service/DeptTreeCache.class b/crm-auth/target/classes/com/crm/auth/service/DeptTreeCache.class
index 76878f7..2fb2398 100644
Binary files a/crm-auth/target/classes/com/crm/auth/service/DeptTreeCache.class and b/crm-auth/target/classes/com/crm/auth/service/DeptTreeCache.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/service/client/DingTalkAuthClient.class b/crm-auth/target/classes/com/crm/auth/service/client/DingTalkAuthClient.class
index acb7721..d681ccb 100644
Binary files a/crm-auth/target/classes/com/crm/auth/service/client/DingTalkAuthClient.class and b/crm-auth/target/classes/com/crm/auth/service/client/DingTalkAuthClient.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/service/client/ThirdPartyUserInfo.class b/crm-auth/target/classes/com/crm/auth/service/client/ThirdPartyUserInfo.class
index a7cd19f..45abb40 100644
Binary files a/crm-auth/target/classes/com/crm/auth/service/client/ThirdPartyUserInfo.class and b/crm-auth/target/classes/com/crm/auth/service/client/ThirdPartyUserInfo.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/service/impl/AuthIdentityServiceImpl.class b/crm-auth/target/classes/com/crm/auth/service/impl/AuthIdentityServiceImpl.class
index 87b7b17..77bb11b 100644
Binary files a/crm-auth/target/classes/com/crm/auth/service/impl/AuthIdentityServiceImpl.class and b/crm-auth/target/classes/com/crm/auth/service/impl/AuthIdentityServiceImpl.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/service/impl/AuthServiceImpl.class b/crm-auth/target/classes/com/crm/auth/service/impl/AuthServiceImpl.class
index f1820fb..795375e 100644
Binary files a/crm-auth/target/classes/com/crm/auth/service/impl/AuthServiceImpl.class and b/crm-auth/target/classes/com/crm/auth/service/impl/AuthServiceImpl.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/service/impl/AuthUserServiceImpl.class b/crm-auth/target/classes/com/crm/auth/service/impl/AuthUserServiceImpl.class
index d8a13d9..566182d 100644
Binary files a/crm-auth/target/classes/com/crm/auth/service/impl/AuthUserServiceImpl.class and b/crm-auth/target/classes/com/crm/auth/service/impl/AuthUserServiceImpl.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/service/impl/SysDeptServiceImpl.class b/crm-auth/target/classes/com/crm/auth/service/impl/SysDeptServiceImpl.class
index 1c375bb..a8db5ea 100644
Binary files a/crm-auth/target/classes/com/crm/auth/service/impl/SysDeptServiceImpl.class and b/crm-auth/target/classes/com/crm/auth/service/impl/SysDeptServiceImpl.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/service/impl/SysMenuServiceImpl.class b/crm-auth/target/classes/com/crm/auth/service/impl/SysMenuServiceImpl.class
index a2d557c..6de31f5 100644
Binary files a/crm-auth/target/classes/com/crm/auth/service/impl/SysMenuServiceImpl.class and b/crm-auth/target/classes/com/crm/auth/service/impl/SysMenuServiceImpl.class differ
diff --git a/crm-auth/target/classes/com/crm/auth/service/impl/SysRoleServiceImpl.class b/crm-auth/target/classes/com/crm/auth/service/impl/SysRoleServiceImpl.class
index 9bf480b..343760f 100644
Binary files a/crm-auth/target/classes/com/crm/auth/service/impl/SysRoleServiceImpl.class and b/crm-auth/target/classes/com/crm/auth/service/impl/SysRoleServiceImpl.class differ
diff --git a/crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
index 12991ea..f2584c2 100644
--- a/crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
+++ b/crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -69,7 +69,6 @@ com\crm\auth\security\PermissionResolverImpl.class
com\crm\auth\mapper\SysUserDeptMapper.class
com\crm\auth\security\SecurityExceptionHandlers.class
com\crm\auth\AuthApplication.class
-com\crm\auth\domain\enums\MenuType$1.class
com\crm\auth\mapper\SysUserRoleMapper.class
com\crm\auth\domain\entity\SysRole.class
com\crm\auth\mapper\SysDeptMapper.class
diff --git a/crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
index 632318b..5e31661 100644
--- a/crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
+++ b/crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -1,72 +1,72 @@
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\AuthApplication.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\config\AuthProperties.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\config\DataInitializer.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\config\PermissionConfig.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\config\SecurityConfig.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\config\WebMvcConfig.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\constant\AuthConstants.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\controller\AuthController.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\controller\DebugTokenController.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\controller\ResourceController.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\controller\RoleController.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\controller\SystemController.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\LoginResultDTO.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\ResourceNode.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\RoleDetailVO.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\UserInfoDTO.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\UserListDTO.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\UserStatsVO.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\AuthIdentity.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\AuthUser.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysDept.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysMenu.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysRole.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysRoleMenu.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysUserDept.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysUserRole.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\enums\DataScopeEnum.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\enums\IdentityTypeEnum.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\enums\MenuType.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\param\UserPageParam.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\AuthIdentityMapper.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\AuthUserMapper.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysDeptMapper.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysMenuMapper.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysRoleMapper.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysRoleMenuMapper.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysUserDeptMapper.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysUserRoleMapper.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\ApiPermissionCache.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\ApiPermissionInterceptor.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\ApiPermissionRule.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\AuthLoginUser.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\DataScopeInterceptor.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\DataScopeTables.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\JwtAuthenticationFilter.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\PermissionGrant.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\PermissionResolver.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\PermissionResolverImpl.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\SecurityExceptionHandlers.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\TokenService.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\client\DingTalkAuthClient.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\client\ThirdPartyAuthClient.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\client\ThirdPartyAuthClientFactory.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\client\ThirdPartyUserInfo.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\DeptTreeCache.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IAuthIdentityService.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IAuthService.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IAuthUserService.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\AuthIdentityServiceImpl.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\AuthServiceImpl.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\AuthUserServiceImpl.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\PermissionSeederImpl.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\ResourceServiceImpl.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\SysDeptServiceImpl.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\SysMenuServiceImpl.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\SysRoleServiceImpl.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\UserQueryServiceImpl.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IResourceService.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\ISysDeptService.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\ISysMenuService.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\ISysRoleService.java
-D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IUserQueryService.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\AuthApplication.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\config\AuthProperties.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\config\DataInitializer.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\config\PermissionConfig.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\config\SecurityConfig.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\config\WebMvcConfig.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\constant\AuthConstants.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\controller\AuthController.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\controller\DebugTokenController.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\controller\ResourceController.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\controller\RoleController.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\controller\SystemController.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\LoginResultDTO.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\ResourceNode.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\RoleDetailVO.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\UserInfoDTO.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\UserListDTO.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\dto\UserStatsVO.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\AuthIdentity.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\AuthUser.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysDept.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysMenu.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysRole.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysRoleMenu.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysUserDept.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\entity\SysUserRole.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\enums\DataScopeEnum.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\enums\IdentityTypeEnum.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\enums\MenuType.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\domain\param\UserPageParam.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\AuthIdentityMapper.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\AuthUserMapper.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysDeptMapper.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysMenuMapper.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysRoleMapper.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysRoleMenuMapper.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysUserDeptMapper.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\mapper\SysUserRoleMapper.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\ApiPermissionCache.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\ApiPermissionInterceptor.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\ApiPermissionRule.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\AuthLoginUser.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\DataScopeInterceptor.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\DataScopeTables.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\JwtAuthenticationFilter.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\PermissionGrant.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\PermissionResolver.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\PermissionResolverImpl.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\SecurityExceptionHandlers.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\security\TokenService.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\client\DingTalkAuthClient.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\client\ThirdPartyAuthClient.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\client\ThirdPartyAuthClientFactory.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\client\ThirdPartyUserInfo.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\DeptTreeCache.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IAuthIdentityService.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IAuthService.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IAuthUserService.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\AuthIdentityServiceImpl.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\AuthServiceImpl.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\AuthUserServiceImpl.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\PermissionSeederImpl.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\ResourceServiceImpl.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\SysDeptServiceImpl.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\SysMenuServiceImpl.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\SysRoleServiceImpl.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\impl\UserQueryServiceImpl.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IResourceService.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\ISysDeptService.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\ISysMenuService.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\ISysRoleService.java
+E:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IUserQueryService.java
diff --git a/crm-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/crm-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
deleted file mode 100644
index cb4eb66..0000000
--- a/crm-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
+++ /dev/null
@@ -1,17 +0,0 @@
-com\crm\auth\service\client\DingTalkAuthClientTest.class
-com\crm\auth\service\client\ThirdPartyAuthClientFactoryTest.class
-com\crm\auth\service\impl\SysDeptServiceImplTest.class
-com\crm\auth\security\scope\TestOwnedDataMapper.class
-com\crm\auth\security\scope\TestOwnedData.class
-com\crm\auth\service\impl\UserListIntegrationTest.class
-com\crm\auth\service\client\DingTalkAuthClientTest$StubbedClient.class
-com\crm\auth\service\impl\SysMenuServiceImplTest.class
-com\crm\auth\security\ApiPermissionInterceptorTest.class
-com\crm\auth\service\impl\PermissionSeederImplTest.class
-com\crm\auth\security\scope\DataScopeIntegrationTest.class
-com\crm\auth\service\impl\AuthServiceImplTest.class
-com\crm\auth\service\client\ThirdPartyAuthClientFactoryTest$StubClient.class
-com\crm\auth\service\impl\ResourceServiceImplTest.class
-com\crm\auth\service\impl\SysRoleServiceImplTest.class
-com\crm\auth\security\scope\DataScopeIntegrationTest$DeptQueryCounter.class
-com\crm\auth\service\impl\AuthUserServiceImplTest.class
diff --git a/crm-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/crm-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
deleted file mode 100644
index 422db7a..0000000
--- a/crm-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
+++ /dev/null
@@ -1,14 +0,0 @@
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\security\ApiPermissionInterceptorTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\security\scope\DataScopeIntegrationTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\security\scope\TestOwnedData.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\security\scope\TestOwnedDataMapper.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\client\DingTalkAuthClientTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\client\ThirdPartyAuthClientFactoryTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\impl\AuthServiceImplTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\impl\AuthUserServiceImplTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\impl\PermissionSeederImplTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\impl\ResourceServiceImplTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\impl\SysDeptServiceImplTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\impl\SysMenuServiceImplTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\impl\SysRoleServiceImplTest.java
-D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\impl\UserListIntegrationTest.java
diff --git a/crm-auth/target/surefire-reports/TEST-com.crm.auth.security.scope.DataScopeIntegrationTest.xml b/crm-auth/target/surefire-reports/TEST-com.crm.auth.security.scope.DataScopeIntegrationTest.xml
deleted file mode 100644
index 00fc8fb..0000000
--- a/crm-auth/target/surefire-reports/TEST-com.crm.auth.security.scope.DataScopeIntegrationTest.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.client.DingTalkAuthClientTest.xml b/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.client.DingTalkAuthClientTest.xml
deleted file mode 100644
index 0dc21ab..0000000
--- a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.client.DingTalkAuthClientTest.xml
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.client.ThirdPartyAuthClientFactoryTest.xml b/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.client.ThirdPartyAuthClientFactoryTest.xml
deleted file mode 100644
index 6a6515f..0000000
--- a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.client.ThirdPartyAuthClientFactoryTest.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.AuthServiceImplTest.xml b/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.AuthServiceImplTest.xml
deleted file mode 100644
index edb82e0..0000000
--- a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.AuthServiceImplTest.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.AuthUserServiceImplTest.xml b/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.AuthUserServiceImplTest.xml
deleted file mode 100644
index 8be2092..0000000
--- a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.AuthUserServiceImplTest.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.SysDeptServiceImplTest.xml b/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.SysDeptServiceImplTest.xml
deleted file mode 100644
index f300687..0000000
--- a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.SysDeptServiceImplTest.xml
+++ /dev/null
@@ -1,69 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.UserListIntegrationTest.xml b/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.UserListIntegrationTest.xml
deleted file mode 100644
index ebd1666..0000000
--- a/crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.UserListIntegrationTest.xml
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/crm-auth/target/surefire-reports/com.crm.auth.security.scope.DataScopeIntegrationTest.txt b/crm-auth/target/surefire-reports/com.crm.auth.security.scope.DataScopeIntegrationTest.txt
deleted file mode 100644
index cac32d9..0000000
--- a/crm-auth/target/surefire-reports/com.crm.auth.security.scope.DataScopeIntegrationTest.txt
+++ /dev/null
@@ -1,4 +0,0 @@
--------------------------------------------------------------------------------
-Test set: com.crm.auth.security.scope.DataScopeIntegrationTest
--------------------------------------------------------------------------------
-Tests run: 28, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 3.906 s -- in com.crm.auth.security.scope.DataScopeIntegrationTest
diff --git a/crm-auth/target/surefire-reports/com.crm.auth.service.client.DingTalkAuthClientTest.txt b/crm-auth/target/surefire-reports/com.crm.auth.service.client.DingTalkAuthClientTest.txt
deleted file mode 100644
index 704132c..0000000
--- a/crm-auth/target/surefire-reports/com.crm.auth.service.client.DingTalkAuthClientTest.txt
+++ /dev/null
@@ -1,4 +0,0 @@
--------------------------------------------------------------------------------
-Test set: com.crm.auth.service.client.DingTalkAuthClientTest
--------------------------------------------------------------------------------
-Tests run: 15, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.749 s -- in com.crm.auth.service.client.DingTalkAuthClientTest
diff --git a/crm-auth/target/surefire-reports/com.crm.auth.service.client.ThirdPartyAuthClientFactoryTest.txt b/crm-auth/target/surefire-reports/com.crm.auth.service.client.ThirdPartyAuthClientFactoryTest.txt
deleted file mode 100644
index e7e5ac1..0000000
--- a/crm-auth/target/surefire-reports/com.crm.auth.service.client.ThirdPartyAuthClientFactoryTest.txt
+++ /dev/null
@@ -1,4 +0,0 @@
--------------------------------------------------------------------------------
-Test set: com.crm.auth.service.client.ThirdPartyAuthClientFactoryTest
--------------------------------------------------------------------------------
-Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 s -- in com.crm.auth.service.client.ThirdPartyAuthClientFactoryTest
diff --git a/crm-auth/target/surefire-reports/com.crm.auth.service.impl.AuthServiceImplTest.txt b/crm-auth/target/surefire-reports/com.crm.auth.service.impl.AuthServiceImplTest.txt
deleted file mode 100644
index f56ace5..0000000
--- a/crm-auth/target/surefire-reports/com.crm.auth.service.impl.AuthServiceImplTest.txt
+++ /dev/null
@@ -1,4 +0,0 @@
--------------------------------------------------------------------------------
-Test set: com.crm.auth.service.impl.AuthServiceImplTest
--------------------------------------------------------------------------------
-Tests run: 9, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.025 s -- in com.crm.auth.service.impl.AuthServiceImplTest
diff --git a/crm-auth/target/surefire-reports/com.crm.auth.service.impl.AuthUserServiceImplTest.txt b/crm-auth/target/surefire-reports/com.crm.auth.service.impl.AuthUserServiceImplTest.txt
deleted file mode 100644
index bf7b302..0000000
--- a/crm-auth/target/surefire-reports/com.crm.auth.service.impl.AuthUserServiceImplTest.txt
+++ /dev/null
@@ -1,4 +0,0 @@
--------------------------------------------------------------------------------
-Test set: com.crm.auth.service.impl.AuthUserServiceImplTest
--------------------------------------------------------------------------------
-Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.336 s -- in com.crm.auth.service.impl.AuthUserServiceImplTest
diff --git a/crm-auth/target/surefire-reports/com.crm.auth.service.impl.SysDeptServiceImplTest.txt b/crm-auth/target/surefire-reports/com.crm.auth.service.impl.SysDeptServiceImplTest.txt
deleted file mode 100644
index 85d71f9..0000000
--- a/crm-auth/target/surefire-reports/com.crm.auth.service.impl.SysDeptServiceImplTest.txt
+++ /dev/null
@@ -1,4 +0,0 @@
--------------------------------------------------------------------------------
-Test set: com.crm.auth.service.impl.SysDeptServiceImplTest
--------------------------------------------------------------------------------
-Tests run: 9, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.119 s -- in com.crm.auth.service.impl.SysDeptServiceImplTest
diff --git a/crm-auth/target/surefire-reports/com.crm.auth.service.impl.UserListIntegrationTest.txt b/crm-auth/target/surefire-reports/com.crm.auth.service.impl.UserListIntegrationTest.txt
deleted file mode 100644
index b49d493..0000000
--- a/crm-auth/target/surefire-reports/com.crm.auth.service.impl.UserListIntegrationTest.txt
+++ /dev/null
@@ -1,4 +0,0 @@
--------------------------------------------------------------------------------
-Test set: com.crm.auth.service.impl.UserListIntegrationTest
--------------------------------------------------------------------------------
-Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.532 s -- in com.crm.auth.service.impl.UserListIntegrationTest
diff --git a/crm-auth/target/test-classes/com/crm/auth/security/scope/DataScopeIntegrationTest$DeptQueryCounter.class b/crm-auth/target/test-classes/com/crm/auth/security/scope/DataScopeIntegrationTest$DeptQueryCounter.class
deleted file mode 100644
index 83f78ef..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/security/scope/DataScopeIntegrationTest$DeptQueryCounter.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/security/scope/DataScopeIntegrationTest.class b/crm-auth/target/test-classes/com/crm/auth/security/scope/DataScopeIntegrationTest.class
deleted file mode 100644
index ee4b268..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/security/scope/DataScopeIntegrationTest.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/security/scope/TestOwnedData.class b/crm-auth/target/test-classes/com/crm/auth/security/scope/TestOwnedData.class
deleted file mode 100644
index 6bb133f..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/security/scope/TestOwnedData.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/security/scope/TestOwnedDataMapper.class b/crm-auth/target/test-classes/com/crm/auth/security/scope/TestOwnedDataMapper.class
deleted file mode 100644
index 6d0b7ab..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/security/scope/TestOwnedDataMapper.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/service/client/DingTalkAuthClientTest$StubbedClient.class b/crm-auth/target/test-classes/com/crm/auth/service/client/DingTalkAuthClientTest$StubbedClient.class
deleted file mode 100644
index edcb1b7..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/service/client/DingTalkAuthClientTest$StubbedClient.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/service/client/DingTalkAuthClientTest.class b/crm-auth/target/test-classes/com/crm/auth/service/client/DingTalkAuthClientTest.class
deleted file mode 100644
index a3376af..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/service/client/DingTalkAuthClientTest.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/service/client/ThirdPartyAuthClientFactoryTest$StubClient.class b/crm-auth/target/test-classes/com/crm/auth/service/client/ThirdPartyAuthClientFactoryTest$StubClient.class
deleted file mode 100644
index 88c6982..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/service/client/ThirdPartyAuthClientFactoryTest$StubClient.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/service/client/ThirdPartyAuthClientFactoryTest.class b/crm-auth/target/test-classes/com/crm/auth/service/client/ThirdPartyAuthClientFactoryTest.class
deleted file mode 100644
index 919844c..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/service/client/ThirdPartyAuthClientFactoryTest.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/service/impl/AuthServiceImplTest.class b/crm-auth/target/test-classes/com/crm/auth/service/impl/AuthServiceImplTest.class
deleted file mode 100644
index acd7acd..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/service/impl/AuthServiceImplTest.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/service/impl/AuthUserServiceImplTest.class b/crm-auth/target/test-classes/com/crm/auth/service/impl/AuthUserServiceImplTest.class
deleted file mode 100644
index fb08e87..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/service/impl/AuthUserServiceImplTest.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/service/impl/SysDeptServiceImplTest.class b/crm-auth/target/test-classes/com/crm/auth/service/impl/SysDeptServiceImplTest.class
deleted file mode 100644
index b4c01bc..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/service/impl/SysDeptServiceImplTest.class and /dev/null differ
diff --git a/crm-auth/target/test-classes/com/crm/auth/service/impl/UserListIntegrationTest.class b/crm-auth/target/test-classes/com/crm/auth/service/impl/UserListIntegrationTest.class
deleted file mode 100644
index 7c2eb24..0000000
Binary files a/crm-auth/target/test-classes/com/crm/auth/service/impl/UserListIntegrationTest.class and /dev/null differ
diff --git a/crm-base/src/main/java/com/crm/base/advice/GlobalDataBindingAdvice.java b/crm-base/src/main/java/com/crm/base/advice/GlobalDataBindingAdvice.java
new file mode 100644
index 0000000..cee8c17
--- /dev/null
+++ b/crm-base/src/main/java/com/crm/base/advice/GlobalDataBindingAdvice.java
@@ -0,0 +1,32 @@
+package com.crm.base.advice;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.InitBinder;
+
+/**
+ * 全局数据绑定防护(mass assignment 防御)
+ *
通过 {@link WebDataBinder#setDisallowedFields(String...)} 在入参侧全局 strip
+ * 服务端裁定字段,防止客户端通过表单伪造 createTime / updateTime / creatorId / updaterId /
+ * deleted / builtin(ADR-0017 Route A 安全替代)
+ * DTO 上有 createTime / updateTime(出参展示用),但绑定器拒绝从表单填入。
+ * Spring 对目标类上不存在的字段会静默跳过,所以全局列表不会引发绑定错误。
+ * 新增服务端裁定字段时必须同步更新 {@link #DISALLOWED_FIELDS} 列表。
+ *
+ * @see com.crm.base.domain.dto.BaseDTO
+ */
+@Slf4j
+@ControllerAdvice
+public class GlobalDataBindingAdvice {
+
+ /** 服务端裁定字段,禁止客户端通过表单写入 */
+ private static final String[] DISALLOWED_FIELDS = {
+ "createTime", "updateTime", "creatorId", "updaterId", "deleted", "builtin"
+ };
+
+ @InitBinder
+ public void disallowServerManagedFields(WebDataBinder binder) {
+ binder.setDisallowedFields(DISALLOWED_FIELDS);
+ }
+}
diff --git a/crm-base/src/test/java/com/crm/base/advice/GlobalDataBindingAdviceTest.java b/crm-base/src/test/java/com/crm/base/advice/GlobalDataBindingAdviceTest.java
new file mode 100644
index 0000000..f31d37f
--- /dev/null
+++ b/crm-base/src/test/java/com/crm/base/advice/GlobalDataBindingAdviceTest.java
@@ -0,0 +1,107 @@
+package com.crm.base.advice;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.web.bind.WebDataBinder;
+
+import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * 全局 mass assignment 防护测试(ADR-0017 ticket 02)
+ *
+ * 验证 {@link GlobalDataBindingAdvice#disallowServerManagedFields(WebDataBinder)}
+ * 配置的 {@code setDisallowedFields} 列表能正确 strip 服务端裁定字段,
+ * 同时不影响正常字段的绑定。
+ */
+class GlobalDataBindingAdviceTest {
+
+ /** 测试用 DTO,含一个服务端裁定字段(createTime)和一个正常字段(builtin)和一个普通字段(name) */
+ static class TestDTO {
+ private Long id;
+ private String name;
+ private LocalDateTime createTime;
+ private Boolean builtin;
+
+ public Long getId() { return id; }
+ public void setId(Long id) { this.id = id; }
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ public LocalDateTime getCreateTime() { return createTime; }
+ public void setCreateTime(LocalDateTime createTime) { this.createTime = createTime; }
+ public Boolean getBuiltin() { return builtin; }
+ public void setBuiltin(Boolean builtin) { this.builtin = builtin; }
+ }
+
+ private TestDTO bind(Map form) {
+ TestDTO target = new TestDTO();
+ WebDataBinder binder = new WebDataBinder(target);
+ // 模拟 @ControllerAdvice 的 @InitBinder 行为
+ new GlobalDataBindingAdvice().disallowServerManagedFields(binder);
+ binder.bind(new org.springframework.beans.MutablePropertyValues(form));
+ return target;
+ }
+
+ @Test
+ @DisplayName("提交 createTime 被 strip,DTO 上为 null")
+ void createTimeStripped() {
+ Map form = new HashMap<>();
+ form.put("name", "测试角色");
+ form.put("createTime", "2026-01-01T00:00:00");
+
+ TestDTO dto = bind(form);
+
+ assertEquals("测试角色", dto.getName());
+ assertNull(dto.getCreateTime(), "createTime 应被 InitBinder strip");
+ }
+
+ @Test
+ @DisplayName("提交 builtin=true 被 strip,DTO 上为 null")
+ void builtinStripped() {
+ Map form = new HashMap<>();
+ form.put("name", "测试角色");
+ form.put("builtin", "true");
+
+ TestDTO dto = bind(form);
+
+ assertEquals("测试角色", dto.getName());
+ assertNull(dto.getBuiltin(), "builtin 应被 InitBinder strip");
+ }
+
+ @Test
+ @DisplayName("不包含服务端裁定字段的正常表单提交不受影响")
+ void normalSubmissionUnaffected() {
+ Map form = new HashMap<>();
+ form.put("id", "123");
+ form.put("name", "正常角色");
+
+ TestDTO dto = bind(form);
+
+ assertEquals(123L, dto.getId());
+ assertEquals("正常角色", dto.getName());
+ assertNull(dto.getCreateTime());
+ assertNull(dto.getBuiltin());
+ }
+
+ @Test
+ @DisplayName("全部 6 个服务端裁定字段同时提交均被 strip")
+ void allDisallowedFieldsStripped() {
+ Map form = new HashMap<>();
+ form.put("name", "测试");
+ form.put("createTime", "2026-01-01T00:00:00");
+ form.put("updateTime", "2026-01-02T00:00:00");
+ form.put("creatorId", "fake-user");
+ form.put("updaterId", "fake-user");
+ form.put("deleted", "true");
+ form.put("builtin", "true");
+
+ TestDTO dto = bind(form);
+
+ assertEquals("测试", dto.getName(), "普通字段应正常绑定");
+ assertNull(dto.getCreateTime(), "createTime 应被 strip");
+ assertNull(dto.getBuiltin(), "builtin 应被 strip");
+ }
+}
diff --git a/crm-base/target/classes/com/crm/base/advice/GlobalExceptionHandlerAdvice.class b/crm-base/target/classes/com/crm/base/advice/GlobalExceptionHandlerAdvice.class
index ef17ef8..af4bb62 100644
Binary files a/crm-base/target/classes/com/crm/base/advice/GlobalExceptionHandlerAdvice.class and b/crm-base/target/classes/com/crm/base/advice/GlobalExceptionHandlerAdvice.class differ
diff --git a/crm-base/target/classes/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.class b/crm-base/target/classes/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.class
index e037d12..dd4849b 100644
Binary files a/crm-base/target/classes/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.class and b/crm-base/target/classes/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.class differ
diff --git a/crm-base/target/classes/com/crm/base/config/JacksonConfig.class b/crm-base/target/classes/com/crm/base/config/JacksonConfig.class
index 68e8169..6f87eef 100644
Binary files a/crm-base/target/classes/com/crm/base/config/JacksonConfig.class and b/crm-base/target/classes/com/crm/base/config/JacksonConfig.class differ
diff --git a/crm-base/target/classes/com/crm/base/config/MetaObjectFillHandler.class b/crm-base/target/classes/com/crm/base/config/MetaObjectFillHandler.class
index 975beae..f763747 100644
Binary files a/crm-base/target/classes/com/crm/base/config/MetaObjectFillHandler.class and b/crm-base/target/classes/com/crm/base/config/MetaObjectFillHandler.class differ
diff --git a/crm-base/target/classes/com/crm/base/config/MybatisPlusConfig.class b/crm-base/target/classes/com/crm/base/config/MybatisPlusConfig.class
index 7c825c1..d2c286f 100644
Binary files a/crm-base/target/classes/com/crm/base/config/MybatisPlusConfig.class and b/crm-base/target/classes/com/crm/base/config/MybatisPlusConfig.class differ
diff --git a/crm-base/target/classes/com/crm/base/config/ScheduledTaskProperties.class b/crm-base/target/classes/com/crm/base/config/ScheduledTaskProperties.class
index 5a87533..8471066 100644
Binary files a/crm-base/target/classes/com/crm/base/config/ScheduledTaskProperties.class and b/crm-base/target/classes/com/crm/base/config/ScheduledTaskProperties.class differ
diff --git a/crm-base/target/classes/com/crm/base/config/SnowflakeProperties.class b/crm-base/target/classes/com/crm/base/config/SnowflakeProperties.class
index 68e04de..1c8aab2 100644
Binary files a/crm-base/target/classes/com/crm/base/config/SnowflakeProperties.class and b/crm-base/target/classes/com/crm/base/config/SnowflakeProperties.class differ
diff --git a/crm-base/target/classes/com/crm/base/domain/dto/BaseDTO.class b/crm-base/target/classes/com/crm/base/domain/dto/BaseDTO.class
index 982bdcf..279b07f 100644
Binary files a/crm-base/target/classes/com/crm/base/domain/dto/BaseDTO.class and b/crm-base/target/classes/com/crm/base/domain/dto/BaseDTO.class differ
diff --git a/crm-base/target/classes/com/crm/base/domain/entity/BaseEntity.class b/crm-base/target/classes/com/crm/base/domain/entity/BaseEntity.class
index b28f6a1..96f141e 100644
Binary files a/crm-base/target/classes/com/crm/base/domain/entity/BaseEntity.class and b/crm-base/target/classes/com/crm/base/domain/entity/BaseEntity.class differ
diff --git a/crm-base/target/classes/com/crm/base/domain/entity/OwnedEntity.class b/crm-base/target/classes/com/crm/base/domain/entity/OwnedEntity.class
index 233da3a..6a5ca9c 100644
Binary files a/crm-base/target/classes/com/crm/base/domain/entity/OwnedEntity.class and b/crm-base/target/classes/com/crm/base/domain/entity/OwnedEntity.class differ
diff --git a/crm-base/target/classes/com/crm/base/domain/param/BaseParam.class b/crm-base/target/classes/com/crm/base/domain/param/BaseParam.class
index 10e18dd..e0f818a 100644
Binary files a/crm-base/target/classes/com/crm/base/domain/param/BaseParam.class and b/crm-base/target/classes/com/crm/base/domain/param/BaseParam.class differ
diff --git a/crm-base/target/classes/com/crm/base/domain/result/PageResult.class b/crm-base/target/classes/com/crm/base/domain/result/PageResult.class
index f6adffb..366aaef 100644
Binary files a/crm-base/target/classes/com/crm/base/domain/result/PageResult.class and b/crm-base/target/classes/com/crm/base/domain/result/PageResult.class differ
diff --git a/crm-base/target/classes/com/crm/base/security/DataOwnership.class b/crm-base/target/classes/com/crm/base/security/DataOwnership.class
index 7d36b5f..146f8f8 100644
Binary files a/crm-base/target/classes/com/crm/base/security/DataOwnership.class and b/crm-base/target/classes/com/crm/base/security/DataOwnership.class differ
diff --git a/crm-base/target/classes/com/crm/base/security/DataScopeHelper.class b/crm-base/target/classes/com/crm/base/security/DataScopeHelper.class
index cd6213a..0efb3ac 100644
Binary files a/crm-base/target/classes/com/crm/base/security/DataScopeHelper.class and b/crm-base/target/classes/com/crm/base/security/DataScopeHelper.class differ
diff --git a/crm-base/target/classes/com/crm/base/security/DataScopeLevel.class b/crm-base/target/classes/com/crm/base/security/DataScopeLevel.class
index 8d6e5ed..6b8c1e7 100644
Binary files a/crm-base/target/classes/com/crm/base/security/DataScopeLevel.class and b/crm-base/target/classes/com/crm/base/security/DataScopeLevel.class differ
diff --git a/crm-base/target/classes/com/crm/base/security/DataVisibility.class b/crm-base/target/classes/com/crm/base/security/DataVisibility.class
index d5e6837..b3df09b 100644
Binary files a/crm-base/target/classes/com/crm/base/security/DataVisibility.class and b/crm-base/target/classes/com/crm/base/security/DataVisibility.class differ
diff --git a/crm-base/target/classes/com/crm/base/utils/BeanCopyUtils.class b/crm-base/target/classes/com/crm/base/utils/BeanCopyUtils.class
index 8f38e7f..4e5821f 100644
Binary files a/crm-base/target/classes/com/crm/base/utils/BeanCopyUtils.class and b/crm-base/target/classes/com/crm/base/utils/BeanCopyUtils.class differ
diff --git a/crm-base/target/classes/com/crm/base/utils/ExcelUtil.class b/crm-base/target/classes/com/crm/base/utils/ExcelUtil.class
index 7f4db4d..627d31f 100644
Binary files a/crm-base/target/classes/com/crm/base/utils/ExcelUtil.class and b/crm-base/target/classes/com/crm/base/utils/ExcelUtil.class differ
diff --git a/crm-base/target/classes/com/crm/base/utils/TreeUtils.class b/crm-base/target/classes/com/crm/base/utils/TreeUtils.class
index 8ff4e4a..96ae1f2 100644
Binary files a/crm-base/target/classes/com/crm/base/utils/TreeUtils.class and b/crm-base/target/classes/com/crm/base/utils/TreeUtils.class differ
diff --git a/crm-base/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/crm-base/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
index 98ffc48..7b0fdcd 100644
--- a/crm-base/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
+++ b/crm-base/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -14,6 +14,7 @@ com\crm\base\security\DataScopeHelper.class
com\crm\base\mapper\CrmBaseMapper.class
com\crm\base\utils\BeanCopyUtils.class
com\crm\base\domain\enums\StatusEnum.class
+com\crm\base\advice\GlobalDataBindingAdvice.class
com\crm\base\config\MybatisPlusConfig.class
com\crm\base\domain\entity\BaseEntity.class
com\crm\base\config\CrmSqlInjector.class
diff --git a/crm-base/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/crm-base/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
index 5c9ad43..3f039e8 100644
--- a/crm-base/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
+++ b/crm-base/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -1,50 +1,51 @@
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\advice\GlobalExceptionHandlerAdvice.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\annotation\DataScope.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\CorsConfig.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\CrmSqlInjector.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\CustomIdGenerator.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\InsertBatchOnDuplicateKeyUpdate.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\JacksonConfig.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\Knife4jConfig.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\MetaObjectFillHandler.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\MybatisPlusConfig.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\RedisConfig.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\ScheduledTaskProperties.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\SnowflakeIdWorker.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\SnowflakeProperties.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\constant\CommonConstants.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\dto\BaseDTO.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\dto\ButtonSeed.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\dto\PermissionModuleDescriptor.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\entity\BaseEntity.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\entity\OwnedEntity.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\enums\HasValueEnum.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\enums\StatusEnum.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\exception\BusinessErrorException.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\exception\MissingParameterException.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\exception\PermissionErrorException.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\exception\ResourceNotExistException.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\param\BaseParam.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\result\PageResult.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\result\Result.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\result\ResultCodeEnum.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\filter\TraceIdFilter.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\mapper\CrmBaseMapper.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\DataOwnership.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\DataScopeHelper.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\DataScopeLevel.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\DataVisibility.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\DataVisibilityContext.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\LoginUser.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\SecurityUtils.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\VisibilityScope.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\service\IBaseService.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\service\impl\BaseServiceImpl.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\service\PermissionSeeder.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\AssertUtils.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\BeanCopyUtils.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\EnumUtils.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\ExcelUtil.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\PageConverter.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\ServletUtils.java
-D:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\TreeUtils.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\advice\GlobalDataBindingAdvice.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\advice\GlobalExceptionHandlerAdvice.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\annotation\DataScope.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\CorsConfig.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\CrmSqlInjector.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\CustomIdGenerator.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\InsertBatchOnDuplicateKeyUpdate.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\JacksonConfig.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\Knife4jConfig.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\MetaObjectFillHandler.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\MybatisPlusConfig.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\RedisConfig.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\ScheduledTaskProperties.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\SnowflakeIdWorker.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\config\SnowflakeProperties.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\constant\CommonConstants.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\dto\BaseDTO.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\dto\ButtonSeed.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\dto\PermissionModuleDescriptor.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\entity\BaseEntity.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\entity\OwnedEntity.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\enums\HasValueEnum.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\enums\StatusEnum.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\exception\BusinessErrorException.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\exception\MissingParameterException.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\exception\PermissionErrorException.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\exception\ResourceNotExistException.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\param\BaseParam.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\result\PageResult.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\result\Result.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\domain\result\ResultCodeEnum.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\filter\TraceIdFilter.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\mapper\CrmBaseMapper.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\DataOwnership.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\DataScopeHelper.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\DataScopeLevel.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\DataVisibility.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\DataVisibilityContext.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\LoginUser.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\SecurityUtils.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\security\VisibilityScope.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\service\IBaseService.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\service\impl\BaseServiceImpl.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\service\PermissionSeeder.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\AssertUtils.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\BeanCopyUtils.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\EnumUtils.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\ExcelUtil.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\PageConverter.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\ServletUtils.java
+E:\code\crm-backend-matt\crm-base\src\main\java\com\crm\base\utils\TreeUtils.java
diff --git a/crm-base/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/crm-base/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
index b043589..1a2614f 100644
--- a/crm-base/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
+++ b/crm-base/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
@@ -1 +1,3 @@
+com\crm\base\advice\GlobalDataBindingAdviceTest$TestDTO.class
+com\crm\base\advice\GlobalDataBindingAdviceTest.class
com\crm\base\security\DataVisibilityTest.class
diff --git a/crm-base/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/crm-base/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
index ee6d61d..6c99e0a 100644
--- a/crm-base/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
+++ b/crm-base/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
@@ -1 +1,2 @@
-D:\code\crm-backend-matt\crm-base\src\test\java\com\crm\base\security\DataVisibilityTest.java
+E:\code\crm-backend-matt\crm-base\src\test\java\com\crm\base\advice\GlobalDataBindingAdviceTest.java
+E:\code\crm-backend-matt\crm-base\src\test\java\com\crm\base\security\DataVisibilityTest.java
diff --git a/crm-base/target/surefire-reports/TEST-com.crm.base.security.DataVisibilityTest.xml b/crm-base/target/surefire-reports/TEST-com.crm.base.security.DataVisibilityTest.xml
index 429f1b2..3fb3ce9 100644
--- a/crm-base/target/surefire-reports/TEST-com.crm.base.security.DataVisibilityTest.xml
+++ b/crm-base/target/surefire-reports/TEST-com.crm.base.security.DataVisibilityTest.xml
@@ -1,77 +1,81 @@
-
+
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
-
+
+
+
-
-
+
+
+
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
+
-
-
-
+
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+testsuite>
\ No newline at end of file
diff --git a/crm-base/target/surefire-reports/com.crm.base.security.DataVisibilityTest.txt b/crm-base/target/surefire-reports/com.crm.base.security.DataVisibilityTest.txt
index 00789a0..abbe7e7 100644
--- a/crm-base/target/surefire-reports/com.crm.base.security.DataVisibilityTest.txt
+++ b/crm-base/target/surefire-reports/com.crm.base.security.DataVisibilityTest.txt
@@ -1,4 +1,4 @@
-------------------------------------------------------------------------------
Test set: com.crm.base.security.DataVisibilityTest
-------------------------------------------------------------------------------
-Tests run: 17, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.198 s -- in com.crm.base.security.DataVisibilityTest
+Tests run: 17, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.060 s -- in com.crm.base.security.DataVisibilityTest
diff --git a/crm-base/target/test-classes/com/crm/base/security/DataVisibilityTest.class b/crm-base/target/test-classes/com/crm/base/security/DataVisibilityTest.class
index f11a7a8..040328c 100644
Binary files a/crm-base/target/test-classes/com/crm/base/security/DataVisibilityTest.class and b/crm-base/target/test-classes/com/crm/base/security/DataVisibilityTest.class differ
diff --git a/crm-dict/src/main/java/com/crm/dict/controller/DictGroupController.java b/crm-dict/src/main/java/com/crm/dict/controller/DictGroupController.java
index 32c9a26..310fe85 100644
--- a/crm-dict/src/main/java/com/crm/dict/controller/DictGroupController.java
+++ b/crm-dict/src/main/java/com/crm/dict/controller/DictGroupController.java
@@ -3,8 +3,7 @@ package com.crm.dict.controller;
import com.crm.base.domain.result.PageResult;
import com.crm.base.domain.result.Result;
import com.crm.dict.constant.DictConstants;
-import com.crm.dict.domain.dto.DictGroupVO;
-import com.crm.dict.domain.entity.DictGroup;
+import com.crm.dict.domain.dto.DictGroupDTO;
import com.crm.dict.domain.param.GroupPageParam;
import com.crm.dict.service.IDictGroupService;
import io.swagger.v3.oas.annotations.Operation;
@@ -33,15 +32,15 @@ public class DictGroupController {
@Operation(summary = "分组分页(keyword 匹配名称/编码,status 筛选)")
@PreAuthorize("hasAuthority('" + DictConstants.PERM_GROUP_LIST + "')")
@PostMapping("/page")
- public Result> page(GroupPageParam param) {
+ public Result> page(GroupPageParam param) {
return Result.success(dictGroupService.pageGroups(param));
}
@Operation(summary = "新建/编辑分组(新建编码必填;编辑时编码/内置标记/状态只读)")
@PreAuthorize("hasAuthority('" + DictConstants.PERM_GROUP_SAVE + "')")
@PostMapping("/saveOrUpdate")
- public Result saveOrUpdate(DictGroup group) {
- dictGroupService.saveGroup(group);
+ public Result saveOrUpdate(DictGroupDTO dto) {
+ dictGroupService.saveGroup(dto);
return Result.success();
}
@@ -64,7 +63,7 @@ public class DictGroupController {
@Operation(summary = "启用分组列表(新建字典项选分组用)")
@PreAuthorize("hasAuthority('" + DictConstants.PERM_GROUP_LIST + "')")
@GetMapping("/enabled-list")
- public Result> enabledList() {
+ public Result> enabledList() {
return Result.success(dictGroupService.listEnabled());
}
}
diff --git a/crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java b/crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java
index 8ca736e..2e2809c 100644
--- a/crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java
+++ b/crm-dict/src/main/java/com/crm/dict/controller/DictItemController.java
@@ -3,8 +3,7 @@ package com.crm.dict.controller;
import com.crm.base.domain.result.PageResult;
import com.crm.base.domain.result.Result;
import com.crm.dict.constant.DictConstants;
-import com.crm.dict.domain.dto.DictItemVO;
-import com.crm.dict.domain.entity.DictItem;
+import com.crm.dict.domain.dto.DictItemDTO;
import com.crm.dict.domain.param.ItemPageParam;
import com.crm.dict.service.DictQueryService;
import com.crm.dict.service.IDictItemService;
@@ -35,15 +34,15 @@ public class DictItemController {
@Operation(summary = "字典项分页(groupId/keyword/status 筛选,附带默认/引用/有效可选标记)")
@PreAuthorize("hasAuthority('" + DictConstants.PERM_ITEM_LIST + "')")
@PostMapping("/page")
- public Result> page(ItemPageParam param) {
+ public Result> page(ItemPageParam param) {
return Result.success(dictItemService.pageItems(param));
}
@Operation(summary = "新建/编辑字典项(新建编码空自动生成;分组/编码创建后只读;值被引用后只读)")
@PreAuthorize("hasAuthority('" + DictConstants.PERM_ITEM_SAVE + "')")
@PostMapping("/saveOrUpdate")
- public Result saveOrUpdate(DictItem item) {
- dictItemService.saveItem(item);
+ public Result saveOrUpdate(DictItemDTO dto) {
+ dictItemService.saveItem(dto);
return Result.success();
}
@@ -83,7 +82,7 @@ public class DictItemController {
@Operation(summary = "某分组启用项列表(业务选择器渲染用,走 10s 本地缓存)")
@PreAuthorize("hasAuthority('" + DictConstants.PERM_ITEM_LIST + "')")
@GetMapping("/enabled-list")
- public Result> enabledList(@RequestParam("groupCode") String groupCode) {
+ public Result> enabledList(@RequestParam("groupCode") String groupCode) {
return Result.success(dictQueryService.listEnabledItems(groupCode));
}
}
diff --git a/crm-dict/src/main/java/com/crm/dict/domain/dto/DictGroupDTO.java b/crm-dict/src/main/java/com/crm/dict/domain/dto/DictGroupDTO.java
new file mode 100644
index 0000000..4f88a95
--- /dev/null
+++ b/crm-dict/src/main/java/com/crm/dict/domain/dto/DictGroupDTO.java
@@ -0,0 +1,50 @@
+package com.crm.dict.domain.dto;
+
+import com.crm.base.domain.dto.BaseDTO;
+import com.crm.dict.domain.entity.DictGroup;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 字典分组传输对象(写入参 + 出参双向,ADR-0017 Route A)
+ * 继承 {@link BaseDTO} 白拿 id/createTime/updateTime;
+ * builtin 由全局 @InitBinder 在入参侧 strip,出参侧展示原值
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DictGroupDTO extends BaseDTO {
+
+ private String name;
+
+ private String code;
+
+ private Integer sortNo;
+
+ private Integer status;
+
+ private String description;
+
+ private Boolean builtin;
+
+ @Schema(description = "分组下未删除的字典项数量(含启用+停用)")
+ private Long itemCount;
+
+ /**
+ * Entity → DTO(出参转换,Service 层调用)
+ */
+ public static DictGroupDTO fromEntity(DictGroup entity) {
+ DictGroupDTO dto = new DictGroupDTO();
+ org.springframework.beans.BeanUtils.copyProperties(entity, dto);
+ return dto;
+ }
+
+ /**
+ * DTO → Entity(入参转换,Service 层调用)
+ */
+ public DictGroup toEntity() {
+ DictGroup entity = new DictGroup();
+ org.springframework.beans.BeanUtils.copyProperties(this, entity);
+ return entity;
+ }
+}
diff --git a/crm-dict/src/main/java/com/crm/dict/domain/dto/DictGroupVO.java b/crm-dict/src/main/java/com/crm/dict/domain/dto/DictGroupVO.java
deleted file mode 100644
index 8d127af..0000000
--- a/crm-dict/src/main/java/com/crm/dict/domain/dto/DictGroupVO.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.crm.dict.domain.dto;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-/**
- * 字典分组视图对象:分页列表展示用
- * 独立字段(不继承实体),只暴露前端需要的业务字段 + createTime,
- * 排除审计字段(creatorId/updaterId/updateTime/deleted)和软删内部字段(deleteKey)。
- */
-@Data
-public class DictGroupVO {
-
- private Long id;
-
- private String name;
-
- private String code;
-
- private Integer sortNo;
-
- private Integer status;
-
- private String description;
-
- private Boolean builtin;
-
- private LocalDateTime createTime;
-
- @Schema(description = "分组下未删除的字典项数量(含启用+停用)")
- private Long itemCount;
-}
diff --git a/crm-dict/src/main/java/com/crm/dict/domain/dto/DictItemDTO.java b/crm-dict/src/main/java/com/crm/dict/domain/dto/DictItemDTO.java
new file mode 100644
index 0000000..dbac985
--- /dev/null
+++ b/crm-dict/src/main/java/com/crm/dict/domain/dto/DictItemDTO.java
@@ -0,0 +1,65 @@
+package com.crm.dict.domain.dto;
+
+import com.crm.base.domain.dto.BaseDTO;
+import com.crm.dict.domain.entity.DictItem;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 字典项传输对象(写入参 + 出参双向,ADR-0017 Route A)
+ * 继承 {@link BaseDTO} 白拿 id/createTime/updateTime;
+ * builtin 由全局 @InitBinder 在入参侧 strip,出参侧展示原值
+ * referenced 读实时引用计数(绝不进缓存);effectiveSelectable 供前端对
+ * "自身启用但所属分组已停用"的失活项做视觉标记
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class DictItemDTO extends BaseDTO {
+
+ private Long groupId;
+
+ private String name;
+
+ private String code;
+
+ private String value;
+
+ private Integer sortNo;
+
+ private Integer status;
+
+ private String description;
+
+ private Boolean builtin;
+
+ @Schema(description = "所属分组名称")
+ private String groupName;
+
+ @Schema(description = "是否为分组默认项")
+ private Boolean isDefault;
+
+ @Schema(description = "是否被业务引用(实时计数)")
+ private Boolean referenced;
+
+ @Schema(description = "是否有效可选(分组与项均启用)")
+ private Boolean effectiveSelectable;
+
+ /**
+ * Entity → DTO(出参转换,Service 层调用)
+ */
+ public static DictItemDTO fromEntity(DictItem entity) {
+ DictItemDTO dto = new DictItemDTO();
+ org.springframework.beans.BeanUtils.copyProperties(entity, dto);
+ return dto;
+ }
+
+ /**
+ * DTO → Entity(入参转换,Service 层调用)
+ */
+ public DictItem toEntity() {
+ DictItem entity = new DictItem();
+ org.springframework.beans.BeanUtils.copyProperties(this, entity);
+ return entity;
+ }
+}
diff --git a/crm-dict/src/main/java/com/crm/dict/domain/dto/DictItemVO.java b/crm-dict/src/main/java/com/crm/dict/domain/dto/DictItemVO.java
deleted file mode 100644
index 524d088..0000000
--- a/crm-dict/src/main/java/com/crm/dict/domain/dto/DictItemVO.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package com.crm.dict.domain.dto;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-/**
- * 字典项视图对象:分页列表展示用
- * referenced 读实时引用计数(绝不进缓存);effectiveSelectable 供前端对
- * "自身启用但所属分组已停用"的失活项做视觉标记。
- * 独立字段(不继承实体),只暴露前端需要的业务字段 + createTime,
- * 排除审计字段(creatorId/updaterId/updateTime/deleted)和软删内部字段(deleteKey)。
- */
-@Data
-public class DictItemVO {
-
- private Long id;
-
- private Long groupId;
-
- private String name;
-
- private String code;
-
- private String value;
-
- private Integer sortNo;
-
- private Integer status;
-
- private String description;
-
- private Boolean builtin;
-
- private LocalDateTime createTime;
-
- @Schema(description = "所属分组名称")
- private String groupName;
-
- @Schema(description = "是否为分组默认项")
- private Boolean isDefault;
-
- @Schema(description = "是否被业务引用(实时计数)")
- private Boolean referenced;
-
- @Schema(description = "是否有效可选(分组与项均启用)")
- private Boolean effectiveSelectable;
-}
diff --git a/crm-dict/src/main/java/com/crm/dict/service/DictQueryService.java b/crm-dict/src/main/java/com/crm/dict/service/DictQueryService.java
index c99d833..b69a807 100644
--- a/crm-dict/src/main/java/com/crm/dict/service/DictQueryService.java
+++ b/crm-dict/src/main/java/com/crm/dict/service/DictQueryService.java
@@ -1,5 +1,6 @@
package com.crm.dict.service;
+import com.crm.dict.domain.dto.DictItemDTO;
import com.crm.dict.domain.entity.DictItem;
import java.util.List;
@@ -8,7 +9,7 @@ import java.util.List;
* 字典读路径服务(业务模块读契约,ADR-0015)
* 带 Caffeine 本地缓存:10s TTL 正结果 + 2s 空结果防穿透,扛高频读;
* 变更写入不主动 evict,接受多副本 10 秒最终一致。不含任何写方法。
- * 注意:本服务返回的实体是缓存快照(可能滞后 10s),只可用于渲染/校验;
+ *
注意:本服务返回的对象是缓存快照(可能滞后 10s),只可用于渲染/校验;
* 需要实时数据(如删除判定)请走 {@link DictReferenceService}。
*/
public interface DictQueryService {
@@ -22,7 +23,7 @@ public interface DictQueryService {
* 某分组下的启用字典项列表(业务选择器渲染用):只返回分组与项均启用的项;
* 分组不存在或分组停用时返回空列表,按 sort_no 排序(空排最后)
*/
- List listEnabledItems(String groupCode);
+ List listEnabledItems(String groupCode);
/**
* 分组当前默认项:联查 group.status,分组停用(休眠)或未设默认时返回 null
diff --git a/crm-dict/src/main/java/com/crm/dict/service/IDictGroupService.java b/crm-dict/src/main/java/com/crm/dict/service/IDictGroupService.java
index 8be532d..dfdb8ca 100644
--- a/crm-dict/src/main/java/com/crm/dict/service/IDictGroupService.java
+++ b/crm-dict/src/main/java/com/crm/dict/service/IDictGroupService.java
@@ -2,7 +2,7 @@ package com.crm.dict.service;
import com.crm.base.domain.result.PageResult;
import com.crm.base.service.IBaseService;
-import com.crm.dict.domain.dto.DictGroupVO;
+import com.crm.dict.domain.dto.DictGroupDTO;
import com.crm.dict.domain.entity.DictGroup;
import com.crm.dict.domain.param.GroupPageParam;
@@ -16,13 +16,13 @@ public interface IDictGroupService extends IBaseService {
/**
* 分组分页(keyword 匹配名称/编码;status 筛选;itemCount 一次聚合查询)
*/
- PageResult pageGroups(GroupPageParam param);
+ PageResult pageGroups(GroupPageParam param);
/**
* 新建/编辑分组:新建编码必填且全局唯一、builtin 强制 false、status 默认启用;
* 编辑时编码/builtin/status 保留原值(编码创建后不可改,启停走独立端点)
*/
- void saveGroup(DictGroup group);
+ void saveGroup(DictGroupDTO dto);
/**
* 删除分组:builtin 阻断;分组下仍有未删除字典项则阻断;软删除 + 复用键
@@ -37,5 +37,5 @@ public interface IDictGroupService extends IBaseService {
/**
* 启用分组列表(新建字典项选分组用),按 sort_no 排序
*/
- List listEnabled();
+ List listEnabled();
}
diff --git a/crm-dict/src/main/java/com/crm/dict/service/IDictItemService.java b/crm-dict/src/main/java/com/crm/dict/service/IDictItemService.java
index d4f2e5f..875d41b 100644
--- a/crm-dict/src/main/java/com/crm/dict/service/IDictItemService.java
+++ b/crm-dict/src/main/java/com/crm/dict/service/IDictItemService.java
@@ -2,7 +2,7 @@ package com.crm.dict.service;
import com.crm.base.domain.result.PageResult;
import com.crm.base.service.IBaseService;
-import com.crm.dict.domain.dto.DictItemVO;
+import com.crm.dict.domain.dto.DictItemDTO;
import com.crm.dict.domain.entity.DictItem;
import com.crm.dict.domain.param.ItemPageParam;
@@ -14,13 +14,13 @@ public interface IDictItemService extends IBaseService {
/**
* 字典项分页(groupId/keyword/status 筛选;附带 groupName/isDefault/referenced/effectiveSelectable)
*/
- PageResult pageItems(ItemPageParam param);
+ PageResult pageItems(ItemPageParam param);
/**
* 新建/编辑字典项:新建时分组必选且须启用、编码空则自动生成 dict_+32位hex、组内唯一、
* 同事务预建引用计数行;编辑时分组/编码只读、被引用后字典值只读、builtin/status 保留原值
*/
- void saveItem(DictItem item);
+ void saveItem(DictItemDTO dto);
/**
* 删除字典项:builtin 阻断;被引用阻断;软删除 + 复用键,同事务清默认项记录与引用计数行
diff --git a/crm-dict/src/main/java/com/crm/dict/service/impl/DictGroupServiceImpl.java b/crm-dict/src/main/java/com/crm/dict/service/impl/DictGroupServiceImpl.java
index ee3d5ca..879f142 100644
--- a/crm-dict/src/main/java/com/crm/dict/service/impl/DictGroupServiceImpl.java
+++ b/crm-dict/src/main/java/com/crm/dict/service/impl/DictGroupServiceImpl.java
@@ -12,7 +12,7 @@ import com.crm.base.domain.result.PageResult;
import com.crm.base.service.impl.BaseServiceImpl;
import com.crm.base.utils.PageConverter;
import com.crm.dict.constant.DictConstants;
-import com.crm.dict.domain.dto.DictGroupVO;
+import com.crm.dict.domain.dto.DictGroupDTO;
import com.crm.dict.domain.entity.DictGroup;
import com.crm.dict.domain.entity.DictGroupDefault;
import com.crm.dict.domain.entity.DictItem;
@@ -44,7 +44,7 @@ public class DictGroupServiceImpl extends BaseServiceImpl pageGroups(GroupPageParam param) {
+ public PageResult pageGroups(GroupPageParam param) {
// 分组分页排序固定:sort_no 空排最后、再按创建时间;不支持前端自定义排序(spec 端点表)
param.setOrderBy(null);
param.setAsc(null);
@@ -57,24 +57,21 @@ public class DictGroupServiceImpl extends BaseServiceImpl result = new PageResult<>(page)
- .convert(g -> g.toDTO(DictGroupVO::new));
+ PageResult result = new PageResult<>(page)
+ .convert(DictGroupDTO::fromEntity);
fillItemCount(result.getContent());
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
- public void saveGroup(DictGroup group) {
- if (group == null) {
+ public void saveGroup(DictGroupDTO dto) {
+ if (dto == null) {
throw new BusinessErrorException(DictConstants.CODE_DICT_INVALID, "请求参数缺失");
}
- // 审计字段由框架 strictInsertFill/strictUpdateFill 自动填充(仅 null 时填充),
- // 客户端传入的审计值不可信且会被保留,统一清空防止伪造
- group.setCreateTime(null);
- group.setUpdateTime(null);
- group.setCreatorId(null);
- group.setUpdaterId(null);
+ DictGroup group = dto.toEntity();
+ // 审计字段(createTime/updateTime/creatorId/updaterId/deleted/builtin)
+ // 由全局 @InitBinder 在入参侧 strip,此处不再手工清空
if (StrUtil.isBlank(group.getName())) {
throw new BusinessErrorException(DictConstants.CODE_DICT_INVALID, "分组名称不能为空");
}
@@ -96,7 +93,7 @@ public class DictGroupServiceImpl extends BaseServiceImpl listEnabled() {
+ public List listEnabled() {
return this.lambdaQuery()
.eq(DictGroup::getStatus, DictConstants.STATUS_ENABLED)
.last("ORDER BY sort_no IS NULL, sort_no ASC, create_time ASC")
- .list();
+ .list().stream()
+ .map(DictGroupDTO::fromEntity)
+ .collect(Collectors.toList());
}
/** 填充当前页各分组的字典项数量(一次聚合查询) */
- private void fillItemCount(List vos) {
+ private void fillItemCount(List vos) {
if (CollUtil.isEmpty(vos)) {
return;
}
- List ids = vos.stream().map(DictGroupVO::getId).collect(Collectors.toList());
+ List ids = vos.stream().map(DictGroupDTO::getId).collect(Collectors.toList());
List