Commit 74a4622fe861ea21d8405b8c4dab3c3d09543041

Authored by zichun
1 parent 736eafbe

feat(usr): UserDetailService 用户详情查询 REQ-USR-003

backend/src/main/java/com/xly/erp/module/usr/service/UserDetailService.java 0 → 100644
  1 +package com.xly.erp.module.usr.service;
  2 +
  3 +import com.xly.erp.module.usr.vo.UserDetailVo;
  4 +
  5 +public interface UserDetailService {
  6 + /**
  7 + * REQ-USR-003 GET /api/v1/users/{userId} 详情。
  8 + * 包含作废用户(不过滤 iIsDeleted)。
  9 + *
  10 + * @throws com.xly.erp.common.exception.BizException 40401 用户不存在
  11 + */
  12 + UserDetailVo getById(Integer userId);
  13 +}
backend/src/main/java/com/xly/erp/module/usr/service/impl/UserDetailServiceImpl.java 0 → 100644
  1 +package com.xly.erp.module.usr.service.impl;
  2 +
  3 +import com.xly.erp.common.exception.BizException;
  4 +import com.xly.erp.common.response.ErrorCode;
  5 +import com.xly.erp.module.usr.entity.SysEmployee;
  6 +import com.xly.erp.module.usr.entity.SysUser;
  7 +import com.xly.erp.module.usr.mapper.SysEmployeeMapper;
  8 +import com.xly.erp.module.usr.mapper.SysUserMapper;
  9 +import com.xly.erp.module.usr.mapper.SysUserPermissionCategoryMapper;
  10 +import com.xly.erp.module.usr.service.UserDetailService;
  11 +import com.xly.erp.module.usr.vo.UserDetailVo;
  12 +import lombok.RequiredArgsConstructor;
  13 +import org.springframework.stereotype.Service;
  14 +
  15 +import java.util.List;
  16 +
  17 +@Service
  18 +@RequiredArgsConstructor
  19 +public class UserDetailServiceImpl implements UserDetailService {
  20 +
  21 + private final SysUserMapper userMapper;
  22 + private final SysEmployeeMapper employeeMapper;
  23 + private final SysUserPermissionCategoryMapper upcMapper;
  24 +
  25 + @Override
  26 + public UserDetailVo getById(Integer userId) {
  27 + SysUser user = userMapper.selectById(userId);
  28 + if (user == null) {
  29 + throw new BizException(ErrorCode.USER_NOT_FOUND, "用户不存在");
  30 + }
  31 +
  32 + String employeeName = null;
  33 + if (user.getIEmployeeId() != null) {
  34 + SysEmployee emp = employeeMapper.selectById(user.getIEmployeeId());
  35 + if (emp != null) {
  36 + employeeName = emp.getSEmployeeName();
  37 + }
  38 + }
  39 +
  40 + List<Integer> pcIds = upcMapper.selectPermissionCategoryIdsByUserId(userId);
  41 +
  42 + return UserDetailVo.builder()
  43 + .userId(user.getIIncrement())
  44 + .username(user.getSUsername())
  45 + .userCode(user.getSUserCode())
  46 + .userType(user.getSUserType())
  47 + .language(user.getSLanguage())
  48 + .canEditDocument(Integer.valueOf(1).equals(user.getICanEditDocument()))
  49 + .isDeleted(Integer.valueOf(1).equals(user.getIIsDeleted()))
  50 + .employeeId(user.getIEmployeeId())
  51 + .employeeName(employeeName)
  52 + .permissionCategoryIds(pcIds)
  53 + .updatedBy(user.getSUpdatedBy())
  54 + .updatedDate(user.getTUpdatedDate())
  55 + .build();
  56 + }
  57 +}
backend/src/test/java/com/xly/erp/module/usr/service/UserDetailServiceImplTest.java 0 → 100644
  1 +package com.xly.erp.module.usr.service;
  2 +
  3 +import com.xly.erp.common.exception.BizException;
  4 +import com.xly.erp.common.response.ErrorCode;
  5 +import com.xly.erp.module.usr.entity.SysUserPermissionCategory;
  6 +import com.xly.erp.module.usr.mapper.SysUserPermissionCategoryMapper;
  7 +import com.xly.erp.module.usr.support.LoginTestSeeder;
  8 +import com.xly.erp.module.usr.vo.UserDetailVo;
  9 +import org.junit.jupiter.api.BeforeEach;
  10 +import org.junit.jupiter.api.Test;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.boot.test.context.SpringBootTest;
  13 +import org.springframework.test.context.ActiveProfiles;
  14 +
  15 +import static org.junit.jupiter.api.Assertions.*;
  16 +
  17 +@SpringBootTest
  18 +@ActiveProfiles("test")
  19 +class UserDetailServiceImplTest {
  20 +
  21 + @Autowired private UserDetailService service;
  22 + @Autowired private LoginTestSeeder seeder;
  23 + @Autowired private SysUserPermissionCategoryMapper upcMapper;
  24 +
  25 + private LoginTestSeeder.Fixture fx;
  26 +
  27 + @BeforeEach
  28 + void setUp() {
  29 + fx = seeder.reset();
  30 + }
  31 +
  32 + @Test
  33 + void getById_existingActiveUser_returnsFullVo() {
  34 + // 给 alice 加 2 个权限分类授权
  35 + for (Integer pcId : fx.activePermissionCategoryIds()) {
  36 + SysUserPermissionCategory link = new SysUserPermissionCategory();
  37 + link.setIUserId(fx.aliceId());
  38 + link.setIPermissionCategoryId(pcId);
  39 + link.setSGrantedBy("system");
  40 + upcMapper.insert(link);
  41 + }
  42 +
  43 + UserDetailVo vo = service.getById(fx.aliceId());
  44 + assertEquals(fx.aliceId(), vo.getUserId());
  45 + assertEquals(LoginTestSeeder.USER_OK, vo.getUsername());
  46 + assertEquals("U001", vo.getUserCode());
  47 + assertEquals("NORMAL", vo.getUserType());
  48 + assertEquals("zh-CN", vo.getLanguage());
  49 + assertEquals(false, vo.getCanEditDocument());
  50 + assertEquals(false, vo.getIsDeleted());
  51 + assertEquals(fx.employeeId(), vo.getEmployeeId());
  52 + assertEquals("张三", vo.getEmployeeName());
  53 + assertEquals(2, vo.getPermissionCategoryIds().size());
  54 + }
  55 +
  56 + @Test
  57 + void getById_userWithoutEmployee_employeeNameIsNull() {
  58 + UserDetailVo vo = service.getById(fx.adminId());
  59 + assertNull(vo.getEmployeeId());
  60 + assertNull(vo.getEmployeeName());
  61 + }
  62 +
  63 + @Test
  64 + void getById_userWithoutPermissions_emptyList() {
  65 + UserDetailVo vo = service.getById(fx.aliceId());
  66 + assertNotNull(vo.getPermissionCategoryIds());
  67 + assertTrue(vo.getPermissionCategoryIds().isEmpty());
  68 + }
  69 +
  70 + @Test
  71 + void getById_deletedUser_stillReturned() {
  72 + UserDetailVo vo = service.getById(fx.bobDeletedId());
  73 + assertEquals(LoginTestSeeder.USER_DELETED, vo.getUsername());
  74 + assertEquals(true, vo.getIsDeleted());
  75 + }
  76 +
  77 + @Test
  78 + void getById_unknownId_throws40401() {
  79 + BizException e = assertThrows(BizException.class, () -> service.getById(99999));
  80 + assertEquals(ErrorCode.USER_NOT_FOUND, e.getCode());
  81 + }
  82 +}