Browse Source

commit

master
luoweijian 4 weeks ago
parent
commit
ffbbb73143
  1. 6
      crm-auth/src/main/java/com/crm/auth/controller/SystemController.java
  2. 14
      crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java
  3. 24
      crm-auth/src/main/java/com/crm/auth/service/IUserQueryService.java
  4. 187
      crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java
  5. 216
      crm-auth/src/main/java/com/crm/auth/service/impl/UserQueryServiceImpl.java
  6. 16
      crm-auth/src/test/java/com/crm/auth/service/impl/AuthUserServiceImplTest.java
  7. 34
      crm-auth/src/test/java/com/crm/auth/service/impl/UserListIntegrationTest.java
  8. BIN
      crm-auth/target/classes/com/crm/auth/AuthApplication.class
  9. BIN
      crm-auth/target/classes/com/crm/auth/config/AuthProperties$DingTalk.class
  10. BIN
      crm-auth/target/classes/com/crm/auth/config/AuthProperties$Jwt.class
  11. BIN
      crm-auth/target/classes/com/crm/auth/config/AuthProperties.class
  12. BIN
      crm-auth/target/classes/com/crm/auth/config/DataInitializer.class
  13. BIN
      crm-auth/target/classes/com/crm/auth/config/PermissionConfig.class
  14. BIN
      crm-auth/target/classes/com/crm/auth/config/SecurityConfig.class
  15. BIN
      crm-auth/target/classes/com/crm/auth/controller/AuthController.class
  16. BIN
      crm-auth/target/classes/com/crm/auth/controller/SystemController.class
  17. BIN
      crm-auth/target/classes/com/crm/auth/domain/dto/LoginResultDTO.class
  18. BIN
      crm-auth/target/classes/com/crm/auth/domain/dto/UserInfoDTO.class
  19. BIN
      crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$DeptRef.class
  20. BIN
      crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$RoleRef.class
  21. BIN
      crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO.class
  22. BIN
      crm-auth/target/classes/com/crm/auth/domain/dto/UserStatsVO.class
  23. BIN
      crm-auth/target/classes/com/crm/auth/domain/entity/AuthIdentity.class
  24. BIN
      crm-auth/target/classes/com/crm/auth/domain/entity/AuthUser.class
  25. BIN
      crm-auth/target/classes/com/crm/auth/domain/entity/SysDept.class
  26. BIN
      crm-auth/target/classes/com/crm/auth/domain/entity/SysMenu.class
  27. BIN
      crm-auth/target/classes/com/crm/auth/domain/entity/SysRole.class
  28. BIN
      crm-auth/target/classes/com/crm/auth/domain/entity/SysRoleMenu.class
  29. BIN
      crm-auth/target/classes/com/crm/auth/domain/entity/SysUserDept.class
  30. BIN
      crm-auth/target/classes/com/crm/auth/domain/entity/SysUserRole.class
  31. BIN
      crm-auth/target/classes/com/crm/auth/domain/enums/DataScopeEnum.class
  32. BIN
      crm-auth/target/classes/com/crm/auth/domain/enums/IdentityTypeEnum.class
  33. BIN
      crm-auth/target/classes/com/crm/auth/domain/param/UserPageParam.class
  34. BIN
      crm-auth/target/classes/com/crm/auth/mapper/AuthIdentityMapper.class
  35. BIN
      crm-auth/target/classes/com/crm/auth/mapper/AuthUserMapper.class
  36. BIN
      crm-auth/target/classes/com/crm/auth/mapper/SysDeptMapper.class
  37. BIN
      crm-auth/target/classes/com/crm/auth/mapper/SysMenuMapper.class
  38. BIN
      crm-auth/target/classes/com/crm/auth/mapper/SysRoleMapper.class
  39. BIN
      crm-auth/target/classes/com/crm/auth/mapper/SysRoleMenuMapper.class
  40. BIN
      crm-auth/target/classes/com/crm/auth/mapper/SysUserDeptMapper.class
  41. BIN
      crm-auth/target/classes/com/crm/auth/mapper/SysUserRoleMapper.class
  42. BIN
      crm-auth/target/classes/com/crm/auth/security/AuthLoginUser.class
  43. BIN
      crm-auth/target/classes/com/crm/auth/security/DataScopeInterceptor.class
  44. BIN
      crm-auth/target/classes/com/crm/auth/security/DataScopeTables.class
  45. BIN
      crm-auth/target/classes/com/crm/auth/security/JwtAuthenticationFilter.class
  46. BIN
      crm-auth/target/classes/com/crm/auth/security/SecurityExceptionHandlers.class
  47. BIN
      crm-auth/target/classes/com/crm/auth/security/TokenService.class
  48. BIN
      crm-auth/target/classes/com/crm/auth/service/DeptTreeCache.class
  49. BIN
      crm-auth/target/classes/com/crm/auth/service/IAuthIdentityService.class
  50. BIN
      crm-auth/target/classes/com/crm/auth/service/IAuthService.class
  51. BIN
      crm-auth/target/classes/com/crm/auth/service/IAuthUserService.class
  52. BIN
      crm-auth/target/classes/com/crm/auth/service/ISysDeptService.class
  53. BIN
      crm-auth/target/classes/com/crm/auth/service/ISysMenuService.class
  54. BIN
      crm-auth/target/classes/com/crm/auth/service/ISysRoleService.class
  55. BIN
      crm-auth/target/classes/com/crm/auth/service/client/DingTalkAuthClient.class
  56. BIN
      crm-auth/target/classes/com/crm/auth/service/client/ThirdPartyAuthClient.class
  57. BIN
      crm-auth/target/classes/com/crm/auth/service/client/ThirdPartyAuthClientFactory.class
  58. BIN
      crm-auth/target/classes/com/crm/auth/service/client/ThirdPartyUserInfo.class
  59. BIN
      crm-auth/target/classes/com/crm/auth/service/impl/AuthIdentityServiceImpl.class
  60. BIN
      crm-auth/target/classes/com/crm/auth/service/impl/AuthServiceImpl.class
  61. BIN
      crm-auth/target/classes/com/crm/auth/service/impl/AuthUserServiceImpl.class
  62. BIN
      crm-auth/target/classes/com/crm/auth/service/impl/SysDeptServiceImpl.class
  63. BIN
      crm-auth/target/classes/com/crm/auth/service/impl/SysMenuServiceImpl.class
  64. BIN
      crm-auth/target/classes/com/crm/auth/service/impl/SysRoleServiceImpl.class
  65. 58
      crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
  66. 3
      crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
  67. 1
      crm-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
  68. 27
      crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.AuthUserServiceImplTest.xml
  69. 38
      crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.UserListIntegrationTest.xml
  70. 2
      crm-auth/target/surefire-reports/com.crm.auth.service.impl.AuthUserServiceImplTest.txt
  71. 2
      crm-auth/target/surefire-reports/com.crm.auth.service.impl.UserListIntegrationTest.txt
  72. BIN
      crm-auth/target/test-classes/com/crm/auth/security/scope/DataScopeIntegrationTest$DeptQueryCounter.class
  73. BIN
      crm-auth/target/test-classes/com/crm/auth/security/scope/DataScopeIntegrationTest.class
  74. BIN
      crm-auth/target/test-classes/com/crm/auth/security/scope/TestOwnedData.class
  75. BIN
      crm-auth/target/test-classes/com/crm/auth/security/scope/TestOwnedDataMapper.class
  76. BIN
      crm-auth/target/test-classes/com/crm/auth/service/client/DingTalkAuthClientTest$StubbedClient.class
  77. BIN
      crm-auth/target/test-classes/com/crm/auth/service/client/DingTalkAuthClientTest.class
  78. BIN
      crm-auth/target/test-classes/com/crm/auth/service/client/ThirdPartyAuthClientFactoryTest$StubClient.class
  79. BIN
      crm-auth/target/test-classes/com/crm/auth/service/client/ThirdPartyAuthClientFactoryTest.class
  80. BIN
      crm-auth/target/test-classes/com/crm/auth/service/impl/AuthServiceImplTest.class
  81. BIN
      crm-auth/target/test-classes/com/crm/auth/service/impl/AuthUserServiceImplTest.class
  82. BIN
      crm-auth/target/test-classes/com/crm/auth/service/impl/SysDeptServiceImplTest.class
  83. BIN
      crm-auth/target/test-classes/com/crm/auth/service/impl/UserListIntegrationTest.class
  84. BIN
      crm-base/target/classes/com/crm/base/advice/GlobalExceptionHandlerAdvice.class
  85. BIN
      crm-base/target/classes/com/crm/base/config/CorsConfig.class
  86. BIN
      crm-base/target/classes/com/crm/base/config/CrmSqlInjector.class
  87. BIN
      crm-base/target/classes/com/crm/base/config/CustomIdGenerator.class
  88. BIN
      crm-base/target/classes/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.class
  89. BIN
      crm-base/target/classes/com/crm/base/config/JacksonConfig.class
  90. BIN
      crm-base/target/classes/com/crm/base/config/Knife4jConfig.class
  91. BIN
      crm-base/target/classes/com/crm/base/config/MetaObjectFillHandler.class
  92. BIN
      crm-base/target/classes/com/crm/base/config/MybatisPlusConfig.class
  93. BIN
      crm-base/target/classes/com/crm/base/config/RedisConfig.class
  94. BIN
      crm-base/target/classes/com/crm/base/config/ScheduledTaskProperties.class
  95. BIN
      crm-base/target/classes/com/crm/base/config/SnowflakeIdWorker.class
  96. BIN
      crm-base/target/classes/com/crm/base/config/SnowflakeProperties.class
  97. BIN
      crm-base/target/classes/com/crm/base/constant/CommonConstants.class
  98. BIN
      crm-base/target/classes/com/crm/base/domain/dto/BaseDTO.class
  99. BIN
      crm-base/target/classes/com/crm/base/domain/entity/BaseEntity.class
  100. BIN
      crm-base/target/classes/com/crm/base/domain/entity/OwnedEntity.class

6
crm-auth/src/main/java/com/crm/auth/controller/SystemController.java

@ -9,6 +9,7 @@ import com.crm.auth.domain.entity.SysMenu;
import com.crm.auth.domain.param.UserPageParam;
import com.crm.auth.service.IAuthUserService;
import com.crm.auth.service.ISysDeptService;
import com.crm.auth.service.IUserQueryService;
import com.crm.auth.security.PermissionResolver;
import com.crm.base.domain.result.PageResult;
import com.crm.base.domain.result.Result;
@ -28,6 +29,7 @@ public class SystemController {
private final ISysDeptService sysDeptService;
private final IAuthUserService authUserService;
private final IUserQueryService userQueryService;
private final PermissionResolver permissionResolver;
// ========== 菜单 ==========
@ -109,12 +111,12 @@ public class SystemController {
@PostMapping("/users/page")
@PreAuthorize("hasRole('ADMIN')")
public Result<PageResult<UserListDTO>> userPage(@RequestBody UserPageParam param) {
return Result.success(authUserService.pageUserList(param));
return Result.success(userQueryService.pageUserList(param));
}
@GetMapping("/users/stats")
@PreAuthorize("hasRole('ADMIN')")
public Result<UserStatsVO> userStats(@RequestParam(required = false) Long deptId) {
return Result.success(authUserService.stats(deptId));
return Result.success(userQueryService.stats(deptId));
}
}

14
crm-auth/src/main/java/com/crm/auth/service/IAuthUserService.java

@ -1,10 +1,6 @@
package com.crm.auth.service;
import com.crm.auth.domain.dto.UserListDTO;
import com.crm.auth.domain.dto.UserStatsVO;
import com.crm.auth.domain.entity.AuthUser;
import com.crm.auth.domain.param.UserPageParam;
import com.crm.base.domain.result.PageResult;
import com.crm.base.service.IBaseService;
import java.util.List;
@ -27,16 +23,6 @@ public interface IAuthUserService extends IBaseService<AuthUser> {
*/
void assignDepts(Long userId, Long primaryDeptId, List<Long> partTimeDeptIds);
/**
* 用户管理-用户列表分页部门子树 × 在职状态 × 关键词 × 最后登录时间反范式部门名/角色名
*/
PageResult<UserListDTO> pageUserList(UserPageParam param);
/**
* 用户管理-指标卡统计部门总数/在职/离职/待分配跟随部门子树与列表过滤解耦
*/
UserStatsVO stats(Long deptId);
/**
* 分配用户的角色全量替换事务保护
*

24
crm-auth/src/main/java/com/crm/auth/service/IUserQueryService.java

@ -0,0 +1,24 @@
package com.crm.auth.service;
import com.crm.auth.domain.dto.UserListDTO;
import com.crm.auth.domain.dto.UserStatsVO;
import com.crm.auth.domain.param.UserPageParam;
import com.crm.base.domain.result.PageResult;
/**
* 用户管理-查询侧CQRS-lite用户列表分页 + 指标卡统计
* <p> {@link IAuthUserService} 拆出写操作分配部门/角色留在原接口
* 读模型拼装在此独立演化避免 Divergent Change</p>
*/
public interface IUserQueryService {
/**
* 用户管理-用户列表分页部门子树 × 在职状态 × 关键词 × 最后登录时间反范式部门名/角色名
*/
PageResult<UserListDTO> pageUserList(UserPageParam param);
/**
* 用户管理-指标卡统计部门总数/在职/离职/待分配跟随部门子树与列表过滤解耦
*/
UserStatsVO stats(Long deptId);
}

187
crm-auth/src/main/java/com/crm/auth/service/impl/AuthUserServiceImpl.java

@ -1,44 +1,26 @@
package com.crm.auth.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.crm.auth.constant.AuthConstants;
import com.crm.auth.domain.dto.UserListDTO;
import com.crm.auth.domain.dto.UserStatsVO;
import com.crm.auth.domain.entity.AuthUser;
import com.crm.auth.domain.entity.SysDept;
import com.crm.auth.domain.entity.SysRole;
import com.crm.auth.domain.entity.SysUserDept;
import com.crm.auth.domain.entity.SysUserRole;
import com.crm.auth.domain.param.UserPageParam;
import com.crm.auth.mapper.AuthUserMapper;
import com.crm.auth.mapper.SysDeptMapper;
import com.crm.auth.mapper.SysRoleMapper;
import com.crm.auth.mapper.SysUserDeptMapper;
import com.crm.auth.mapper.SysUserRoleMapper;
import com.crm.auth.service.IAuthUserService;
import com.crm.auth.service.ISysDeptService;
import com.crm.base.domain.exception.BusinessErrorException;
import com.crm.base.domain.exception.ResourceNotExistException;
import com.crm.base.domain.result.PageResult;
import com.crm.base.service.impl.BaseServiceImpl;
import com.crm.base.utils.PageConverter;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
@ -49,8 +31,6 @@ public class AuthUserServiceImpl extends BaseServiceImpl<AuthUserMapper, AuthUse
private final SysUserDeptMapper sysUserDeptMapper;
private final SysDeptMapper sysDeptMapper;
private final SysUserRoleMapper sysUserRoleMapper;
private final SysRoleMapper sysRoleMapper;
private final ISysDeptService sysDeptService;
@Override
public AuthUser getByMobile(String mobile) {
@ -110,173 +90,6 @@ public class AuthUserServiceImpl extends BaseServiceImpl<AuthUserMapper, AuthUse
}
}
// ========== 用户列表与统计(用户管理模块) ==========
private static final String STATUS_ACTIVE = "active";
private static final String STATUS_RESIGNED = "resigned";
private static final String STATUS_UNASSIGNED = "unassigned";
@Override
public PageResult<UserListDTO> pageUserList(UserPageParam param) {
Page<AuthUser> mpPage = PageConverter.toMpPage(param);
// 部门子树 → 部门集合∩子树的候选用户 id(deptId 为空则不限部门)
List<Long> scopedUserIds = resolveScopedUserIds(param.getDeptId());
if (scopedUserIds != null && scopedUserIds.isEmpty()) {
return emptyUserDTOPage(mpPage);
}
String status = param.getEmploymentStatus();
boolean unassigned = STATUS_UNASSIGNED.equalsIgnoreCase(status);
boolean active = unassigned || STATUS_ACTIVE.equalsIgnoreCase(status);
boolean resigned = STATUS_RESIGNED.equalsIgnoreCase(status);
// 预先求值,避免 MP 条件参数即时求值 null 字段导致 NPE
LocalDateTime loginFromStart = param.getLoginFrom() != null
? param.getLoginFrom().atStartOfDay() : null;
LocalDateTime loginToEnd = param.getLoginTo() != null
? param.getLoginTo().atTime(LocalTime.MAX) : null;
Page<AuthUser> result = lambdaQuery()
.in(scopedUserIds != null, AuthUser::getId, scopedUserIds)
.eq(active, AuthUser::getEmploymentStatus, STATUS_ACTIVE)
.eq(resigned, AuthUser::getEmploymentStatus, STATUS_RESIGNED)
.and(StrUtil.isNotBlank(param.getKeyword()),
w -> w.like(AuthUser::getUsername, param.getKeyword())
.or().like(AuthUser::getAccount, param.getKeyword())
.or().like(AuthUser::getMobile, param.getKeyword()))
.ge(loginFromStart != null, AuthUser::getLastLoginTime, loginFromStart)
.le(loginToEnd != null, AuthUser::getLastLoginTime, loginToEnd)
// 待分配 = 在职且无任何角色(NOT IN sys_user_role)
.notInSql(unassigned, AuthUser::getId, "SELECT user_id FROM sys_user_role")
.page(mpPage);
List<AuthUser> records = result.getRecords();
if (records.isEmpty()) {
return emptyUserDTOPage(result);
}
// 反范式部门名/角色名:批量查、组装,避免 N+1
List<Long> pageUserIds = records.stream().map(AuthUser::getId).toList();
Map<Long, List<Long>> partTimeByUser = sysUserDeptMapper.selectList(
new LambdaQueryWrapper<SysUserDept>()
.in(SysUserDept::getUserId, pageUserIds))
.stream().collect(Collectors.groupingBy(SysUserDept::getUserId,
Collectors.mapping(SysUserDept::getDeptId, Collectors.toList())));
Map<Long, List<Long>> roleIdsByUser = sysUserRoleMapper.selectList(
new LambdaQueryWrapper<SysUserRole>()
.in(SysUserRole::getUserId, pageUserIds))
.stream().collect(Collectors.groupingBy(SysUserRole::getUserId,
Collectors.mapping(SysUserRole::getRoleId, Collectors.toList())));
Set<Long> deptIds = new HashSet<>();
for (AuthUser u : records) {
if (u.getDeptId() != null) deptIds.add(u.getDeptId());
}
partTimeByUser.values().forEach(deptIds::addAll);
Map<Long, String> deptNameMap = deptIds.isEmpty()
? Collections.emptyMap()
: sysDeptMapper.selectBatchIds(deptIds).stream()
.collect(Collectors.toMap(SysDept::getId, SysDept::getDeptName));
Set<Long> roleIds = new HashSet<>();
roleIdsByUser.values().forEach(roleIds::addAll);
Map<Long, String> roleNameMap = roleIds.isEmpty()
? Collections.emptyMap()
: sysRoleMapper.selectBatchIds(roleIds).stream()
.collect(Collectors.toMap(SysRole::getId, SysRole::getRoleName));
return new PageResult<AuthUser>(result).convert(u ->
assembleUserListDTO(u, partTimeByUser, roleIdsByUser, deptNameMap, roleNameMap));
}
@Override
public UserStatsVO stats(Long deptId) {
// 部门子树(含自身);null 退化为全公司
int deptCount;
if (deptId == null) {
deptCount = Math.toIntExact(sysDeptService.count());
} else {
deptCount = sysDeptService.getChildDeptIds(deptId).size();
}
List<Long> scopedUserIds = resolveScopedUserIds(deptId);
if (scopedUserIds != null && scopedUserIds.isEmpty()) {
return new UserStatsVO(deptCount, 0L, 0L, 0L);
}
long activeCount = lambdaQuery()
.in(scopedUserIds != null, AuthUser::getId, scopedUserIds)
.eq(AuthUser::getEmploymentStatus, STATUS_ACTIVE)
.count();
long resignedCount = lambdaQuery()
.in(scopedUserIds != null, AuthUser::getId, scopedUserIds)
.eq(AuthUser::getEmploymentStatus, STATUS_RESIGNED)
.count();
long unassignedCount = lambdaQuery()
.in(scopedUserIds != null, AuthUser::getId, scopedUserIds)
.eq(AuthUser::getEmploymentStatus, STATUS_ACTIVE)
.notInSql(AuthUser::getId, "SELECT user_id FROM sys_user_role")
.count();
return new UserStatsVO(deptCount, activeCount, resignedCount, unassignedCount);
}
/**
* 解析部门子树内"部门集合∩子树"的用户 id主部门 dept_id 兼职 sys_user_dept.dept_id 命中子树者
* deptId null 时返回 null表示不限部门命中空集返回 emptyList
*/
private List<Long> resolveScopedUserIds(Long deptId) {
if (deptId == null) {
return null;
}
List<Long> subtree = sysDeptService.getChildDeptIds(deptId);
Set<Long> ids = new HashSet<>();
// 主部门命中子树
lambdaQuery().select(AuthUser::getId).in(AuthUser::getDeptId, subtree)
.list().forEach(u -> ids.add(u.getId()));
// 兼职命中子树
sysUserDeptMapper.selectList(new LambdaQueryWrapper<SysUserDept>()
.select(SysUserDept::getUserId).in(SysUserDept::getDeptId, subtree))
.forEach(ud -> ids.add(ud.getUserId()));
return new ArrayList<>(ids);
}
/**
* 构造空的 UserListDTO 分页结果部门子树命中空集 / 查询结果为空时短路返回
* 分页信息从底层 Page 继承content 置空列表
*/
private PageResult<UserListDTO> emptyUserDTOPage(IPage<?> page) {
PageResult<UserListDTO> r = new PageResult<>();
r.setContent(Collections.emptyList());
r.setTotal(page.getTotal());
r.setSize(page.getSize());
r.setCurrent(page.getCurrent());
r.setPages(page.getPages());
r.setEmpty(page.getTotal() == 0);
return r;
}
private UserListDTO assembleUserListDTO(AuthUser u,
Map<Long, List<Long>> partTimeByUser,
Map<Long, List<Long>> roleIdsByUser,
Map<Long, String> deptNameMap,
Map<Long, String> roleNameMap) {
UserListDTO dto = new UserListDTO();
BeanUtil.copyProperties(u, dto);
dto.setPrimaryDeptId(u.getDeptId());
dto.setPrimaryDeptName(u.getDeptId() != null ? deptNameMap.get(u.getDeptId()) : null);
List<Long> ptIds = partTimeByUser.getOrDefault(u.getId(), Collections.emptyList());
dto.setPartTimeDepts(ptIds.stream()
.map(id -> new UserListDTO.DeptRef(id, deptNameMap.get(id)))
.toList());
List<Long> rIds = roleIdsByUser.getOrDefault(u.getId(), Collections.emptyList());
dto.setRoles(rIds.stream()
.map(id -> new UserListDTO.RoleRef(id, roleNameMap.get(id)))
.toList());
return dto;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void assignRoles(Long userId, List<Long> roleIds) {

216
crm-auth/src/main/java/com/crm/auth/service/impl/UserQueryServiceImpl.java

@ -0,0 +1,216 @@
package com.crm.auth.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.crm.auth.domain.dto.UserListDTO;
import com.crm.auth.domain.dto.UserStatsVO;
import com.crm.auth.domain.entity.AuthUser;
import com.crm.auth.domain.entity.SysDept;
import com.crm.auth.domain.entity.SysRole;
import com.crm.auth.domain.entity.SysUserDept;
import com.crm.auth.domain.entity.SysUserRole;
import com.crm.auth.domain.param.UserPageParam;
import com.crm.auth.mapper.AuthUserMapper;
import com.crm.auth.mapper.SysDeptMapper;
import com.crm.auth.mapper.SysRoleMapper;
import com.crm.auth.mapper.SysUserDeptMapper;
import com.crm.auth.mapper.SysUserRoleMapper;
import com.crm.auth.service.ISysDeptService;
import com.crm.auth.service.IUserQueryService;
import com.crm.base.domain.result.PageResult;
import com.crm.base.utils.PageConverter;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 用户管理-查询侧实现CQRS-lite {@link AuthUserServiceImpl} 拆出的读模型拼装逻辑
* <p>不继承 BaseServiceImpl直接注入 AuthUserMapper 做分页/计数/列表查询
* 写操作assignDepts/assignRoles仍在 {@link AuthUserServiceImpl}</p>
*/
@Service
@RequiredArgsConstructor
public class UserQueryServiceImpl implements IUserQueryService {
private final AuthUserMapper authUserMapper;
private final SysUserDeptMapper sysUserDeptMapper;
private final SysDeptMapper sysDeptMapper;
private final SysUserRoleMapper sysUserRoleMapper;
private final SysRoleMapper sysRoleMapper;
private final ISysDeptService sysDeptService;
private static final String STATUS_ACTIVE = "active";
private static final String STATUS_RESIGNED = "resigned";
private static final String STATUS_UNASSIGNED = "unassigned";
@Override
public PageResult<UserListDTO> pageUserList(UserPageParam param) {
Page<AuthUser> mpPage = PageConverter.toMpPage(param);
// 部门子树 → 部门集合∩子树的候选用户 id(deptId 为空则不限部门)
List<Long> scopedUserIds = resolveScopedUserIds(param.getDeptId());
if (scopedUserIds != null && scopedUserIds.isEmpty()) {
return emptyUserDTOPage(mpPage);
}
String status = param.getEmploymentStatus();
boolean unassigned = STATUS_UNASSIGNED.equalsIgnoreCase(status);
boolean active = unassigned || STATUS_ACTIVE.equalsIgnoreCase(status);
boolean resigned = STATUS_RESIGNED.equalsIgnoreCase(status);
// 预先求值,避免 MP 条件参数即时求值 null 字段导致 NPE
LocalDateTime loginFromStart = param.getLoginFrom() != null
? param.getLoginFrom().atStartOfDay() : null;
LocalDateTime loginToEnd = param.getLoginTo() != null
? param.getLoginTo().atTime(LocalTime.MAX) : null;
LambdaQueryWrapper<AuthUser> wrapper = new LambdaQueryWrapper<AuthUser>()
.in(scopedUserIds != null, AuthUser::getId, scopedUserIds)
.eq(active, AuthUser::getEmploymentStatus, STATUS_ACTIVE)
.eq(resigned, AuthUser::getEmploymentStatus, STATUS_RESIGNED)
.and(StrUtil.isNotBlank(param.getKeyword()),
w -> w.like(AuthUser::getUsername, param.getKeyword())
.or().like(AuthUser::getAccount, param.getKeyword())
.or().like(AuthUser::getMobile, param.getKeyword()))
.ge(loginFromStart != null, AuthUser::getLastLoginTime, loginFromStart)
.le(loginToEnd != null, AuthUser::getLastLoginTime, loginToEnd)
// 待分配 = 在职且无任何角色(NOT IN sys_user_role)
.notInSql(unassigned, AuthUser::getId, "SELECT user_id FROM sys_user_role");
Page<AuthUser> result = authUserMapper.selectPage(mpPage, wrapper);
List<AuthUser> records = result.getRecords();
if (records.isEmpty()) {
return emptyUserDTOPage(result);
}
// 反范式部门名/角色名:批量查、组装,避免 N+1
List<Long> pageUserIds = records.stream().map(AuthUser::getId).toList();
Map<Long, List<Long>> partTimeByUser = sysUserDeptMapper.selectList(
new LambdaQueryWrapper<SysUserDept>()
.in(SysUserDept::getUserId, pageUserIds))
.stream().collect(Collectors.groupingBy(SysUserDept::getUserId,
Collectors.mapping(SysUserDept::getDeptId, Collectors.toList())));
Map<Long, List<Long>> roleIdsByUser = sysUserRoleMapper.selectList(
new LambdaQueryWrapper<SysUserRole>()
.in(SysUserRole::getUserId, pageUserIds))
.stream().collect(Collectors.groupingBy(SysUserRole::getUserId,
Collectors.mapping(SysUserRole::getRoleId, Collectors.toList())));
Set<Long> deptIds = new HashSet<>();
for (AuthUser u : records) {
if (u.getDeptId() != null) deptIds.add(u.getDeptId());
}
partTimeByUser.values().forEach(deptIds::addAll);
Map<Long, String> deptNameMap = deptIds.isEmpty()
? Collections.emptyMap()
: sysDeptMapper.selectBatchIds(deptIds).stream()
.collect(Collectors.toMap(SysDept::getId, SysDept::getDeptName));
Set<Long> roleIds = new HashSet<>();
roleIdsByUser.values().forEach(roleIds::addAll);
Map<Long, String> roleNameMap = roleIds.isEmpty()
? Collections.emptyMap()
: sysRoleMapper.selectBatchIds(roleIds).stream()
.collect(Collectors.toMap(SysRole::getId, SysRole::getRoleName));
return new PageResult<AuthUser>(result).convert(u ->
assembleUserListDTO(u, partTimeByUser, roleIdsByUser, deptNameMap, roleNameMap));
}
@Override
public UserStatsVO stats(Long deptId) {
// 部门子树(含自身);null 退化为全公司
int deptCount;
if (deptId == null) {
deptCount = Math.toIntExact(sysDeptService.count());
} else {
deptCount = sysDeptService.getChildDeptIds(deptId).size();
}
List<Long> scopedUserIds = resolveScopedUserIds(deptId);
if (scopedUserIds != null && scopedUserIds.isEmpty()) {
return new UserStatsVO(deptCount, 0L, 0L, 0L);
}
long activeCount = authUserMapper.selectCount(new LambdaQueryWrapper<AuthUser>()
.in(scopedUserIds != null, AuthUser::getId, scopedUserIds)
.eq(AuthUser::getEmploymentStatus, STATUS_ACTIVE));
long resignedCount = authUserMapper.selectCount(new LambdaQueryWrapper<AuthUser>()
.in(scopedUserIds != null, AuthUser::getId, scopedUserIds)
.eq(AuthUser::getEmploymentStatus, STATUS_RESIGNED));
long unassignedCount = authUserMapper.selectCount(new LambdaQueryWrapper<AuthUser>()
.in(scopedUserIds != null, AuthUser::getId, scopedUserIds)
.eq(AuthUser::getEmploymentStatus, STATUS_ACTIVE)
.notInSql(AuthUser::getId, "SELECT user_id FROM sys_user_role"));
return new UserStatsVO(deptCount, activeCount, resignedCount, unassignedCount);
}
/**
* 解析部门子树内"部门集合∩子树"的用户 id主部门 dept_id 兼职 sys_user_dept.dept_id 命中子树者
* deptId null 时返回 null表示不限部门命中空集返回 emptyList
*/
private List<Long> resolveScopedUserIds(Long deptId) {
if (deptId == null) {
return null;
}
List<Long> subtree = sysDeptService.getChildDeptIds(deptId);
Set<Long> ids = new HashSet<>();
// 主部门命中子树
authUserMapper.selectList(new LambdaQueryWrapper<AuthUser>()
.select(AuthUser::getId).in(AuthUser::getDeptId, subtree))
.forEach(u -> ids.add(u.getId()));
// 兼职命中子树
sysUserDeptMapper.selectList(new LambdaQueryWrapper<SysUserDept>()
.select(SysUserDept::getUserId).in(SysUserDept::getDeptId, subtree))
.forEach(ud -> ids.add(ud.getUserId()));
return new ArrayList<>(ids);
}
/**
* 构造空的 UserListDTO 分页结果部门子树命中空集 / 查询结果为空时短路返回
* 分页信息从底层 Page 继承content 置空列表
*/
private PageResult<UserListDTO> emptyUserDTOPage(IPage<?> page) {
PageResult<UserListDTO> r = new PageResult<>();
r.setContent(Collections.emptyList());
r.setTotal(page.getTotal());
r.setSize(page.getSize());
r.setCurrent(page.getCurrent());
r.setPages(page.getPages());
r.setEmpty(page.getTotal() == 0);
return r;
}
private UserListDTO assembleUserListDTO(AuthUser u,
Map<Long, List<Long>> partTimeByUser,
Map<Long, List<Long>> roleIdsByUser,
Map<Long, String> deptNameMap,
Map<Long, String> roleNameMap) {
UserListDTO dto = new UserListDTO();
BeanUtil.copyProperties(u, dto);
dto.setPrimaryDeptId(u.getDeptId());
dto.setPrimaryDeptName(u.getDeptId() != null ? deptNameMap.get(u.getDeptId()) : null);
List<Long> ptIds = partTimeByUser.getOrDefault(u.getId(), Collections.emptyList());
dto.setPartTimeDepts(ptIds.stream()
.map(id -> new UserListDTO.DeptRef(id, deptNameMap.get(id)))
.toList());
List<Long> rIds = roleIdsByUser.getOrDefault(u.getId(), Collections.emptyList());
dto.setRoles(rIds.stream()
.map(id -> new UserListDTO.RoleRef(id, roleNameMap.get(id)))
.toList());
return dto;
}
}

16
crm-auth/src/test/java/com/crm/auth/service/impl/AuthUserServiceImplTest.java

@ -9,6 +9,10 @@ import com.crm.auth.mapper.SysDeptMapper;
import com.crm.auth.mapper.SysUserDeptMapper;
import com.crm.base.domain.exception.BusinessErrorException;
import com.crm.base.domain.exception.ResourceNotExistException;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import org.apache.ibatis.builder.MapperBuilderAssistant;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@ -54,6 +58,18 @@ class AuthUserServiceImplTest {
@InjectMocks
private AuthUserServiceImpl service;
/**
* Mockito 单元测试无 SqlSessionFactoryLambdaUpdateWrapper/LambdaQueryWrapper
* set/eq 时触发 tryInitCache 需要手动初始化 TableInfoHelper lambda cache
*/
@BeforeAll
static void initLambdaCache() {
MapperBuilderAssistant assistant =
new MapperBuilderAssistant(new MybatisConfiguration(), "");
TableInfoHelper.initTableInfo(assistant, AuthUser.class);
TableInfoHelper.initTableInfo(assistant, SysUserDept.class);
}
@BeforeEach
void setUp() {
// ServiceImpl 的 getById/update 走父类 baseMapper 字段,无 Spring 容器时手动指回 mock

34
crm-auth/src/test/java/com/crm/auth/service/impl/UserListIntegrationTest.java

@ -63,7 +63,7 @@ class UserListIntegrationTest {
private static SqlSessionFactory sqlSessionFactory;
private SqlSession session;
private AuthUserServiceImpl authUserService;
private UserQueryServiceImpl userQueryService;
private SysDeptServiceImpl sysDeptService;
@BeforeAll
@ -113,13 +113,13 @@ class UserListIntegrationTest {
session.getMapper(SysUserDeptMapper.class));
ReflectionTestUtils.setField(sysDeptService, "baseMapper", sysDeptMapper);
authUserService = new AuthUserServiceImpl(
userQueryService = new UserQueryServiceImpl(
session.getMapper(AuthUserMapper.class),
session.getMapper(SysUserDeptMapper.class),
sysDeptMapper,
session.getMapper(SysUserRoleMapper.class),
session.getMapper(SysRoleMapper.class),
sysDeptService);
ReflectionTestUtils.setField(authUserService, "baseMapper", session.getMapper(AuthUserMapper.class));
}
@AfterEach
@ -134,7 +134,7 @@ class UserListIntegrationTest {
@Test
@DisplayName("全公司统计:5部门 / 5在职 / 1离职 / 2待分配")
void stats_wholeCompany() {
UserStatsVO vo = authUserService.stats(null);
UserStatsVO vo = userQueryService.stats(null);
assertThat(vo.getDeptCount()).isEqualTo(5);
assertThat(vo.getActiveCount()).isEqualTo(5);
assertThat(vo.getResignedCount()).isEqualTo(1);
@ -144,7 +144,7 @@ class UserListIntegrationTest {
@Test
@DisplayName("销售部子树统计:4部门 / 3在职 / 0离职 / 1待分配")
void stats_salesSubtree() {
UserStatsVO vo = authUserService.stats(10L);
UserStatsVO vo = userQueryService.stats(10L);
assertThat(vo.getDeptCount()).isEqualTo(4);
assertThat(vo.getActiveCount()).isEqualTo(3);
assertThat(vo.getResignedCount()).isEqualTo(0);
@ -154,7 +154,7 @@ class UserListIntegrationTest {
@Test
@DisplayName("市场部子树统计:含兼职命中(用户1兼挂市场部)")
void stats_marketSubtree_includesPartTime() {
UserStatsVO vo = authUserService.stats(20L);
UserStatsVO vo = userQueryService.stats(20L);
assertThat(vo.getDeptCount()).isEqualTo(1);
// 主部门=20 的用户: 4(离职), 5(在职)
// 兼职=20 的用户: 1(在职) → scopedUserIds = {4, 5, 1}
@ -170,7 +170,7 @@ class UserListIntegrationTest {
void page_noFilter_returnsAll() {
UserPageParam param = new UserPageParam();
param.setSize(10);
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getTotal()).isEqualTo(6);
assertThat(result.getContent()).hasSize(6);
}
@ -181,7 +181,7 @@ class UserListIntegrationTest {
UserPageParam param = new UserPageParam();
param.setSize(10);
param.setEmploymentStatus("active");
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getTotal()).isEqualTo(5);
assertThat(result.getContent()).extracting(UserListDTO::getId)
.doesNotContain(4L);
@ -193,7 +193,7 @@ class UserListIntegrationTest {
UserPageParam param = new UserPageParam();
param.setSize(10);
param.setEmploymentStatus("resigned");
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getTotal()).isEqualTo(1);
assertThat(result.getContent().get(0).getId()).isEqualTo(4L);
}
@ -204,7 +204,7 @@ class UserListIntegrationTest {
UserPageParam param = new UserPageParam();
param.setSize(10);
param.setEmploymentStatus("unassigned");
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getTotal()).isEqualTo(2);
assertThat(result.getContent()).extracting(UserListDTO::getId)
.containsExactlyInAnyOrder(3L, 5L);
@ -216,7 +216,7 @@ class UserListIntegrationTest {
UserPageParam param = new UserPageParam();
param.setSize(10);
param.setDeptId(10L);
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getTotal()).isEqualTo(3);
assertThat(result.getContent()).extracting(UserListDTO::getId)
.containsExactlyInAnyOrder(1L, 2L, 3L);
@ -228,7 +228,7 @@ class UserListIntegrationTest {
UserPageParam param = new UserPageParam();
param.setSize(10);
param.setKeyword("张");
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getTotal()).isEqualTo(1);
assertThat(result.getContent().get(0).getId()).isEqualTo(1L);
}
@ -239,7 +239,7 @@ class UserListIntegrationTest {
UserPageParam param = new UserPageParam();
param.setSize(10);
param.setKeyword("lisi");
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getTotal()).isEqualTo(1);
assertThat(result.getContent().get(0).getId()).isEqualTo(2L);
}
@ -250,7 +250,7 @@ class UserListIntegrationTest {
UserPageParam param = new UserPageParam();
param.setSize(10);
param.setLoginFrom(LocalDate.of(2024, 2, 1));
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getTotal()).isEqualTo(2);
assertThat(result.getContent()).extracting(UserListDTO::getId)
.containsExactlyInAnyOrder(2L, 4L);
@ -264,7 +264,7 @@ class UserListIntegrationTest {
UserPageParam param = new UserPageParam();
param.setCurrent(1);
param.setSize(2);
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getContent()).hasSize(2);
assertThat(result.getTotal()).isEqualTo(6);
assertThat(result.getPages()).isEqualTo(3);
@ -279,7 +279,7 @@ class UserListIntegrationTest {
UserPageParam param = new UserPageParam();
param.setSize(10);
param.setKeyword("zhangsan");
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getContent()).hasSize(1);
UserListDTO dto = result.getContent().get(0);
@ -307,7 +307,7 @@ class UserListIntegrationTest {
UserPageParam param = new UserPageParam();
param.setSize(10);
param.setKeyword("wangwu");
PageResult<UserListDTO> result = authUserService.pageUserList(param);
PageResult<UserListDTO> result = userQueryService.pageUserList(param);
assertThat(result.getContent()).hasSize(1);
UserListDTO dto = result.getContent().get(0);

BIN
crm-auth/target/classes/com/crm/auth/AuthApplication.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/config/AuthProperties$DingTalk.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/config/AuthProperties$Jwt.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/config/AuthProperties.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/config/DataInitializer.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/config/PermissionConfig.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/config/SecurityConfig.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/controller/AuthController.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/controller/SystemController.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/dto/LoginResultDTO.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/dto/UserInfoDTO.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$DeptRef.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO$RoleRef.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/dto/UserListDTO.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/dto/UserStatsVO.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/entity/AuthIdentity.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/entity/AuthUser.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/entity/SysDept.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/entity/SysMenu.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/entity/SysRole.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/entity/SysRoleMenu.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/entity/SysUserDept.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/entity/SysUserRole.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/enums/DataScopeEnum.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/enums/IdentityTypeEnum.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/domain/param/UserPageParam.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/mapper/AuthIdentityMapper.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/mapper/AuthUserMapper.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/mapper/SysDeptMapper.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/mapper/SysMenuMapper.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/mapper/SysRoleMapper.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/mapper/SysRoleMenuMapper.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/mapper/SysUserDeptMapper.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/mapper/SysUserRoleMapper.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/security/AuthLoginUser.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/security/DataScopeInterceptor.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/security/DataScopeTables.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/security/JwtAuthenticationFilter.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/security/SecurityExceptionHandlers.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/security/TokenService.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/DeptTreeCache.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/IAuthIdentityService.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/IAuthService.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/IAuthUserService.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/ISysDeptService.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/ISysMenuService.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/ISysRoleService.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/client/DingTalkAuthClient.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/client/ThirdPartyAuthClient.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/client/ThirdPartyAuthClientFactory.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/client/ThirdPartyUserInfo.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/impl/AuthIdentityServiceImpl.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/impl/AuthServiceImpl.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/impl/AuthUserServiceImpl.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/impl/SysDeptServiceImpl.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/impl/SysMenuServiceImpl.class

Binary file not shown.

BIN
crm-auth/target/classes/com/crm/auth/service/impl/SysRoleServiceImpl.class

Binary file not shown.

58
crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst

@ -1,75 +1,19 @@
com\crm\auth\security\AuthLoginUser.class
com\crm\auth\service\client\ThirdPartyUserInfo.class
com\crm\auth\security\TokenService.class
com\crm\auth\service\impl\AuthUserServiceImpl.class
com\crm\auth\domain\entity\SysRoleMenu.class
com\crm\auth\domain\entity\AuthIdentity.class
com\crm\auth\service\impl\UserQueryServiceImpl.class
com\crm\auth\service\impl\ResourceServiceImpl$1.class
com\crm\auth\domain\dto\UserStatsVO.class
com\crm\auth\service\client\ThirdPartyAuthClient.class
com\crm\auth\domain\entity\SysUserRole.class
com\crm\auth\service\ISysMenuService.class
com\crm\auth\service\impl\ResourceServiceImpl.class
com\crm\auth\service\client\ThirdPartyAuthClientFactory.class
com\crm\auth\mapper\SysRoleMenuMapper.class
com\crm\auth\domain\entity\SysMenu.class
com\crm\auth\service\DeptTreeCache.class
com\crm\auth\service\ISysRoleService.class
com\crm\auth\domain\dto\ResourceNode.class
com\crm\auth\service\ISysDeptService.class
com\crm\auth\security\ApiPermissionCache.class
com\crm\auth\service\IResourceService.class
com\crm\auth\security\ApiPermissionInterceptor.class
com\crm\auth\security\PermissionResolver.class
com\crm\auth\domain\dto\UserInfoDTO.class
com\crm\auth\constant\AuthConstants.class
com\crm\auth\service\impl\AuthIdentityServiceImpl.class
com\crm\auth\config\WebMvcConfig.class
com\crm\auth\mapper\AuthIdentityMapper.class
com\crm\auth\domain\enums\IdentityTypeEnum.class
com\crm\auth\service\client\DingTalkAuthClient.class
com\crm\auth\service\impl\AuthServiceImpl.class
com\crm\auth\controller\AuthController.class
com\crm\auth\domain\param\UserPageParam.class
com\crm\auth\controller\SystemController.class
com\crm\auth\controller\RoleController.class
com\crm\auth\security\DataScopeInterceptor$1.class
com\crm\auth\config\DataInitializer.class
com\crm\auth\security\DataScopeTables.class
com\crm\auth\domain\enums\MenuType.class
com\crm\auth\service\IAuthUserService.class
com\crm\auth\security\PermissionGrant.class
com\crm\auth\config\AuthProperties$Jwt.class
com\crm\auth\service\impl\SysMenuServiceImpl.class
com\crm\auth\mapper\AuthUserMapper.class
com\crm\auth\config\AuthProperties$DingTalk.class
com\crm\auth\service\IAuthIdentityService.class
com\crm\auth\domain\dto\LoginResultDTO.class
com\crm\auth\domain\entity\SysUserDept.class
com\crm\auth\security\JwtAuthenticationFilter.class
com\crm\auth\domain\entity\SysDept.class
com\crm\auth\service\impl\SysDeptServiceImpl.class
com\crm\auth\domain\dto\RoleDetailVO.class
com\crm\auth\service\IAuthService.class
com\crm\auth\controller\ResourceController.class
com\crm\auth\domain\dto\UserListDTO$RoleRef.class
com\crm\auth\domain\enums\DataScopeEnum.class
com\crm\auth\mapper\SysRoleMapper.class
com\crm\auth\config\AuthProperties.class
com\crm\auth\security\DataScopeInterceptor.class
com\crm\auth\domain\entity\AuthUser.class
com\crm\auth\security\ApiPermissionRule.class
com\crm\auth\config\SecurityConfig.class
com\crm\auth\mapper\SysMenuMapper.class
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
com\crm\auth\config\PermissionConfig.class
com\crm\auth\domain\dto\UserListDTO$DeptRef.class
com\crm\auth\domain\dto\UserListDTO.class
com\crm\auth\service\impl\SysRoleServiceImpl.class

3
crm-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst

@ -59,11 +59,14 @@ D:\code\crm-backend-matt\crm-auth\src\main\java\com\crm\auth\service\IAuthUserSe
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

1
crm-auth/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst

@ -6,6 +6,7 @@ D:\code\crm-backend-matt\crm-auth\src\test\java\com\crm\auth\service\client\Ding
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

27
crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.AuthUserServiceImplTest.xml

File diff suppressed because one or more lines are too long

38
crm-auth/target/surefire-reports/TEST-com.crm.auth.service.impl.UserListIntegrationTest.xml

File diff suppressed because one or more lines are too long

2
crm-auth/target/surefire-reports/com.crm.auth.service.impl.AuthUserServiceImplTest.txt

@ -1,4 +1,4 @@
-------------------------------------------------------------------------------
Test set: com.crm.auth.service.impl.AuthUserServiceImplTest
-------------------------------------------------------------------------------
Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.168 s -- in com.crm.auth.service.impl.AuthUserServiceImplTest
Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.181 s -- in com.crm.auth.service.impl.AuthUserServiceImplTest

2
crm-auth/target/surefire-reports/com.crm.auth.service.impl.UserListIntegrationTest.txt

@ -1,4 +1,4 @@
-------------------------------------------------------------------------------
Test set: com.crm.auth.service.impl.UserListIntegrationTest
-------------------------------------------------------------------------------
Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.338 s -- in com.crm.auth.service.impl.UserListIntegrationTest
Tests run: 14, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.132 s -- in com.crm.auth.service.impl.UserListIntegrationTest

BIN
crm-auth/target/test-classes/com/crm/auth/security/scope/DataScopeIntegrationTest$DeptQueryCounter.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/security/scope/DataScopeIntegrationTest.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/security/scope/TestOwnedData.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/security/scope/TestOwnedDataMapper.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/service/client/DingTalkAuthClientTest$StubbedClient.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/service/client/DingTalkAuthClientTest.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/service/client/ThirdPartyAuthClientFactoryTest$StubClient.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/service/client/ThirdPartyAuthClientFactoryTest.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/service/impl/AuthServiceImplTest.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/service/impl/AuthUserServiceImplTest.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/service/impl/SysDeptServiceImplTest.class

Binary file not shown.

BIN
crm-auth/target/test-classes/com/crm/auth/service/impl/UserListIntegrationTest.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/advice/GlobalExceptionHandlerAdvice.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/CorsConfig.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/CrmSqlInjector.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/CustomIdGenerator.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/InsertBatchOnDuplicateKeyUpdate.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/JacksonConfig.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/Knife4jConfig.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/MetaObjectFillHandler.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/MybatisPlusConfig.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/RedisConfig.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/ScheduledTaskProperties.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/SnowflakeIdWorker.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/config/SnowflakeProperties.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/constant/CommonConstants.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/domain/dto/BaseDTO.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/domain/entity/BaseEntity.class

Binary file not shown.

BIN
crm-base/target/classes/com/crm/base/domain/entity/OwnedEntity.class

Binary file not shown.

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save