liujie
昨天 c983a0a398504697a777ffae48e59961b5ee2bd7
hugray-server/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -24,6 +24,11 @@
        <result property="updateBy"      column="update_by"       />
        <result property="updateTime"    column="update_time"     />
        <result property="remark"        column="remark"          />
        <result property="jobTitle"          column="job_title"          />
        <result property="serviceQrcodeUrl"   column="service_qrcode_url"  />
        <!-- role_names 是 selectUserList 里 group_concat 出来的派生列,只有列表查询会带;
             详情/登录链路没有这一列,此处留着不影响(无列即不赋值) -->
        <result property="roleNames"          column="role_names"          />
        <association property="dept"     javaType="SysDept"         resultMap="deptResult" />
        <collection  property="roles"    javaType="java.util.List"  resultMap="RoleResult" />
    </resultMap>
@@ -48,7 +53,7 @@
    </resultMap>
   
   <sql id="selectUserVo">
        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.pwd_update_date, u.create_by, u.create_time, u.update_by, u.update_time, u.remark,
        select u.user_id, u.dept_id, u.user_name, u.nick_name, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.pwd_update_date, u.create_by, u.create_time, u.update_by, u.update_time, u.job_title, u.service_qrcode_url, u.remark,
        d.dept_id, d.parent_id, d.ancestors, d.dept_name, d.order_num, d.leader, d.status as dept_status,
        r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope, r.status as role_status
        from sys_user u
@@ -58,7 +63,24 @@
    </sql>
    
    <select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
      select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
      select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
      u.job_title, u.service_qrcode_url,
      <!--
        角色列:只能用标量子查询聚合,不能改成 left join sys_user_role。
        本项目列表走 PageHelper 分页,join 关联表会让多角色用户的行翻倍,
        count 与 limit 同时出错(AccountUserMapper.xml 里有同样的踩坑记录)。
        标量子查询写在 select 列表里是安全的:count 优化会把整个 select 列表换成 count(0),
        子查询随之被丢弃,不影响总数。
        order by 补 role_id 兜底,role_sort 相同时顺序才稳定。
      -->
      (select group_concat(r2.role_name order by r2.role_sort, r2.role_id separator '、')
         from sys_user_role ur2
         join sys_role r2 on r2.role_id = ur2.role_id
        where ur2.user_id = u.user_id) as role_names,
      d.dept_name, d.leader from sys_user u
      <!-- join 与别名 d/u 都不能删:下面 ${params.dataScope} 由 Service 的
           @DataScope(deptAlias = "d", userAlias = "u") 拼出,里面硬编码 d.dept_id / u.user_id。
           页面不再显示部门列,但数据权限过滤仍然依赖这个 join。 -->
      left join sys_dept d on u.dept_id = d.dept_id
      where u.del_flag = '0'
      <if test="userId != null and userId != 0">
@@ -81,6 +103,11 @@
      </if>
      <if test="deptId != null and deptId != 0">
         AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE find_in_set(#{deptId}, ancestors) ))
      </if>
      <!-- 按角色筛选:用 exists 而非 join,理由同上面 role_names 的注释。
           sys_user_role 主键是 (user_id, role_id),这里的条件能走主键前缀。 -->
      <if test="roleId != null and roleId != 0">
         AND exists(select 1 from sys_user_role ur where ur.user_id = u.user_id and ur.role_id = #{roleId})
      </if>
      <!-- 数据范围过滤 -->
      ${params.dataScope}
@@ -158,6 +185,10 @@
          <if test="pwdUpdateDate != null">pwd_update_date,</if>
          <if test="createBy != null and createBy != ''">create_by,</if>
          <if test="remark != null and remark != ''">remark,</if>
          <!-- 以下两列刻意用 != null 而非 != '':清空二维码(置空串)也要能写进库,
               照抄同排其它列的 != '' 会让"删除二维码"永远删不掉 -->
          <if test="jobTitle != null">job_title,</if>
          <if test="serviceQrcodeUrl != null">service_qrcode_url,</if>
          create_time
       )values(
          <if test="userId != null and userId != ''">#{userId},</if>
@@ -173,6 +204,8 @@
          <if test="pwdUpdateDate != null">#{pwdUpdateDate},</if>
          <if test="createBy != null and createBy != ''">#{createBy},</if>
          <if test="remark != null and remark != ''">#{remark},</if>
          <if test="jobTitle != null">#{jobTitle},</if>
          <if test="serviceQrcodeUrl != null">#{serviceQrcodeUrl},</if>
          sysdate()
       )
   </insert>
@@ -192,6 +225,8 @@
          <if test="loginDate != null">login_date = #{loginDate},</if>
          <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
          <if test="remark != null">remark = #{remark},</if>
          <if test="jobTitle != null">job_title = #{jobTitle},</if>
          <if test="serviceQrcodeUrl != null">service_qrcode_url = #{serviceQrcodeUrl},</if>
          update_time = sysdate()
       </set>
       where user_id = #{userId}