Commit 9895c567f53f509a887976f75ff829c197a4c3af

Authored by zichun
1 parent d3ff317d

feat(usr): user list mapper + vo with join REQ-USR-003

backend/src/main/java/com/xly/erp/module/usr/mapper/UserMapper.java
@@ -2,6 +2,20 @@ package com.xly.erp.module.usr.mapper; @@ -2,6 +2,20 @@ package com.xly.erp.module.usr.mapper;
2 2
3 import com.baomidou.mybatisplus.core.mapper.BaseMapper; 3 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
4 import com.xly.erp.module.usr.entity.User; 4 import com.xly.erp.module.usr.entity.User;
  5 +import com.xly.erp.module.usr.vo.UserListVO;
  6 +import org.apache.ibatis.annotations.Param;
  7 +
  8 +import java.util.List;
5 9
6 public interface UserMapper extends BaseMapper<User> { 10 public interface UserMapper extends BaseMapper<User> {
  11 +
  12 + List<UserListVO> pageWithFilter(@Param("field") String field,
  13 + @Param("matchOp") String matchOp,
  14 + @Param("value") Object value,
  15 + @Param("offset") int offset,
  16 + @Param("size") int size);
  17 +
  18 + long countWithFilter(@Param("field") String field,
  19 + @Param("matchOp") String matchOp,
  20 + @Param("value") Object value);
7 } 21 }
backend/src/main/java/com/xly/erp/module/usr/vo/UserListVO.java 0 → 100644
  1 +package com.xly.erp.module.usr.vo;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonProperty;
  4 +
  5 +import java.time.LocalDateTime;
  6 +
  7 +public class UserListVO {
  8 +
  9 + @JsonProperty("iIncrement")
  10 + private Integer iIncrement;
  11 +
  12 + @JsonProperty("sUserName")
  13 + private String sUserName;
  14 +
  15 + @JsonProperty("staffName")
  16 + private String staffName;
  17 +
  18 + @JsonProperty("sUserNo")
  19 + private String sUserNo;
  20 +
  21 + @JsonProperty("department")
  22 + private String department;
  23 +
  24 + @JsonProperty("sUserType")
  25 + private String sUserType;
  26 +
  27 + @JsonProperty("sLanguage")
  28 + private String sLanguage;
  29 +
  30 + @JsonProperty("bDeleted")
  31 + private Boolean bDeleted;
  32 +
  33 + @JsonProperty("tLastLoginDate")
  34 + private LocalDateTime tLastLoginDate;
  35 +
  36 + @JsonProperty("sCreatedBy")
  37 + private String sCreatedBy;
  38 +
  39 + @JsonProperty("tCreateDate")
  40 + private LocalDateTime tCreateDate;
  41 +
  42 + public Integer getIIncrement() { return iIncrement; }
  43 + public void setIIncrement(Integer iIncrement) { this.iIncrement = iIncrement; }
  44 + public String getSUserName() { return sUserName; }
  45 + public void setSUserName(String sUserName) { this.sUserName = sUserName; }
  46 + public String getStaffName() { return staffName; }
  47 + public void setStaffName(String staffName) { this.staffName = staffName; }
  48 + public String getSUserNo() { return sUserNo; }
  49 + public void setSUserNo(String sUserNo) { this.sUserNo = sUserNo; }
  50 + public String getDepartment() { return department; }
  51 + public void setDepartment(String department) { this.department = department; }
  52 + public String getSUserType() { return sUserType; }
  53 + public void setSUserType(String sUserType) { this.sUserType = sUserType; }
  54 + public String getSLanguage() { return sLanguage; }
  55 + public void setSLanguage(String sLanguage) { this.sLanguage = sLanguage; }
  56 + public Boolean getBDeleted() { return bDeleted; }
  57 + public void setBDeleted(Boolean bDeleted) { this.bDeleted = bDeleted; }
  58 + public LocalDateTime getTLastLoginDate() { return tLastLoginDate; }
  59 + public void setTLastLoginDate(LocalDateTime tLastLoginDate) { this.tLastLoginDate = tLastLoginDate; }
  60 + public String getSCreatedBy() { return sCreatedBy; }
  61 + public void setSCreatedBy(String sCreatedBy) { this.sCreatedBy = sCreatedBy; }
  62 + public LocalDateTime getTCreateDate() { return tCreateDate; }
  63 + public void setTCreateDate(LocalDateTime tCreateDate) { this.tCreateDate = tCreateDate; }
  64 +}
backend/src/main/resources/mapper/usr/UserMapper.xml 0 → 100644
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  3 + "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  4 +<mapper namespace="com.xly.erp.module.usr.mapper.UserMapper">
  5 +
  6 + <sql id="baseSelectColumns">
  7 + u.iIncrement AS iIncrement,
  8 + u.sUserName AS sUserName,
  9 + s.sStaffName AS staffName,
  10 + u.sUserNo AS sUserNo,
  11 + s.sDepartment AS department,
  12 + u.sUserType AS sUserType,
  13 + u.sLanguage AS sLanguage,
  14 + u.bDeleted AS bDeleted,
  15 + u.tLastLoginDate AS tLastLoginDate,
  16 + u.sCreatedBy AS sCreatedBy,
  17 + u.tCreateDate AS tCreateDate
  18 + </sql>
  19 +
  20 + <sql id="filterClause">
  21 + <where>
  22 + <if test="value != null and value != ''">
  23 + <choose>
  24 + <when test="matchOp == 'contains'">${field} LIKE CONCAT('%', #{value}, '%')</when>
  25 + <when test="matchOp == 'notContains'">${field} NOT LIKE CONCAT('%', #{value}, '%')</when>
  26 + <when test="matchOp == 'equals'">${field} = #{value}</when>
  27 + </choose>
  28 + </if>
  29 + </where>
  30 + </sql>
  31 +
  32 + <select id="pageWithFilter" resultType="com.xly.erp.module.usr.vo.UserListVO">
  33 + SELECT <include refid="baseSelectColumns"/>
  34 + FROM tUser u
  35 + LEFT JOIN tStaff s ON s.iIncrement = u.iStaffId AND s.bDeleted = 0
  36 + <include refid="filterClause"/>
  37 + ORDER BY u.iIncrement DESC
  38 + LIMIT #{offset}, #{size}
  39 + </select>
  40 +
  41 + <select id="countWithFilter" resultType="long">
  42 + SELECT COUNT(1)
  43 + FROM tUser u
  44 + LEFT JOIN tStaff s ON s.iIncrement = u.iStaffId AND s.bDeleted = 0
  45 + <include refid="filterClause"/>
  46 + </select>
  47 +
  48 +</mapper>
backend/src/test/java/com/xly/erp/module/usr/mapper/UserMapperIT.java
@@ -94,6 +94,39 @@ class UserMapperIT { @@ -94,6 +94,39 @@ class UserMapperIT {
94 } 94 }
95 95
96 @Test 96 @Test
  97 + void pageWithFilter_filtersAndJoins() {
  98 + jdbcTemplate.update(
  99 + "INSERT INTO tStaff (sBrandsId, sSubsidiaryId, tCreateDate, sStaffNo, sStaffName, sDepartment, "
  100 + + "sCreatedBy, bDeleted) VALUES ('XLY','XLY', NOW(), 'sp_test_lst_st', '员工X', '研发', 'STUB', 0)");
  101 + Integer staffId = jdbcTemplate.queryForObject(
  102 + "SELECT iIncrement FROM tStaff WHERE sStaffNo = 'sp_test_lst_st'", Integer.class);
  103 +
  104 + User u1 = newUser("sp_test_lst_u1", "查询用户1");
  105 + u1.setIStaffId(staffId);
  106 + userMapper.insert(u1);
  107 + User u2 = newUser("sp_test_lst_u2", "查询用户2");
  108 + userMapper.insert(u2);
  109 +
  110 + java.util.List<com.xly.erp.module.usr.vo.UserListVO> result = userMapper.pageWithFilter(
  111 + "u.sUserNo", "contains", "sp_test_lst_", 0, 10);
  112 +
  113 + assertThat(result).extracting(com.xly.erp.module.usr.vo.UserListVO::getSUserNo)
  114 + .contains("sp_test_lst_u1", "sp_test_lst_u2");
  115 + com.xly.erp.module.usr.vo.UserListVO row1 = result.stream()
  116 + .filter(v -> "sp_test_lst_u1".equals(v.getSUserNo())).findFirst().orElseThrow();
  117 + assertThat(row1.getStaffName()).isEqualTo("员工X");
  118 + assertThat(row1.getDepartment()).isEqualTo("研发");
  119 + com.xly.erp.module.usr.vo.UserListVO row2 = result.stream()
  120 + .filter(v -> "sp_test_lst_u2".equals(v.getSUserNo())).findFirst().orElseThrow();
  121 + assertThat(row2.getStaffName()).isNull();
  122 +
  123 + long total = userMapper.countWithFilter("u.sUserNo", "contains", "sp_test_lst_");
  124 + assertThat(total).isGreaterThanOrEqualTo(2);
  125 +
  126 + jdbcTemplate.update("DELETE FROM tStaff WHERE sStaffNo = 'sp_test_lst_st'");
  127 + }
  128 +
  129 + @Test
97 void userPermissionMapper_deleteByUserId_removesAllRowsForGivenUser() { 130 void userPermissionMapper_deleteByUserId_removesAllRowsForGivenUser() {
98 User user1 = newUser("sp_test_del_u1", "用户1"); 131 User user1 = newUser("sp_test_del_u1", "用户1");
99 userMapper.insert(user1); 132 userMapper.insert(user1);