陈昶聿
6 天以前 586a386b2d779e94002c8099ff62271b0e684d88
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -28,6 +28,9 @@
import javax.validation.Validator;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -177,87 +180,103 @@
    public SysUser selectUserByUserName2(String userName) {
        String[] split = userName.split("&");
        SysUser sysUser = userMapper.selectUserByUserNameByCondition(split[0], split[1], null);
        if (Objects.isNull(sysUser)) return sysUser;
        //获取当前登陆人的机构和院�?
        boolean isAdmin = StringUtils.isNotEmpty(split[0]) && "admin".equals(split[0]);
        IUserExtInfoService userExtInfoService = SpringUtils.getBean(IUserExtInfoService.class);
        Map<String, String> userOrgInfo = userExtInfoService.getUserOrgInfo(
                sysUser.getUserId().toString(),
                split[1],
                split[2]);
        Executor executor = SpringUtils.getBean("threadPoolTaskExecutor");
        // === 并行查询: 用户机构信息 + 部门列表 ===
        CompletableFuture<Map<String, String>> orgInfoFuture = CompletableFuture.supplyAsync(() ->
                userExtInfoService.getUserOrgInfo(sysUser.getUserId().toString(), split[1], split[2]), executor);
        CompletableFuture<List<SysDept>> deptsFuture;
        if (isAdmin) {
            SysDept dept = new SysDept();
            dept.setOrgid(split[1]);
            deptsFuture = CompletableFuture.supplyAsync(() -> sysDeptMapper.selectDeptList(dept), executor);
        } else {
            deptsFuture = CompletableFuture.supplyAsync(() -> sysUserDeptMapper.selectDeptListByUserId(sysUser.getUserId()), executor);
        }
        // 等待机构信息
        Map<String, String> userOrgInfo = new HashMap<>();
        try {
            userOrgInfo = orgInfoFuture.get(5, TimeUnit.SECONDS);
        } catch (Exception e) {
            log.warn("获取用户机构信息超时或异常", e);
        }
        if (!userOrgInfo.isEmpty()) {
            sysUser.setOrgid(userOrgInfo.get("orgid"));
            sysUser.setCampusid(userOrgInfo.get("campusid"));
        }
        if (Objects.isNull(sysUser)) return sysUser;
        List<SysDept> sysDepts = null;
        if (StringUtils.isNotEmpty(split[0]) && split[0].equals("admin")) {
            SysDept dept = new SysDept();
            dept.setOrgid(split[1]);
            sysDepts = sysDeptMapper.selectDeptList(dept);
        } else {
            sysDepts = sysUserDeptMapper.selectDeptListByUserId(sysUser.getUserId());
        // 等待部门列表
        List<SysDept> sysDepts = new ArrayList<>();
        try {
            sysDepts = deptsFuture.get(5, TimeUnit.SECONDS);
        } catch (Exception e) {
            log.warn("获取部门列表超时或异常", e);
        }
        List<Long> deptIds = new ArrayList<>();
        for (SysDept sysDept : sysDepts) {
            deptIds.add(sysDept.getDeptId());
        }
        SysUserDept sysUserDept = new SysUserDept();
        sysUserDept.setUserId(sysUser.getUserId());
        sysUserDept.setDeptType(sysUser.getSearchscope());
        sysUserDept.setOrgid(split[1]);
        // === 查询科室和病区信息 ===
        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")) {
                //如果是admin,只能去sys_dept去取数据
                SysDept dept = new SysDept();
                dept.setOrgid(split[1]);
                dept.setDeptType("1");
                sysDepts = sysDeptMapper.selectDeptList(dept);
                sysUserDeptKSs = DtoConversionUtils.sourceToTarget(sysDepts, SysUserDept.class);
                dept.setDeptType("2");
                sysDepts = sysDeptMapper.selectDeptList(dept);
                sysUserDeptBQs = DtoConversionUtils.sourceToTarget(sysDepts, SysUserDept.class);
                List<SysUserDept> distinctUserDepts = new ArrayList<>();
                Set<String> uniqueDeptCodes = new HashSet<>();
                for (SysUserDept userDept : sysUserDeptKSs) {
                    String deptCode = userDept.getDeptCode();
                    if (StringUtils.isNotEmpty(deptCode) && !uniqueDeptCodes.contains(deptCode)) {
                        distinctUserDepts.add(userDept);
                        uniqueDeptCodes.add(deptCode);
        if (StringUtils.isNotEmpty(sysUser.getSearchscope())) {
            if ("0".equals(sysUser.getSearchscope())) {
                if (isAdmin) {
                    // admin直接从sys_dept查询,跳过无意义的selectSysUserDeptList
                    SysDept deptKS = new SysDept();
                    deptKS.setOrgid(split[1]);
                    deptKS.setDeptType("1");
                    SysDept deptBQ = new SysDept();
                    deptBQ.setOrgid(split[1]);
                    deptBQ.setDeptType("2");
                    CompletableFuture<List<SysDept>> ksFuture = CompletableFuture.supplyAsync(() -> sysDeptMapper.selectDeptList(deptKS), executor);
                    CompletableFuture<List<SysDept>> bqFuture = CompletableFuture.supplyAsync(() -> sysDeptMapper.selectDeptList(deptBQ), executor);
                    try {
                        sysUserDeptKSs = distinctByDeptCode(DtoConversionUtils.sourceToTarget(ksFuture.get(5, TimeUnit.SECONDS), SysUserDept.class));
                        sysUserDeptBQs = distinctByDeptCode(DtoConversionUtils.sourceToTarget(bqFuture.get(5, TimeUnit.SECONDS), SysUserDept.class));
                    } catch (Exception e) {
                        log.warn("获取admin科室/病区信息超时或异常", e);
                    }
                } else {
                    // 并行查询科室和病区
                    SysUserDept queryKS = new SysUserDept();
                    queryKS.setUserId(sysUser.getUserId());
                    queryKS.setDeptType("1");
                    queryKS.setOrgid(split[1]);
                    SysUserDept queryBQ = new SysUserDept();
                    queryBQ.setUserId(sysUser.getUserId());
                    queryBQ.setDeptType("2");
                    queryBQ.setOrgid(split[1]);
                    CompletableFuture<List<SysUserDept>> ksFuture = CompletableFuture.supplyAsync(() -> sysUserDeptMapper.selectSysUserDeptList(queryKS), executor);
                    CompletableFuture<List<SysUserDept>> bqFuture = CompletableFuture.supplyAsync(() -> sysUserDeptMapper.selectSysUserDeptList(queryBQ), executor);
                    try {
                        sysUserDeptKSs = ksFuture.get(5, TimeUnit.SECONDS);
                        sysUserDeptBQs = bqFuture.get(5, TimeUnit.SECONDS);
                    } catch (Exception e) {
                        log.warn("获取科室/病区信息超时或异常", e);
                    }
                }
                List<SysUserDept> distinctUserBQs = new ArrayList<>();
                Set<String> uniqueBQCodes = new HashSet<>();
                for (SysUserDept userDept : sysUserDeptBQs) {
                    String deptCode = userDept.getDeptCode();
                    if (StringUtils.isNotEmpty(deptCode) && !uniqueBQCodes.contains(deptCode)) {
                        distinctUserBQs.add(userDept);
                        uniqueBQCodes.add(deptCode);
                    }
                }
                sysUserDeptKSs = distinctUserDepts;
                sysUserDeptBQs = distinctUserBQs;
            } else if ("1".equals(sysUser.getSearchscope())) {
                SysUserDept queryKS = new SysUserDept();
                queryKS.setUserId(sysUser.getUserId());
                queryKS.setDeptType("1");
                queryKS.setOrgid(split[1]);
                sysUserDeptKSs = sysUserDeptMapper.selectSysUserDeptList(queryKS);
            } else if ("2".equals(sysUser.getSearchscope())) {
                SysUserDept queryBQ = new SysUserDept();
                queryBQ.setUserId(sysUser.getUserId());
                queryBQ.setDeptType("2");
                queryBQ.setOrgid(split[1]);
                sysUserDeptBQs = sysUserDeptMapper.selectSysUserDeptList(queryBQ);
            }
        } 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);
        }
        sysUser.setDepts(deptIds);
@@ -285,16 +304,32 @@
                if (StringUtils.isNotEmpty(sud.getDeptName())) map.put("deptName", sud.getDeptName());
                list.add(map);
            }
            //获取当前机构的满意度问题分类
            sysUser.setBelongDepts(list);
            Map<String, Object> satisfactionCategories = new HashMap<>();
            //设置当前用户的声音问题分类和问卷问题分类
            IUserExtInfoService userExtInfoService3 = SpringUtils.getBean(IUserExtInfoService.class);
            sysUser.setSatisfactionCategories(userExtInfoService3.getSatisfactionCategories(sysUser.getOrgid()));
            // 设置满意度分类(走缓存)
            sysUser.setSatisfactionCategories(userExtInfoService.getSatisfactionCategories(sysUser.getOrgid()));
        }
        return sysUser;
    }
    /**
     * 按deptCode去重
     */
    private List<SysUserDept> distinctByDeptCode(List<SysUserDept> list) {
        if (CollectionUtils.isEmpty(list)) {
            return list;
        }
        List<SysUserDept> result = new ArrayList<>();
        Set<String> uniqueCodes = new HashSet<>();
        for (SysUserDept item : list) {
            String deptCode = item.getDeptCode();
            if (StringUtils.isNotEmpty(deptCode) && !uniqueCodes.contains(deptCode)) {
                result.add(item);
                uniqueCodes.add(deptCode);
            }
        }
        return result;
    }
    @Override
    public SysUser selectUserByUserNameAndDeptId(String userName) {
        String[] split = userName.split("&");