From 74a4622fe861ea21d8405b8c4dab3c3d09543041 Mon Sep 17 00:00:00 2001 From: zichun Date: Fri, 15 May 2026 09:43:34 +0800 Subject: [PATCH] feat(usr): UserDetailService 用户详情查询 REQ-USR-003 --- backend/src/main/java/com/xly/erp/module/usr/service/UserDetailService.java | 13 +++++++++++++ backend/src/main/java/com/xly/erp/module/usr/service/impl/UserDetailServiceImpl.java | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend/src/test/java/com/xly/erp/module/usr/service/UserDetailServiceImplTest.java | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 152 insertions(+), 0 deletions(-) create mode 100644 backend/src/main/java/com/xly/erp/module/usr/service/UserDetailService.java create mode 100644 backend/src/main/java/com/xly/erp/module/usr/service/impl/UserDetailServiceImpl.java create mode 100644 backend/src/test/java/com/xly/erp/module/usr/service/UserDetailServiceImplTest.java diff --git a/backend/src/main/java/com/xly/erp/module/usr/service/UserDetailService.java b/backend/src/main/java/com/xly/erp/module/usr/service/UserDetailService.java new file mode 100644 index 0000000..a69a3e7 --- /dev/null +++ b/backend/src/main/java/com/xly/erp/module/usr/service/UserDetailService.java @@ -0,0 +1,13 @@ +package com.xly.erp.module.usr.service; + +import com.xly.erp.module.usr.vo.UserDetailVo; + +public interface UserDetailService { + /** + * REQ-USR-003 GET /api/v1/users/{userId} 详情。 + * 包含作废用户(不过滤 iIsDeleted)。 + * + * @throws com.xly.erp.common.exception.BizException 40401 用户不存在 + */ + UserDetailVo getById(Integer userId); +} diff --git a/backend/src/main/java/com/xly/erp/module/usr/service/impl/UserDetailServiceImpl.java b/backend/src/main/java/com/xly/erp/module/usr/service/impl/UserDetailServiceImpl.java new file mode 100644 index 0000000..7dcc409 --- /dev/null +++ b/backend/src/main/java/com/xly/erp/module/usr/service/impl/UserDetailServiceImpl.java @@ -0,0 +1,57 @@ +package com.xly.erp.module.usr.service.impl; + +import com.xly.erp.common.exception.BizException; +import com.xly.erp.common.response.ErrorCode; +import com.xly.erp.module.usr.entity.SysEmployee; +import com.xly.erp.module.usr.entity.SysUser; +import com.xly.erp.module.usr.mapper.SysEmployeeMapper; +import com.xly.erp.module.usr.mapper.SysUserMapper; +import com.xly.erp.module.usr.mapper.SysUserPermissionCategoryMapper; +import com.xly.erp.module.usr.service.UserDetailService; +import com.xly.erp.module.usr.vo.UserDetailVo; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class UserDetailServiceImpl implements UserDetailService { + + private final SysUserMapper userMapper; + private final SysEmployeeMapper employeeMapper; + private final SysUserPermissionCategoryMapper upcMapper; + + @Override + public UserDetailVo getById(Integer userId) { + SysUser user = userMapper.selectById(userId); + if (user == null) { + throw new BizException(ErrorCode.USER_NOT_FOUND, "用户不存在"); + } + + String employeeName = null; + if (user.getIEmployeeId() != null) { + SysEmployee emp = employeeMapper.selectById(user.getIEmployeeId()); + if (emp != null) { + employeeName = emp.getSEmployeeName(); + } + } + + List pcIds = upcMapper.selectPermissionCategoryIdsByUserId(userId); + + return UserDetailVo.builder() + .userId(user.getIIncrement()) + .username(user.getSUsername()) + .userCode(user.getSUserCode()) + .userType(user.getSUserType()) + .language(user.getSLanguage()) + .canEditDocument(Integer.valueOf(1).equals(user.getICanEditDocument())) + .isDeleted(Integer.valueOf(1).equals(user.getIIsDeleted())) + .employeeId(user.getIEmployeeId()) + .employeeName(employeeName) + .permissionCategoryIds(pcIds) + .updatedBy(user.getSUpdatedBy()) + .updatedDate(user.getTUpdatedDate()) + .build(); + } +} diff --git a/backend/src/test/java/com/xly/erp/module/usr/service/UserDetailServiceImplTest.java b/backend/src/test/java/com/xly/erp/module/usr/service/UserDetailServiceImplTest.java new file mode 100644 index 0000000..9dbd546 --- /dev/null +++ b/backend/src/test/java/com/xly/erp/module/usr/service/UserDetailServiceImplTest.java @@ -0,0 +1,82 @@ +package com.xly.erp.module.usr.service; + +import com.xly.erp.common.exception.BizException; +import com.xly.erp.common.response.ErrorCode; +import com.xly.erp.module.usr.entity.SysUserPermissionCategory; +import com.xly.erp.module.usr.mapper.SysUserPermissionCategoryMapper; +import com.xly.erp.module.usr.support.LoginTestSeeder; +import com.xly.erp.module.usr.vo.UserDetailVo; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@ActiveProfiles("test") +class UserDetailServiceImplTest { + + @Autowired private UserDetailService service; + @Autowired private LoginTestSeeder seeder; + @Autowired private SysUserPermissionCategoryMapper upcMapper; + + private LoginTestSeeder.Fixture fx; + + @BeforeEach + void setUp() { + fx = seeder.reset(); + } + + @Test + void getById_existingActiveUser_returnsFullVo() { + // 给 alice 加 2 个权限分类授权 + for (Integer pcId : fx.activePermissionCategoryIds()) { + SysUserPermissionCategory link = new SysUserPermissionCategory(); + link.setIUserId(fx.aliceId()); + link.setIPermissionCategoryId(pcId); + link.setSGrantedBy("system"); + upcMapper.insert(link); + } + + UserDetailVo vo = service.getById(fx.aliceId()); + assertEquals(fx.aliceId(), vo.getUserId()); + assertEquals(LoginTestSeeder.USER_OK, vo.getUsername()); + assertEquals("U001", vo.getUserCode()); + assertEquals("NORMAL", vo.getUserType()); + assertEquals("zh-CN", vo.getLanguage()); + assertEquals(false, vo.getCanEditDocument()); + assertEquals(false, vo.getIsDeleted()); + assertEquals(fx.employeeId(), vo.getEmployeeId()); + assertEquals("张三", vo.getEmployeeName()); + assertEquals(2, vo.getPermissionCategoryIds().size()); + } + + @Test + void getById_userWithoutEmployee_employeeNameIsNull() { + UserDetailVo vo = service.getById(fx.adminId()); + assertNull(vo.getEmployeeId()); + assertNull(vo.getEmployeeName()); + } + + @Test + void getById_userWithoutPermissions_emptyList() { + UserDetailVo vo = service.getById(fx.aliceId()); + assertNotNull(vo.getPermissionCategoryIds()); + assertTrue(vo.getPermissionCategoryIds().isEmpty()); + } + + @Test + void getById_deletedUser_stillReturned() { + UserDetailVo vo = service.getById(fx.bobDeletedId()); + assertEquals(LoginTestSeeder.USER_DELETED, vo.getUsername()); + assertEquals(true, vo.getIsDeleted()); + } + + @Test + void getById_unknownId_throws40401() { + BizException e = assertThrows(BizException.class, () -> service.getById(99999)); + assertEquals(ErrorCode.USER_NOT_FOUND, e.getCode()); + } +} -- libgit2 0.22.2