fix:批量创建检点,支持节点已存在

This commit is contained in:
2026-01-24 14:35:10 +08:00
parent 8184dbfa79
commit fad040a2a5

View File

@@ -3464,6 +3464,14 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
* </pre>
*/
Map<String, String> uuidToObjectKeyMap = new HashMap<>();
/**
* 已存在的节点映射uuid -> FileMetadataInfo
* <pre>
* 用于幂等性检查,如果节点已存在则跳过创建
* </pre>
*/
Map<String, FileMetadataInfo> existingNodesMap = new HashMap<>();
}
/**
@@ -3606,15 +3614,22 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
* 检查要创建的节点是否已存在(重复导入检测)
*/
private SdmResponse<Void> checkDuplicateNodes(BatchCreateDirContext ctx) {
if (CollectionUtils.isEmpty(ctx.getAllNodeUuIds())) {
return SdmResponse.success(null);
}
List<FileMetadataInfo> existingNodes = fileMetadataInfoService.lambdaQuery()
.in(FileMetadataInfo::getRelatedResourceUuid, ctx.allNodeUuIds)
.eq(FileMetadataInfo::getTenantId, ctx.tenantId)
.in(FileMetadataInfo::getRelatedResourceUuid, ctx.getAllNodeUuIds())
.eq(FileMetadataInfo::getTenantId, ctx.getTenantId())
.list();
if (CollectionUtils.isNotEmpty(existingNodes)) {
log.error("批量创建目录失败部分目录已存在非新项目已存在的uuid: {}",
existingNodes.stream().map(FileMetadataInfo::getRelatedResourceUuid).collect(Collectors.toList()));
return SdmResponse.failed("目录已存在,请勿重复创建");
log.info("批量创建目录检测到部分节点已存在,数量: {}", existingNodes.size());
for (FileMetadataInfo node : existingNodes) {
if (node.getRelatedResourceUuid() != null) {
ctx.getExistingNodesMap().put(node.getRelatedResourceUuid(), node);
}
}
}
return SdmResponse.success(null);
}
@@ -3660,6 +3675,18 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
List<String> minioObjectKeys = new ArrayList<>();
for (DirNodeInfo node : nodes) {
// 检查节点是否已存在(幂等性处理)
if (ctx.getExistingNodesMap().containsKey(node.getUuId())) {
FileMetadataInfo existingNode = ctx.getExistingNodesMap().get(node.getUuId());
// 更新映射,供子节点使用
ctx.getUuidToDbIdMap().put(node.getUuId(), existingNode.getId());
ctx.getUuidToObjectKeyMap().put(node.getUuId(), existingNode.getObjectKey());
// 将已存在的ID也加入结果列表保持返回完整性
ctx.getCreatedDirIds().add(existingNode.getId());
log.info("节点已存在,跳过创建: uuid={}, objectKey={}", node.getUuId(), existingNode.getObjectKey());
continue;
}
FileMetadataInfo entity = buildDirNodeMetadata(node, ctx);
entities.add(entity);
minioObjectKeys.add(entity.getObjectKey());