package cn.besteam.modules.system.biz; import cn.besteam.common.constant.CommonConstant; import cn.besteam.common.constant.DepartmentEnum; import cn.besteam.common.constant.DepartmentEnum.OrgTypeEnum; import cn.besteam.common.constant.ErrorCode; import cn.besteam.common.exception.BusinessException; import cn.besteam.common.util.RedisUtil; import cn.besteam.common.util.TreeFilterModelSysDepartmentCascadeUtil; import cn.besteam.common.util.TreeFilterRegionTreeUtil; import cn.besteam.common.util.TreeFilterSysDepartmentTreeModelUtil; import cn.besteam.common.util.oConvertUtils; import cn.besteam.common.util.tree.TreeUtils; import cn.besteam.modules.medical.entity.MwBusinessApproval; import cn.besteam.modules.medical.service.IMwBusinessApprovalService; import cn.besteam.modules.shiro.authc.util.EnvUtils; import cn.besteam.modules.system.dto.SysDepartmentDTO; import cn.besteam.modules.system.dto.SysDepartmentTreeModel; import cn.besteam.modules.system.entity.SysDepartment; import cn.besteam.modules.system.entity.SysUser; import cn.besteam.modules.system.entity.SysUserDepartment; import cn.besteam.modules.system.service.ISysDepartmentService; import cn.besteam.modules.system.service.ISysUserDepartmentService; import cn.besteam.modules.system.service.ISysUserService; import cn.besteam.modules.system.vo.*; import cn.hutool.core.collection.CollUtil; import cn.hutool.poi.excel.ExcelWriter; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; @Service public class SysDepartmentBiz { private Logger logger = LoggerFactory.getLogger(SysDepartmentBiz.class); @Autowired private ISysDepartmentService sysDepartmentService; @Autowired private ISysUserDepartmentService sysUserDepartmentService; @Autowired private ISysUserService sysUserService; /** * 业务审批 */ @Autowired private IMwBusinessApprovalService businessApprovalService; @Autowired private RedisUtil redisUtil; @Autowired private SysDepartmentBiz sysDepartmentBiz; public List getMyRegionTreeList(Integer userId) { SysDepartment myDepartment = sysDepartmentService.getMyDepartment(userId == null ? EnvUtils.getUser().getId() : userId); Set hasUserTreeCodeSet = sysUserDepartmentService.list(Wrappers.lambdaQuery().likeRight(SysUserDepartment::getTreeCode, myDepartment.getTreeCode())) .stream().map(SysUserDepartment::getTreeCode).collect(Collectors.toSet()); List sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda() .in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) .likeRight(SysDepartment::getTreeCode, myDepartment.getTreeCode()) .orderByAsc(SysDepartment::getDepartOrder) .orderByAsc(SysDepartment::getId)); List dtoList = new ArrayList<>(); Map> childrenMap = sysDepartmentList.stream() .collect(Collectors.groupingBy(SysDepartment::getParentId)); SysDepartmentDTO rootDto = fillRegionChildrenV2(myDepartment, childrenMap, hasUserTreeCodeSet, new HashMap<>()); dtoList.add(rootDto); return dtoList; } /** * 查询区域列表V2 * @param keyword * @return */ public List listRegion_bak(String keyword) { //筛选 if (StringUtils.isNotBlank(keyword)) { SysDepartment myDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { myDepartment = sysDepartmentService.getHospital(myDepartment.getParentId()); } Set hasUserTreeCodeSet = sysUserDepartmentService.list(Wrappers.lambdaQuery().likeRight(SysUserDepartment::getTreeCode, myDepartment.getTreeCode())) .stream().map(SysUserDepartment::getTreeCode).collect(Collectors.toSet()); List sysDepartmentList = new ArrayList<>(); // 第一次查询 List searchDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda() .in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) .likeRight(SysDepartment::getTreeCode, myDepartment.getTreeCode()) .like(SysDepartment::getDepartName, keyword) .orderByAsc(SysDepartment::getDepartOrder) .orderByAsc(SysDepartment::getId)); if (CollectionUtils.isEmpty(searchDepartmentList)) { return new ArrayList<>(); } // 将所有查询整合到一个集合中进行批量查询 Set allTreeCodes = searchDepartmentList.stream() .map(SysDepartment::getTreeCode) .collect(Collectors.toSet()); List filterDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda() .in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) .and(wrapper -> { allTreeCodes.forEach(treeCode -> wrapper.or().likeRight(SysDepartment::getTreeCode, treeCode)); }) .orderByAsc(SysDepartment::getDepartOrder) .orderByAsc(SysDepartment::getId)); // 使用缓存来减少重复查询 Map sysDepartmentCacheMap = new HashMap<>(); Set sysDepartmentIdList = new HashSet<>(); List resultDepartmentList = new ArrayList<>(); for (SysDepartment sysDepartment : filterDepartmentList) { while (sysDepartment != null && !sysDepartment.getId().equals(myDepartment.getId())) { if (!sysDepartmentIdList.contains(sysDepartment.getId())) { sysDepartmentIdList.add(sysDepartment.getId()); resultDepartmentList.add(sysDepartment); } else { break; } if (sysDepartmentCacheMap.containsKey(sysDepartment.getParentId())) { sysDepartment = sysDepartmentCacheMap.get(sysDepartment.getParentId()); } else { Integer parentId = sysDepartment.getParentId(); sysDepartment = sysDepartmentService.getById(parentId); sysDepartmentCacheMap.put(parentId, sysDepartment); } } } sysDepartmentList = resultDepartmentList; List dtoList = new ArrayList<>(); Map> childrenMap = sysDepartmentList.stream() .collect(Collectors.groupingBy(SysDepartment::getParentId)); SysDepartmentDTO rootDto = fillRegionChildrenV2(myDepartment, childrenMap, hasUserTreeCodeSet, new HashMap<>()); dtoList.add(rootDto); return dtoList; } else { List cache = (List) sysDepartmentBiz.getCache(4); return cache; } } private SysDepartmentDTO fillRegionChildrenV2(SysDepartment parent, Map> childrenMap, Set hasUserTreeCodeSet, Map canDeleteCache) { SysDepartmentDTO dto = new SysDepartmentDTO(); BeanUtils.copyProperties(parent, dto); dto.setKey(dto.getId()); List children = childrenMap.getOrDefault(parent.getId(), Collections.emptyList()); List childrenList = children.stream().map(child -> { child.setDepartName(oConvertUtils.replaceBlank(child.getDepartName())); return fillRegionChildrenV2(child, childrenMap, hasUserTreeCodeSet, canDeleteCache); }).collect(Collectors.toList()); dto.setChildrenList(childrenList.isEmpty() ? new ArrayList<>() : childrenList); childrenMap.remove(parent.getId()); Boolean canDelete = canDeleteCache.get(parent.getTreeCode()); if (canDelete == null) { AtomicBoolean canDeleteAtomic = new AtomicBoolean(true); hasUserTreeCodeSet.stream() .filter(treeCode -> treeCode.startsWith(parent.getTreeCode())) .findFirst() .ifPresent(treeCode -> canDeleteAtomic.set(false)); canDelete = canDeleteAtomic.get(); canDeleteCache.put(parent.getTreeCode(), canDelete); } dto.setCanDelete(canDelete); return dto; } /** * 获取组织架构表数据列表V2 * * @param keyword * @return */ public List listRegion(String keyword) { SysDepartment myDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { myDepartment = sysDepartmentService.getHospital(myDepartment.getParentId()); } Set hasUserTreeCodeSet = sysUserDepartmentService.list(Wrappers.lambdaQuery().likeRight(SysUserDepartment::getTreeCode, myDepartment.getTreeCode())).stream().map(SysUserDepartment::getTreeCode).collect(Collectors.toSet()); List sysDepartmentList = new ArrayList<>(); //筛选 if (StringUtils.isNotEmpty(keyword)) { List searchDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda()// .in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType()))// .likeRight(SysDepartment::getTreeCode, myDepartment.getTreeCode()).like(SysDepartment::getDepartName, keyword).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); if (CollectionUtils.isEmpty(searchDepartmentList)) { return new ArrayList<>(); } List filterDepartmentList = new ArrayList<>(searchDepartmentList); for (SysDepartment sysDepartment : searchDepartmentList) { filterDepartmentList.addAll(sysDepartmentService.list(new QueryWrapper().lambda().in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())).likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId))); } Map sysDepartmentCacheMap = new HashMap<>(); Set sysDepartmentIdList = new HashSet<>(); for (SysDepartment sysDepartment : filterDepartmentList) { while (sysDepartment != null && !sysDepartment.getId().equals(myDepartment.getId())) { if (!sysDepartmentIdList.contains(sysDepartment.getId())) { sysDepartmentIdList.add(sysDepartment.getId()); sysDepartmentList.add(sysDepartment); } else { break; } if (sysDepartmentCacheMap.containsKey(sysDepartment.getParentId())) { sysDepartment = sysDepartmentCacheMap.get(sysDepartment.getParentId()); } else { Integer parentId = sysDepartment.getParentId(); sysDepartment = sysDepartmentService.getById(sysDepartment.getParentId()); sysDepartmentCacheMap.put(parentId, sysDepartment); } } } } else { sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda() .in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) .likeRight(SysDepartment::getTreeCode, myDepartment.getTreeCode()).ne(SysDepartment::getId, myDepartment.getId()) .orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); } List dtoList = new ArrayList<>(); Map> childrenMap = sysDepartmentList.stream() .collect(Collectors.groupingBy(SysDepartment::getParentId)); dtoList.add(fillRegionChildrenV2(myDepartment, childrenMap, hasUserTreeCodeSet,new HashMap<>())); return dtoList; } public List listRegionChildren(Integer parentId) { SysDepartment parentDepartment = sysDepartmentService.getById(parentId); if (parentDepartment == null) { throw new BusinessException(ErrorCode.ERR_500, "父级组织不存在"); } SysDepartment myDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { myDepartment = sysDepartmentService.getHospital(myDepartment.getParentId()); } if (!parentDepartment.getTreeCode().startsWith(myDepartment.getTreeCode())) { throw new BusinessException(ErrorCode.ERR_500, "无操作权限"); } Set hasUserTreeCodeSet = sysUserDepartmentService.list(Wrappers.lambdaQuery().likeRight(SysUserDepartment::getTreeCode, myDepartment.getTreeCode())).stream().map(SysUserDepartment::getTreeCode).collect(Collectors.toSet()); List sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda().eq(SysDepartment::getParentId, parentId).orderByAsc(SysDepartment::getDepartOrder)); return fillRegionChildren(parentDepartment, sysDepartmentList, hasUserTreeCodeSet).getChildrenList(); } private SysDepartmentDTO fillRegionChildren(SysDepartment parent, List list, Set hasUserTreeCodeSet) { SysDepartmentDTO dto = new SysDepartmentDTO(); BeanUtils.copyProperties(parent, dto); dto.setKey(dto.getId()); List childrenList = new ArrayList<>(); for (SysDepartment children : list) { if (children.getParentId().equals(parent.getId())) { //去掉空格 children.setDepartName(oConvertUtils.replaceBlank(children.getDepartName())); childrenList.add(fillRegionChildren(children, list, hasUserTreeCodeSet)); } } if (CollectionUtils.isNotEmpty(childrenList)) { dto.setChildrenList(childrenList); } else { int count = sysDepartmentService.count(new QueryWrapper().lambda().eq(SysDepartment::getParentId, dto.getId())); if (count > 0) { dto.setChildrenList(new ArrayList<>()); } } for (String treeCode : hasUserTreeCodeSet) { if (treeCode.startsWith(parent.getTreeCode())) { dto.setCanDelete(false); break; } } return dto; } /** * 获取组织架构表数据列表-树状 * * @param pageNo * @param pageSize * @param keyword * @return */ public IPage queryPageList(Integer pageNo, Integer pageSize, String keyword) { SysDepartment myDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); IPage page = new Page<>(pageNo, pageSize); if (myDepartment == null) { return page; } if (myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { myDepartment = sysDepartmentService.getHospital(myDepartment.getParentId()); } Set hasUserTreeCodeSet = sysUserDepartmentService.list(Wrappers.lambdaQuery().likeRight(SysUserDepartment::getTreeCode, myDepartment.getTreeCode())).stream().map(SysUserDepartment::getTreeCode).collect(Collectors.toSet()); List sysDepartmentList = new ArrayList<>(); //筛选 if (StringUtils.isNotEmpty(keyword)) { List searchDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, myDepartment.getTreeCode()).like(SysDepartment::getDepartName, keyword).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); if (CollectionUtils.isEmpty(searchDepartmentList)) { return page; } List filterDepartmentList = new ArrayList<>(searchDepartmentList); for (SysDepartment sysDepartment : searchDepartmentList) { filterDepartmentList.addAll(sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId))); } Map sysDepartmentCacheMap = new HashMap<>(); Set sysDepartmentIdList = new HashSet<>(); for (SysDepartment sysDepartment : filterDepartmentList) { while (sysDepartment != null && !sysDepartment.getId().equals(myDepartment.getId())) { if (!sysDepartmentIdList.contains(sysDepartment.getId())) { sysDepartmentIdList.add(sysDepartment.getId()); sysDepartmentList.add(sysDepartment); } else { break; } if (sysDepartmentCacheMap.containsKey(sysDepartment.getParentId())) { sysDepartment = sysDepartmentCacheMap.get(sysDepartment.getParentId()); } else { Integer parentId = sysDepartment.getParentId(); sysDepartment = sysDepartmentService.getById(sysDepartment.getParentId()); sysDepartmentCacheMap.put(parentId, sysDepartment); } } } } else { sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, myDepartment.getTreeCode()).ne(SysDepartment::getId, myDepartment.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); } List dtoList = new ArrayList<>(); dtoList.add(fillChildren(myDepartment, sysDepartmentList, hasUserTreeCodeSet)); page.setRecords(dtoList); return page; } private SysDepartmentDTO fillChildren(SysDepartment parent, List list, Set hasUserTreeCodeSet) { SysDepartmentDTO dto = new SysDepartmentDTO(); BeanUtils.copyProperties(parent, dto); dto.setKey(dto.getId()); List childrenList = new ArrayList<>(); for (SysDepartment children : list) { if (children.getParentId().equals(parent.getId())) { childrenList.add(fillChildren(children, list, hasUserTreeCodeSet)); } } if (CollectionUtils.isNotEmpty(childrenList)) { dto.setChildrenList(childrenList); } for (String treeCode : hasUserTreeCodeSet) { if (treeCode.startsWith(parent.getTreeCode())) { dto.setCanDelete(false); break; } } return dto; } /** * 获取组织架构树形列表-新增、编辑组织架构用,去掉科室级 * * @return */ public List sysDepartmentTreeList() { SysDepartment myDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (myDepartment == null) { return new ArrayList<>(); } if (myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { return new ArrayList<>(); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper()// .lambda().likeRight(SysDepartment::getTreeCode, myDepartment.getTreeCode())// .ne(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.OFFICE.getType())// .ne(SysDepartment::getId, myDepartment.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); List treeModelList = new ArrayList<>(); Map> childrenMap = sysDepartmentList.stream() .collect(Collectors.groupingBy(SysDepartment::getParentId)); treeModelList.add(fillChildrenTreeModelV2(myDepartment, childrenMap)); return treeModelList; } private SysDepartmentTreeModel fillChildrenTreeModel(SysDepartment parent, List list) { SysDepartmentTreeModel treeModel = SysDepartmentTreeModel.of(parent); for (SysDepartment children : list) { if (children.getParentId().equals(parent.getId())) { treeModel.getChildren().add(fillChildrenTreeModel(children, list)); treeModel.setIsLeaf(false); } } return treeModel; } private SysDepartmentTreeModel fillChildrenTreeModelV2(SysDepartment parent,Map> childrenMap) { SysDepartmentTreeModel treeModel = SysDepartmentTreeModel.of(parent); List childrenModels = new ArrayList<>(); // 使用部门映射直接获取子部门,避免了遍历整个列表 List children = childrenMap.getOrDefault(parent.getId(), Collections.emptyList()); List childrenList = children.stream().map(child -> { child.setDepartName(oConvertUtils.replaceBlank(child.getDepartName())); treeModel.setIsLeaf(false); return fillChildrenTreeModelV2(child, childrenMap); }).collect(Collectors.toList()); treeModel.setChildren(childrenList.isEmpty() ? new ArrayList<>() :childrenList); childrenMap.remove(treeModel.getId()); return treeModel; } /** * 获取我的组织架构-树形列表 * 用户列表筛选组织用到 * * @return */ public List getMyDepartmentTreeList(Integer userId) { SysDepartment myDepartment = sysDepartmentService.getMyDepartment(userId == null ? EnvUtils.getUser().getId() : userId); if (myDepartment == null) { return new ArrayList<>(); } if (myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { myDepartment = sysDepartmentService.getHospital(myDepartment.getParentId()); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper()// .lambda().likeRight(SysDepartment::getTreeCode, myDepartment.getTreeCode())// .ne(SysDepartment::getId, myDepartment.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); List treeModelList = new ArrayList<>(); Map> childrenMap = sysDepartmentList.stream() .collect(Collectors.groupingBy(SysDepartment::getParentId)); treeModelList.add(fillChildrenTreeModelV2(myDepartment, childrenMap)); return treeModelList; } /** * 添加组织架构表 * * @param dto */ @Transactional(rollbackFor = Exception.class) public void save(SysDepartment dto) { if (dto.getDepartName().length() > 20) { throw new BusinessException(ErrorCode.ERR_500, "不超过20个字符"); } SysDepartment parent = sysDepartmentService.getById(dto.getParentId()); if (parent == null) { throw new BusinessException(ErrorCode.PARENT_DEPARTMENT_NOT_FOUND); } SysDepartment myDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (!parent.getTreeCode().startsWith(myDepartment.getTreeCode())) { throw new BusinessException(ErrorCode.ERR_500, "无操作权限"); } if (dto.getOrgType().equals(DepartmentEnum.OrgTypeEnum.AREA.getType())) { SysDepartment departmentEntity = sysDepartmentService.getOne(new QueryWrapper().lambda().eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType()).eq(SysDepartment::getDepartName, dto.getDepartName())); if (departmentEntity != null) { throw new BusinessException(ErrorCode.DEPARTMENT_FOUND); } } else { SysDepartment departmentEntity = sysDepartmentService.getOne(new QueryWrapper().lambda().eq(SysDepartment::getDepartName, dto.getDepartName()).eq(SysDepartment::getParentId, dto.getParentId())); if (departmentEntity != null) { throw new BusinessException(ErrorCode.DEPARTMENT_FOUND); } } if (!checkOrgTypeRelation(parent.getOrgType(), dto.getOrgType())) { throw new BusinessException(ErrorCode.DEPARTMENT_ORG_TYPE_INVALID); } SysDepartment sysDepartment = new SysDepartment(); BeanUtils.copyProperties(dto, sysDepartment); //获取部门树编码 sysDepartment.setTreeCode(sysDepartmentService.getTreeCode(dto.getParentId())); sysDepartment.setOrgCode(sysDepartmentService.getOrgCode(dto.getParentId(), dto.getOrgType())); //添加服务到期时间 if (sysDepartment.getOrgType() == 2) { Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1); sysDepartment.setExpireDate(calendar.getTime()); sysDepartment.setReminderDays(30); } sysDepartmentService.save(sysDepartment); //todo 更新缓存数据 List sysDepartmentList = new ArrayList<>(); sysDepartmentList.add(sysDepartment); //updateCache(1, sysDepartmentList,null); CompletableFuture.runAsync(this::delDepartCache); } /** * 检查新增、编辑时,父-子组织架构类型是否正确 * 区域 - 区域/单位 * 单位 - 部门/科室 * 部门 - 部门/科室 * 科室 - x 不允许作为父级组织 * * @param parentOrgType * @param orgType * @return */ private boolean checkOrgTypeRelation(Integer parentOrgType, Integer orgType) { if (parentOrgType.equals(DepartmentEnum.OrgTypeEnum.AREA.getType())) { if (orgType.equals(DepartmentEnum.OrgTypeEnum.AREA.getType()) || orgType.equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { return true; } } else if (parentOrgType.equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { if (orgType.equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || orgType.equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { return true; } } else if (parentOrgType.equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType())) { if (orgType.equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || orgType.equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { return true; } } return false; } /** * 编辑组织架构表 * * @param dto */ @Transactional(rollbackFor = Exception.class) public void edit(SysDepartment dto) { SysDepartment department = sysDepartmentService.getById(dto.getId()); boolean isDeleteCache = !dto.getDepartOrder().equals(department.getDepartOrder()); if (department == null) { throw new BusinessException(ErrorCode.DEPARTMENT_FOUND); } SysDepartment parent = sysDepartmentService.getById(dto.getParentId()); if (parent == null) { throw new BusinessException(ErrorCode.PARENT_DEPARTMENT_NOT_FOUND); } if (parent.getId().equals(department.getId())) { throw new BusinessException(ErrorCode.ERR_500, "父级组织不能为自身"); } SysDepartment myDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); //当前修改的组织不是自己的下属组织 if (!department.getTreeCode().startsWith(myDepartment.getTreeCode())) { throw new BusinessException(ErrorCode.ERR_500, "无操作权限"); } //选择的父级组织不是自己的下属组织 if (!parent.getTreeCode().startsWith(myDepartment.getTreeCode())) { throw new BusinessException(ErrorCode.ERR_500, "无操作权限"); } if (dto.getOrgType().equals(DepartmentEnum.OrgTypeEnum.AREA.getType())) { SysDepartment departmentEntity = sysDepartmentService.getOne(new QueryWrapper().lambda().eq(SysDepartment::getDepartName, dto.getDepartName()).ne(SysDepartment::getId, dto.getId())); if (departmentEntity != null) { throw new BusinessException(ErrorCode.DEPARTMENT_FOUND); } } else { SysDepartment departmentEntity = sysDepartmentService.getOne(new QueryWrapper().lambda().eq(SysDepartment::getDepartName, dto.getDepartName()).eq(SysDepartment::getParentId, dto.getParentId()).ne(SysDepartment::getId, dto.getId())); if (departmentEntity != null) { throw new BusinessException(ErrorCode.DEPARTMENT_FOUND); } } if (!checkOrgTypeRelation(parent.getOrgType(), dto.getOrgType())) { throw new BusinessException(ErrorCode.DEPARTMENT_ORG_TYPE_INVALID); } Integer originParentId = department.getParentId(); if (!dto.getParentId().equals(originParentId)) { department.setTreeCode(sysDepartmentService.getTreeCode(dto.getParentId())); //department.setOrgCode(sysDepartmentService.getOrgCode(dto.getParentId(), dto.getOrgType())); } //todo 科室禁用 如果是禁用操作就需要添加审核数据 if (department.getStatus() == 1 && dto.getStatus() == 0) { Integer hospitalId = getHospitalId(dto.getParentId()); //科室禁用没有通过的,不能重复添加数据 Integer count = businessApprovalService.count(new QueryWrapper() .eq("hospital_id", hospitalId) .eq("office_id", dto.getId()) .eq("status", 0) .eq("type", 1)); if (count == 0) { MwBusinessApproval businessApproval = new MwBusinessApproval(); businessApproval.setHospitalId(hospitalId); businessApproval.setOfficeId(dto.getId()); businessApproval.setOperatorId(EnvUtils.getUser().getId()); businessApproval.setLinkman(EnvUtils.getUser().getName()); businessApproval.setLinkphone(EnvUtils.getUser().getPhone()); businessApproval.setApplyContent("科室(" + department.getDepartName() + ")申请禁用"); businessApproval.setApplyMark("无"); businessApproval.setStatus(0); businessApproval.setType(1); businessApproval.setApplyDataId(dto.getId()); businessApprovalService.save(businessApproval); } } else { department.setStatus(dto.getStatus()); } department.setParentId(dto.getParentId()); department.setDepartName(dto.getDepartName()); department.setOrgType(dto.getOrgType()); department.setLevel(dto.getLevel()); department.setIsWarehouse(dto.getIsWarehouse()); //department.setStatus(dto.getStatus()); department.setOfficeType(dto.getOfficeType()); department.setDepartOrder(dto.getDepartOrder()); department.setUpdateTime(new Date()); //加载原始数据 List sysDepartmentListY = new ArrayList<>(); SysDepartment departmentY = sysDepartmentService.getSysDepartmentById(department.getId()); sysDepartmentListY.add(departmentY); sysDepartmentService.updateById(department); sysDepartmentService.deleteCache(department.getId()); if (!dto.getParentId().equals(originParentId)) { reCalculateChildrenTreeCode(department); sysUserDepartmentService.updateTreeCode(); } //todo 更新缓存数据 List sysDepartmentListX = new ArrayList<>(); sysDepartmentListX.add(department); CompletableFuture.runAsync(this::delDepartCache); } private void delDepartCache() { logger.debug("开始删除缓存"); redisUtil.del("myRegionTreeList"); redisUtil.del("myDepartmentTreeList"); redisUtil.del("myHospitalAndOfficeCascadeList"); redisUtil.del("myHospitalCascadeList"); logger.debug("删除缓存成功"); } /** * * @param type 类型 */ private void updateCacheByType(Integer type){ // 创建CountDownLatch, 计数器初始值为4 CountDownLatch latch = new CountDownLatch(2); long startTime = System.currentTimeMillis(); ExecutorService executorService = Executors.newFixedThreadPool(4); /* if (!type.equals(4)) { // 启动并行任务 executorService.submit(() -> { try { long start = System.currentTimeMillis(); List sysDepartmentDTOS = sysDepartmentBiz.getMyRegionTreeList(1); redisUtil.set("myRegionTreeList", sysDepartmentDTOS); logger.debug("myRegionTreeList耗时:{}秒", (System.currentTimeMillis() - start) / 1000); } finally { latch.countDown(); } }); }*/ if (!type.equals(3)) { executorService.submit(() -> { try { long start = System.currentTimeMillis(); List myDepartmentTreeList = sysDepartmentBiz.getMyDepartmentTreeList( 1); redisUtil.set("myDepartmentTreeList", myDepartmentTreeList); logger.debug("myDepartmentTreeList耗时:{}秒", (System.currentTimeMillis() - start) / 1000); } finally { latch.countDown(); } }); } if (!type.equals(1)) { executorService.submit(() -> { try { long start = System.currentTimeMillis(); List myHospitalAndOfficeCascadeList = sysDepartmentBiz.getMyHospitalAndOfficeCascadeListV2( 1); redisUtil.set("myHospitalAndOfficeCascadeList", myHospitalAndOfficeCascadeList); logger.debug("myHospitalAndOfficeCascadeList耗时:{}秒", (System.currentTimeMillis() - start) / 1000); } finally { latch.countDown(); } }); } if (!type.equals(2)) { executorService.submit(() -> { try { long start = System.currentTimeMillis(); List myHospitalCascadeList = sysDepartmentBiz.getMyHospitalCascadeList( 1); redisUtil.set("myHospitalCascadeList", myHospitalCascadeList); logger.debug("myHospitalCascadeList耗时:{}秒", (System.currentTimeMillis() - start) / 1000); } finally { latch.countDown(); } }); } // 等待所有任务完成 try { latch.await(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); logger.error("任务执行被中断", e); } finally { logger.debug("总计耗时:{}秒", (System.currentTimeMillis() - startTime) / 1000); logger.debug("更新缓存结束"); } } private Integer getHospitalId(Integer officeId) { SysDepartment sysDepartment = sysDepartmentService.getById(officeId); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { return sysDepartment.getId(); } else { return getHospitalId(sysDepartment.getParentId()); } } return null; } /** * 医院录屏开关 * * @param dto */ @Transactional(rollbackFor = Exception.class) public void editSwitch(SysDepartment dto) { SysDepartment department = sysDepartmentService.getById(dto.getId()); if (department != null && dto.getSelectSwitch() != null) { department.setSelectSwitch(dto.getSelectSwitch()); sysDepartmentService.updateById(department); sysDepartmentService.deleteCache(department.getId()); } } @Transactional(rollbackFor = Exception.class) public void reCalculateChildrenTreeCode(SysDepartment parent) { List childrenList = sysDepartmentService.list(new QueryWrapper().lambda().eq(SysDepartment::getParentId, parent.getId())); for (SysDepartment children : childrenList) { children.setTreeCode(sysDepartmentService.getTreeCode(children.getParentId())); sysDepartmentService.updateById(children); sysDepartmentService.deleteCache(children.getId()); reCalculateChildrenTreeCode(children); } } /** * 删除组织架构表 * * @param id */ @Transactional(rollbackFor = Exception.class) public void delete(Integer id) { if (id == null) { throw new BusinessException(ErrorCode.ERR_500, "id不能为空"); } SysDepartment sysDepartment = sysDepartmentService.getById(id); if (sysDepartment == null) { throw new BusinessException(ErrorCode.DEPARTMENT_NOT_FOUND); } int count = sysUserDepartmentService.count(Wrappers.lambdaQuery().likeRight(SysUserDepartment::getTreeCode, sysDepartment.getTreeCode())); if (count > 0) { throw new BusinessException(ErrorCode.ERR_500, "该组织已存在用户,无法删除"); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode())); for (SysDepartment departmentEntity : sysDepartmentList) { departmentEntity.setDepartName(departmentEntity.getDepartName() + "-已删除"); departmentEntity.setDelFlag(CommonConstant.DEL_FLAG_1); sysDepartmentService.updateById(departmentEntity); sysDepartmentService.removeById(departmentEntity); } Set sysDepartmentSet = sysDepartmentList.stream().map(SysDepartment::getId).collect(Collectors.toSet()); // sysDepartmentService.deleteCache(sysDepartment.getId()); for (Integer childrenId : sysDepartmentSet) { sysDepartmentService.deleteCache(childrenId); } //todo 更新缓存数据 List sysDepartmentListDe = new ArrayList<>(); sysDepartmentListDe.add(sysDepartment); CompletableFuture.runAsync(()->updateCache(3, sysDepartmentListDe,null)); redisUtil.del("myRegionTreeList"); } /** * 获取我的医院列表 * * @return */ public List getMyHospitalList() { List treeModelList = new ArrayList<>(); // SysDepartment sysDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { SysDepartment hospital = sysDepartmentService.getHospital(sysDepartment.getParentId()); treeModelList.add(SysDepartmentTreeModel.of(hospital)); } else if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { treeModelList.add(SysDepartmentTreeModel.of(sysDepartment)); } else { SysDepartmentTreeModel areaTreeModel = SysDepartmentTreeModel.of(sysDepartment); getChildrenHospitalList(areaTreeModel); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { areaTreeModel.setIsLeaf(false); treeModelList.add(areaTreeModel); } } } return treeModelList; } /** * 医院-树形 * * @param sysDepartment * @return */ private void getChildrenHospitalList(SysDepartmentTreeModel sysDepartment) { List childrenVOList = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysDepartment::getParentId, sysDepartment.getId()).in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())); List sysDepartmentList = sysDepartmentService.list(wrapper); for (SysDepartment children : sysDepartmentList) { SysDepartmentTreeModel childrenTreeModel = SysDepartmentTreeModel.of(children); getChildrenHospitalList(childrenTreeModel); //去除多余树干,例如:广东省-中山市-西区 、 广东省-中山市 if (CollectionUtils.isEmpty(childrenTreeModel.getChildren()) && !children.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { continue; } if (CollectionUtils.isNotEmpty(childrenTreeModel.getChildren())) { childrenTreeModel.setIsLeaf(false); } childrenVOList.add(childrenTreeModel); } sysDepartment.setChildren(childrenVOList); } /** * 获取我的科室列表 * * @return */ public List getMyOfficeList() { List treeModelList = new ArrayList<>(); // SysDepartment sysDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = sysDepartmentService.getHospital(sysDepartment.getParentId()); } SysDepartmentTreeModel areaTreeModel = SysDepartmentTreeModel.of(sysDepartment); getChildrenOfficeList(areaTreeModel); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { areaTreeModel.setIsLeaf(false); treeModelList.add(areaTreeModel); } } return treeModelList; } /** * 科室-树形 * * @param sysDepartment * @return */ private void getChildrenOfficeList(SysDepartmentTreeModel sysDepartment) { List childrenVOList = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysDepartment::getParentId, sysDepartment.getId()); List sysDepartmentList = sysDepartmentService.list(wrapper); for (SysDepartment children : sysDepartmentList) { SysDepartmentTreeModel childrenTreeModel = SysDepartmentTreeModel.of(children); getChildrenOfficeList(childrenTreeModel); //去除多余树干,例如:广东省-中山市-西区-中医院-门诊部门 、 广东省-中山市 if (CollectionUtils.isEmpty(childrenTreeModel.getChildren()) && !children.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { continue; } childrenVOList.add(childrenTreeModel); } sysDepartment.setChildren(childrenVOList); } //########## /** * 获取我的医院列表--级联 * * @return */ public List getMyHospitalCascadeList(Integer userId) { List voList = new ArrayList<>(); // SysDepartment sysDepartment = sysDepartmentService.getMyDepartment(userId == null ? EnvUtils.getUser().getId() : userId); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { SysDepartment hospital = sysDepartmentService.getHospital(sysDepartment.getParentId()); voList.add(SysDepartmentCascadeVO.of(hospital)); } else if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { voList.add(SysDepartmentCascadeVO.of(sysDepartment)); } else { List sysDepartmentList = sysDepartmentService.list( Wrappers.lambdaQuery(SysDepartment.class) .likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()) .ne(SysDepartment::getId, sysDepartment) .in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) .orderByAsc(SysDepartment::getDepartOrder) .orderByAsc(SysDepartment::getId)); Map> childrenMap = sysDepartmentList.stream() .collect(Collectors.groupingBy(SysDepartment::getParentId)); SysDepartmentCascadeVO areaTreeModel = getChildrenHospitalCascadeListV2( sysDepartment, childrenMap); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { voList.add(areaTreeModel); } } } return voList; } /** * 获取我的医院和科室列表--级联 * * @return */ public List getMyHospitalAndOfficeCascadeList(Integer userId) { List voList = new ArrayList<>(); // SysDepartment sysDepartment = sysDepartmentService.getMyDepartment(userId==null?EnvUtils.getUser().getId():userId); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { SysDepartment hospital = sysDepartmentService.getHospital(sysDepartment.getParentId()); SysDepartmentCascadeVO sysDepartmentCascadeVO=SysDepartmentCascadeVO.of(hospital); sysDepartment = sysDepartmentService.getById(hospital.getId()); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = sysDepartmentService.getHospital(sysDepartment.getParentId()); } SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartment); getChildrenOfficeCascadeList_er(areaTreeModel); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { sysDepartmentCascadeVO.setChildren(areaTreeModel.getChildren()); } } voList.add(sysDepartmentCascadeVO); } else if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { SysDepartment hospital = sysDepartmentService.getHospital(sysDepartment.getId()); SysDepartmentCascadeVO sysDepartmentCascadeVO=SysDepartmentCascadeVO.of(sysDepartment); sysDepartment = sysDepartmentService.getById(hospital.getId()); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = sysDepartmentService.getHospital(sysDepartment.getParentId()); } SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartment); getChildrenOfficeCascadeList_er(areaTreeModel); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { sysDepartmentCascadeVO.setChildren(areaTreeModel.getChildren()); } } voList.add(sysDepartmentCascadeVO); } else { if(userId==1){ voList = getChildrenHospitalAndOfficeCascadeListNew(sysDepartment); List returnSysDepartmentCascadeVOs = new ArrayList<>(); for(SysDepartmentCascadeVO sysDepartmentCascadeVO : voList){ if(sysDepartmentCascadeVO.getId()==-1){ returnSysDepartmentCascadeVOs.add(sysDepartmentCascadeVO); } } voList = returnSysDepartmentCascadeVOs; }else { SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartment); getChildrenHospitalAndOfficeCascadeList(areaTreeModel); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { voList.add(areaTreeModel); } } } } return voList; } public List getMyHospitalAndOfficeCascadeListV2(Integer userId) { List voList = new ArrayList<>(); // SysDepartment sysDepartment = sysDepartmentService.getMyDepartment(userId==null?EnvUtils.getUser().getId():userId); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { SysDepartment hospital = sysDepartmentService.getHospital(sysDepartment.getParentId()); SysDepartmentCascadeVO sysDepartmentCascadeVO=SysDepartmentCascadeVO.of(hospital); sysDepartment = sysDepartmentService.getById(hospital.getId()); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = sysDepartmentService.getHospital(sysDepartment.getParentId()); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper()// .lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode())// .ne(SysDepartment::getId, sysDepartment.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); Map> childrenMap = sysDepartmentList.stream() .collect(Collectors.groupingBy(SysDepartment::getParentId)); SysDepartmentCascadeVO areaTreeModel = getChildrenOfficeCascadeList_erV2( sysDepartment, childrenMap); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { sysDepartmentCascadeVO.setChildren(areaTreeModel.getChildren()); } } voList.add(sysDepartmentCascadeVO); } else if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { SysDepartment hospital = sysDepartmentService.getHospital(sysDepartment.getId()); SysDepartmentCascadeVO sysDepartmentCascadeVO=SysDepartmentCascadeVO.of(sysDepartment); sysDepartment = sysDepartmentService.getById(hospital.getId()); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = sysDepartmentService.getHospital(sysDepartment.getParentId()); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper()// .lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode())// .ne(SysDepartment::getId, sysDepartment.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); Map> childrenMap = sysDepartmentList.stream() .collect(Collectors.groupingBy(SysDepartment::getParentId)); SysDepartmentCascadeVO areaTreeModel = getChildrenOfficeCascadeList_erV2( sysDepartment, childrenMap); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { sysDepartmentCascadeVO.setChildren(areaTreeModel.getChildren()); } } voList.add(sysDepartmentCascadeVO); } else { if(sysDepartment.getId()== -1){ List sysDepartmentList = sysDepartmentService.lambdaQuery() .eq(SysDepartment::getStatus, 1) .likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode())// .ne(SysDepartment::getId, sysDepartment.getId()) .in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType() , DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType(), DepartmentEnum.OrgTypeEnum.OFFICE.getType())) .orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId) .list(); Map> childrenMap = sysDepartmentList.stream() .collect(Collectors.groupingBy(SysDepartment::getParentId)); SysDepartmentCascadeVO sysDepartmentCascadeVO = getChildrenHospitalAndOfficeCascadeListNewV2( sysDepartment, childrenMap); List returnSysDepartmentCascadeVOs = new ArrayList<>(); returnSysDepartmentCascadeVOs.add(sysDepartmentCascadeVO); voList = returnSysDepartmentCascadeVOs; }else { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode())// .ne(SysDepartment::getId, sysDepartment.getId()) .in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType() ,DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType(),DepartmentEnum.OrgTypeEnum.OFFICE.getType())) .orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId); List sysDepartmentList = sysDepartmentService.list(wrapper); Map> childrenMap = sysDepartmentList.stream() .collect(Collectors.groupingBy(SysDepartment::getParentId)); SysDepartmentCascadeVO areaTreeModel = getChildrenHospitalAndOfficeCascadeListV2( sysDepartment, childrenMap); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { voList.add(areaTreeModel); } } } } return voList; } private SysDepartmentCascadeVO getChildrenHospitalAndOfficeCascadeListNewV2(SysDepartment root,Map> childrenMap ) { SysDepartmentCascadeVO rootVO = SysDepartmentCascadeVO.of( root); List children = childrenMap.getOrDefault(rootVO.getId(), Collections.emptyList()); List childrenList = children.stream().map(child -> { return getChildrenHospitalAndOfficeCascadeListNewV2(child, childrenMap); }).collect(Collectors.toList()); rootVO.setChildren(childrenList.isEmpty() ? new ArrayList<>() :childrenList); childrenMap.remove(rootVO.getId()); return rootVO; } /** * 医院和科室-树形--级联() * * @param root * @return */ private List getChildrenHospitalAndOfficeCascadeListNew(SysDepartment root) { if (root == null) { return Collections.emptyList(); } List records = sysDepartmentService.lambdaQuery() .eq(SysDepartment::getStatus, 1) .in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType() , DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType(), DepartmentEnum.OrgTypeEnum.OFFICE.getType())) .orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId) .list(); if (CollUtil.isEmpty(records)) { return Collections.emptyList(); } List sysDepartmentCascadeVOS = records.stream() .map(SysDepartmentCascadeVO::of).collect(Collectors.toList()); return TreeUtils.buildTree(sysDepartmentCascadeVOS); } public List getChildrenHospitalAndOfficeCascadeListNewParallel(SysDepartment root,ExecutorService executorService) { if (root == null) { return Collections.emptyList(); } List records = sysDepartmentService.lambdaQuery() .eq(SysDepartment::getStatus, 1) .in(SysDepartment::getOrgType, Arrays.asList( DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType(), DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType(), DepartmentEnum.OrgTypeEnum.OFFICE.getType())) .orderByAsc(SysDepartment::getDepartOrder) .orderByAsc(SysDepartment::getId) .list(); if (records.isEmpty()) { return Collections.emptyList(); } List sysDepartmentCascadeVOS = records.stream() .map(SysDepartmentCascadeVO::of) .collect(Collectors.toList()); Map> groupedByParent = sysDepartmentCascadeVOS.stream() .collect(Collectors.groupingBy(SysDepartmentCascadeVO::getParentId)); return buildTreeAsync(groupedByParent, root.getId(),executorService); } private List buildTreeAsync(Map> groupedByParent, Integer parentId,ExecutorService executorService) { List rootNodes = groupedByParent.getOrDefault(parentId, Collections.emptyList()); List> futures = new ArrayList<>(); for (SysDepartmentCascadeVO node : rootNodes) { futures.add(CompletableFuture.runAsync(() -> { List children = buildTreeAsync(groupedByParent, Integer.valueOf(node.getValue()),executorService); if (!children.isEmpty() || node.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { node.setChildren(children); } },executorService)); } CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); return rootNodes; } public void getChildrenHospitalAndOfficeCascadeListParallel(SysDepartmentCascadeVO sysDepartment,ExecutorService executorService) { List childrenVOList = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysDepartment::getParentId, sysDepartment.getValue()) .in(SysDepartment::getOrgType, Arrays.asList( DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType(), DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType(), DepartmentEnum.OrgTypeEnum.OFFICE.getType())) .orderByAsc(SysDepartment::getDepartOrder) .orderByAsc(SysDepartment::getId); List sysDepartmentList = sysDepartmentService.list(wrapper); List> futures = sysDepartmentList.stream() .map(children -> CompletableFuture.supplyAsync(() -> { SysDepartmentCascadeVO childrenTreeModel = SysDepartmentCascadeVO.of(children); getChildrenHospitalAndOfficeCascadeListParallel(childrenTreeModel,executorService); return childrenTreeModel; },executorService)) .collect(Collectors.toList()); List childResults = futures.stream() .map(CompletableFuture::join) .filter(childrenTreeModel -> !CollectionUtils.isEmpty(childrenTreeModel.getChildren()) || childrenTreeModel.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) .collect(Collectors.toList()); sysDepartment.setChildren(childResults); } private SysDepartmentCascadeVO getChildrenHospitalAndOfficeCascadeListV2(SysDepartment sysDepartment,Map> childrenMap) { SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartment); List children = childrenMap.getOrDefault(areaTreeModel.getId(), Collections.emptyList()); List childrenList = children.stream().map(child -> { return getChildrenHospitalAndOfficeCascadeListV2(child, childrenMap); //去除多余树干,例如:广东省-中山市-西区 、 广东省-中山市 }).filter(x -> !(CollectionUtils.isEmpty(x.getChildren()) && !x.getOrgType() .equals(OrgTypeEnum.OFFICE.getType()))).collect( Collectors.toList()); areaTreeModel.setChildren(childrenList.isEmpty() ? new ArrayList<>() :childrenList); childrenMap.remove(areaTreeModel.getId()); return areaTreeModel; } private void getChildrenHospitalAndOfficeCascadeList(SysDepartmentCascadeVO sysDepartment) { List childrenVOList = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysDepartment::getParentId, sysDepartment.getValue()).in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType() ,DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType(),DepartmentEnum.OrgTypeEnum.OFFICE.getType())).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId); List sysDepartmentList = sysDepartmentService.list(wrapper); for (SysDepartment children : sysDepartmentList) { SysDepartmentCascadeVO childrenTreeModel = SysDepartmentCascadeVO.of(children); getChildrenHospitalAndOfficeCascadeList(childrenTreeModel); //去除多余树干,例如:广东省-中山市-西区 、 广东省-中山市 if (CollectionUtils.isEmpty(childrenTreeModel.getChildren()) && !children.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { continue; } childrenVOList.add(childrenTreeModel); } sysDepartment.setChildren(childrenVOList); } /** * 医院-树形--级联 * * @param sysDepartment * @return */ private void getChildrenHospitalCascadeList(SysDepartmentCascadeVO sysDepartment) { List childrenVOList = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysDepartment::getParentId, sysDepartment.getValue()).in(SysDepartment::getOrgType, Arrays.asList(DepartmentEnum.OrgTypeEnum.AREA.getType(), DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId); List sysDepartmentList = sysDepartmentService.list(wrapper); for (SysDepartment children : sysDepartmentList) { SysDepartmentCascadeVO childrenTreeModel = SysDepartmentCascadeVO.of(children); getChildrenHospitalCascadeList(childrenTreeModel); //去除多余树干,例如:广东省-中山市-西区 、 广东省-中山市 if (CollectionUtils.isEmpty(childrenTreeModel.getChildren()) && !children.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { continue; } childrenVOList.add(childrenTreeModel); } sysDepartment.setChildren(childrenVOList); } private SysDepartmentCascadeVO getChildrenHospitalCascadeListV2(SysDepartment sysDepartment, Map> childrenMap ) { SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartment); List children = childrenMap.getOrDefault(sysDepartment.getId(), Collections.emptyList()); List childrenList = children.stream().map(child -> { return getChildrenHospitalCascadeListV2(child, childrenMap); }).filter(x -> !(CollectionUtils.isEmpty(x.getChildren()) && !x.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType()))).collect(Collectors.toList()); areaTreeModel.setChildren(childrenList.isEmpty() ? new ArrayList<>() :childrenList); childrenMap.remove(areaTreeModel.getId()); return areaTreeModel; } /** * 获取我的科室列表 * * @return */ public List getMyOfficeCascadeList(Integer parentId) { List treeModelList = new ArrayList<>(); // SysDepartment sysDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (parentId != null) { sysDepartment = sysDepartmentService.getById(parentId); } if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = sysDepartmentService.getHospital(sysDepartment.getParentId()); } SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartment); getChildrenOfficeCascadeList(areaTreeModel); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { treeModelList.add(areaTreeModel); } } return treeModelList; } /** * 获取我的科室列表V2 * * @return */ public List getMyOfficeCascadeListV2(Integer parentId, Boolean onlyOffice) { List treeModelList = new ArrayList<>(); // SysDepartment sysDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); ////如果登录账户是科室或者是部门的时候不需要查询医院信息 /*if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())){ SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartment); getChildrenOfficeCascadeListOffice(areaTreeModel); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { treeModelList.addAll(areaTreeModel.getChildren()); } }else { if (parentId != null) { sysDepartment = sysDepartmentService.getById(parentId); } if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = sysDepartmentService.getHospital(sysDepartment.getParentId()); } SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartment); getChildrenOfficeCascadeList(areaTreeModel); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { treeModelList.addAll(areaTreeModel.getChildren()); } } }*/ if (parentId != null) { sysDepartment = sysDepartmentService.getById(parentId); } if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = sysDepartmentService.getHospital(sysDepartment.getParentId()); } SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartment); getChildrenOfficeCascadeList(areaTreeModel); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { treeModelList.addAll(areaTreeModel.getChildren()); } } // 如果只需要科室数据,过滤掉部门层级 if (Boolean.TRUE.equals(onlyOffice)) { treeModelList = filterOnlyOffice(treeModelList); } return treeModelList; } /** * 递归过滤,只保留科室节点 */ private List filterOnlyOffice(List list) { if (CollectionUtils.isEmpty(list)) { return list; } List result = new ArrayList<>(); for (SysDepartmentCascadeVO vo : list) { if (DepartmentEnum.OrgTypeEnum.OFFICE.getType().equals(vo.getOrgType())) { // 科室节点直接添加,清空子节点 vo.setChildren(null); result.add(vo); } else if (CollectionUtils.isNotEmpty(vo.getChildren())) { // 非科室节点,递归处理子节点 result.addAll(filterOnlyOffice(vo.getChildren())); } } return result; } /** * 科室-树形-角色部门和科室 * * @param sysDepartment * @return */ private void getChildrenOfficeCascadeListOffice(SysDepartmentCascadeVO sysDepartment) { List childrenVOList = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysDepartment::getId, sysDepartment.getValue()); List sysDepartmentList = sysDepartmentService.list(wrapper); for (SysDepartment children : sysDepartmentList) { SysDepartmentCascadeVO childrenTreeModel = SysDepartmentCascadeVO.of(children); getChildrenOfficeCascadeList(childrenTreeModel); //去除多余树干,例如:广东省-中山市-西区-中医院-门诊部门 、 广东省-中山市 if (CollectionUtils.isEmpty(childrenTreeModel.getChildren()) && (!children.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType()) || children.getIsWarehouse().equals(1))) { continue; } childrenVOList.add(childrenTreeModel); } sysDepartment.setChildren(childrenVOList); } /** * 科室-树形-角色和医院 * * @param sysDepartment * @return */ private void getChildrenOfficeCascadeList(SysDepartmentCascadeVO sysDepartment) { List childrenVOList = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysDepartment::getParentId, sysDepartment.getValue()); List sysDepartmentList = sysDepartmentService.list(wrapper); for (SysDepartment children : sysDepartmentList) { SysDepartmentCascadeVO childrenTreeModel = SysDepartmentCascadeVO.of(children); getChildrenOfficeCascadeList(childrenTreeModel); //去除多余树干,例如:广东省-中山市-西区-中医院-门诊部门 、 广东省-中山市 if (CollectionUtils.isEmpty(childrenTreeModel.getChildren()) && (!children.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType()) || children.getIsWarehouse().equals(1))) { continue; } childrenVOList.add(childrenTreeModel); } sysDepartment.setChildren(childrenVOList); } private SysDepartmentCascadeVO getChildrenOfficeCascadeList_erV2(SysDepartment sysDepartment,Map> childrenMap) { long start = System.currentTimeMillis(); SysDepartmentCascadeVO parent = SysDepartmentCascadeVO.of(sysDepartment); List children = childrenMap.getOrDefault(parent.getId(), Collections.emptyList()); List childrenList = children.stream().map(child -> { return getChildrenOfficeCascadeList_erV2(child, childrenMap); }).filter(x -> !(CollectionUtils.isEmpty(x.getChildren()) && !x.getOrgType() .equals(OrgTypeEnum.OFFICE.getType()))).collect(Collectors.toList()); long end = System.currentTimeMillis() - start; System.err.println("----------fillChildrenTreeModel2------"+Thread.currentThread().getName()+"----->"+end); childrenMap.remove(parent.getId()); parent.setChildren(childrenList.isEmpty() ? new ArrayList<>() :childrenList); return parent; } /** * 科室-树形-二维码 * * @param sysDepartment * @return */ private void getChildrenOfficeCascadeList_er(SysDepartmentCascadeVO sysDepartment) { List childrenVOList = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda().eq(SysDepartment::getParentId, sysDepartment.getValue()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId); List sysDepartmentList = sysDepartmentService.list(wrapper); for (SysDepartment children : sysDepartmentList) { SysDepartmentCascadeVO childrenTreeModel = SysDepartmentCascadeVO.of(children); getChildrenOfficeCascadeList_er(childrenTreeModel); //去除多余树干,例如:广东省-中山市-西区-中医院-门诊部门 、 广东省-中山市 if (CollectionUtils.isEmpty(childrenTreeModel.getChildren()) && (!children.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType()))) { continue; } childrenVOList.add(childrenTreeModel); } sysDepartment.setChildren(childrenVOList); } private void getChildrenOfficeCascadeList_erParallel(SysDepartmentCascadeVO sysDepartment,ExecutorService executorService) { List childrenVOList = new ArrayList<>(); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(SysDepartment::getParentId, sysDepartment.getValue()) .orderByAsc(SysDepartment::getDepartOrder) .orderByAsc(SysDepartment::getId); List sysDepartmentList = sysDepartmentService.list(wrapper); List> futures = sysDepartmentList.stream() .map(children -> CompletableFuture.runAsync(() -> { SysDepartmentCascadeVO childrenTreeModel = SysDepartmentCascadeVO.of(children); getChildrenOfficeCascadeList_er(childrenTreeModel); if (!childrenTreeModel.getChildren().isEmpty() || children.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { synchronized (childrenVOList) { childrenVOList.add(childrenTreeModel); } } }, executorService)) .collect(Collectors.toList()); CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); sysDepartment.setChildren(childrenVOList); } /** * 获取我的暂存间列表 * * @return */ public List getMyWarehouseOfficeList(Integer officeId) { List treeModelList = new ArrayList<>(); //获取用户所在部门 SysDepartment sysDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (officeId != null) { sysDepartment = sysDepartmentService.getById(officeId); } if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = sysDepartmentService.getHospital(sysDepartment.getParentId()); } List sysDepartmentList = sysDepartmentService.list(new QueryWrapper().lambda().likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode()).eq(SysDepartment::getIsWarehouse, CommonConstant.WARE_HOUSE).eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.OFFICE.getType())); for (SysDepartment sysDepartmentTemp : sysDepartmentList) { SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartmentTemp); treeModelList.add(areaTreeModel); } } return treeModelList; } /** * 获取我的科室列表-APP端 * 如果登录用户所在部门为区域级,则返回空科室 * * @return */ public List getMyOfficeListByApp(Integer userId) { List treeModelList = new ArrayList<>(); // SysDepartment sysDepartment = sysDepartmentService.getMyDepartment(userId); if (sysDepartment != null) { if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { sysDepartment = sysDepartmentService.getHospital(sysDepartment.getParentId()); } else if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.AREA.getType())) { return treeModelList; } List childrenList = sysDepartmentService.list(new QueryWrapper()// .lambda()// .likeRight(SysDepartment::getTreeCode, sysDepartment.getTreeCode())// .eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.OFFICE.getType())// .eq(SysDepartment::getIsWarehouse, 0)//是否是暂存间:0否1是 .eq(SysDepartment::getStatus, 1)//状态(1启用,0不启用) .orderByAsc(SysDepartment::getTreeCode)); for (SysDepartment children : childrenList) { treeModelList.add(SysDepartmentTreeModel.of(children)); } } return treeModelList; } /** * 获取前两级区域-不包括平台 * * @return */ public List getTwoAreaCascadeList() { List voList = new ArrayList<>(); SysDepartment myDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (!myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.AREA.getType())) { // if (myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { // voList.add(SysDepartmentCascadeVO.of(myDepartment)); // } return voList; } int level = 0; SysDepartment parentDepartment = myDepartment; while (parentDepartment != null && !parentDepartment.getId().equals(-1)) { level++; parentDepartment = sysDepartmentService.getById(parentDepartment.getParentId()); } if (level == 0) { SysDepartmentCascadeVO vo = SysDepartmentCascadeVO.of(myDepartment); List rootList = sysDepartmentService.list(new QueryWrapper().lambda().eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType()).eq(SysDepartment::getParentId, myDepartment.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); if (CollectionUtils.isNotEmpty(rootList)) { vo.setChildren(getLevelRegionList(rootList, 2)); } voList.add(vo); } else if (level == 1) { SysDepartmentCascadeVO vo = SysDepartmentCascadeVO.of(myDepartment); List rootList = sysDepartmentService.list(new QueryWrapper().lambda().eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType()).eq(SysDepartment::getParentId, myDepartment.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); if (CollectionUtils.isNotEmpty(rootList)) { vo.setChildren(getLevelRegionList(rootList, 1)); } voList.add(vo); } else if (level == 2) { voList.add(SysDepartmentCascadeVO.of(myDepartment)); } return voList; } /** * 获取前三级区域-不包括平台 * * @return */ public List getThreeAreaCascadeList() { List voList = new ArrayList<>(); SysDepartment myDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); if (!myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.AREA.getType())) { if (myDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { voList.add(SysDepartmentCascadeVO.of(myDepartment)); } return voList; } int level = 0; SysDepartment parentDepartment = myDepartment; while (parentDepartment != null && !parentDepartment.getId().equals(-1)) { level++; parentDepartment = sysDepartmentService.getById(parentDepartment.getParentId()); } if (level == 0) { SysDepartmentCascadeVO vo = SysDepartmentCascadeVO.of(myDepartment); List rootList = sysDepartmentService.list(new QueryWrapper().lambda().eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType()).eq(SysDepartment::getParentId, myDepartment.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); if (CollectionUtils.isNotEmpty(rootList)) { vo.setChildren(getLevelRegionList(rootList, 3)); } voList.add(vo); } else if (level == 1) { SysDepartmentCascadeVO vo = SysDepartmentCascadeVO.of(myDepartment); List rootList = sysDepartmentService.list(new QueryWrapper().lambda().eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType()).eq(SysDepartment::getParentId, myDepartment.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); if (CollectionUtils.isNotEmpty(rootList)) { vo.setChildren(getLevelRegionList(rootList, 2)); } voList.add(vo); } else if (level == 2) { SysDepartmentCascadeVO vo = SysDepartmentCascadeVO.of(myDepartment); List rootList = sysDepartmentService.list(new QueryWrapper().lambda().eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType()).eq(SysDepartment::getParentId, myDepartment.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); if (CollectionUtils.isNotEmpty(rootList)) { vo.setChildren(getLevelRegionList(rootList, 1)); } voList.add(vo); } else if (level == 3) { voList.add(SysDepartmentCascadeVO.of(myDepartment)); } return voList; } private List getLevelRegionList(List rootList, int level) { if (level < 1) { return null; } List rootCascadeVOList = new ArrayList<>(); for (SysDepartment root : rootList) { SysDepartmentCascadeVO rootCascadeVO = SysDepartmentCascadeVO.of(root); List childrenList = sysDepartmentService.list(new QueryWrapper().lambda().eq(SysDepartment::getOrgType, DepartmentEnum.OrgTypeEnum.AREA.getType()).eq(SysDepartment::getParentId, root.getId()).orderByAsc(SysDepartment::getDepartOrder).orderByAsc(SysDepartment::getId)); if (CollectionUtils.isNotEmpty(childrenList)) { rootCascadeVO.setChildren(getLevelRegionList(childrenList, level - 1)); } rootCascadeVOList.add(rootCascadeVO); } return rootCascadeVOList; } public List getRegionHospitalCascadeList(Integer departmentId) { List voList = new ArrayList<>(); SysDepartment sysDepartment = sysDepartmentService.getById(departmentId); if (sysDepartment == null) { return voList; } if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType())) { return voList; } else if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { voList.add(SysDepartmentCascadeVO.of(sysDepartment)); } else { SysDepartmentCascadeVO areaTreeModel = SysDepartmentCascadeVO.of(sysDepartment); getChildrenHospitalCascadeList(areaTreeModel); if (CollectionUtils.isNotEmpty(areaTreeModel.getChildren())) { voList.add(areaTreeModel); } } return voList; } /** * 批量编辑医院配置(全选开关/手选开关/签名开关) * * @param ids :ids(多个用逗号隔开) * @param selectSwitch:选择开关 * @param checkallSwitch:全选开关 * @param signatureSwitch:签名开关 */ public void batchEdit(String ids, Integer selectSwitch, Integer checkallSwitch, Integer signatureSwitch, Integer environmentalHandoverSwitch, Integer outboundWeighingSwitch, Integer outboundPrintingSwitch, Integer bluetoothPrintSwitch, Integer bluetoothWeighSwitch,Integer chipBoxSwitch) { String[] ids_ = ids.split(","); for (String id : ids_) { SysDepartment sysDepartment = new SysDepartment(); sysDepartment.setId(Integer.parseInt(id)); if (selectSwitch != null) { sysDepartment.setSelectSwitch(selectSwitch); } if (checkallSwitch != null) { sysDepartment.setCheckallSwitch(checkallSwitch); } if (signatureSwitch != null) { sysDepartment.setSignatureSwitch(signatureSwitch); } if (environmentalHandoverSwitch != null) { sysDepartment.setEnvironmentalHandoverSwitch(environmentalHandoverSwitch); } if (outboundWeighingSwitch != null) { sysDepartment.setOutboundWeighingSwitch(outboundWeighingSwitch); } if (outboundPrintingSwitch != null) { sysDepartment.setOutboundPrintingSwitch(outboundPrintingSwitch); } if (bluetoothPrintSwitch != null) { sysDepartment.setBluetoothPrintSwitch(bluetoothPrintSwitch); } if (bluetoothWeighSwitch != null) { sysDepartment.setBluetoothWeighSwitch(bluetoothWeighSwitch); } if (chipBoxSwitch != null) { sysDepartment.setChipBoxSwitch(chipBoxSwitch); }else { sysDepartment.setChipBoxSwitch(0); } sysDepartmentService.saveOrUpdate(sysDepartment); } } public void editHospitalConfiguration(Integer id, Integer type, Integer state) { SysDepartment sysDepartment = new SysDepartment(); sysDepartment.setId(id); if (type == 1) { sysDepartment.setCheckallSwitch(state); } if (type == 2) { sysDepartment.setSelectSwitch(state); } if (type == 3) { sysDepartment.setSignatureSwitch(state); } if (type == 4) { sysDepartment.setEnvironmentalHandoverSwitch(state); } if (type == 5) { sysDepartment.setOutboundWeighingSwitch(state); } if (type == 6) { sysDepartment.setOutboundPrintingSwitch(state); } if (type == 7) { sysDepartment.setBluetoothWeighSwitch(state); } if (type == 8) { sysDepartment.setBluetoothPrintSwitch(state); } if (type == 9) { sysDepartment.setChipBoxSwitch(state); } sysDepartmentService.saveOrUpdate(sysDepartment); } public IPage getCollectAppletAuthorization(CollectAppletAuthorizationVO vo, Integer pageNo, Integer pageSize) { return sysDepartmentService.getCollectAppletAuthorization(vo, pageNo, pageSize); } public void exportCollectAppletAuthorization(CollectAppletAuthorizationVO vo, HttpServletResponse response) throws Exception { ExcelWriter excelWriter = new ExcelWriter(exportCollectAppletAuthorization(vo, "收集小程序授权"), "收集小程序授权"); if (excelWriter != null) { response.setContentType("application/octet-stream;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("收集小程序授权", "UTF-8") + ".xlsx"); excelWriter.flush(response.getOutputStream(), true); excelWriter.close(); } } private XSSFWorkbook exportCollectAppletAuthorization(CollectAppletAuthorizationVO vo, String name) { IPage collectAppletAuthorization = sysDepartmentService.getCollectAppletAuthorization(vo, 1, 100000); List records = collectAppletAuthorization.getRecords(); XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet(name); XSSFCellStyle cellStyle = createDefaultCellStyle(workbook); XSSFRow row = sheet.createRow(0);//表头 XSSFCell cell = row.createCell(0); cell.setCellStyle(cellStyle); cell.setCellValue("收集小程序授权"); sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4)); XSSFRow row2 = sheet.createRow(0);//表头 XSSFCell cel20 = row2.createCell(0); cel20.setCellValue("所属区域"); cel20.setCellStyle(cellStyle); XSSFCell cel21 = row2.createCell(1); cel21.setCellValue("医院名称"); cel21.setCellStyle(cellStyle); XSSFCell cel22 = row2.createCell(2); cel22.setCellValue("授权开关"); cel22.setCellStyle(cellStyle); XSSFCell cel23 = row2.createCell(3); cel23.setCellValue("操作人"); cel23.setCellStyle(cellStyle); XSSFCell cel24 = row2.createCell(4); cel24.setCellValue("操作时间"); cel24.setCellStyle(cellStyle); for (int i = 1; i < records.size(); i++) { XSSFRow row1 = sheet.createRow(i);//表头 XSSFCell cel2 = row1.createCell(0); cel2.setCellStyle(cellStyle); cel2.setCellValue(records.get(i).getArea()); cel2.setCellStyle(cellStyle); XSSFCell cel3 = row1.createCell(1); cel3.setCellValue(records.get(i).getHospital()); cel3.setCellStyle(cellStyle); XSSFCell cel4 = row1.createCell(2); cel4.setCellValue(records.get(i).getAppletSwitch() == 1 ? "开" : "关"); cel4.setCellStyle(cellStyle); XSSFCell cel5 = row1.createCell(3); cel5.setCellValue(records.get(i).getAppletOperateUser()); cel5.setCellStyle(cellStyle); XSSFCell cel6 = row1.createCell(4); cel6.setCellValue(records.get(i).getAppletOperateTime()); cel6.setCellStyle(cellStyle); } return workbook; } public void batchEditCollectAppletAuthorization(String ids, Integer status, HttpServletRequest request) { String token = sysUserService.getToken(request); SysUser user = sysUserService.getByToken(token); String[] split = ids.split(","); sysDepartmentService.batchEditCollectAppletAuthorization(Arrays.asList(split), status, user.getId()); } private XSSFCellStyle createDefaultCellStyle(XSSFWorkbook workbook) { XSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setAlignment(HorizontalAlignment.CENTER); XSSFFont font = workbook.createFont(); font.setFontName("宋体"); font.setFontHeightInPoints((short) 12); cellStyle.setFont(font); return cellStyle; } private XSSFCellStyle createDefaultLeftCellStyle(XSSFWorkbook workbook) { XSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setAlignment(HorizontalAlignment.LEFT); XSSFFont font = workbook.createFont(); font.setFontName("宋体"); font.setFontHeightInPoints((short) 12); cellStyle.setFont(font); return cellStyle; } private XSSFCellStyle createDefaultRightCellStyle(XSSFWorkbook workbook) { XSSFCellStyle cellStyle = workbook.createCellStyle(); cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); cellStyle.setAlignment(HorizontalAlignment.RIGHT); XSSFFont font = workbook.createFont(); font.setFontName("宋体"); font.setFontHeightInPoints((short) 12); cellStyle.setFont(font); return cellStyle; } public IPage getMonthlySmsAuthorization(MonthlySmsAuthorizationVO vo, Integer pageNo, Integer pageSize) { return sysDepartmentService.getMonthlySmsAuthorization(vo, pageNo, pageSize); } public void exportMonthlySmsAuthorization(MonthlySmsAuthorizationVO vo, HttpServletResponse response) throws Exception { ExcelWriter excelWriter = new ExcelWriter(exportMonthlySmsAuthorization(vo, "月报短信授权"), "月报短信授权"); if (excelWriter != null) { response.setContentType("application/octet-stream;charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("月报短信授权", "UTF-8") + ".xlsx"); excelWriter.flush(response.getOutputStream(), true); excelWriter.close(); } } private XSSFWorkbook exportMonthlySmsAuthorization(MonthlySmsAuthorizationVO vo, String name) { IPage collectAppletAuthorization = sysDepartmentService.getMonthlySmsAuthorization(vo, 1, 100000); List records = collectAppletAuthorization.getRecords(); XSSFWorkbook workbook = new XSSFWorkbook(); XSSFSheet sheet = workbook.createSheet(name); XSSFCellStyle cellStyle = createDefaultCellStyle(workbook); XSSFRow row = sheet.createRow(0);//表头 XSSFCell cell = row.createCell(0); cell.setCellStyle(cellStyle); cell.setCellValue("月报短信授权"); sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 4)); XSSFRow row2 = sheet.createRow(0);//表头 XSSFCell cel20 = row2.createCell(0); cel20.setCellValue("所属区域"); cel20.setCellStyle(cellStyle); XSSFCell cel21 = row2.createCell(1); cel21.setCellValue("医院名称"); cel21.setCellStyle(cellStyle); XSSFCell cel22 = row2.createCell(2); cel22.setCellValue("授权开关"); cel22.setCellStyle(cellStyle); XSSFCell cel23 = row2.createCell(3); cel23.setCellValue("操作人"); cel23.setCellStyle(cellStyle); XSSFCell cel24 = row2.createCell(4); cel24.setCellValue("操作时间"); cel24.setCellStyle(cellStyle); for (int i = 1; i < records.size(); i++) { XSSFRow row1 = sheet.createRow(i);//表头 XSSFCell cel2 = row1.createCell(0); cel2.setCellStyle(cellStyle); cel2.setCellValue(records.get(i).getArea()); cel2.setCellStyle(cellStyle); XSSFCell cel3 = row1.createCell(1); cel3.setCellValue(records.get(i).getHospital()); cel3.setCellStyle(cellStyle); XSSFCell cel4 = row1.createCell(2); cel4.setCellValue(records.get(i).getSmsSwitch() == 1 ? "开" : "关"); cel4.setCellStyle(cellStyle); XSSFCell cel5 = row1.createCell(3); cel5.setCellValue(records.get(i).getSmsOperateUser()); cel5.setCellStyle(cellStyle); XSSFCell cel6 = row1.createCell(4); cel6.setCellValue(records.get(i).getSmsOperateTime()); cel6.setCellStyle(cellStyle); } return workbook; } public void batchEditMonthlySmsAuthorization(String ids, Integer status, HttpServletRequest request) { String token = sysUserService.getToken(request); SysUser user = sysUserService.getByToken(token); String[] split = ids.split(","); sysDepartmentService.batchEditMonthlySmsAuthorization(Arrays.asList(split), status, user.getId()); } /** * 获取组织架构缓存数据 * * @param type * @return */ public Object getCache(Integer type) { Object ob = new Object(); SysDepartment sysDepartment = sysDepartmentService.getMyDepartment(EnvUtils.getUser().getId()); switch (type) { case 1: if (redisUtil.hasKey("myHospitalAndOfficeCascadeList")) { //获取医院部门和科室接口 ob = redisUtil.get("myHospitalAndOfficeCascadeList"); } else { ob = sysDepartmentBiz.getMyHospitalAndOfficeCascadeListV2(1); redisUtil.set("myHospitalAndOfficeCascadeList", ob); } ob = sysDepartmentBiz.getMyHospitalAndOfficeCascadeListV2(1); List list1 = (List) ob; ob = filterateSysDepartmentCascadeVO(list1, sysDepartment); break; case 2: List obVo= new ArrayList<>(); if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.DEPARTMENT.getType()) || sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.OFFICE.getType())) { SysDepartment hospital = sysDepartmentService.getHospital(sysDepartment.getParentId()); obVo.add(SysDepartmentCascadeVO.of(hospital)); ob = obVo; } else if (sysDepartment.getOrgType().equals(DepartmentEnum.OrgTypeEnum.HOSPITAL.getType())) { obVo.add(SysDepartmentCascadeVO.of(sysDepartment)); ob = obVo; } else { if (redisUtil.hasKey("myHospitalCascadeList")) { //获取医院层级接口 ob = redisUtil.get("myHospitalCascadeList"); } else { CompletableFuture.runAsync(()-> updateCacheByType(2)); ob = sysDepartmentBiz.getMyHospitalCascadeList(1); redisUtil.set("myHospitalCascadeList", ob); } List list2 = (List) ob; ob = filterateSysDepartmentCascadeVO(list2, sysDepartment); } break; case 3: if (redisUtil.hasKey("myDepartmentTreeList")) { //获取组织接口 ob = redisUtil.get("myDepartmentTreeList"); } else { CompletableFuture.runAsync(()-> updateCacheByType(3)); ob = sysDepartmentBiz.getMyDepartmentTreeList(1); redisUtil.set("myDepartmentTreeList", ob); } List list3 = (List) ob; ob = filterateSysDepartmentTreeVO(list3, sysDepartment); break; case 4: if (redisUtil.hasKey("myRegionTreeList")) { //获取组织接口 ob = redisUtil.get("myRegionTreeList"); } else { ob = sysDepartmentBiz.getMyRegionTreeList(1); redisUtil.set("myRegionTreeList", ob); // CompletableFuture.runAsync(()->updateCacheByType(4)); } List list4 = (List) ob; ob = filterateRegionTreeDTO(list4, sysDepartment); break; } return ob; } /** * * 根据账号获取数据 * @param myRegionList * @param sysDepartment * @return */ private List filterateRegionTreeDTO(List myRegionList, SysDepartment sysDepartment) { TreeFilterRegionTreeUtil treeFilterRegionTreeUtil = new TreeFilterRegionTreeUtil(); if (sysDepartment.getId() != -1) { List hitIds = new ArrayList<>(); hitIds.add(sysDepartment.getId().intValue()); myRegionList = treeFilterRegionTreeUtil.searchNode(myRegionList, hitIds); } return myRegionList; } /** * 根据账号获取数据 * * @param myHospitalAndOfficeCascadeList * @param sysDepartment * @return */ private List filterateSysDepartmentCascadeVO(List myHospitalAndOfficeCascadeList, SysDepartment sysDepartment) { TreeFilterModelSysDepartmentCascadeUtil treeFilterModelUtil = new TreeFilterModelSysDepartmentCascadeUtil(); if (sysDepartment.getId() != -1) { List hitIds = new ArrayList<>(); hitIds.add(sysDepartment.getId().intValue()); myHospitalAndOfficeCascadeList = treeFilterModelUtil.searchNode(myHospitalAndOfficeCascadeList, hitIds); } return myHospitalAndOfficeCascadeList; } /** * 根据账号获取数据 * * @param myDepartmentTreeList * @param sysDepartment * @return */ private List filterateSysDepartmentTreeVO(List myDepartmentTreeList, SysDepartment sysDepartment) { TreeFilterSysDepartmentTreeModelUtil treeFilterModelUtil = new TreeFilterSysDepartmentTreeModelUtil(); if (sysDepartment.getId() != -1) { List hitIds = new ArrayList<>(); hitIds.add(sysDepartment.getId().intValue()); myDepartmentTreeList = treeFilterModelUtil.searchNode(myDepartmentTreeList, hitIds); } return myDepartmentTreeList; } /** * 更新缓存数据 * * @param type 1:添加缓存数据,2:修改缓存数据,3:删除缓存数据 * @return */ public void updateCache(Integer type, List sysDepartmentList,List sysDepartmentListY) { List myHospitalAndOfficeCascadeList = null; if (redisUtil.hasKey("myHospitalAndOfficeCascadeList")) { //获取医院部门和科室接口 myHospitalAndOfficeCascadeList = redisUtil.get("myHospitalAndOfficeCascadeList"); } else { myHospitalAndOfficeCascadeList = sysDepartmentBiz.getMyHospitalAndOfficeCascadeList(1); } for (SysDepartment sysDepartment : sysDepartmentList) { //todo 递归处理树形结构1 SysDepartment sysDepartmentY = new SysDepartment(); if(sysDepartmentListY!=null){ for(SysDepartment sysDepartmenty_ : sysDepartmentListY ){ if(sysDepartment.getId() == sysDepartmenty_.getId() || sysDepartment.getId().equals(sysDepartmenty_.getId())){ sysDepartmentY = sysDepartmenty_; } } } myHospitalAndOfficeCascadeList = setSysDepartmentCascadeVO(myHospitalAndOfficeCascadeList, sysDepartment, type,2,sysDepartmentY); } redisUtil.set("myHospitalAndOfficeCascadeList", myHospitalAndOfficeCascadeList); List myHospitalCascadeList = null; if (redisUtil.hasKey("myHospitalCascadeList")) { //获取医院层级接口 myHospitalCascadeList = redisUtil.get("myHospitalCascadeList"); } else { myHospitalCascadeList = sysDepartmentBiz.getMyHospitalCascadeList(1); } for (SysDepartment sysDepartment : sysDepartmentList) { //todo 递归处理树形结构2 SysDepartment sysDepartmentY = new SysDepartment(); if(sysDepartmentListY!=null){ for(SysDepartment sysDepartmenty_ : sysDepartmentListY ){ if(sysDepartment.getId() == sysDepartmenty_.getId() || sysDepartment.getId().equals(sysDepartmenty_.getId())){ sysDepartmentY = sysDepartmenty_; } } } myHospitalCascadeList = setSysDepartmentCascadeVO(myHospitalCascadeList, sysDepartment, type,1,sysDepartmentY); } redisUtil.set("myHospitalCascadeList", myHospitalCascadeList); List myDepartmentTreeList = null; if (redisUtil.hasKey("myDepartmentTreeList")) { //获取组织接口 myDepartmentTreeList = redisUtil.get("myDepartmentTreeList"); } else { myDepartmentTreeList = sysDepartmentBiz.getMyDepartmentTreeList(1); } for (SysDepartment sysDepartment : sysDepartmentList) { //todo 递归处理树形结构3 SysDepartment sysDepartmentY = new SysDepartment(); if(sysDepartmentListY!=null){ for(SysDepartment sysDepartmenty_ : sysDepartmentListY ){ if(sysDepartment.getId() == sysDepartmenty_.getId() || sysDepartment.getId().equals(sysDepartmenty_.getId())){ sysDepartmentY = sysDepartmenty_; } } } myDepartmentTreeList = setSysDepartmentTreeModel(myDepartmentTreeList, sysDepartment, type,sysDepartmentY); } redisUtil.set("myDepartmentTreeList", myDepartmentTreeList); } /** * 递归处理树形结构 * * @param myHospitalAndOfficeCascadeList 树形对象 * @param sysDepartment 新操作的组织架构对象 * @param type 1:添加缓存数据,2:修改缓存数据,3:删除缓存数据 * @param isHospital 1:医院,2:部门和科室 * @return */ private List setSysDepartmentCascadeVO(List myHospitalAndOfficeCascadeList, SysDepartment sysDepartment, Integer type,Integer isHospital,SysDepartment sysDepartmentY) { List voList = new ArrayList<>(); switch (type) { case 1: voList = setSysDepartmentCascadeTypeAdd(myHospitalAndOfficeCascadeList,sysDepartment,isHospital); break; case 2: voList = setSysDepartmentCascadeTypeDel(myHospitalAndOfficeCascadeList,sysDepartmentY); voList = setSysDepartmentCascadeTypeAdd(voList,sysDepartment,isHospital); break; case 3: voList = setSysDepartmentCascadeTypeDel(myHospitalAndOfficeCascadeList,sysDepartment); break; } return voList; } //处理添加缓存 private List setSysDepartmentCascadeTypeAdd(List myHospitalAndOfficeCascadeList, SysDepartment sysDepartment, Integer isHospital) { if (myHospitalAndOfficeCascadeList == null || myHospitalAndOfficeCascadeList.size() == 0) { return myHospitalAndOfficeCascadeList; } for (SysDepartmentCascadeVO sysDepartmentCascadeVO1 : myHospitalAndOfficeCascadeList) { //添加数据 SysDepartmentCascadeVO sysDepartmentCascadeVO = new SysDepartmentCascadeVO(); if (!sysDepartmentCascadeVO1.getValue().equals(sysDepartment.getParentId().toString())) { Boolean ok = true; if (isHospital == 1 && sysDepartment.getOrgType() > 2) { ok = false; } if (ok) { setSysDepartmentCascadeTypeAdd(sysDepartmentCascadeVO1.getChildren(), sysDepartment, isHospital); } } else { sysDepartmentCascadeVO.setValue(sysDepartment.getId() + ""); sysDepartmentCascadeVO.setLabel(sysDepartment.getDepartName()); sysDepartmentCascadeVO.setOrgType(sysDepartment.getOrgType()); if (sysDepartmentCascadeVO1.getChildren() == null) { List childrenList = new ArrayList<>(); childrenList.add(sysDepartmentCascadeVO); sysDepartmentCascadeVO1.setChildren(childrenList); } else { sysDepartmentCascadeVO1.getChildren().add(sysDepartmentCascadeVO); } return myHospitalAndOfficeCascadeList; } } return myHospitalAndOfficeCascadeList; } //处理删除缓存 private List setSysDepartmentCascadeTypeDel(List myHospitalAndOfficeCascadeList, SysDepartment sysDepartment) { if (myHospitalAndOfficeCascadeList == null || myHospitalAndOfficeCascadeList.size() == 0) { return myHospitalAndOfficeCascadeList; } for (SysDepartmentCascadeVO sysDepartmentCascadeVO1 : myHospitalAndOfficeCascadeList) { //删除 if (!sysDepartmentCascadeVO1.getValue().equals(sysDepartment.getParentId().toString())) { setSysDepartmentCascadeTypeDel(sysDepartmentCascadeVO1.getChildren(), sysDepartment); } else { SysDepartmentCascadeVO sysDepartmentCascadeVO_ = new SysDepartmentCascadeVO(); sysDepartmentCascadeVO_.setValue(sysDepartment.getId() + ""); sysDepartmentCascadeVO_.setLabel(sysDepartment.getDepartName()); sysDepartmentCascadeVO_.setOrgType(sysDepartment.getOrgType()); if (sysDepartmentCascadeVO1.getChildren() != null) { sysDepartmentCascadeVO1.getChildren().remove(sysDepartmentCascadeVO_); } return myHospitalAndOfficeCascadeList; } } return myHospitalAndOfficeCascadeList; } /** * 递归处理树形结构 * * @param myDepartmentTreeList 树形对象 * @param sysDepartment 新操作的组织架构对象 * @param type 1:添加缓存数据,2:修改缓存数据,3:删除缓存数据 * @return */ private List setSysDepartmentTreeModel(List myDepartmentTreeList, SysDepartment sysDepartment, Integer type,SysDepartment sysDepartmentY) { List voList = new ArrayList<>(); switch (type) { case 1: voList = setSysDepartmentTreeModelTypeAdd(myDepartmentTreeList,sysDepartment); break; case 2: voList = setSysDepartmentTreeModelTypeDel(myDepartmentTreeList,sysDepartmentY); voList = setSysDepartmentTreeModelTypeAdd(voList,sysDepartment); break; case 3: voList = setSysDepartmentTreeModelTypeDel(myDepartmentTreeList,sysDepartment); break; } return voList; } //处理添加缓存 private List setSysDepartmentTreeModelTypeAdd(List myDepartmentTreeList, SysDepartment sysDepartment) { if (myDepartmentTreeList == null || myDepartmentTreeList.size() == 0) { return myDepartmentTreeList; } for (SysDepartmentTreeModel sysDepartmentTreeModel : myDepartmentTreeList) { //添加数据 if (!sysDepartmentTreeModel.getValue().equals(sysDepartment.getParentId())) { setSysDepartmentTreeModelTypeAdd(sysDepartmentTreeModel.getChildren(), sysDepartment); } else { SysDepartmentTreeModel sysDepartmentTreeModelNew = SysDepartmentTreeModel.of(sysDepartment); if (sysDepartmentTreeModel.getChildren() == null) { List childrenList = new ArrayList<>(); childrenList.add(sysDepartmentTreeModelNew); sysDepartmentTreeModel.setChildren(childrenList); } else { sysDepartmentTreeModel.getChildren().add(sysDepartmentTreeModelNew); } return myDepartmentTreeList; } } return myDepartmentTreeList; } //处理删除缓存 private List setSysDepartmentTreeModelTypeDel(List myDepartmentTreeList, SysDepartment sysDepartment) { if (myDepartmentTreeList == null || myDepartmentTreeList.size() == 0) { return myDepartmentTreeList; } for (SysDepartmentTreeModel sysDepartmentTreeModel : myDepartmentTreeList) { //删除 if (!sysDepartmentTreeModel.getValue().equals(sysDepartment.getParentId())) { setSysDepartmentTreeModelTypeDel(sysDepartmentTreeModel.getChildren(), sysDepartment); } else { List returnSysDepartmentTreeModels = new ArrayList<>(); if (returnSysDepartmentTreeModels != null) { for (SysDepartmentTreeModel sysDepartmentTreeModel1 : sysDepartmentTreeModel.getChildren()) { if (!sysDepartmentTreeModel1.getValue().equals(sysDepartment.getId())) { returnSysDepartmentTreeModels.add(sysDepartmentTreeModel1); } } } sysDepartmentTreeModel.setChildren(returnSysDepartmentTreeModels); return myDepartmentTreeList; } } return myDepartmentTreeList; } }