diff --git a/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java index a6230d97..98fc457c 100644 --- a/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/DimensionTemplateServiceImpl.java @@ -295,16 +295,10 @@ public class DimensionTemplateServiceImpl extends ServiceImpl分类) - List nextNodeTypes = (currentLevelIndex != dimensionNodeTypeLevels.size() - 1) - ? dimensionNodeTypeLevels.get(currentLevelIndex + 1) - : Collections.singletonList(chooseNodeType); - - for (String nextNodeType : nextNodeTypes) { - SdmResponse> allNodeByProjectIdAndType = simuluationNodeFeignClient.getAllNodeByProjectIdAndType(chooseUuids, nextNodeType); - if (allNodeByProjectIdAndType.isSuccess() && CollectionUtils.isNotEmpty(allNodeByProjectIdAndType.getData())) { - uuids.addAll(allNodeByProjectIdAndType.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList()); - } + // 获取下一层节点,如果下一层没有,则继续查询更深层级 + List nextLevelUuids = findNextLevelNodeUuids(chooseUuids, chooseNodeType, currentLevelIndex, dimensionNodeTypeLevels); + if (CollectionUtils.isNotEmpty(nextLevelUuids)) { + uuids.addAll(nextLevelUuids); } } @@ -342,6 +336,52 @@ public class DimensionTemplateServiceImpl extends ServiceImpl + * 此方法会根据当前节点所在的层级,查找其在维度定义中的下一层或更深层次的子节点。 + * 如果在直接下一层没有找到子节点,并且当前不是最后一层,它会继续尝试查询更深的层级,直到找到子节点或遍历完所有后续层级。 + * 对于最后一层的节点,它会查找同类型的子节点(例如,分类下的子分类)。 + * + * @param chooseUuids 当前选中节点的UUID列表 + * @param chooseNodeType 当前选中节点的类型 + * @param currentLevelIndex 当前节点类型在维度层级中的索引 + * @param dimensionNodeTypeLevels 维度层级定义,包含各层级的节点类型列表 + * @return 下一层级子节点的UUID列表 + */ + private List findNextLevelNodeUuids(List chooseUuids, String chooseNodeType, int currentLevelIndex, List> dimensionNodeTypeLevels) { + List nextLevelUuids = new ArrayList<>(); + + // 如果是最后一层,则查找同类型的连续子节点 + if (currentLevelIndex == dimensionNodeTypeLevels.size() - 1) { + List nextNodeTypes = Collections.singletonList(chooseNodeType); + for (String nextNodeType : nextNodeTypes) { + SdmResponse> response = simuluationNodeFeignClient.getAllNodeByProjectIdAndType(chooseUuids, nextNodeType); + if (response.isSuccess() && CollectionUtils.isNotEmpty(response.getData())) { + nextLevelUuids.addAll(response.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList()); + } + } + return nextLevelUuids; + } + + // 如果不是最后一层,则从下一层开始查找,直到找到节点或遍历完所有层级 + for (int i = currentLevelIndex + 1; i < dimensionNodeTypeLevels.size(); i++) { + List nextNodeTypes = dimensionNodeTypeLevels.get(i); + for (String nextNodeType : nextNodeTypes) { + SdmResponse> response = simuluationNodeFeignClient.getAllNodeByProjectIdAndType(chooseUuids, nextNodeType); + if (response.isSuccess() && CollectionUtils.isNotEmpty(response.getData())) { + nextLevelUuids.addAll(response.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList()); + } + } + // 如果在当前层级找到了子节点,则停止继续向更深层级查找 + if (CollectionUtils.isNotEmpty(nextLevelUuids)) { + break; + } + } + + return nextLevelUuids; + } + /** * 根据 uuid 获取节点的 nodeCode