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 d155a017..911df5aa 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 @@ -700,6 +700,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { fileStorageService.remove(new LambdaQueryWrapper().eq(FileStorage::getFileId, deleteFileMetadataInfo.getId())); fileMetadataExtensionService.remove(new LambdaQueryWrapper().eq(FileMetadataExtension::getTFilemetaId, deleteFileMetadataInfo.getId())); fileUserPermissionService.remove(new LambdaQueryWrapper().eq(FileUserPermission::getTFilemetaId, deleteFileMetadataInfo.getId())); + fileTagRelService.remove(new LambdaQueryWrapper().eq(FileTagRel::getFileId, deleteFileMetadataInfo.getId())); return SdmResponse.success("操作成功"); } } catch (Exception e) { @@ -2501,9 +2502,14 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { tempFileMetadataInfo.setUpdateTime(LocalDateTime.now()); // 保存标签缓存到 tempFileMetadataInfo(如果有) - if (CollectionUtils.isNotEmpty(req.getDictTags()) && req.getDictTagIdsCache() != null) { - tempFileMetadataInfo.setDictTagIdsCache(req.getDictTagIdsCache()); + if (CollectionUtils.isNotEmpty(req.getDictTags())) { + Map> dictIdMap = req.getDictTagIdsCache(); + if (dictIdMap == null || dictIdMap.isEmpty()) { + dictIdMap = dictTagHelper.queryAndCacheDictTagIds(req); + } + tempFileMetadataInfo.setDictTagIdsCache(dictIdMap); } + fileMetadataInfo.setTempMetadata(JSONObject.toJSONString(tempFileMetadataInfo)); fileMetadataInfo.setUpdateTime(LocalDateTime.now()); diff --git a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/DeleteApproveStrategy.java b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/DeleteApproveStrategy.java index c59d4878..e72f8e23 100644 --- a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/DeleteApproveStrategy.java +++ b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/DeleteApproveStrategy.java @@ -54,6 +54,7 @@ public class DeleteApproveStrategy implements ApproveStrategy { IFileStorageService fileStorageService = context.getFileStorageService(); ISimulationParameterLibraryCategoryObjectService paramObjectService = context.getParamObjectService(); IFileSimulationMappingService fileSimulationMappingService = context.getFileSimulationMappingService(); + IFileTagRelService fileTagRelService = context.getFileTagRelService(); // 删除MinIO文件 minioService.deleteFile(metadata.getObjectKey(), metadata.getBucketName()); @@ -64,6 +65,7 @@ public class DeleteApproveStrategy implements ApproveStrategy { fileMetadataExtensionService.remove(new LambdaQueryWrapper().eq(FileMetadataExtension::getTFilemetaId, metadata.getId())); fileUserPermissionService.remove(new LambdaQueryWrapper().eq(FileUserPermission::getTFilemetaId, metadata.getId())); fileSimulationMappingService.remove(new LambdaQueryWrapper().eq(FileSimulationMapping::getFileId, metadata.getId())); + fileTagRelService.remove(new LambdaQueryWrapper().in(FileTagRel::getFileId, metadata.getId())); // 如果是参数库审批 删除参数库对象 if (ApproveTypeEnum.PARAM_APPROVE.getCode() == type) { @@ -84,6 +86,7 @@ public class DeleteApproveStrategy implements ApproveStrategy { IFileUserPermissionService fileUserPermissionService = context.getFileUserPermissionService(); IFileStorageService fileStorageService = context.getFileStorageService(); IFileSimulationMappingService fileSimulationMappingService = context.getFileSimulationMappingService(); + IFileTagRelService fileTagRelService = context.getFileTagRelService(); Long rootDirId = rootDirMetadata.getId(); String rootDirObjectKey = rootDirMetadata.getObjectKey(); @@ -105,6 +108,7 @@ public class DeleteApproveStrategy implements ApproveStrategy { .or() .in(FileStorage::getDirId, allDirIds) .remove(); + fileTagRelService.lambdaUpdate().in(FileTagRel::getDirId, allFileIds).remove(); } // MinIO 递归删除 diff --git a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ModifyMetadataApproveStrategy.java b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ModifyMetadataApproveStrategy.java index d2b71b88..cb67a046 100644 --- a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ModifyMetadataApproveStrategy.java +++ b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ModifyMetadataApproveStrategy.java @@ -65,7 +65,7 @@ public class ModifyMetadataApproveStrategy implements ApproveStrategy { // 处理标签更新(如果 tempMetadata 中包含标签信息) if (updateInfo.getDictTagIdsCache() != null && !updateInfo.getDictTagIdsCache().isEmpty()) { - updateFileTagsAfterApproval(metadata, updateInfo, fileTagRelService); + updateFileTagsAfterApproval(metadata, updateInfo, service, fileTagRelService); } return true; @@ -86,8 +86,10 @@ public class ModifyMetadataApproveStrategy implements ApproveStrategy { /** * 审批通过后更新文件标签 * 从 updateInfo 中获取标签信息并更新到 file_tag_rel 表 + * 为当前文件所在目录及其所有祖先目录创建标签关系 */ - private void updateFileTagsAfterApproval(FileMetadataInfo metadata, FileMetadataInfo updateInfo, + private void updateFileTagsAfterApproval(FileMetadataInfo metadata, FileMetadataInfo updateInfo, + IFileMetadataInfoService fileMetadataInfoService, IFileTagRelService fileTagRelService) { try { Long tenantId = metadata.getTenantId(); @@ -106,9 +108,12 @@ public class ModifyMetadataApproveStrategy implements ApproveStrategy { .eq(FileTagRel::getFileId, fileId) .remove(); - // 构建新标签关系 - List newTagRelList = new ArrayList<>(); + // 查询当前目录及所有祖先目录 ID Long dirId = updateInfo.getParentId(); + List dirIdAndAncestors = dirId != null ? collectDirIdAndAncestorIds(dirId, fileMetadataInfoService) : new ArrayList<>(); + + // 构建新标签关系(为当前目录及每个祖先目录各创建一条) + List newTagRelList = new ArrayList<>(); Long fileSize = updateInfo.getFileSize() != null ? updateInfo.getFileSize() : 0L; for (Map.Entry> classEntry : dictTagIdsCache.entrySet()) { @@ -119,13 +124,11 @@ public class ModifyMetadataApproveStrategy implements ApproveStrategy { continue; } - // 注意:这里只为当前文件所在目录创建标签关系 - // 如果需要为祖先目录也创建,需要从 metadata 中获取 parentId 并递归查询 - if (dirId != null) { + for (Long ancestorDirId : dirIdAndAncestors) { FileTagRel tagRel = new FileTagRel(); tagRel.setFileId(fileId); tagRel.setTagId(dictId); - tagRel.setDirId(dirId); + tagRel.setDirId(ancestorDirId); tagRel.setTenantId(tenantId); tagRel.setCreatorId(creatorId); tagRel.setFileSize(fileSize); @@ -144,4 +147,22 @@ public class ModifyMetadataApproveStrategy implements ApproveStrategy { // 不抛出异常,避免影响审批流程 } } + + /** + * 收集当前目录及其所有祖先目录的 ID(从当前目录到根路径) + */ + private List collectDirIdAndAncestorIds(Long dirId, IFileMetadataInfoService fileMetadataInfoService) { + List dirIds = new ArrayList<>(); + Long currentId = dirId; + int maxDepth = 100; // 防止循环引用导致死循环 + while (currentId != null && currentId > 0 && dirIds.size() < maxDepth) { + dirIds.add(currentId); + FileMetadataInfo dirMeta = fileMetadataInfoService.getById(currentId); + if (dirMeta == null || dirMeta.getParentId() == null || dirMeta.getParentId() <= 0) { + break; + } + currentId = dirMeta.getParentId(); + } + return dirIds; + } } \ No newline at end of file diff --git a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/UploadApproveStrategy.java b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/UploadApproveStrategy.java index bceb81a7..a745982f 100644 --- a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/UploadApproveStrategy.java +++ b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/UploadApproveStrategy.java @@ -28,6 +28,7 @@ public class UploadApproveStrategy implements ApproveStrategy { IFileStorageService fileStorageService = context.getFileStorageService(); IFileSimulationMappingService fileSimulationMappingService = context.getFileSimulationMappingService(); ISimulationParameterLibraryCategoryObjectService paramObjectService = context.getParamObjectService(); + IFileTagRelService fileTagRelService = context.getFileTagRelService(); // 审批通过 if (NumberConstants.TWO == status) { @@ -54,6 +55,9 @@ public class UploadApproveStrategy implements ApproveStrategy { fileUserPermissionService.remove(new LambdaQueryWrapper().in(FileUserPermission::getTFilemetaId, removeIds)); fileSimulationMappingService.remove(new LambdaQueryWrapper().in(FileSimulationMapping::getFileId, removeIds)); + // 删除文件标签关系 + fileTagRelService.remove(new LambdaQueryWrapper().in(FileTagRel::getFileId, removeIds)); + // 如果是参数库审批 删除参数库对象 记录操作日志 if (ApproveTypeEnum.PARAM_APPROVE.getCode() == context.getApproveType()) { paramObjectService.remove(new LambdaQueryWrapper().in(SimulationParameterLibraryCategoryObject::getFileId, removeIds));