UserMapper.xml 2.23 KB
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xly.erp.module.usr.mapper.UserMapper">

    <!-- REQ-USR-003 用户列表查询:LEFT JOIN tStaff + 动态 WHERE。
         column 由 service 层白名单映射后通过 @Param("column") 单独传入,
         绝不接受 DTO 中可被 GET query-string 绑定的字段。 -->
    <select id="searchUsers" resultType="com.xly.erp.module.usr.vo.UserListItemVO">
        SELECT
            u.iIncrement, u.sUserName, s.sStaffName, u.sUserNo,
            s.sDepartment, u.sUserType, u.sLanguage, u.bDeleted,
            u.tLastLoginDate, u.sCreatedBy, u.tCreateDate
        FROM tUser u
        LEFT JOIN tStaff s ON u.iStaffId = s.iIncrement AND s.bDeleted = 0
        <where>
            <!-- 默认过滤已软删除:仅当 queryField=='deleted' 且 queryValue 非空时让用户控制 bDeleted 取值 -->
            <if test="query.queryField != 'deleted' or query.queryValue == null or query.queryValue == ''">
                u.bDeleted = 0
            </if>
            <if test="column != null and column != '' and query.queryValue != null and query.queryValue != ''">
                AND
                <choose>
                    <!-- deleted 是 bit(1) 列,MySQL 与字符串 '1'/'0' 隐式比较不可靠;
                         service 已把 queryValue 标准化为 '0' / '1',此处显式 CAST 成整数。 -->
                    <when test="query.queryField == 'deleted'">
                        ${column} = CAST(#{query.queryValue} AS UNSIGNED)
                    </when>
                    <when test="query.matchType == 'equals'">
                        ${column} = #{query.queryValue}
                    </when>
                    <when test="query.matchType == 'notContains'">
                        ${column} NOT LIKE CONCAT('%', #{query.queryValue}, '%')
                    </when>
                    <otherwise>
                        ${column} LIKE CONCAT('%', #{query.queryValue}, '%')
                    </otherwise>
                </choose>
            </if>
        </where>
        ORDER BY u.tCreateDate DESC, u.iIncrement DESC
    </select>
</mapper>