| | |
| | | |
| | | 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; |
| | | |
| | | /** |
| | |
| | | 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); |
| | |
| | | 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("&"); |