From ce556a34f24112d1173c2bf6a8bbe9542615ad58 Mon Sep 17 00:00:00 2001 From: caihaohan Date: Mon, 26 Feb 2024 15:13:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=9B=B6=E9=83=A8=E4=BB=B6=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E6=8E=A5=E5=8F=A3=E6=94=AF=E6=8C=81=E5=85=A8=E9=83=A8?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E5=90=8D=E7=A7=B0=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/PartNameServiceImpl.java | 96 +++++++++++++++---- 1 file changed, 75 insertions(+), 21 deletions(-) diff --git a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/impl/PartNameServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/impl/PartNameServiceImpl.java index 52783265..3ac0c7dd 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/impl/PartNameServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/impl/PartNameServiceImpl.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.jero.common.constant.enums.YesOrNoEnum; import com.jero.common.exception.JeroBootException; +import com.jero.modules.laws.standard.entity.LawsTreeNode; import com.jero.modules.laws.standard.entity.PartName; import com.jero.modules.laws.standard.entity.TreePage; import com.jero.modules.laws.standard.service.PartNameService; @@ -15,9 +16,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -38,30 +37,40 @@ public class PartNameServiceImpl extends ServiceImpl @Override public TreePage queryTreeList(String nodeName, Integer pageNo, Integer pageSize) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + List topLevelNodes; queryWrapper.eq(PartName::getDelFlag, YesOrNoEnum.NO.getValue()) .like(StrUtil.isNotBlank(nodeName), PartName::getName, nodeName); List allNodes = partNameMapper.selectList(queryWrapper); + List firstNodeCodeList = allNodes.stream() + .map(PartName::getFirstNode) + .distinct() + .collect(Collectors.toList()); + // 不做筛选的时候查询加速 + if (StrUtil.isBlank(nodeName)) { + // 构建树结构 + topLevelNodes = this.buildTree(new HashSet<>(allNodes)); + } else { + // 做筛选的时候需要自己组树 + queryWrapper.clear(); + queryWrapper.eq(PartName::getDelFlag, YesOrNoEnum.NO.getValue()) + .in(PartName::getFirstNode, firstNodeCodeList) + .or().in(PartName::getCode, firstNodeCodeList); + List allNodeList = partNameMapper.selectList(queryWrapper); - // 将所有节点转换为映射,以便快速查找 - Map nodeMap = allNodes.stream() - .collect(Collectors.toMap(PartName::getCode, Function.identity())); - - // 构建树形结构 - List topLevelNodes = new ArrayList<>(); - allNodes.forEach(node -> { - if (node.getParentCode().equals("Part")) { - topLevelNodes.add(node); - } else { - PartName parentNode = nodeMap.get(node.getParentCode()); - if (parentNode != null) { - if (parentNode.getChildPartNameList() == null) { - parentNode.setChildPartNameList(new ArrayList<>()); - } - parentNode.getChildPartNameList().add(node); - } + // 构建树形结构 + Set nodesSet = new HashSet<>(); + for (PartName node : allNodes) { + nodesSet.addAll(findPathToRoot(allNodeList, node)); + nodesSet.addAll(findAllChildren(allNodeList, node)); } - }); + topLevelNodes = this.buildTree(nodesSet); + } + if (!topLevelNodes.isEmpty()) { + if (topLevelNodes.get(0).getParentCode().equals("0")) { + topLevelNodes = topLevelNodes.get(0).getChildPartNameList(); + } + } // 实现分页逻辑 int start = (pageNo - 1) * pageSize; int end = Math.min(start + pageSize, topLevelNodes.size()); @@ -76,6 +85,51 @@ public class PartNameServiceImpl extends ServiceImpl return result; } + private List buildTree(Set nodesSet) { + List topLevelNodes = new ArrayList<>(); + Map nodeMap = nodesSet.stream() + .collect(Collectors.toMap(PartName::getCode, Function.identity())); + for (PartName node : nodesSet) { + PartName parentNode = nodeMap.get(node.getParentCode()); + if (parentNode != null) { + if (parentNode.getChildPartNameList() == null) { + parentNode.setChildPartNameList(new ArrayList<>()); + } + parentNode.getChildPartNameList().add(node); + } else { + topLevelNodes.add(node); + } + } + return topLevelNodes; + } + + public static Set findPathToRoot(List allNodes, PartName node) { + Set pathNodes = new HashSet<>(); + PartName[] currentHolder = new PartName[1]; + currentHolder[0] = node; + while (currentHolder[0] != null) { + pathNodes.add(currentHolder[0]); + currentHolder[0] = allNodes.stream() + .filter(n -> n.getCode().equals(currentHolder[0].getParentCode())) + .findFirst().orElse(null); + } + return pathNodes; + } + + public Set findAllChildren(List allNodes, PartName node) { + Set childrenSet = new HashSet<>(); + List directChildren = allNodes.stream() + .filter(n -> n.getParentCode().equals(node.getCode())) + .collect(Collectors.toList()); + + for (PartName child : directChildren) { + childrenSet.add(child); + childrenSet.addAll(findAllChildren(allNodes, child)); + } + return childrenSet; + } + + @Override public List queryEcho(String selectNodeCodes) { List codeList = StrUtil.split(selectNodeCodes, ',');