fix:数据总览支持同一级展示多个节点

This commit is contained in:
2026-03-09 10:02:39 +08:00
parent 25a561ac0a
commit 5a5295232e

View File

@@ -153,12 +153,28 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
hierarchy.setCreatedBy(userId);
hierarchy.setTemplateId(templateId);
hierarchy.setSortOrder(sortOrder++); // 设置排序序号并递增
hierarchy.setDisplayName(normalizeDisplayName(hierarchyReq.getDisplayName()));
hierarchies.add(hierarchy);
}
dimensionTemplateHierarchyService.saveBatch(hierarchies);
}
}
private List<String> parseDisplayNames(String displayName) {
if (StringUtils.isBlank(displayName)) {
return Collections.emptyList();
}
return Arrays.stream(displayName.split(","))
.map(String::trim)
.filter(StringUtils::isNotBlank)
.distinct()
.toList();
}
private String normalizeDisplayName(String displayName) {
return String.join(",", parseDisplayNames(displayName));
}
private void deleteDimensionTemplateHierarchyByTemplateid(Long templateId) {
LambdaQueryWrapper<DimensionTemplateHierarchy> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DimensionTemplateHierarchy::getTemplateId, templateId);
@@ -204,21 +220,33 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
Long dimensionTemplateId = req.getDimensionTemplateId();
LambdaQueryWrapper<DimensionTemplateHierarchy> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DimensionTemplateHierarchy::getTemplateId, dimensionTemplateId).orderByAsc(DimensionTemplateHierarchy::getSortOrder);
List<String> dimensionNodeTyepOrderList = dimensionTemplateHierarchyService.list(queryWrapper).stream().map(DimensionTemplateHierarchy::getDisplayName).toList();
List<List<String>> dimensionNodeTypeLevels = dimensionTemplateHierarchyService.list(queryWrapper).stream()
.map(DimensionTemplateHierarchy::getDisplayName)
.map(this::parseDisplayNames)
.filter(CollectionUtils::isNotEmpty)
.toList();
if (CollectionUtils.isEmpty(dimensionNodeTypeLevels)) {
return SdmResponse.success(Collections.emptyList());
}
List<String> uuids = new ArrayList<>();
List<FileMetadataInfo> resultDir = new ArrayList<>();
if (ObjectUtils.isEmpty(req.getFileIds())) {
// 选中维度了,没有选节点,按照模版,展示模版的第一层节点数据
String rootNodeType = dimensionNodeTyepOrderList.get(0);
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> allNodeByNodeTypeResponse = simuluationNodeFeignClient.getAllNodeByNodeType(null, rootNodeType);
// 选中维度了,没有选节点,按照模版,展示模版的第一层节点数据(支持同一层多个节点类型)
List<String> rootNodeTypes = dimensionNodeTypeLevels.get(0);
for (String rootNodeType : rootNodeTypes) {
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> allNodeByNodeTypeResponse = simuluationNodeFeignClient.getAllNodeByNodeType(null, rootNodeType);
if (!allNodeByNodeTypeResponse.isSuccess()) {
log.error("获取节点信息失败");
return SdmResponse.success(Collections.emptyList());
if (!allNodeByNodeTypeResponse.isSuccess()) {
log.error("获取节点信息失败,nodeType:{}", rootNodeType);
continue;
}
if (CollectionUtils.isNotEmpty(allNodeByNodeTypeResponse.getData())) {
uuids.addAll(allNodeByNodeTypeResponse.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
}
}
uuids.addAll(allNodeByNodeTypeResponse.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
} else {
// 选中维度了,也选中了节点,按照模版,展示该节点下的普通文件夹、任务、算列、按照展示模版指定的下一层节点文件夹
List<Long> fileIds = req.getFileIds();
@@ -243,19 +271,28 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
// chooseUuid和chooseNodeType不为空,并且是node节点类型才是节点文件夹才需要查询子节点文件夹文件
if (ObjectUtils.isNotEmpty(chooseUuids) && ObjectUtils.isNotEmpty(chooseNodeType) && tagMapService.isNodeType(chooseNodeType)) {
// 从dimensionNodeTyepOrderList中获取chooseNodeType下一个位置的数据有可能chooseNodeType所在位置就是最后一层节点,SdmResponse返回空数据
int index = dimensionNodeTyepOrderList.indexOf(chooseNodeType);
if (index == -1) {
// 找到当前节点类型所在层级
int currentLevelIndex = -1;
for (int i = 0; i < dimensionNodeTypeLevels.size(); i++) {
if (dimensionNodeTypeLevels.get(i).contains(chooseNodeType)) {
currentLevelIndex = i;
break;
}
}
if (currentLevelIndex == -1) {
return SdmResponse.failed("选中节点类型不在数据展示维度中");
}
// 非最后一层:查模板下一层;最后一层:查同类型连续子节点(例如 分类->分类)
String nextNodeType = (index != dimensionNodeTyepOrderList.size() - 1)
? dimensionNodeTyepOrderList.get(index + 1)
: chooseNodeType;
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> allNodeByProjectIdAndType = simuluationNodeFeignClient.getAllNodeByProjectIdAndType(chooseUuids, nextNodeType);
if (allNodeByProjectIdAndType.isSuccess() && ObjectUtils.isNotEmpty(allNodeByProjectIdAndType.getData())) {
uuids.addAll(allNodeByProjectIdAndType.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
// 非最后一层:查模板下一层多个类型;最后一层:查同类型连续子节点(例如 分类->分类)
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());
}
}
}
@@ -274,6 +311,7 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
}
}
uuids = uuids.stream().filter(StringUtils::isNotBlank).distinct().toList();
if (CollectionUtils.isNotEmpty(uuids)) {
List<FileMetadataInfo> nodeDirInfos = fileMetadataInfoService.lambdaQuery()
.in(FileMetadataInfo::getRelatedResourceUuid, uuids)