From fe2e63069a6353b94bf39b50dfb7311f16f78391 Mon Sep 17 00:00:00 2001 From: zichun Date: Wed, 6 May 2026 21:53:21 +0800 Subject: [PATCH] feat(usr): UserMapper.xml searchUsers REQ-USR-003 --- backend/src/main/java/com/xly/erp/module/usr/mapper/UserMapper.java | 7 +++++++ backend/src/main/resources/mapper/usr/UserMapper.xml | 35 +++++++++++++++++++++++++++++++++++ backend/src/test/java/com/xly/erp/module/usr/mapper/UserMapperSearchIT.java | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 128 insertions(+), 0 deletions(-) create mode 100644 backend/src/main/resources/mapper/usr/UserMapper.xml create mode 100644 backend/src/test/java/com/xly/erp/module/usr/mapper/UserMapperSearchIT.java diff --git a/backend/src/main/java/com/xly/erp/module/usr/mapper/UserMapper.java b/backend/src/main/java/com/xly/erp/module/usr/mapper/UserMapper.java index 2a5bcaf..5cfe50d 100644 --- a/backend/src/main/java/com/xly/erp/module/usr/mapper/UserMapper.java +++ b/backend/src/main/java/com/xly/erp/module/usr/mapper/UserMapper.java @@ -1,7 +1,14 @@ package com.xly.erp.module.usr.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.xly.erp.module.usr.dto.UserQueryDTO; import com.xly.erp.module.usr.entity.UserEntity; +import com.xly.erp.module.usr.vo.UserListItemVO; +import org.apache.ibatis.annotations.Param; public interface UserMapper extends BaseMapper { + + /** REQ-USR-003 用户列表查询:跨表 JOIN tStaff,按 query 过滤 + 分页。XML 实现。 */ + IPage searchUsers(IPage page, @Param("query") UserQueryDTO query); } diff --git a/backend/src/main/resources/mapper/usr/UserMapper.xml b/backend/src/main/resources/mapper/usr/UserMapper.xml new file mode 100644 index 0000000..095614c --- /dev/null +++ b/backend/src/main/resources/mapper/usr/UserMapper.xml @@ -0,0 +1,35 @@ + + + + + + + diff --git a/backend/src/test/java/com/xly/erp/module/usr/mapper/UserMapperSearchIT.java b/backend/src/test/java/com/xly/erp/module/usr/mapper/UserMapperSearchIT.java new file mode 100644 index 0000000..46a668f --- /dev/null +++ b/backend/src/test/java/com/xly/erp/module/usr/mapper/UserMapperSearchIT.java @@ -0,0 +1,86 @@ +package com.xly.erp.module.usr.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.xly.erp.module.usr.dto.UserQueryDTO; +import com.xly.erp.module.usr.entity.StaffEntity; +import com.xly.erp.module.usr.entity.UserEntity; +import com.xly.erp.module.usr.vo.UserListItemVO; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +@ActiveProfiles("test") +@Transactional +@Rollback +class UserMapperSearchIT { + + @Autowired UserMapper userMapper; + @Autowired StaffMapper staffMapper; + + private Integer insertStaff(String name) { + StaffEntity s = new StaffEntity(); + s.setSStaffNo("st_" + System.nanoTime()); + s.setSStaffName(name); + s.setSDepartment("研发部"); + s.setBDeleted(false); + s.setTCreateDate(LocalDateTime.now()); + staffMapper.insert(s); + return s.getIIncrement(); + } + + private Integer insertUser(String userName, Integer staffId) { + UserEntity u = new UserEntity(); + u.setSUserNo("uno_" + System.nanoTime()); + u.setSUserName(userName); + u.setIStaffId(staffId); + u.setSUserType("普通用户"); + u.setSLanguage("zh"); + u.setBCanModifyDocs(false); + u.setSPasswordHash("$2a$10$x"); + u.setBDeleted(false); + u.setTCreateDate(LocalDateTime.now()); + userMapper.insert(u); + return u.getIIncrement(); + } + + @Test + void searchUsers_emptyFilter_returnsAllUndeletedAsPage() { + Integer staffId = insertStaff("张三"); + insertUser("alice_" + System.nanoTime(), staffId); + insertUser("bob_" + System.nanoTime(), null); + + UserQueryDTO query = new UserQueryDTO(); + IPage result = userMapper.searchUsers(new Page<>(1, 50), query); + + assertThat(result.getTotal()).isGreaterThanOrEqualTo(2L); + assertThat(result.getRecords()).extracting(UserListItemVO::getSUserName) + .anyMatch(n -> n.startsWith("alice_") || n.startsWith("bob_")); + } + + @Test + void searchUsers_filterByUserName_filtersCorrectly() { + String alicePrefix = "ali_" + System.nanoTime(); + insertUser(alicePrefix + "_alice", null); + insertUser("bob_unmatch_" + System.nanoTime(), null); + + UserQueryDTO query = new UserQueryDTO(); + query.setQueryField("username"); + query.setColumn("u.sUserName"); + query.setMatchType("contains"); + query.setQueryValue(alicePrefix); + + IPage result = userMapper.searchUsers(new Page<>(1, 50), query); + + assertThat(result.getRecords()).hasSize(1); + assertThat(result.getRecords().get(0).getSUserName()).startsWith(alicePrefix); + } +} -- libgit2 0.22.2