liusheng
4 天以前 4bb2588c5579d43ae5d343c7343a425a80b02d6c
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.*;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DtoConversionUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanValidators;
@@ -13,13 +14,16 @@
import com.ruoyi.system.mapper.*;
import com.ruoyi.system.service.ISysConfigService;
import com.ruoyi.system.service.ISysUserService;
import com.smartor.domain.SvyTaskVO;
import com.smartor.mapper.SysUserDeptMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import javax.validation.Validator;
import java.util.*;
@@ -60,6 +64,9 @@
    @Autowired
    protected Validator validator;
    @Value("${isAdmin}")
    private List<Long> isAdmin;
    /**
     * 根据条件分页查询用户列表
@@ -159,92 +166,238 @@
    @Override
    public SysUser selectUserByUserName2(String userName) {
        String[] split = userName.split("&");
        SysUser sysUser = userMapper.selectUserByUserNameByCondition(split[0], split[1]);
        List<SysDept> sysDepts = null;
        if (StringUtils.isNotEmpty(split[0]) && split[0].equals("admin")) {
        log.debug("开始查询用户信息,用户名: {}", userName);
        try {
            // 参数校验
            if (StringUtils.isEmpty(userName)) {
                log.warn("用户名参数为空");
                return null;
            }
            // 解析用户名和机构ID
            String[] userInfo = parseUserName(userName);
            if (userInfo == null) {
                log.warn("用户名格式不正确: {}", userName);
                return null;
            }
            String username = userInfo[0];
            String orgId = userInfo[1];
            // 查询用户基本信息
            SysUser sysUser = userMapper.selectUserByUserNameByCondition(username, orgId);
            if (Objects.isNull(sysUser)) {
                log.warn("未找到用户信息: username={}, orgId={}", username, orgId);
                return null;
            }
            // 查询用户部门信息
            List<SysDept> sysDepts = getUserDepts(sysUser, username, orgId);
            List<Long> deptIds = extractDeptIds(sysDepts);
            sysUser.setDepts(deptIds);
            // 根据搜索范围处理科室和病区信息
            processUserDeptInfo(sysUser, username, orgId);
            log.debug("用户信息查询完成: userId={}", sysUser.getUserId());
            return sysUser;
        } catch (Exception e) {
            log.error("查询用户信息时发生异常: userName={}", userName, e);
            return null;
        }
    }
    /**
     * 解析用户名,提取用户名和机构ID
     */
    private String[] parseUserName(String userName) {
        if (StringUtils.isEmpty(userName) || !userName.contains("&")) {
            return null;
        }
        return userName.split("&");
    }
    /**
     * 获取用户部门信息
     */
    private List<SysDept> getUserDepts(SysUser sysUser, String username, String orgId) {
        if ("admin".equals(username)) {
            SysDept dept = new SysDept();
            dept.setOrgid(split[1]);
            sysDepts = sysDeptMapper.selectDeptList(dept);
            dept.setOrgid(orgId);
            return sysDeptMapper.selectDeptList(dept);
        } else {
            sysDepts = sysUserDeptMapper.selectDeptListByUserId(sysUser.getUserId());
            return sysUserDeptMapper.selectDeptListByUserId(sysUser.getUserId());
        }
        List<Long> deptIds = new ArrayList<>();
        for (SysDept sysDept : sysDepts) {
            deptIds.add(sysDept.getDeptId());
    }
    /**
     * 提取部门ID列表
     */
    private List<Long> extractDeptIds(List<SysDept> sysDepts) {
        if (CollectionUtils.isEmpty(sysDepts)) {
            return new ArrayList<>();
        }
        return sysDepts.stream()
                .map(SysDept::getDeptId)
                .collect(Collectors.toList());
    }
    /**
     * 处理用户科室和病区信息
     */
    private void processUserDeptInfo(SysUser sysUser, String username, String orgId) {
        String searchScope = sysUser.getSearchscope();
        if (StringUtils.isEmpty(searchScope)) {
            return;
        }
        switch (searchScope) {
            case "0": // 全部范围
                processFullScopeDeptInfo(sysUser, username, orgId);
                break;
            case "1": // 科室范围
                processDeptScopeInfo(sysUser, orgId, "1");
                break;
            case "2": // 病区范围
                processDeptScopeInfo(sysUser, orgId, "2");
                break;
            default:
                log.warn("未知的搜索范围: {}", searchScope);
        }
    }
    /**
     * 处理全部范围的部门信息
     */
    private void processFullScopeDeptInfo(SysUser sysUser, String username, String orgId) {
        SysUserDept sysUserDept = createSysUserDept(sysUser, orgId);
        List<SysUserDept> sysUserDeptKSs = null;
        List<SysUserDept> sysUserDeptBQs = null;
        if ("admin".equals(username)) {
            // admin用户特殊处理
            sysUserDept.setUserId(null);
            sysUserDeptKSs = getAdminDeptList(orgId, "1");
            sysUserDeptBQs = getAdminDeptList(orgId, "2");
            // 去重处理
            sysUserDeptKSs = removeDuplicateDepts(sysUserDeptKSs);
            sysUserDeptBQs = removeDuplicateDepts(sysUserDeptBQs);
        } else {
            // 普通用户处理
            sysUserDept.setDeptType("1");
            sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
            sysUserDept.setDeptType("2");
            sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
        }
        // 设置科室和病区信息
        setBelongWards(sysUser, sysUserDeptBQs);
        setBelongDepts(sysUser, sysUserDeptKSs);
    }
    /**
     * 处理指定范围的部门信息
     */
    private void processDeptScopeInfo(SysUser sysUser, String orgId, String deptType) {
        SysUserDept sysUserDept = createSysUserDept(sysUser, orgId);
        sysUserDept.setDeptType(deptType);
        List<SysUserDept> deptList = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
        if ("1".equals(deptType)) {
            setBelongDepts(sysUser, deptList);
        } else if ("2".equals(deptType)) {
            setBelongWards(sysUser, deptList);
        }
    }
    /**
     * 创建SysUserDept对象
     */
    private SysUserDept createSysUserDept(SysUser sysUser, String orgId) {
        SysUserDept sysUserDept = new SysUserDept();
        sysUserDept.setUserId(sysUser.getUserId());
        sysUserDept.setDeptType(sysUser.getSearchscope());
        List<SysUserDept> sysUserDeptKSs = null;
        List<SysUserDept> sysUserDeptBQs = null;
        if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("0")) {
            if (StringUtils.isNotEmpty(split[0]) && split[0].equals("admin")) {
                sysUserDept.setUserId(null);
            }
            sysUserDept.setDeptType("1");
            sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
            sysUserDept.setDeptType("2");
            sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
            //如果是admin,需要对sysUserDeptBQs,sysUserDeptBQs去重
            if (StringUtils.isNotEmpty(split[0]) && split[0].equals("admin")) {
                List<SysUserDept> distinctUserDepts = new ArrayList<>();
                Set<String> uniqueDeptCodes = new HashSet<>();
                for (SysUserDept userDept : sysUserDeptKSs) {
                    String deptCode = userDept.getDeptCode();
                    if (!uniqueDeptCodes.contains(deptCode)) {
                        distinctUserDepts.add(userDept);
                        uniqueDeptCodes.add(deptCode);
                    }
                }
                List<SysUserDept> distinctUserBQs = new ArrayList<>();
                Set<String> uniqueBQCodes = new HashSet<>();
                for (SysUserDept userDept : sysUserDeptBQs) {
                    String deptCode = userDept.getDeptCode();
                    if (!uniqueBQCodes.contains(deptCode)) {
                        distinctUserBQs.add(userDept);
                        uniqueBQCodes.add(deptCode);
                    }
                }
                sysUserDeptKSs = distinctUserDepts;
                sysUserDeptBQs = distinctUserBQs;
            }
        } else if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("1")) {
            sysUserDept.setDeptType("1");
            sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
        } else if (StringUtils.isNotEmpty(sysUser.getSearchscope()) && sysUser.getSearchscope().equals("2")) {
            sysUserDept.setDeptType("2");
            sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
        sysUserDept.setOrgid(orgId);
        return sysUserDept;
    }
    /**
     * 获取admin用户的部门列表
     */
    private List<SysUserDept> getAdminDeptList(String orgId, String deptType) {
        SysDept dept = new SysDept();
        dept.setOrgid(orgId);
        dept.setDeptType(deptType);
        List<SysDept> sysDepts = sysDeptMapper.selectDeptList(dept);
        return DtoConversionUtils.sourceToTarget(sysDepts, SysUserDept.class);
    }
    /**
     * 去除重复的部门信息
     */
    private List<SysUserDept> removeDuplicateDepts(List<SysUserDept> deptList) {
        if (CollectionUtils.isEmpty(deptList)) {
            return new ArrayList<>();
        }
        sysUser.setDepts(deptIds);
        if (!CollectionUtils.isEmpty(sysUserDeptBQs)) {
            List<Map<String, Object>> list = new ArrayList<>();
            for (SysUserDept sud : sysUserDeptBQs) {
                Map<String, Object> map = new HashMap<>();
                map.put("districtCode", "");
                if (StringUtils.isNotEmpty(sud.getDeptCode())) map.put("districtCode", sud.getDeptCode());
                map.put("districtName", "");
                if (StringUtils.isNotEmpty(sud.getDeptName())) map.put("districtName", sud.getDeptName());
                list.add(map);
        List<SysUserDept> distinctDepts = new ArrayList<>();
        Set<String> uniqueCodes = new HashSet<>();
        for (SysUserDept dept : deptList) {
            String deptCode = dept.getDeptCode();
            if (StringUtils.isNotEmpty(deptCode) && !uniqueCodes.contains(deptCode)) {
                distinctDepts.add(dept);
                uniqueCodes.add(deptCode);
            }
            sysUser.setBelongWards(list);
        }
        if (!CollectionUtils.isEmpty(sysUserDeptKSs)) {
            List<Map<String, Object>> list = new ArrayList<>();
            for (SysUserDept sud : sysUserDeptKSs) {
                Map<String, Object> map = new HashMap<>();
                map.put("deptCode", "");
                if (StringUtils.isNotEmpty(sud.getDeptCode())) map.put("deptCode", sud.getDeptCode());
                map.put("deptName", "");
                if (StringUtils.isNotEmpty(sud.getDeptName())) map.put("deptName", sud.getDeptName());
                list.add(map);
            }
            sysUser.setBelongDepts(list);
        return distinctDepts;
    }
    /**
     * 设置病区信息
     */
    private void setBelongWards(SysUser sysUser, List<SysUserDept> sysUserDeptBQs) {
        if (CollectionUtils.isEmpty(sysUserDeptBQs)) {
            return;
        }
        return sysUser;
        List<Map<String, Object>> wardList = sysUserDeptBQs.stream()
                .filter(sud -> StringUtils.isNotEmpty(sud.getDeptCode()))
                .map(sud -> {
                    Map<String, Object> map = new HashMap<>();
                    map.put("districtCode", StringUtils.defaultString(sud.getDeptCode(), ""));
                    map.put("districtName", StringUtils.defaultString(sud.getDeptName(), ""));
                    return map;
                })
                .collect(Collectors.toList());
        sysUser.setBelongWards(wardList);
    }
    /**
     * 设置科室信息
     */
    private void setBelongDepts(SysUser sysUser, List<SysUserDept> sysUserDeptKSs) {
        if (CollectionUtils.isEmpty(sysUserDeptKSs)) {
            return;
        }
        List<Map<String, Object>> deptList = sysUserDeptKSs.stream()
                .filter(sud -> StringUtils.isNotEmpty(sud.getDeptCode()))
                .map(sud -> {
                    Map<String, Object> map = new HashMap<>();
                    map.put("deptCode", StringUtils.defaultString(sud.getDeptCode(), ""));
                    map.put("deptName", StringUtils.defaultString(sud.getDeptName(), ""));
                    return map;
                })
                .collect(Collectors.toList());
        sysUser.setBelongDepts(deptList);
    }
    /**
@@ -350,7 +503,7 @@
     */
    @Override
    public void checkUserAllowed(SysUser user) {
        if (StringUtils.isNotNull(user.getUserId()) && user.isAdmin()) {
        if (StringUtils.isNotNull(user.getUserId()) && isAdmin.contains(user.getUserId())) {
            throw new ServiceException("不允许操作超级管理员用户");
        }
    }
@@ -362,7 +515,7 @@
     */
    @Override
    public void checkUserDataScope(Long userId) {
        if (!SysUser.isAdmin(SecurityUtils.getUserId())) {
        if (!isAdmin.contains(SecurityUtils.getUserId())) {
            SysUser user = new SysUser();
            user.setUserId(userId);
            List<SysUser> users = SpringUtils.getAopProxy(this).selectUserList(user);
@@ -456,11 +609,15 @@
        if (!CollectionUtils.isEmpty(user.getDeptCodes())) {
            for (String deptCode : user.getDeptCodes()) {
                SysDept sysDept = sysDeptMapper.selectDeptByCode(deptCode);
                if (ObjectUtils.isEmpty(sysDept)) {
                    continue;
                }
                SysUserDept sysUserDept = new SysUserDept();
                sysUserDept.setUserId(user.getUserId());
                sysUserDept.setOrgid(user.getOrgid());
                sysUserDept.setDeptCode(deptCode);
                sysUserDept.setDeptId(sysDept.getDeptId());
                List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
                sysUserDept.setDelFlag(0L);
                sysUserDept.setDeptType("1");
@@ -478,10 +635,14 @@
        if (!CollectionUtils.isEmpty(user.getWardCodes())) {
            for (String wardCode : user.getWardCodes()) {
                SysDept sysDept = sysDeptMapper.selectDeptByCode(wardCode);
                if (ObjectUtils.isEmpty(sysDept)) {
                    continue;
                }
                SysUserDept sysUserDept = new SysUserDept();
                sysUserDept.setUserId(user.getUserId());
                sysUserDept.setDeptCode(wardCode);
                sysUserDept.setDeptId(sysDept.getDeptId());
                sysUserDept.setOrgid(user.getOrgid());
                List<SysUserDept> sysUserDepts = sysUserDeptMapper.selectSysUserDeptList(sysUserDept);
                sysUserDept.setDelFlag(0L);
                sysUserDept.setDeptType("2");