fix:数据总览兼容基于维度查询,缺少对应维度时,继续往下搜索层级
This commit is contained in:
@@ -295,16 +295,10 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
|
||||
return SdmResponse.failed("选中节点类型不在数据展示维度中");
|
||||
}
|
||||
|
||||
// 非最后一层:查模板下一层多个类型;最后一层:查同类型连续子节点(例如 分类->分类)
|
||||
List<String> nextNodeTypes = (currentLevelIndex != dimensionNodeTypeLevels.size() - 1)
|
||||
? dimensionNodeTypeLevels.get(currentLevelIndex + 1)
|
||||
: Collections.singletonList(chooseNodeType);
|
||||
|
||||
for (String nextNodeType : nextNodeTypes) {
|
||||
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> allNodeByProjectIdAndType = simuluationNodeFeignClient.getAllNodeByProjectIdAndType(chooseUuids, nextNodeType);
|
||||
if (allNodeByProjectIdAndType.isSuccess() && CollectionUtils.isNotEmpty(allNodeByProjectIdAndType.getData())) {
|
||||
uuids.addAll(allNodeByProjectIdAndType.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
|
||||
}
|
||||
// 获取下一层节点,如果下一层没有,则继续查询更深层级
|
||||
List<String> nextLevelUuids = findNextLevelNodeUuids(chooseUuids, chooseNodeType, currentLevelIndex, dimensionNodeTypeLevels);
|
||||
if (CollectionUtils.isNotEmpty(nextLevelUuids)) {
|
||||
uuids.addAll(nextLevelUuids);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -342,6 +336,52 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
|
||||
return SdmResponse.success(mergedResult);
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归获取维度模板中指定节点的下一层级子节点UUID。
|
||||
* <p>
|
||||
* 此方法会根据当前节点所在的层级,查找其在维度定义中的下一层或更深层次的子节点。
|
||||
* 如果在直接下一层没有找到子节点,并且当前不是最后一层,它会继续尝试查询更深的层级,直到找到子节点或遍历完所有后续层级。
|
||||
* 对于最后一层的节点,它会查找同类型的子节点(例如,分类下的子分类)。
|
||||
*
|
||||
* @param chooseUuids 当前选中节点的UUID列表
|
||||
* @param chooseNodeType 当前选中节点的类型
|
||||
* @param currentLevelIndex 当前节点类型在维度层级中的索引
|
||||
* @param dimensionNodeTypeLevels 维度层级定义,包含各层级的节点类型列表
|
||||
* @return 下一层级子节点的UUID列表
|
||||
*/
|
||||
private List<String> findNextLevelNodeUuids(List<String> chooseUuids, String chooseNodeType, int currentLevelIndex, List<List<String>> dimensionNodeTypeLevels) {
|
||||
List<String> nextLevelUuids = new ArrayList<>();
|
||||
|
||||
// 如果是最后一层,则查找同类型的连续子节点
|
||||
if (currentLevelIndex == dimensionNodeTypeLevels.size() - 1) {
|
||||
List<String> nextNodeTypes = Collections.singletonList(chooseNodeType);
|
||||
for (String nextNodeType : nextNodeTypes) {
|
||||
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> 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<String> nextNodeTypes = dimensionNodeTypeLevels.get(i);
|
||||
for (String nextNodeType : nextNodeTypes) {
|
||||
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> 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
|
||||
|
||||
Reference in New Issue
Block a user