zouyu
2025-03-06 d9326c6f02ff4dae1a301f6ad9dd5539450aa1ba
用户管理&权限管理调整
已修改10个文件
已添加8个文件
451 ■■■■■ 文件已修改
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentListServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/lib/aspose-words-15.12.0-jdk16.jar 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/lib/license.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
inspect-server/src/main/resources/static/report-template.docx 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/CustomController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/AuthApi.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/HeaderToken.java 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Company.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Person.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/dto/PersonDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cnas-manage/src/main/java/com/ruoyi/manage/service/impl/ManageDocumentListServiceImpl.java
@@ -22,9 +22,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
inspect-server/src/main/resources/lib/aspose-words-15.12.0-jdk16.jar
Binary files differ
inspect-server/src/main/resources/lib/license.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<License>
    <Data>
        <Products>
            <Product>Aspose.Total for Java</Product>
            <Product>Aspose.Words for Java</Product>
        </Products>
        <EditionType>Enterprise</EditionType>
        <SubscriptionExpiry>20991231</SubscriptionExpiry>
        <LicenseExpiry>20991231</LicenseExpiry>
        <SerialNumber>8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7</SerialNumber>
    </Data>
    <Signature>sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=</Signature>
</License>
inspect-server/src/main/resources/static/report-template.docx
Binary files differ
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/CustomController.java
@@ -30,7 +30,7 @@
    @ApiOperation(value = "获取客户列表")
    @GetMapping("/selectCustomPageList")
    public Result<IPage<Custom>> selectCustomPageList(Page page, Custom custom) throws Exception {
    public Result<IPage<Custom>> selectCustomPageList(Page page, Custom custom) {
        return Result.success(customService.selectCustomPageList(page, custom));
    }
    @ApiOperation(value = "删除客户信息")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/UserController.java
@@ -2,13 +2,18 @@
import com.ruoyi.common.core.domain.Result;
import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.core.dto.PersonDto;
import com.ruoyi.system.service.UserService;
import com.ruoyi.web.controller.dto.UpdateUserDto;
import com.ruoyi.web.controller.system.api.HeaderToken;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
@@ -23,6 +28,9 @@
    @Resource
    private UserService userService;
    @Autowired
    private HeaderToken headerToken;
    /**
     * todo:  type : 1: èŽ·å–æ£€æµ‹äººå‘˜ä¿¡æ¯
@@ -70,6 +78,23 @@
    }
    @ApiOperation(value = "查看人事系统组织架构")
    @GetMapping(value = "/selectCompaniesList")
    public Result<List<Company>> selectCompaniesList() {
        return Result.success(headerToken.companyUrl());
    }
    @ApiOperation("获取人事系统组织下的人员")
    @GetMapping(value = "/selectSimpleList")
    public Result<?> selectSimpleList(String companyId) {
        return Result.success(headerToken.userUrl(companyId));
    }
    @ApiOperation("将人事系统勾选的内容转移到本系统")
    @PostMapping(value = "/addPersonUser")
    public Result<?> addPersonUser(@RequestBody PersonDto personDto) {
        return Result.success(userService.addPersonUser(personDto));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/AuthApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,57 @@
package com.ruoyi.web.controller.system.api;
public class AuthApi {
    /**
     * æµ‹è¯•地址
     * */
//    private String code = "https://ztt-sso.asuncloud.net/oauth2/token";
    /**
     * æ­£å¼åœ°å€
     * */
    public static String code = "https://ztt-sso.ztt.cn/oauth2/token";
    /**
     * æ²³å£äººäº‹æµ‹è¯•库
     * */
//    private String appId = "8b2f2c7e-2ab9-4718-8193-c0c636dceba8";
//    private String appSecret = "db59b70d28ab1865aafe4008f59d4760";
    /**
     * æ²³å£äººäº‹æ­£å¼åº“
     * */
    public static String appId = "f6f3d70f-3666-4d3d-b9c5-430de3f6007c";
    public static String appSecret = "a18923496542302066b0a7bec993a4e2";
/**
 * è£…备人事测试库
 * */
//    private String appId = "0acf9b63-31e3-45c4-99c1-af1aac88b985";
//    private String appSecret = "7fb7a4026c71619345c31fa12ba31f4f";
    /**
     * è£…备人事正式库
     * */
//    private String appId = "6f5f6a0c-2a01-4ef6-9e75-c8a6f0c2f044";
//    private String appSecret = "89b9c4735b1e5ee9d6a8544b9b38bb03";
    /**
     * æŸ¥è¯¢ç»„织架构
     */
    public static String companies = "https://ztt-connector.ztt.cn/api/org/v1/companies";
    public static String simple="https://ztt-connector.ztt.cn/api/org/v1/employees/simple?companyId=";
    /**
     * èŽ·å–æ‰€æœ‰äººå‘˜
     */
    public static String employees = "https://ztt-connector.ztt.cn/api/org/v1/employees";
    /**
     * äººå‘˜å¯†ç èŽ·å–
     * */
    public static String password = "https://ztt-connector.ztt.cn/api/org/v1/employees/original_pwd/";
    public static String department = "https://ztt-connector.ztt.cn/api/org/v1/companies/companyId/departments";
    public static String person = "https://ztt-connector.ztt.cn/api/org/v1/employees/simple/";
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/api/HeaderToken.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
package com.ruoyi.web.controller.system.api;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.log.Log;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.common.core.domain.entity.Person;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.system.mapper.UserMapper;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@Component
public class HeaderToken {
    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private UserMapper userMapper;
    public String fetchNewAccessToken() {
        HttpRequest request = HttpRequest.post(AuthApi.code)
                .header("Content-Type", "application/x-www-form-urlencoded")
                .form("grant_type", "client_credentials")
                .form("client_id", AuthApi.appId)
                .form("client_secret", AuthApi.appSecret);
        HttpResponse response = request.execute();
        ObjectMapper objectMapper = new ObjectMapper();
        JsonNode jsonNode;
        try {
            jsonNode = objectMapper.readTree(response.body());
            String accessToken = jsonNode.get("access_token").asText();
            Log.get().info("获取人事系统token:"+accessToken);
            redisTemplate.opsForValue().set("access_token",accessToken,jsonNode.get("expires_in").asInt() - 60,TimeUnit.SECONDS);
            return accessToken;
        } catch (Exception e) {
            throw new ErrorException(e.getMessage());
        }
    }
    //判断是否存在
    public String getAccessToken() {
        String accessToken;
        if (!redisTemplate.hasKey("access_token")) {
            accessToken = fetchNewAccessToken();
        }else{
            accessToken = redisTemplate.opsForValue().get("access_token")+"";
        }
        return accessToken;
    }
    //调用
    public List<Company> companyUrl() {
        String accessToken = getAccessToken();
        HttpRequest request = HttpRequest.get(AuthApi.companies)
                .header("Authorization", "Bearer " + accessToken);
        List<Company> companies;
        try {
            companies = JSON.parseArray(request.execute().body(), Company.class);
        }catch (Exception e){
            throw new ErrorException(e.getMessage());
        }
        return companies.stream().filter(ob->{
            if(Objects.equals(ob.getStatus(), "enabled")) return true;
            return false;
        }).collect(Collectors.toList());
//        return companies;
    }
    public List<Person> userUrl(String companyId) {
        String accessToken = getAccessToken();
        HttpRequest request = HttpRequest.get(AuthApi.simple+companyId)
                .header("Authorization", "Bearer " + accessToken)
                .header("Content-Type", "application/form-data");
        List<Person> person;
        try {
            person = JSON.parseArray(request.execute().body(), Person.class);
        }catch (Exception e){
            throw new ErrorException(e.getMessage());
        }
        List<JSONObject> department = getDepartment(companyId);
        return person.stream().filter(ob->{
            if(Objects.equals(ob.getStatus(), "enabled")) {
                ob.setIsLive(userMapper.selectCount(Wrappers.<User>lambdaQuery().eq(User::getAccount, ob.getEmployeeID())));
                ob.setDepartment(getDepartmentStr(department, ob.getDepartmentCode()).replaceFirst("/", ""));
                return true;
            }
            return false;
        }).collect(Collectors.toList());
    }
    public String getDepartmentStr(List<JSONObject> department, String code){
        String str = "";
        Optional<JSONObject> depart = department.stream().filter(a -> code.equals(a.get("departmentCode"))).findFirst();
        str = "/" + depart.get().get("departmentName") + str;
        if(depart.get().get("parentDepartmentCode") != null){
            str = getDepartmentStr(department, depart.get().get("parentDepartmentCode").toString()) + str;
        }
        return str;
    }
    public String getPassword(String employeeId) {
        String accessToken = getAccessToken();
        HttpRequest request = HttpRequest.get(AuthApi.password + employeeId)
                .header("Authorization", "Bearer " + accessToken);
        System.out.println(AuthApi.password + employeeId);
        System.out.println(request.execute().body());
        return JSON.parseObject(request.execute().body()).get("originalPwd").toString();
    }
    public List<JSONObject> getDepartment(String companyId){
        String accessToken = getAccessToken();
        HttpRequest request = HttpRequest.get(AuthApi.department.replace("companyId", companyId))
                .header("Authorization", "Bearer " + accessToken)
                .header("Content-Type", "application/form-data");
        List<JSONObject> list;
        try {
            list = JSON.parseArray(request.execute().body());
        }catch (Exception e){
            throw new ErrorException(e.getMessage());
        }
        return list.stream().filter(ob->{
            if(Objects.equals(ob.get("status"), "enabled")) return true;
            return false;
        }).collect(Collectors.toList());
    }
    public Person selectPersonUser(String code){
        String accessToken = getAccessToken();
        HttpRequest request = HttpRequest.get(AuthApi.person + code)
                .header("Authorization", "Bearer " + accessToken)
                .header("Content-Type", "application/form-data");
        Person person;
        try {
            person = JSON.parseObject(request.execute().body(), Person.class);
            if(BeanUtil.isEmpty(person))return null;
        }catch (Exception e){
            throw new ErrorException(e.getMessage());
        }
        List<JSONObject> department = getDepartment(person.getCompanyId());
        person.setDepartment(getDepartmentStr(department, person.getDepartmentCode()).replaceFirst("/", ""));
        person.setIsLive(userMapper.selectCount(Wrappers.<User>lambdaQuery().eq(User::getAccount, person.getEmployeeID())));
        return person;
    }
    // èŽ·å–æ‰€æœ‰äººå‘˜ä¿¡æ¯
    public List<Map> getEmployees() {
        // èŽ·å–token
        String accessToken = getAccessToken();
        HttpRequest request = HttpRequest.get(AuthApi.employees).header("Authorization", "Bearer " + accessToken)
                .header("Content-Type", "application/form-data");
        String body = request.execute().body();
        List<Map> maps = JSONArray.parseArray(body, Map.class);
        return  maps;
    }
    // èŽ·å–äººå‘˜ä¿¡æ¯
    public Map getEmployee(String employeeId) {
        // èŽ·å–token
        String accessToken = getAccessToken();
        System.out.println("token " + accessToken);
        String url = AuthApi.employees + "/" + employeeId;
        HttpRequest request = HttpRequest.get(url).header("Authorization", "Bearer " + accessToken);
        String body = request.execute().body();
        ObjectMapper objectMapper = new ObjectMapper();
        Map map = new HashMap<>();
        try {
             map = objectMapper.readValue(body, Map.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
        return map;
    }
}
ruoyi-admin/src/main/resources/application.yml
@@ -64,7 +64,7 @@
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: true
      enabled: false
  # redis é…ç½®
  redis:
    # åœ°å€
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Company.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.common.core.domain.entity;
import lombok.Data;
@Data
public class Company {
    private String companyId;
    private String companyName;
    private String parentCompanyId;
    private String description;
    private String status;
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/Person.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.common.core.domain.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class Person {
    private String name;
    //人员编号,全局唯一
    private String employeeID;
//岗位
    private String position;
//岗位编码
    private String positionCode;
//手机号码
    private String phoneNumber;
    //性别 1:男 2:女
    private Integer gender;
    //组织状态 enable:在职 disabled:离职
    private String status;
//所属组织编码
    private String companyId;
//公司邮箱(可用于邮箱系统)
    private String companyEmail;
//入职公司时间
    private String dateOfJoiningTheCompany;
//组织内的部门编码
    private String departmentCode;
    @ApiModelProperty(">1:存在 =0:不存在")
    private Long isLive;
    private String department;
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
@@ -69,6 +69,32 @@
    /** å­èœå• */
    private List<SysMenu> children = new ArrayList<SysMenu>();
    /** æ˜¯å¦å¯ä»¥é€‰æ‹©ä»…看我, 0:否, 1:是 */
    private Integer isRersonalButton;
    /** ä»…看我, 0:否, 1:是 */
    private Integer isRersonal;
    public Integer getIsRersonalButton()
    {
        return isRersonalButton;
    }
    public void setIsRersonalButton(Integer isRersonalButton)
    {
        this.isRersonalButton = isRersonalButton;
    }
    public Integer getIsRersonal()
    {
        return isRersonal;
    }
    public void setIsRersonal(Integer isRersonal)
    {
        this.isRersonal = isRersonal;
    }
    public Long getMenuId()
    {
        return menuId;
@@ -269,6 +295,7 @@
            .append("updateBy", getUpdateBy())
            .append("updateTime", getUpdateTime())
            .append("remark", getRemark())
            .append("isRersonalButton", getIsRersonalButton())
            .toString();
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/User.java
@@ -96,5 +96,8 @@
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "所属组织编码")
    private String companyId;
}
ruoyi-common/src/main/java/com/ruoyi/common/core/dto/PersonDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.common.core.dto;
import com.ruoyi.common.core.domain.entity.Company;
import com.ruoyi.common.core.domain.entity.Person;
import lombok.Data;
import java.util.List;
@Data
public class PersonDto {
    private List<Person> person;
    private List<Company> company;
    private Integer roleId;
}
ruoyi-system/src/main/java/com/ruoyi/system/service/UserService.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.core.dto.PersonDto;
import java.util.List;
@@ -38,5 +39,6 @@
    int delUserDepardLimsId(Integer id);
    int addPersonUser(PersonDto personDto);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserServiceImpl.java
@@ -1,14 +1,21 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.Custom;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.core.dto.PersonDto;
import com.ruoyi.common.utils.QueryWrappers;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.CustomService;
import com.ruoyi.system.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import java.time.LocalDateTime;
import java.util.List;
@@ -21,6 +28,10 @@
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Autowired
    private CustomService customService;
    /**
     * æ ¹æ®æ¡ä»¶èŽ·å–ç”¨æˆ·åˆ—è¡¨
     * @param user
@@ -60,5 +71,44 @@
    public int delUserDepardLimsId(Integer id) {
        return baseMapper.update(null, Wrappers.<User>lambdaUpdate().eq(User::getId, id).set(User::getDepartLimsId, null).set(User::getUpdateTime, LocalDateTime.now()).set(User::getUpdateBy, SecurityUtils.getUsername()));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int addPersonUser(PersonDto personDto) {
        personDto.getPerson().forEach(person -> {
            User user = baseMapper.selectOne(Wrappers.<User>lambdaQuery().eq(User::getAccount, person.getEmployeeID()));
            String companyName = personDto.getCompany().stream().filter(a -> a.getCompanyId().equals(person.getCompanyId())).findFirst().get().getCompanyName();
            Custom custom = customService.getCustomId(companyName);
            if (BeanUtil.isEmpty(user)) {
                user = new User();
                user.setName(person.getName());
                user.setNameEn("not write");
                user.setAccount(person.getEmployeeID());
                user.setPhone(person.getPhoneNumber());
                user.setEmail(person.getCompanyEmail());
                user.setIsCustom(person.getCompanyId().equals("SC2463") ? 0 : 1);
//                user.setPassword(DigestUtils.md5DigestAsHex(headerToken.getPassword(person.getEmployeeID()).getBytes()));
                user.setPassword(SecurityUtils.encryptPassword("zttZTT123!"));
                user.setCompany(BeanUtil.isNotEmpty(custom) ? (custom.getId() + "") : companyName);
//                user.setAddress("未填写");
//                user.setRoleId(personDto.getRoleId() > 10000 ? 0 : personDto.getRoleId());
                user.setCompanyId(person.getCompanyId());
                baseMapper.insert(user);
            } else {
                user.setName(person.getName());
                user.setPhone(person.getPhoneNumber());
                user.setEmail(person.getCompanyEmail());
                user.setIsCustom(0);
                user.setCompany(BeanUtil.isNotEmpty(custom) ? (custom.getId() + "") : companyName);
//                user.setCreateUser(null);
//                user.setCreateTime(null);
//                user.setUpdateUser(null);
//                user.setUpdateTime(null);
                user.setCompanyId(person.getCompanyId());
                baseMapper.updateById(user);
            }
        });
        return 1;
    }
}
ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
@@ -26,6 +26,7 @@
        <result property="updateTime"     column="update_time"    />
        <result property="updateBy"       column="update_by"      />
        <result property="remark"         column="remark"         />
        <result property="isRersonalButton" column="is_rersonal_button"/>
    </resultMap>
    <sql id="selectMenuVo">
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -69,6 +69,9 @@
        <if test="userName != null and userName != ''">
            AND u.account like concat('%', #{userName}, '%')
        </if>
        <if test="nickName != null and nickName != ''">
            AND u.name like concat('%', #{nickName}, '%')
        </if>
        <if test="status != null and status != ''">
            AND u.status = #{status}
        </if>