fix:数据总览:层级节点需要合并文件夹,非层级节点不合并文件夹

This commit is contained in:
2026-03-30 20:26:45 +08:00
parent 3f57abcdb1
commit badfc2f627

View File

@@ -404,6 +404,7 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
/**
* 根据originalName合并FileMetadataInfo列表并处理bucketName生成totalName
*
* @param nodeDirInfos 需要合并的FileMetadataInfo列表
* @return 合并后的结果
*/
@@ -418,8 +419,7 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
long start2 = System.currentTimeMillis();
// 先把所有FileMetadataInfo转换成FileMetadataChildrenDTO后续统一做批量设置
List<FileMetadataInfoResp> allChildren = new ArrayList<>();
Map<String, List<FileMetadataChildrenDTO>> groupedChildren = new HashMap<>();
List<FileMetadataChildrenDTO> allChildren = new ArrayList<>();
for (FileMetadataInfo fileInfo : nodeDirInfos) {
FileMetadataChildrenDTO childDto = FileMetadataConvert.INSTANCE.convertToFileMetadataChildrenDTO(fileInfo);
// 设置totalName从bucketName中提取
@@ -429,54 +429,77 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
String totalName = objectKey.substring(baseDirPath.length());
childDto.setTotalName(totalName);
}
allChildren.add(childDto);
groupedChildren.computeIfAbsent(fileInfo.getOriginalName(), key -> new ArrayList<>()).add(childDto);
}
long start3 = System.currentTimeMillis();
// 批量设置文件权限
List<Long> permissionFileIds = allChildren.stream()
.map(FileMetadataInfoResp::getId)
.map(FileMetadataChildrenDTO::getId)
.filter(Objects::nonNull)
.toList();
Map<Long, Integer> permissionMap = fileUserPermissionService.getMergedPermissionBatch(
permissionFileIds,
ThreadLocalContext.getUserId()
);
for (FileMetadataInfoResp childDto : allChildren) {
for (FileMetadataChildrenDTO childDto : allChildren) {
Integer permissionValue = permissionMap.get(childDto.getId());
childDto.setPermissionValue(permissionValue == null ? 0 : permissionValue);
}
long start4= System.currentTimeMillis();
long start4 = System.currentTimeMillis();
// 批量设置文件的节点信息tag1-tag10,学科信息
hierarchyHelper.setTagReqFromFileMetadataBatch(allChildren, FileMetadataInfoResp::getId);
hierarchyHelper.setTagReqFromFileMetadataBatch(allChildren, FileMetadataChildrenDTO::getId);
long start5 = System.currentTimeMillis();
// 批量填充文件类型标签信息
fileDictTagQueryService.fillFileTagsForRespList(allChildren, FileMetadataInfoResp::getId);
fileDictTagQueryService.fillFileTagsForRespList(allChildren, FileMetadataChildrenDTO::getId);
long start6 = System.currentTimeMillis();
// 设置聚合结果
List<FileMetadataChildrenDTO> result = new ArrayList<>();
for (List<FileMetadataChildrenDTO> children : groupedChildren.values()) {
FileMetadataChildrenDTO baseDto = new FileMetadataChildrenDTO();
BeanUtils.copyProperties(children.get(0),baseDto);
baseDto.setMergeSameNameChildren(children);
baseDto.setFileIds(children.stream().map(FileMetadataInfoResp::getId).toList());
result.add(baseDto);
List<FileMetadataChildrenDTO> itemsToMerge = new ArrayList<>();
// 1. 分类:根据节点类型将项目分为“需合并”和“不需合并”
for (FileMetadataChildrenDTO childDto : allChildren) {
String nodeType = childDto.getRelatedResourceUuidOwnType();
// 仅层级节点需要合并
if (nodeType != null && tagMapService.isNodeType(nodeType)) {
itemsToMerge.add(childDto);
} else {
// 普通文件夹或非层级节点,不合并,直接添加到结果列表
// 为了与合并后的项结构一致,进行自我包裹
FileMetadataChildrenDTO baseDto = new FileMetadataChildrenDTO();
BeanUtils.copyProperties(childDto, baseDto);
childDto.setMergeSameNameChildren(Collections.singletonList(baseDto));
childDto.setFileIds(Collections.singletonList(baseDto.getId()));
result.add(childDto);
}
}
if(CollectionUtils.isNotEmpty(result)) {
// 2. 聚合:对“需合并”的项进行分组和聚合
if (CollectionUtils.isNotEmpty(itemsToMerge)) {
Map<String, List<FileMetadataChildrenDTO>> groupedToMerge = itemsToMerge.stream()
.collect(Collectors.groupingBy(FileMetadataChildrenDTO::getOriginalName));
for (List<FileMetadataChildrenDTO> children : groupedToMerge.values()) {
FileMetadataChildrenDTO baseDto = new FileMetadataChildrenDTO();
BeanUtils.copyProperties(children.get(0), baseDto);
baseDto.setMergeSameNameChildren(children);
baseDto.setFileIds(children.stream().map(FileMetadataChildrenDTO::getId).toList());
result.add(baseDto);
}
}
if (CollectionUtils.isNotEmpty(result)) {
result = sortMergedNodeDirResult(result);
}
log.info("getSimulationNodeTree 方法耗时 " +
"设置节点的 nodeCode" + (start2-start1) + "毫秒," +
"批量转换成FileMetadataChildrenDTO" + (start3-start2) + "毫秒," +
"批量设置文件权限:" + (start4-start3) + "毫秒," +
"批量设置文件的节点信息tag1-tag10" + (start5-start4) + "毫秒," +
"批量填充文件类型标签信息:" + (start6-start5) + "毫秒," +
"设置节点的 nodeCode" + (start2 - start1) + "毫秒," +
"批量转换成FileMetadataChildrenDTO" + (start3 - start2) + "毫秒," +
"批量设置文件权限:" + (start4 - start3) + "毫秒," +
"批量设置文件的节点信息tag1-tag10" + (start5 - start4) + "毫秒," +
"批量填充文件类型标签信息:" + (start6 - start5) + "毫秒," +
"结果排序:" + (System.currentTimeMillis() - start6) + "毫秒");
return result;