From 93a189675f0c8c9b1fa1f8100ad79ce3cffb3c0f Mon Sep 17 00:00:00 2001 From: zichun Date: Fri, 8 May 2026 11:35:45 +0800 Subject: [PATCH] feat(usr): selectUserList XML + getUserList service + GET /api/usr/users REQ-USR-003 --- backend/src/main/java/com/example/erp/module/usr/controller/UserController.java | 20 ++++++++++++++++++++ backend/src/main/java/com/example/erp/module/usr/mapper/UsrUserMapper.java | 11 +++++++++++ backend/src/main/java/com/example/erp/module/usr/service/UserService.java | 5 +++++ backend/src/main/java/com/example/erp/module/usr/service/impl/UserServiceImpl.java | 15 +++++++++++++++ backend/src/main/resources/mapper/UsrUserMapper.xml | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend/src/test/java/com/example/erp/module/usr/UserControllerTest.java | 25 +++++++++++++++++++++++++ backend/src/test/java/com/example/erp/module/usr/UserServiceTest.java | 31 +++++++++++++++++++++++++++++++ 7 files changed, 180 insertions(+), 0 deletions(-) create mode 100644 backend/src/main/resources/mapper/UsrUserMapper.xml diff --git a/backend/src/main/java/com/example/erp/module/usr/controller/UserController.java b/backend/src/main/java/com/example/erp/module/usr/controller/UserController.java index fd78f09..4636fc6 100644 --- a/backend/src/main/java/com/example/erp/module/usr/controller/UserController.java +++ b/backend/src/main/java/com/example/erp/module/usr/controller/UserController.java @@ -1,12 +1,15 @@ package com.example.erp.module.usr.controller; import com.example.erp.common.response.Result; +import com.example.erp.common.vo.PageVO; import com.example.erp.config.UserPrincipal; import com.example.erp.module.usr.dto.UserCreateReqDTO; +import com.example.erp.module.usr.dto.UserListQueryDTO; import com.example.erp.module.usr.service.UserService; import com.example.erp.module.usr.vo.PermissionGroupVO; import com.example.erp.module.usr.vo.StaffVO; import com.example.erp.module.usr.vo.UserCreateRespVO; +import com.example.erp.module.usr.vo.UserListItemVO; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -28,6 +31,23 @@ public class UserController { return Result.ok(userService.createUser(req, principal)); } + @GetMapping("/users") + public Result> getUsers( + @RequestParam(defaultValue = "username") String queryField, + @RequestParam(defaultValue = "contains") String matchType, + @RequestParam(defaultValue = "") String queryValue, + @RequestParam(defaultValue = "1") int page, + @RequestParam(defaultValue = "20") int pageSize, + @AuthenticationPrincipal UserPrincipal principal) { + UserListQueryDTO q = new UserListQueryDTO(); + q.setQueryField(queryField); + q.setMatchType(matchType); + q.setQueryValue(queryValue); + q.setPage(page); + q.setPageSize(pageSize); + return Result.ok(userService.getUserList(q, principal.brandId())); + } + @GetMapping("/users/staffs") public Result> getStaffs(@AuthenticationPrincipal UserPrincipal principal) { return Result.ok(userService.getStaffs(principal.brandId())); diff --git a/backend/src/main/java/com/example/erp/module/usr/mapper/UsrUserMapper.java b/backend/src/main/java/com/example/erp/module/usr/mapper/UsrUserMapper.java index f2d6ba7..f27b26c 100644 --- a/backend/src/main/java/com/example/erp/module/usr/mapper/UsrUserMapper.java +++ b/backend/src/main/java/com/example/erp/module/usr/mapper/UsrUserMapper.java @@ -1,7 +1,18 @@ package com.example.erp.module.usr.mapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.example.erp.module.usr.entity.UsrUserEntity; +import com.example.erp.module.usr.vo.UserListItemVO; +import org.apache.ibatis.annotations.Param; public interface UsrUserMapper extends BaseMapper { + + IPage selectUserList( + IPage page, + @Param("brandId") String brandId, + @Param("queryField") String queryField, + @Param("matchType") String matchType, + @Param("queryValue") String queryValue + ); } diff --git a/backend/src/main/java/com/example/erp/module/usr/service/UserService.java b/backend/src/main/java/com/example/erp/module/usr/service/UserService.java index 31f8d1e..250676c 100644 --- a/backend/src/main/java/com/example/erp/module/usr/service/UserService.java +++ b/backend/src/main/java/com/example/erp/module/usr/service/UserService.java @@ -1,10 +1,13 @@ package com.example.erp.module.usr.service; +import com.example.erp.common.vo.PageVO; import com.example.erp.config.UserPrincipal; import com.example.erp.module.usr.dto.UserCreateReqDTO; +import com.example.erp.module.usr.dto.UserListQueryDTO; import com.example.erp.module.usr.vo.PermissionGroupVO; import com.example.erp.module.usr.vo.StaffVO; import com.example.erp.module.usr.vo.UserCreateRespVO; +import com.example.erp.module.usr.vo.UserListItemVO; import java.util.List; @@ -15,4 +18,6 @@ public interface UserService { List getStaffs(String brandId); List getPermissionGroups(String brandId); + + PageVO getUserList(UserListQueryDTO query, String brandId); } diff --git a/backend/src/main/java/com/example/erp/module/usr/service/impl/UserServiceImpl.java b/backend/src/main/java/com/example/erp/module/usr/service/impl/UserServiceImpl.java index 9a526b9..0b38a04 100644 --- a/backend/src/main/java/com/example/erp/module/usr/service/impl/UserServiceImpl.java +++ b/backend/src/main/java/com/example/erp/module/usr/service/impl/UserServiceImpl.java @@ -1,10 +1,14 @@ package com.example.erp.module.usr.service.impl; 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.example.erp.common.constants.UsrErrorCode; import com.example.erp.common.exception.BizException; +import com.example.erp.common.vo.PageVO; import com.example.erp.config.UserPrincipal; import com.example.erp.module.usr.dto.UserCreateReqDTO; +import com.example.erp.module.usr.dto.UserListQueryDTO; import com.example.erp.module.usr.entity.PermissionGroupEntity; import com.example.erp.module.usr.entity.StaffEntity; import com.example.erp.module.usr.entity.UserPermissionEntity; @@ -17,6 +21,7 @@ import com.example.erp.module.usr.service.UserService; import com.example.erp.module.usr.vo.PermissionGroupVO; import com.example.erp.module.usr.vo.StaffVO; import com.example.erp.module.usr.vo.UserCreateRespVO; +import com.example.erp.module.usr.vo.UserListItemVO; import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; @@ -118,6 +123,16 @@ public class UserServiceImpl implements UserService { @Override @Transactional(readOnly = true) + public PageVO getUserList(UserListQueryDTO query, String brandId) { + int cappedSize = Math.min(query.getPageSize(), 100); + IPage iPage = new Page<>(query.getPage(), cappedSize); + String queryValue = query.getQueryValue() == null ? "" : query.getQueryValue(); + IPage result = userMapper.selectUserList(iPage, brandId, query.getQueryField(), query.getMatchType(), queryValue); + return PageVO.of(result); + } + + @Override + @Transactional(readOnly = true) public List getPermissionGroups(String brandId) { List groups = permGroupMapper.selectList(new LambdaQueryWrapper() .eq(PermissionGroupEntity::getSBrandsId, brandId)); diff --git a/backend/src/main/resources/mapper/UsrUserMapper.xml b/backend/src/main/resources/mapper/UsrUserMapper.xml new file mode 100644 index 0000000..67c212c --- /dev/null +++ b/backend/src/main/resources/mapper/UsrUserMapper.xml @@ -0,0 +1,73 @@ + + + + + + + diff --git a/backend/src/test/java/com/example/erp/module/usr/UserControllerTest.java b/backend/src/test/java/com/example/erp/module/usr/UserControllerTest.java index d64f832..8b66013 100644 --- a/backend/src/test/java/com/example/erp/module/usr/UserControllerTest.java +++ b/backend/src/test/java/com/example/erp/module/usr/UserControllerTest.java @@ -7,7 +7,10 @@ import com.example.erp.config.SecurityConfig; import com.example.erp.common.util.JwtUtil; import com.example.erp.module.usr.controller.UserController; import com.example.erp.module.usr.service.UserService; +import com.example.erp.common.vo.PageVO; +import com.example.erp.module.usr.dto.UserListQueryDTO; import com.example.erp.module.usr.vo.UserCreateRespVO; +import com.example.erp.module.usr.vo.UserListItemVO; import com.example.erp.module.usr.vo.StaffVO; import com.example.erp.module.usr.vo.PermissionGroupVO; import com.fasterxml.jackson.databind.ObjectMapper; @@ -103,6 +106,28 @@ class UserControllerTest { } @Test + void getUsers_withToken_returns200() throws Exception { + PageVO page = new PageVO<>(); + page.setTotal(0); + page.setPage(1); + page.setPageSize(20); + page.setList(List.of()); + when(userService.getUserList(any(UserListQueryDTO.class), anyString())).thenReturn(page); + + mockMvc.perform(get("/api/usr/users").with(superAdmin())) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.data.total").value(0)) + .andExpect(jsonPath("$.data.list").isArray()); + } + + @Test + void getUsers_noAuth_returns401() throws Exception { + mockMvc.perform(get("/api/usr/users")) + .andExpect(status().isUnauthorized()); + } + + @Test void getPermissionGroups_returns200() throws Exception { PermissionGroupVO g = new PermissionGroupVO(); g.setSId("g1"); diff --git a/backend/src/test/java/com/example/erp/module/usr/UserServiceTest.java b/backend/src/test/java/com/example/erp/module/usr/UserServiceTest.java index fb2305b..af2cede 100644 --- a/backend/src/test/java/com/example/erp/module/usr/UserServiceTest.java +++ b/backend/src/test/java/com/example/erp/module/usr/UserServiceTest.java @@ -1,9 +1,13 @@ package com.example.erp.module.usr; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.example.erp.common.exception.BizException; +import com.example.erp.common.vo.PageVO; import com.example.erp.config.UserPrincipal; import com.example.erp.module.usr.dto.UserCreateReqDTO; import com.example.erp.module.usr.dto.UserListQueryDTO; +import com.example.erp.module.usr.vo.UserListItemVO; import com.example.erp.module.usr.entity.StaffEntity; import com.example.erp.module.usr.entity.UsrUserEntity; import com.example.erp.module.usr.entity.UserPermissionEntity; @@ -118,6 +122,33 @@ class UserServiceTest { } @Test + void getUserList_capsPageSizeAt100_callsMapper() { + IPage mockPage = new Page<>(1, 100, 5); + when(userMapper.selectUserList(argThat(p -> p.getSize() == 100), eq("b1"), any(), any(), any())) + .thenReturn(mockPage); + + UserListQueryDTO q = new UserListQueryDTO(); + q.setPageSize(200); + PageVO result = userService.getUserList(q, "b1"); + + assertEquals(5L, result.getTotal()); + verify(userMapper).selectUserList(argThat(p -> p.getSize() == 100), eq("b1"), any(), any(), any()); + } + + @Test + void getUserList_emptyQueryValue_doesNotFilter() { + IPage mockPage = new Page<>(1, 20, 2); + when(userMapper.selectUserList(any(), eq("b1"), eq("username"), eq("contains"), eq(""))) + .thenReturn(mockPage); + + UserListQueryDTO q = new UserListQueryDTO(); + q.setQueryValue(null); + PageVO result = userService.getUserList(q, "b1"); + + assertEquals(2L, result.getTotal()); + } + + @Test void createUser_invalidEmployeeId_throws40001() { req.setEmployeeId("bad-staff-id"); when(userMapper.selectCount(any())).thenReturn(0L); -- libgit2 0.22.2