diff --git a/laws-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java b/laws-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java index 819f6969..0746eaa4 100644 --- a/laws-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java +++ b/laws-module-system/src/main/java/com/jero/modules/system/entity/SysDictItem.java @@ -197,6 +197,13 @@ public class SysDictItem implements TreeNode { @JsonProperty("isLeaf") private boolean leafFlag; + /** + * 第一级节点 + */ + @TableField(exist = false) + @ApiModelProperty(value = "第一级节点") + private String firstNode; + @Override public String obtainTreeNodeId() { return id; diff --git a/laws-modules/src/main/java/com/jero/modules/laws/standard/controller/LawsDictTreeController.java b/laws-modules/src/main/java/com/jero/modules/laws/standard/controller/LawsDictTreeController.java index 40c1317a..c76bfb83 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/standard/controller/LawsDictTreeController.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/standard/controller/LawsDictTreeController.java @@ -33,7 +33,7 @@ public class LawsDictTreeController { public Result> queryTreeList( @RequestParam(name = "nodeName", required = false, defaultValue = "") @ApiParam("节点名称") String nodeName, @RequestParam("dictId") @ApiParam("字典编码") String dictId) { - List list = dictTreeService.queryTreeList(nodeName, dictId); + List list = dictTreeService.getTree("0", dictId, nodeName); return Result.OK(list); } @@ -51,7 +51,7 @@ public class LawsDictTreeController { public Result> getChild(@RequestParam("dictItemId") String dictItemId, @RequestParam("dictId") @ApiParam("字典编码") String dictId, @RequestParam("nodeName") String nodeName) { - return Result.OK(dictTreeService.getChild(dictItemId, dictId, nodeName)); + return Result.OK(dictTreeService.getTree(dictItemId, dictId, nodeName)); } 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 a0120d11..24d2da42 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 @@ -40,7 +40,7 @@ public class LawsPartNameController { @GetMapping("/queryFirstList") public Result> queryFirstList( @RequestParam(name = "nodeName", required = false, defaultValue = "") @ApiParam("节点名称") String nodeName) { - List list = IPartNameService.queryList(nodeName); + List list = IPartNameService.getTree("Part", nodeName); return Result.OK(list); } @@ -57,7 +57,7 @@ public class LawsPartNameController { @GetMapping("/getChild") public Result> getChild(@RequestParam("parentCode") String parentCode, @RequestParam("nodeName") String nodeName) { - return Result.OK(IPartNameService.getChild(parentCode, nodeName)); + return Result.OK(IPartNameService.getTree(parentCode, nodeName)); } @AutoLog(value = "企业标准-零部件树历史数据处理") 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 5a9faf76..9aa772a6 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 @@ -1,5 +1,6 @@ package com.jero.modules.laws.standard.service; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.jero.modules.system.entity.SysDictItem; import com.jero.modules.system.service.ISysDictItemService; @@ -7,6 +8,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; import java.util.stream.Collectors; @Service @@ -15,119 +18,60 @@ public class DictTreeService { @Resource private ISysDictItemService dictItemService; - public List queryTreeList(String nodeName, String dictId) { + public List getTree(String dictItemId, String dictId, String nodeName) { // 查询所有节点 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysDictItem::getDictId, dictId); List allNodes = dictItemService.list(queryWrapper); - // 通过 nodeName 过滤符合条件的节点 - List matchedNodes = allNodes.stream() + // 过滤符合条件的节点 + List matchedNodes = allNodes.parallelStream() .filter(node -> node.getItemText() != null && node.getItemText().contains(nodeName)) .collect(Collectors.toList()); + // 构建节点映射,以及父子关系映射 + Map nodeMap = allNodes.parallelStream() + .collect(Collectors.toConcurrentMap(SysDictItem::getId, Function.identity())); + Map> parentChildMap = matchedNodes.parallelStream() + .collect(Collectors.groupingByConcurrent(SysDictItem::getParentId)); + if (matchedNodes.isEmpty()) { return Collections.emptyList(); } - // 用于存储一级节点 - 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); - List allNodes = dictItemService.list(queryWrapper); - - // 通过 nodeName 过滤符合条件的节点 - List matchedNodes = allNodes.stream() - .filter(node -> node.getItemText() != null && node.getItemText().contains(nodeName)) - .collect(Collectors.toList()); - - if (matchedNodes.isEmpty()) { - return Collections.emptyList(); - } - - // 用于存储一级节点 - Set rootNodes = new HashSet<>(); - - // 查找每个匹配节点的一级父节点 - for (SysDictItem matchedNode : matchedNodes) { + Set rootNodes = ConcurrentHashMap.newKeySet(); + Set allParentNodeIds = ConcurrentHashMap.newKeySet(); + matchedNodes.parallelStream().forEach(matchedNode -> { 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); + currentNode = nodeMap.get(currentNode.getParentId()); + if (currentNode != null) { + allParentNodeIds.add(currentNode.getId()); + } } - // 添加一级节点到结果集 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()) && - n.getParentId().equals(node.getId())))); }); - return new ArrayList<>(rootNodes); + // 设置叶子标志 + rootNodes.parallelStream().forEach(rootNode -> { + List children = parentChildMap.get(rootNode.getId()); + boolean hasNoChildren = (children == null || children.isEmpty()); + + if (StrUtil.isBlank(nodeName)) { + rootNode.setLeafFlag(hasNoChildren); + } else { + boolean isNotInAllParents = !allParentNodeIds.contains(rootNode.getId()); + rootNode.setLeafFlag(hasNoChildren && isNotInAllParents); + } + }); + + // 按名字排序 + return rootNodes.stream() + .sorted(Comparator.comparing(SysDictItem::getSortOrder)) + .collect(Collectors.toList()); } public List queryEcho(String selectNodeCodes, String dictId) { diff --git a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/ILawsPartNameService.java b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/ILawsPartNameService.java index 6f271979..98f04101 100644 --- a/laws-modules/src/main/java/com/jero/modules/laws/standard/service/ILawsPartNameService.java +++ b/laws-modules/src/main/java/com/jero/modules/laws/standard/service/ILawsPartNameService.java @@ -32,7 +32,8 @@ public interface ILawsPartNameService 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 3ee98d29..02096607 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 @@ -140,90 +140,35 @@ public class PartNameServiceImpl extends ServiceImpl } @Override - public List queryList(String nodeName) { + public List getTree(String parentCode, String nodeName) { // 查询所有节点 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - List allNodes = list(queryWrapper); - - // 通过 nodeName 过滤符合条件的节点 - Map nodeMap = allNodes.parallelStream() - .collect(Collectors.toConcurrentMap(PartName::getCode, Function.identity())); - Map> parentChildMap = allNodes.parallelStream() - .collect(Collectors.groupingByConcurrent(PartName::getParentCode)); - - 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 && !currentNode.getParentCode().equals("Part")) { - currentNode = nodeMap.get(currentNode.getParentCode()); - } - if (currentNode != null) { - rootNodes.add(currentNode); - } - }); - - // 设置叶子标志 - rootNodes.parallelStream().forEach(rootNode -> { - List children = parentChildMap.get(rootNode.getCode()); - rootNode.setLeafFlag(children == null || children.isEmpty()); - }); - - return rootNodes.stream() - .sorted(Comparator.comparing(PartName::getName)) - .collect(Collectors.toList()); - } - - // 方法:获取给定节点ID的所有子孙节点ID - private Set getAllDescendantCodes(String parentCode, List allNodes) { - Set descendantCodes = new HashSet<>(); - List directChildren = allNodes.stream() - .filter(node -> node.getParentCode().equals(parentCode)) - .collect(Collectors.toList()); - - for (PartName child : directChildren) { - descendantCodes.add(child.getCode()); - descendantCodes.addAll(getAllDescendantCodes(child.getCode(), allNodes)); // 递归获取子孙节点 - } - - return descendantCodes; - } - - @Override - public List getChild(String parentCode, String nodeName) { - // 查询所有节点 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - List allNodes = list(queryWrapper); - - // 构建节点映射,以及父子关系映射 - Map nodeMap = allNodes.parallelStream() - .collect(Collectors.toConcurrentMap(PartName::getCode, Function.identity())); - Map> parentChildMap = allNodes.parallelStream() - .collect(Collectors.groupingByConcurrent(PartName::getParentCode)); + List allNodes = list(); // 过滤符合条件的节点 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 && !currentNode.getParentCode().equals(parentCode)) { currentNode = nodeMap.get(currentNode.getParentCode()); + if (currentNode != null) { + allParentNodeCodes.add(currentNode.getCode()); + } } if (currentNode != null) { rootNodes.add(currentNode); @@ -233,7 +178,14 @@ public class PartNameServiceImpl extends ServiceImpl // 设置叶子标志 rootNodes.parallelStream().forEach(rootNode -> { List children = parentChildMap.get(rootNode.getCode()); - rootNode.setLeafFlag(children == null || children.isEmpty()); + boolean hasNoChildren = (children == null || children.isEmpty()); + + if (StrUtil.isBlank(nodeName)) { + rootNode.setLeafFlag(hasNoChildren); + } else { + boolean isNotInAllParents = !allParentNodeCodes.contains(rootNode.getCode()); + rootNode.setLeafFlag(hasNoChildren && isNotInAllParents); + } }); // 按名字排序