fix:批量导入项目节点

This commit is contained in:
2026-01-22 20:29:00 +08:00
parent b8507af064
commit 98b5b16393

View File

@@ -3435,6 +3435,14 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
*/
Set<String> firstLevelParentUuIds;
/**
* 第一层节点对象列表(这些节点的父目录是系统根目录)
* <pre>
* 用于BFS遍历时先添加第一层避免丢失第一层节点
* </pre>
*/
List<DirNodeInfo> firstLevelNodes;
/**
* UUID到数据库ID的映射随着分层插入逐步填充
* <pre>
@@ -3505,7 +3513,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
log.info("初始化UUID映射完成系统根路径: {}", systemRootDir.getObjectKey());
// 6. BFS层级遍历按层分组
List<List<DirNodeInfo>> levelNodes = buildLevelNodesByBFS(ctx.getParentToChildren(), ctx.getFirstLevelParentUuIds());
List<List<DirNodeInfo>> levelNodes = buildLevelNodesByBFS(ctx.getParentToChildren(), ctx.getFirstLevelNodes());
log.info("BFS层级分析完成共计{}层,总节点数:{}", levelNodes.size(),
levelNodes.stream().mapToInt(List::size).sum());
@@ -3582,10 +3590,14 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
));
ctx.setParentToChildren(parentToChildren);
// 找出第一层父节点UUID集合这些节点的父目录是系统根目录
ctx.setFirstLevelParentUuIds(allNodes.stream()
// 找出第一层节点(这些节点的父目录是系统根目录)
List<DirNodeInfo> firstLevelNodes = allNodes.stream()
.filter(element -> element.getParentUuId() == null)
.collect(Collectors.toList());
ctx.setFirstLevelNodes(firstLevelNodes);
// 提取第一层节点UUID集合
ctx.setFirstLevelParentUuIds(firstLevelNodes.stream()
.map(DirNodeInfo::getUuId)
.collect(Collectors.toSet()));
}
@@ -3738,17 +3750,27 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
/**
* BFS层级遍历按层分组节点
*
* @param parentToChildren 父子关系映射
* @param firstLevelParentUuIds 第一层节点UUID集合(挂在系统根目录下)
* @param parentToChildren 父子关系映射
* @param firstLevelNodes 第一层节点列表(挂在系统根目录下)
* @return 按层分组的节点列表
*/
private List<List<DirNodeInfo>> buildLevelNodesByBFS(
Map<String, List<DirNodeInfo>> parentToChildren,
Set<String> firstLevelParentUuIds) {
List<DirNodeInfo> firstLevelNodes) {
List<List<DirNodeInfo>> levelNodes = new ArrayList<>();
Set<String> currentLevelParents = new HashSet<>(firstLevelParentUuIds);
// 先添加第一层节点
if (CollectionUtils.isNotEmpty(firstLevelNodes)) {
levelNodes.add(new ArrayList<>(firstLevelNodes));
}
// 提取第一层节点的UUID作为初始父节点集合
Set<String> currentLevelParents = firstLevelNodes.stream()
.map(DirNodeInfo::getUuId)
.collect(Collectors.toSet());
// 从第二层开始遍历
while (!currentLevelParents.isEmpty()) {
List<DirNodeInfo> currentLevelChildren = new ArrayList<>();
Set<String> nextLevelParents = new HashSet<>();