diff --git a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java index 2abcb402..2b1beac8 100644 --- a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java @@ -3464,6 +3464,14 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { * */ Map uuidToObjectKeyMap = new HashMap<>(); + + /** + * 已存在的节点映射:uuid -> FileMetadataInfo + *
+         * 用于幂等性检查,如果节点已存在则跳过创建
+         * 
+ */ + Map existingNodesMap = new HashMap<>(); } /** @@ -3606,15 +3614,22 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { * 检查要创建的节点是否已存在(重复导入检测) */ private SdmResponse checkDuplicateNodes(BatchCreateDirContext ctx) { + if (CollectionUtils.isEmpty(ctx.getAllNodeUuIds())) { + return SdmResponse.success(null); + } + List 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 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());