From 080f8c076cab77580ade3d209f0394028a70b83c Mon Sep 17 00:00:00 2001 From: caihaohan Date: Sat, 10 Aug 2024 17:26:08 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=87=AA=E5=AE=9A=E4=B9=89=E6=A0=91?= =?UTF-8?q?=E5=BD=A2=E7=BB=93=E6=9E=84=E6=87=92=E5=8A=A0=E8=BD=BD=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../standard/service/DictTreeService.java | 160 +++++++++++------- 1 file changed, 103 insertions(+), 57 deletions(-) diff --git a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/DictTreeService.java b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/DictTreeService.java index 07659269..7d99e613 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/DictTreeService.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/DictTreeService.java @@ -6,9 +6,7 @@ import com.jero.modules.system.service.ISysDictItemService; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Service @@ -18,38 +16,117 @@ public class DictTreeService { private ISysDictItemService dictItemService; public List queryTreeList(String nodeName, String dictId) { + // 查询所有节点 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysDictItem::getDictId, dictId); - queryWrapper.eq(SysDictItem::getParentId, "0"); - if (nodeName != null && !nodeName.isEmpty()) { - queryWrapper.like(SysDictItem::getItemText, nodeName); - } - List list = dictItemService.list(queryWrapper); + List allNodes = dictItemService.list(queryWrapper); - if (list.isEmpty()) { - return list; + // 通过 nodeName 过滤符合条件的节点 + List matchedNodes = allNodes.stream() + .filter(node -> node.getItemText() != null && node.getItemText().contains(nodeName)) + .collect(Collectors.toList()); + + if (matchedNodes.isEmpty()) { + return Collections.emptyList(); } - List dictItemIds = list.stream().map(SysDictItem::getId).collect(Collectors.toList()); - // 判断有没有子级 - queryWrapper.clear(); + // 用于存储一级节点 + Set rootNodes = new HashSet<>(); + + // 查找每个匹配节点的一级父节点 + for (SysDictItem matchedNode : matchedNodes) { + SysDictItem currentNode = matchedNode; + while (currentNode != null && !currentNode.getParentId().equals("0")) { + // 查找当前节点的父节点 + String parentId = currentNode.getParentId(); + currentNode = allNodes.stream() + .filter(node -> node.getId().equals(parentId)) + .findFirst() + .orElse(null); + } + // 添加一级节点到结果集 + if (currentNode != null) { + rootNodes.add(currentNode); + } + } + + // 设置叶子标志的逻辑调整 + for (SysDictItem node : rootNodes) { + Set descendantIds = getAllDescendantIds(node.getId(), allNodes); // 获取所有子孙节点的ID + boolean isLeaf = true; // 默认设置为叶子节点 + + for (SysDictItem matchedNode : matchedNodes) { + if (descendantIds.contains(matchedNode.getId())) { + isLeaf = false; + break; // 如果在子孙节点中找到匹配节点,当前根节点不是叶子节点 + } + } + node.setLeafFlag(isLeaf); // 设置叶子标志 + } + + return new ArrayList<>(rootNodes); + } + + + // 方法:获取给定节点ID的所有子孙节点ID + private Set getAllDescendantIds(String parentId, List allNodes) { + Set descendantIds = new HashSet<>(); + List directChildren = allNodes.stream() + .filter(node -> node.getParentId().equals(parentId)) + .collect(Collectors.toList()); + + for (SysDictItem child : directChildren) { + descendantIds.add(child.getId()); + descendantIds.addAll(getAllDescendantIds(child.getId(), allNodes)); // 递归获取子孙节点 + } + + return descendantIds; + } + + + public List getChild(String dictItemId, String dictId, String nodeName) { + // 查询所有节点 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysDictItem::getDictId, dictId); - queryWrapper.in(SysDictItem::getParentId, dictItemIds); - if (nodeName != null && !nodeName.isEmpty()) { - queryWrapper.like(SysDictItem::getItemText, nodeName); - } - List childList = dictItemService.list(queryWrapper); + List allNodes = dictItemService.list(queryWrapper); - if (childList.isEmpty()) { - list.forEach(e -> e.setLeafFlag(true)); - return list; + // 通过 nodeName 过滤符合条件的节点 + List matchedNodes = allNodes.stream() + .filter(node -> node.getItemText() != null && node.getItemText().contains(nodeName)) + .collect(Collectors.toList()); + + if (matchedNodes.isEmpty()) { + return Collections.emptyList(); } - Map> childMap = childList.stream().collect(Collectors.groupingBy(SysDictItem::getParentId)); - list.forEach(item -> { - List sysDictItems = childMap.get(item.getId()); - item.setLeafFlag(sysDictItems == null || sysDictItems.isEmpty()); + + // 用于存储一级节点 + Set rootNodes = new HashSet<>(); + + // 查找每个匹配节点的一级父节点 + for (SysDictItem matchedNode : matchedNodes) { + SysDictItem currentNode = matchedNode; + while (currentNode != null && !currentNode.getParentId().equals(dictItemId)) { + // 查找当前节点的父节点 + String parentId = currentNode.getParentId(); + currentNode = allNodes.stream() + .filter(node -> node.getId().equals(parentId)) + .findFirst() + .orElse(null); + } + // 添加一级节点到结果集 + if (currentNode != null) { + rootNodes.add(currentNode); + } + } + + // 设置叶子标志 + Set rootNodeIds = rootNodes.stream().map(SysDictItem::getId).collect(Collectors.toSet()); + rootNodes.forEach(node -> { + node.setLeafFlag(matchedNodes.stream() + .noneMatch(n -> rootNodeIds.contains(n.getParentId()))); }); - return list; + + return new ArrayList<>(rootNodes); } public List queryEcho(String selectNodeCodes, String dictId) { @@ -58,35 +135,4 @@ public class DictTreeService { queryWrapper.in(SysDictItem::getItemValue, Arrays.asList(selectNodeCodes.split(","))); return dictItemService.list(queryWrapper); } - - public List getChild(String dictItemId, String dictId, String nodeName) { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(SysDictItem::getDictId, dictId); - queryWrapper.eq(SysDictItem::getParentId, dictItemId); - if (nodeName != null && !nodeName.isEmpty()) { - queryWrapper.like(SysDictItem::getItemText, nodeName); - } - List list = dictItemService.list(queryWrapper); - - List dictItemIds = list.stream().map(SysDictItem::getId).collect(Collectors.toList()); - // 判断有没有子级 - queryWrapper.clear(); - queryWrapper.eq(SysDictItem::getDictId, dictId); - queryWrapper.in(SysDictItem::getParentId, dictItemIds); - if (nodeName != null && !nodeName.isEmpty()) { - queryWrapper.like(SysDictItem::getItemText, nodeName); - } - List childList = dictItemService.list(queryWrapper); - - if (childList.isEmpty()) { - list.forEach(e -> e.setLeafFlag(true)); - return list; - } - Map> childMap = childList.stream().collect(Collectors.groupingBy(SysDictItem::getParentId)); - list.forEach(item -> { - List sysDictItems = childMap.get(item.getId()); - item.setLeafFlag(sysDictItems == null || sysDictItems.isEmpty()); - }); - return list; - } }