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 83184e34..a0120d11 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 @@ -3,7 +3,6 @@ package com.jero.modules.laws.standard.controller; import com.jero.common.api.vo.Result; import com.jero.common.aspect.annotation.AutoLog; import com.jero.modules.laws.standard.entity.PartName; -import com.jero.modules.laws.standard.entity.TreePage; import com.jero.modules.laws.standard.service.ILawsPartNameService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -31,17 +30,8 @@ public class LawsPartNameController { @AutoLog(value = "企业标准-零部件树") @ApiOperation(value = "企业标准-零部件树", notes = "企业标准-零部件树") @GetMapping("/") - public Result> queryENTreeList( - @RequestParam(name = "nodeName", required = false, defaultValue = "") @ApiParam("一级节点名称") String nodeName, - @RequestParam(name = "pageNo", defaultValue = "1") @ApiParam("页码") Integer pageNo, - @RequestParam(name = "pageSize", defaultValue = "10") @ApiParam("页面大小") Integer pageSize) { - if (pageNo == null) { - pageNo = 1; - } - if (pageSize == null) { - pageSize = 5; - } - TreePage list = IPartNameService.queryTreeList(nodeName, pageNo, pageSize); + public Result> queryENTreeList() { + List list = IPartNameService.queryTreeList(); return Result.OK(list); } 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 b93981de..6f271979 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 @@ -2,7 +2,6 @@ package com.jero.modules.laws.standard.service; import com.baomidou.mybatisplus.extension.service.IService; import com.jero.modules.laws.standard.entity.PartName; -import com.jero.modules.laws.standard.entity.TreePage; import java.util.List; @@ -16,13 +15,9 @@ public interface ILawsPartNameService extends IService { /** * 查询零部件树 * - * @param nodeName 节点名称 - * @param pageNo 页码 - * @param pageSize 页面大小 * @return 零部件树 */ - @Deprecated - TreePage queryTreeList(String nodeName, Integer pageNo, Integer pageSize); + List queryTreeList(); /** * 零部件树选中回显 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 de3b6504..3ee98d29 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 @@ -3,10 +3,8 @@ package com.jero.modules.laws.standard.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.PartName; -import com.jero.modules.laws.standard.entity.TreePage; import com.jero.modules.laws.standard.mapper.PartNameMapper; import com.jero.modules.laws.standard.service.ILawsPartNameService; import org.springframework.stereotype.Service; @@ -33,54 +31,10 @@ public class PartNameServiceImpl extends ServiceImpl private PartNameMapper partNameMapper; @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(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); - - // 构建树形结构 - 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()); - List pageData = topLevelNodes.subList(start, end); - - // 封装分页信息 - TreePage result = new TreePage<>(); - result.setRecords(pageData); - result.setTotal(topLevelNodes.size()); - result.setSize(pageSize); - result.setCurrent(pageNo); - return result; + public List queryTreeList() { + List allNodes = list(); + // 构建完整的树形结构 + return buildTree(new HashSet<>(allNodes)); // 直接返回构建的树形列表 } private List buildTree(Collection nodesCollection) { @@ -103,6 +57,8 @@ public class PartNameServiceImpl extends ServiceImpl for (PartName node : nodesCollection) { node.setLeafFlag(node.getChildPartNameList() == null || node.getChildPartNameList().isEmpty()); } + // 排序 + topLevelNodes.sort(Comparator.comparing(PartName::getName)); return topLevelNodes; } @@ -185,13 +141,16 @@ public class PartNameServiceImpl extends ServiceImpl @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)); // 通过 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()); @@ -200,13 +159,11 @@ public class PartNameServiceImpl extends ServiceImpl return Collections.emptyList(); } - // 用于存储一级节点 + // 查找每个匹配节点的一级父节点 Set rootNodes = ConcurrentHashMap.newKeySet(); - - // 并行查找每个匹配节点的一级父节点 matchedNodes.parallelStream().forEach(matchedNode -> { PartName currentNode = matchedNode; - while (currentNode != null && !"Part".equals(currentNode.getParentCode())) { + while (currentNode != null && !currentNode.getParentCode().equals("Part")) { currentNode = nodeMap.get(currentNode.getParentCode()); } if (currentNode != null) { @@ -214,34 +171,27 @@ public class PartNameServiceImpl extends ServiceImpl } }); - // 并行设置叶子标志 - 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()); + rootNode.setLeafFlag(children == null || children.isEmpty()); }); - // 按名字排序 return rootNodes.stream() .sorted(Comparator.comparing(PartName::getName)) .collect(Collectors.toList()); } // 方法:获取给定节点ID的所有子孙节点ID - private Set getAllDescendantCodes(String parentCode, Map nodeMap) { + private Set getAllDescendantCodes(String parentCode, List allNodes) { Set descendantCodes = new HashSet<>(); - Deque stack = new ArrayDeque<>(); - stack.push(parentCode); + List directChildren = allNodes.stream() + .filter(node -> node.getParentCode().equals(parentCode)) + .collect(Collectors.toList()); - 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()); - }); + for (PartName child : directChildren) { + descendantCodes.add(child.getCode()); + descendantCodes.addAll(getAllDescendantCodes(child.getCode(), allNodes)); // 递归获取子孙节点 } return descendantCodes; @@ -249,13 +199,17 @@ public class PartNameServiceImpl extends ServiceImpl @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 过滤符合条件的节点 + // 构建节点映射,以及父子关系映射 + 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()); @@ -264,13 +218,11 @@ public class PartNameServiceImpl extends ServiceImpl return Collections.emptyList(); } - // 用于存储一级节点 + // 查找每个匹配节点的一级父节点 Set rootNodes = ConcurrentHashMap.newKeySet(); - - // 并行查找每个匹配节点的一级父节点 matchedNodes.parallelStream().forEach(matchedNode -> { PartName currentNode = matchedNode; - while (currentNode != null && !parentCode.equals(currentNode.getParentCode())) { + while (currentNode != null && !currentNode.getParentCode().equals(parentCode)) { currentNode = nodeMap.get(currentNode.getParentCode()); } if (currentNode != null) { @@ -278,12 +230,10 @@ public class PartNameServiceImpl extends ServiceImpl } }); - // 并行设置叶子标志 - rootNodes.parallelStream().forEach(node -> { - boolean isLeaf = matchedNodes.stream() - .noneMatch(n -> parentCode.equals(n.getParentCode()) && - n.getParentCode().equals(node.getCode())); - node.setLeafFlag(isLeaf); + // 设置叶子标志 + rootNodes.parallelStream().forEach(rootNode -> { + List children = parentChildMap.get(rootNode.getCode()); + rootNode.setLeafFlag(children == null || children.isEmpty()); }); // 按名字排序 @@ -292,6 +242,7 @@ public class PartNameServiceImpl extends ServiceImpl .collect(Collectors.toList()); } + private PartName getFirstLevelNode(PartName node, Map nodeMap) { if (node.getParentCode().equals("Part")) { return node;