diff --git a/laws-modules/src/main/java/com/jero/modules/laws/standard/controller/LawsPartNameController.java b/laws-modules/src/main/java/com/jero/modules/laws/standard/controller/LawsPartNameController.java index 84092b0b..43104af5 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/standard/controller/LawsPartNameController.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/standard/controller/LawsPartNameController.java @@ -66,7 +66,7 @@ public class LawsPartNameController { @GetMapping("/queryFirstList") public Result> queryFirstList( @RequestParam(name = "nodeName", required = false, defaultValue = "") @ApiParam("节点名称") String nodeName) { - List list = partNameService.queryList(nodeName); + List list = partNameService.getTree("Part", nodeName); return Result.OK(list); } @@ -76,7 +76,7 @@ public class LawsPartNameController { @GetMapping("/getChild") public Result> getChild(@RequestParam("parentCode") String parentCode, @RequestParam("nodeName") String nodeName) { - return Result.OK(partNameService.getChild(parentCode, nodeName)); + return Result.OK(partNameService.getTree(parentCode, nodeName)); } } diff --git a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/PartNameService.java b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/PartNameService.java index 55cdddca..ec17d3c0 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/PartNameService.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/PartNameService.java @@ -36,7 +36,8 @@ public interface PartNameService extends IService { */ void fixFirstNodeCode(); - List queryList(String nodeName); - - List getChild(String parentCode, String nodeName); + /** + * 零部件树懒加载 + */ + List getTree(String parentCode, String nodeName); } 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 4f9eb955..a6ff6c59 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 @@ -190,108 +190,53 @@ public class PartNameServiceImpl extends ServiceImpl return null; } - @Override - public List queryList(String nodeName) { - // 查询所有节点并建立父节点映射 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - List allNodes = list(queryWrapper); - Map nodeMap = allNodes.stream() - .collect(Collectors.toMap(PartName::getCode, node -> node)); + public List getTree(String parentCode, String nodeName) { + // 查询所有节点 + List allNodes = list(); - // 通过 nodeName 过滤符合条件的节点 + // 过滤符合条件的节点 List matchedNodes = allNodes.parallelStream() .filter(node -> node.getName() != null && node.getName().contains(nodeName)) .collect(Collectors.toList()); + // 构建节点映射,以及父子关系映射 + Map nodeMap = allNodes.parallelStream() + .collect(Collectors.toConcurrentMap(PartName::getCode, Function.identity())); + Map> parentChildMap = matchedNodes.parallelStream() + .collect(Collectors.groupingByConcurrent(PartName::getParentCode)); + if (matchedNodes.isEmpty()) { return Collections.emptyList(); } - // 用于存储一级节点 + // 查找每个匹配节点的一级父节点 Set rootNodes = ConcurrentHashMap.newKeySet(); - - // 并行查找每个匹配节点的一级父节点 + Set allParentNodeCodes = ConcurrentHashMap.newKeySet(); matchedNodes.parallelStream().forEach(matchedNode -> { PartName currentNode = matchedNode; - while (currentNode != null && !"Part".equals(currentNode.getParentCode())) { + while (currentNode != null && !currentNode.getParentCode().equals(parentCode)) { currentNode = nodeMap.get(currentNode.getParentCode()); + if (currentNode != null) { + allParentNodeCodes.add(currentNode.getCode()); + } } if (currentNode != null) { rootNodes.add(currentNode); } }); - // 并行设置叶子标志 - rootNodes.parallelStream().forEach(node -> { - Set descendantCodes = getAllDescendantCodes(node.getCode(), nodeMap); - boolean isLeaf = matchedNodes.stream() - .noneMatch(matchedNode -> descendantCodes.contains(matchedNode.getCode())); - node.setLeafFlag(isLeaf); - }); + // 设置叶子标志 + rootNodes.parallelStream().forEach(rootNode -> { + List children = parentChildMap.get(rootNode.getCode()); + boolean hasNoChildren = (children == null || children.isEmpty()); - // 按名字排序 - return rootNodes.stream() - .sorted(Comparator.comparing(PartName::getName)) - .collect(Collectors.toList()); - } - - // 优化后的获取子孙节点ID方法,使用节点映射避免重复计算 - private Set getAllDescendantCodes(String parentCode, Map nodeMap) { - Set descendantCodes = new HashSet<>(); - Deque stack = new ArrayDeque<>(); - stack.push(parentCode); - - while (!stack.isEmpty()) { - String currentCode = stack.pop(); - nodeMap.values().parallelStream() - .filter(node -> node.getParentCode().equals(currentCode)) - .forEach(child -> { - descendantCodes.add(child.getCode()); - stack.push(child.getCode()); - }); - } - - return descendantCodes; - } - - @Override - public List getChild(String parentCode, String nodeName) { - // 查询所有节点并建立父节点映射 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - List allNodes = list(queryWrapper); - Map nodeMap = allNodes.stream() - .collect(Collectors.toMap(PartName::getCode, node -> node)); - - // 通过 nodeName 过滤符合条件的节点 - List matchedNodes = allNodes.parallelStream() - .filter(node -> node.getName() != null && node.getName().contains(nodeName)) - .collect(Collectors.toList()); - - if (matchedNodes.isEmpty()) { - return Collections.emptyList(); - } - - // 用于存储一级节点 - Set rootNodes = ConcurrentHashMap.newKeySet(); - - // 并行查找每个匹配节点的一级父节点 - matchedNodes.parallelStream().forEach(matchedNode -> { - PartName currentNode = matchedNode; - while (currentNode != null && !parentCode.equals(currentNode.getParentCode())) { - currentNode = nodeMap.get(currentNode.getParentCode()); + if (StrUtil.isBlank(nodeName)) { + rootNode.setLeafFlag(hasNoChildren); + } else { + boolean isNotInAllParents = !allParentNodeCodes.contains(rootNode.getCode()); + rootNode.setLeafFlag(hasNoChildren && isNotInAllParents); } - if (currentNode != null) { - rootNodes.add(currentNode); - } - }); - - // 并行设置叶子标志 - rootNodes.parallelStream().forEach(node -> { - boolean isLeaf = matchedNodes.stream() - .noneMatch(n -> parentCode.equals(n.getParentCode()) && - n.getParentCode().equals(node.getCode())); - node.setLeafFlag(isLeaf); }); // 按名字排序