fix:批量导入项目节点
This commit is contained in:
@@ -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<>();
|
||||
|
||||
Reference in New Issue
Block a user