Merge branch 'master' of https://gitlab.jlcucc.com:52302/coscoshipping/sys_manager_ebtp_project
Conflicts: src/main/java/com/coscoshipping/ebtp/project/org/service/impl/SysOrgServiceImpl.java
This commit is contained in:
@ -22,9 +22,7 @@ import com.coscoshipping.ebtp.project.org.service.SysOrgService;
|
|||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,31 +57,75 @@ public class SysOrgServiceImpl extends BaseServiceImpl<SysOrgMapper, SysOrg> imp
|
|||||||
return sysOrgList.stream().map(entity -> BeanUtil.toBean(entity, SysOrgVO.class)).collect(Collectors.toList());
|
return sysOrgList.stream().map(entity -> BeanUtil.toBean(entity, SysOrgVO.class)).collect(Collectors.toList());
|
||||||
} else {
|
} else {
|
||||||
sysOrgList = this.list();
|
sysOrgList = this.list();
|
||||||
|
|
||||||
//存储所有的部门ID
|
|
||||||
String allDepartmentId = "";
|
|
||||||
|
|
||||||
if (!CollectionUtils.isEmpty(sysOrgList)) {
|
|
||||||
//获取要查询的节点ID 如果为空则查询所有节点进行树形展示
|
|
||||||
String rootNode = StringUtils.isNotBlank(org.getOrgId()) ? org.getOrgId() : CommonUtil.ROOT_NODE;
|
|
||||||
|
|
||||||
allDepartmentId += rootNode;
|
|
||||||
|
|
||||||
List<SysOrgVO> sysOrgVOList = JsonUtils.jsonToList(sysOrgList, SysOrgVO.class);
|
|
||||||
//获取要查询的节点
|
|
||||||
sysOrgVO = sysOrgVOList.stream()
|
|
||||||
.filter(n -> StringUtils.equals(n.getUpOrgId(), rootNode))
|
|
||||||
.map(this::setInfoForTree)
|
|
||||||
.collect(Collectors.toList())
|
|
||||||
.get(0);
|
|
||||||
//递归查询节点信息
|
|
||||||
getChildrenNode(sysOrgVOList, sysOrgVO, allDepartmentId);
|
|
||||||
}
|
|
||||||
sysOrgVO.setAllDepartmentId(allDepartmentId);
|
|
||||||
List<SysOrgVO> voList = new ArrayList<>();
|
List<SysOrgVO> voList = new ArrayList<>();
|
||||||
voList.add(sysOrgVO);
|
|
||||||
|
if (CollectionUtils.isEmpty(sysOrgList)) {
|
||||||
return voList;
|
return voList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 预处理所有节点为SysOrgVO,并构建子节点映射表
|
||||||
|
List<SysOrgVO> allOrgVOs = sysOrgList.stream()
|
||||||
|
.map(entity -> BeanUtil.toBean(entity, SysOrgVO.class))
|
||||||
|
.map(this::setInfoForTree) // 提前应用树形结构转换
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 构建父节点到子节点的映射(key: upOrgId,value: 子节点列表)
|
||||||
|
Map<String, List<SysOrgVO>> parentToChildrenMap = new HashMap<>();
|
||||||
|
String rootOrgCode = "10000000";
|
||||||
|
for (SysOrgVO orgVO : allOrgVOs) {
|
||||||
|
String parentId = StringUtils.isBlank(orgVO.getUpOrgId()) ? rootOrgCode : orgVO.getUpOrgId();
|
||||||
|
parentToChildrenMap.computeIfAbsent(parentId, k -> new ArrayList<>()).add(orgVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取根节点ID
|
||||||
|
String rootNode = StringUtils.isNotBlank(org.getOrgId()) ? org.getOrgId() : rootOrgCode;
|
||||||
|
|
||||||
|
// 使用StringBuilder记录所有部门ID
|
||||||
|
StringBuilder allDepartmentIdBuilder = new StringBuilder(rootNode);
|
||||||
|
|
||||||
|
// 构建多级树结构(从根节点开始递归)
|
||||||
|
List<SysOrgVO> rootChildren = parentToChildrenMap.getOrDefault(rootNode, new ArrayList<>());
|
||||||
|
for (SysOrgVO rootChild : rootChildren) {
|
||||||
|
buildMultiLevelTree(rootChild, parentToChildrenMap, allDepartmentIdBuilder);
|
||||||
|
voList.add(rootChild);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置全量部门ID
|
||||||
|
voList.forEach(vo -> vo.setAllDepartmentId(allDepartmentIdBuilder.toString()));
|
||||||
|
|
||||||
|
return voList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 递归构建多级组织机构树结构
|
||||||
|
*
|
||||||
|
* @param currentNode 当前需要处理的组织机构节点
|
||||||
|
* @param parentToChildrenMap 父节点ID到子节点列表的映射表(预处理结果,用于O(1)时间查找子节点)
|
||||||
|
* @param allDepartmentIdBuilder 记录所有层级部门ID的字符串构建器(按层级顺序累加)
|
||||||
|
* @apiNote 通过递归方式为当前节点设置子节点,并继续处理子节点的子节点,最终形成完整的多级树结构。
|
||||||
|
* 依赖预处理的{@code parentToChildrenMap}提升查找子节点效率,避免重复遍历全量数据。
|
||||||
|
*/
|
||||||
|
private void buildMultiLevelTree(SysOrgVO currentNode,
|
||||||
|
Map<String, List<SysOrgVO>> parentToChildrenMap,
|
||||||
|
StringBuilder allDepartmentIdBuilder) {
|
||||||
|
// 从映射表直接获取当前节点的子节点(O(1))
|
||||||
|
List<SysOrgVO> children = parentToChildrenMap.getOrDefault(currentNode.getOrgId(), new ArrayList<>());
|
||||||
|
|
||||||
|
// 排序
|
||||||
|
List<SysOrgVO> sortedChildren = children.stream()
|
||||||
|
.sorted(Comparator.comparing(SysOrgVO::getSort, Comparator.nullsLast(String::compareTo)))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
currentNode.setChildren(sortedChildren);
|
||||||
|
|
||||||
|
// 记录当前节点ID,累加所有层级ID
|
||||||
|
allDepartmentIdBuilder.append(",").append(currentNode.getOrgId());
|
||||||
|
|
||||||
|
// 递归处理子节点
|
||||||
|
for (SysOrgVO child : sortedChildren) {
|
||||||
|
buildMultiLevelTree(child, parentToChildrenMap, allDepartmentIdBuilder);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -181,38 +223,6 @@ public class SysOrgServiceImpl extends BaseServiceImpl<SysOrgMapper, SysOrg> imp
|
|||||||
.setValue(orgVO.getOrgId());
|
.setValue(orgVO.getOrgId());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 递归查询部门信息树形展示
|
|
||||||
*
|
|
||||||
* @param sysOrgVOList 所有部门信息
|
|
||||||
* @param sysOrg 当前查询节点
|
|
||||||
*/
|
|
||||||
private void getChildrenNode(List<SysOrgVO> sysOrgVOList, SysOrgVO sysOrg, String allDepartmentId) {
|
|
||||||
|
|
||||||
List<SysOrgVO> childrenNodeList = new ArrayList<>();
|
|
||||||
|
|
||||||
for (SysOrgVO sysOrgVO : sysOrgVOList) {
|
|
||||||
//判断机构部门上级ID和当前节点ID是否相等
|
|
||||||
if (StringUtils.equals(sysOrg.getOrgId(), sysOrgVO.getUpOrgId())) {
|
|
||||||
childrenNodeList.add(sysOrgVO);
|
|
||||||
allDepartmentId += sysOrgVO.getOrgId();
|
|
||||||
getChildrenNode(sysOrgVOList, sysOrgVO, allDepartmentId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//判断是否有下级节点
|
|
||||||
if (!CollectionUtils.isEmpty(childrenNodeList)) {
|
|
||||||
//根据sort排序
|
|
||||||
childrenNodeList = childrenNodeList
|
|
||||||
.stream()
|
|
||||||
.map(this::setInfoForTree)
|
|
||||||
.sorted(Comparator.comparing(SysOrgVO::getSort, Comparator.nullsLast(String::compareTo)))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
sysOrg.setChildren(childrenNodeList);
|
|
||||||
} else {
|
|
||||||
sysOrg.setChildren(ListUtil.empty());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private LambdaQueryWrapper<SysOrg> buildQueryWrapper(SysOrgVO vo) {
|
private LambdaQueryWrapper<SysOrg> buildQueryWrapper(SysOrgVO vo) {
|
||||||
LambdaQueryWrapper<SysOrg> lqw = Wrappers.lambdaQuery();
|
LambdaQueryWrapper<SysOrg> lqw = Wrappers.lambdaQuery();
|
||||||
lqw.like(StringUtils.isNotBlank(vo.getOrgName()), SysOrg::getOrgName, vo.getOrgName());
|
lqw.like(StringUtils.isNotBlank(vo.getOrgName()), SysOrg::getOrgName, vo.getOrgName());
|
||||||
|
Reference in New Issue
Block a user