From 2964d0db69a8bc8dcab7468e340d0c497de1441a Mon Sep 17 00:00:00 2001 From: gulongcheng <474084054@qq.com> Date: Fri, 13 Feb 2026 11:51:26 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BC=98=E5=8C=96=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/FileMetadataExtensionRequest.java | 25 +++ .../entity/req/data/UploadFilesReq.java | 22 -- .../data/model/entity/FileMetadataInfo.java | 5 + .../com/sdm/data/model/req/UpdateFileReq.java | 25 +-- .../impl/MinioFileIDataFileServiceImpl.java | 87 ++++++-- .../ModifyFileApproveStrategy.java | 208 ++++++++++++++---- .../ModifyMetadataApproveStrategy.java | 30 ++- 7 files changed, 295 insertions(+), 107 deletions(-) create mode 100644 common/src/main/java/com/sdm/common/entity/req/data/FileMetadataExtensionRequest.java diff --git a/common/src/main/java/com/sdm/common/entity/req/data/FileMetadataExtensionRequest.java b/common/src/main/java/com/sdm/common/entity/req/data/FileMetadataExtensionRequest.java new file mode 100644 index 00000000..f6efa2e8 --- /dev/null +++ b/common/src/main/java/com/sdm/common/entity/req/data/FileMetadataExtensionRequest.java @@ -0,0 +1,25 @@ +package com.sdm.common.entity.req.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class FileMetadataExtensionRequest { + /** + * 扩展字段名 + */ + @Schema(description = "扩展字段名") + private String extensionKey; + + /** + * 扩展字段值 + */ + @Schema(description = "扩展字段值") + private String extensionValue; + + /** + * 值的数据类型(string, number, boolean, json等) + */ + @Schema(description = "值的数据类型(string, number, boolean, json等)") + private String dataType; +} \ No newline at end of file diff --git a/common/src/main/java/com/sdm/common/entity/req/data/UploadFilesReq.java b/common/src/main/java/com/sdm/common/entity/req/data/UploadFilesReq.java index e8b9d51d..f87918b0 100644 --- a/common/src/main/java/com/sdm/common/entity/req/data/UploadFilesReq.java +++ b/common/src/main/java/com/sdm/common/entity/req/data/UploadFilesReq.java @@ -148,27 +148,5 @@ public class UploadFilesReq { } public UploadFilesReq() { - - } - - @Data - public class FileMetadataExtensionRequest { - /** - * 扩展字段名 - */ - @Schema(description = "扩展字段名") - private String extensionKey; - - /** - * 扩展字段值 - */ - @Schema(description = "扩展字段值") - private String extensionValue; - - /** - * 值的数据类型(string, number, boolean, json等) - */ - @Schema(description = "值的数据类型(string, number, boolean, json等)") - private String dataType; } } \ No newline at end of file diff --git a/data/src/main/java/com/sdm/data/model/entity/FileMetadataInfo.java b/data/src/main/java/com/sdm/data/model/entity/FileMetadataInfo.java index a5805af8..679397b1 100644 --- a/data/src/main/java/com/sdm/data/model/entity/FileMetadataInfo.java +++ b/data/src/main/java/com/sdm/data/model/entity/FileMetadataInfo.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Map; import com.fasterxml.jackson.annotation.JsonFormat; +import com.sdm.common.entity.req.data.FileMetadataExtensionRequest; import com.sdm.common.entity.req.data.SimulationPoolInfo; import com.sdm.common.entity.resp.data.PoolInfo; import io.swagger.v3.oas.annotations.media.Schema; @@ -240,4 +241,8 @@ public class FileMetadataInfo implements Serializable { @Schema(description = "字典标签查询结果缓存(用于审批流程)", hidden = true) @TableField(exist = false) private Map> dictTagIdsCache; + + @Schema(description = "文件元数据扩展信息") + @TableField(exist = false) + private List fileMetadataExtensionRequest; } \ No newline at end of file diff --git a/data/src/main/java/com/sdm/data/model/req/UpdateFileReq.java b/data/src/main/java/com/sdm/data/model/req/UpdateFileReq.java index 38328621..cf71686a 100644 --- a/data/src/main/java/com/sdm/data/model/req/UpdateFileReq.java +++ b/data/src/main/java/com/sdm/data/model/req/UpdateFileReq.java @@ -1,8 +1,8 @@ package com.sdm.data.model.req; import com.alibaba.fastjson2.annotation.JSONField; +import com.sdm.common.entity.req.data.FileMetadataExtensionRequest; import com.sdm.common.entity.req.data.SimulationPoolInfo; -import com.sdm.common.entity.req.data.UploadFilesReq; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.web.multipart.MultipartFile; @@ -86,26 +86,5 @@ public class UpdateFileReq { * 扩展信息 */ @Schema(description = "扩展信息") - private List fileMetadataExtensionRequest; - - @Data - public class FileMetadataExtensionRequest { - /** - * 扩展字段名 - */ - @Schema(description = "扩展字段名") - private String extensionKey; - - /** - * 扩展字段值 - */ - @Schema(description = "扩展字段值") - private String extensionValue; - - /** - * 值的数据类型(string, number, boolean, json等) - */ - @Schema(description = "值的数据类型(string, number, boolean, json等)") - private String dataType; - } + private List fileMetadataExtensionRequest; } 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 a62d91be..863fdd0e 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 @@ -2308,7 +2308,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { private void saveFileExtensions(UploadFilesReq req, FileMetadataInfo fileInfo) { List fileMetadataExtensionList = new ArrayList<>(); - List fileMetadataExtensionRequestList = req.getFileMetadataExtensionRequest(); + List fileMetadataExtensionRequestList = req.getFileMetadataExtensionRequest(); if (fileMetadataExtensionRequestList != null && !fileMetadataExtensionRequestList.isEmpty()) { fileMetadataExtensionRequestList.forEach(extensionRequest -> { FileMetadataExtension fileMetadataExtension = new FileMetadataExtension(); @@ -2486,15 +2486,20 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { .eq(FileMetadataInfo::getDataType, DataTypeEnum.DIRECTORY.getValue()) .one(); - if (ObjectUtils.isEmpty(req.getFile())) { - if (dirMetadataInfo != null && DirTypeEnum.isApprovalRequired(dirMetadataInfo.getDirType())) { - return handleMetadataApproval(req, fileMetadataInfo, dirMetadataInfo); - } - updateMetadataDirectly(req, fileMetadataInfo, dirMetadataInfo); - return SdmResponse.success("更新成功"); + // 判断目录是否需要审批(基于目录类型判断,而非文件有无) + boolean approvalRequired = dirMetadataInfo != null && DirTypeEnum.isApprovalRequired(dirMetadataInfo.getDirType()); + + if (approvalRequired) { + // 需要审批:统一走审批流程(根据是否有文件,在 handleApproval 内部区分处理) + return handleApproval(req, fileMetadataInfo, dirMetadataInfo); } - uploadAndUpdateFile(req, fileMetadataInfo, fileMetadataInfo.getVersionNo(), fileMetadataInfo.getFileGroupId(), dirMetadataInfo); + // 不需要审批:直接更新或上传 + if (ObjectUtils.isEmpty(req.getFile())) { + updateMetadataDirectly(req, fileMetadataInfo, dirMetadataInfo); + } else { + uploadAndUpdateFile(req, fileMetadataInfo, fileMetadataInfo.getVersionNo(), fileMetadataInfo.getFileGroupId(), dirMetadataInfo); + } return SdmResponse.success("更新成功"); } @@ -2538,10 +2543,16 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { } /** - * 发起元数据更新审批: + * 文件更新审批处理(统一入口): *

- * 1) 暂存待修改的元数据(JSONObject 序列化)到 tempMetadata 字段; - * 2) 构建审批请求对象,包含变更前后(Before/After)的数据及相关元信息(项目、人员等); + * 根据是否有文件上传,走不同的审批流程: + * 1) 无文件上传:仅更新元数据(项目/分析方向/备注/标签/工况绑定等); + * 2) 有文件上传:元数据 + 文件版本更新(鸠占鹊巢,审批通过后执行)。 + *

+ *

+ * 审批流程: + * 1) 暂存待修改的元数据到 tempMetadata 字段; + * 2) 构建审批请求对象,包含变更前后(Before/After)的数据; * 3) 提交审批中心,由其统一管理后续的文件状态流转。 *

* @@ -2550,9 +2561,16 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { * @param dirMetadataInfo 父目录元数据(提供审批模板及路径上下文) * @return 成功响应 */ - private SdmResponse handleMetadataApproval(UpdateFileReq req, FileMetadataInfo fileMetadataInfo, FileMetadataInfo dirMetadataInfo) { + private SdmResponse handleApproval(UpdateFileReq req, FileMetadataInfo fileMetadataInfo, FileMetadataInfo dirMetadataInfo) { + boolean hasFileUpload = !ObjectUtils.isEmpty(req.getFile()); + ApproveFileDataTypeEnum approveFileActionENUM = hasFileUpload ? ApproveFileDataTypeEnum.MODIFY_REVIEWING : ApproveFileDataTypeEnum.MODIFY_METADATA_REVIEWING; + String tempFileObjectKey = null; + + // 构建待审批的新版本元数据 FileMetadataInfo tempInfo = new FileMetadataInfo(); BeanUtils.copyProperties(fileMetadataInfo, tempInfo); + + // 公共字段更新 tempInfo.setProjectId(req.getProjectId()); tempInfo.setAnalysisDirectionId(req.getAnalysisDirectionId()); tempInfo.setRemarks(req.getRemarks()); @@ -2561,6 +2579,37 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { tempInfo.setUpdaterId(ThreadLocalContext.getUserId()); tempInfo.setUpdateTime(LocalDateTime.now()); + // 有文件上传时:额外处理文件上传(先上传到临时位置,审批通过后执行鸠占鹊巢) + if (hasFileUpload) { + // 1) 生成新版本文件名与临时 objectKey + String originalName = req.getFileName(); + Long newVersionNo = fileMetadataInfo.getVersionNo() + 1; + String versionSuffix = "_V" + newVersionNo; + int dotIndex = originalName.lastIndexOf('.'); + if (dotIndex == -1) { + return SdmResponse.failed("文件没有后缀"); + } + String modifiedFileName = originalName.substring(0, dotIndex) + versionSuffix + originalName.substring(dotIndex); + + String parDirObjectKey = dirMetadataInfo.getObjectKey(); + tempFileObjectKey = getFileMinioObjectKey(parDirObjectKey + modifiedFileName); + + // 2) 上传新文件到临时位置 + minioService.uploadFile(req.getFile(), tempFileObjectKey, null, fileMetadataInfo.getBucketName()); + + // 3) 更新元数据 + tempInfo.setObjectKey(tempFileObjectKey); + tempInfo.setOriginalName(req.getFileName()); + tempInfo.setFileSize(req.getFile().getSize()); + tempInfo.setVersionNo(newVersionNo); + } + + // 处理扩展字段 + if (CollectionUtils.isNotEmpty(req.getFileMetadataExtensionRequest())) { + tempInfo.setFileMetadataExtensionRequest(req.getFileMetadataExtensionRequest()); + } + + // 处理标签 if (CollectionUtils.isNotEmpty(req.getDictTags())) { Map> dictIdMap = req.getDictTagIdsCache(); if (dictIdMap == null || dictIdMap.isEmpty()) { @@ -2574,9 +2623,11 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { fileMetadataInfo.setUpdaterId(ThreadLocalContext.getUserId()); fileMetadataInfoService.updateById(fileMetadataInfo); + // 构建审批请求 + String approvalContent = hasFileUpload ? "文件上传新版本" : "文件元数据修改"; FileApproveRequestBuilder builder = FileApproveRequestBuilder.builder() .toUpdateFileIds(List.of(fileMetadataInfo.getId())) - .contents(DirTypeEnum.buildApprovalTitle(dirMetadataInfo.getDirType(), "文件元数据修改")) + .contents(DirTypeEnum.buildApprovalTitle(dirMetadataInfo.getDirType(), approvalContent)) .approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE) .approveFileActionENUM(ApproveFileActionENUM.MODIFY) .beforeData(List.of(fileMetadataInfo)) @@ -2600,7 +2651,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { setSimulationPoolAndTaskInfo(builder.getAfterData()); } - fileApproveExecutor.launchApproveAndUpdateStatus(builder, ApproveFileDataTypeEnum.MODIFY_METADATA_REVIEWING); + fileApproveExecutor.launchApproveAndUpdateStatus(builder, approveFileActionENUM); return SdmResponse.success("更新成功"); } @@ -2625,6 +2676,10 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { if (CollectionUtils.isNotEmpty(req.getSimulationPoolInfoList())) { fileSimulationMappingService.lambdaUpdate().eq(FileSimulationMapping::getFileId, fileMetadataInfo.getId()).remove(); for (SimulationPoolInfo poolInfo : req.getSimulationPoolInfoList()) { + fileSimulationMappingService.lambdaUpdate() + .eq (FileSimulationMapping::getSimulationPoolId, poolInfo.getSimulationPoolId()) + .eq (FileSimulationMapping::getSimulationPoolVersion, poolInfo.getSimulationPoolVersion()) + .eq(FileSimulationMapping::getFileId, fileMetadataInfo.getId()).remove(); for (String taskId : poolInfo.getSimulationPoolTaskIds()) { FileSimulationMapping mapping = new FileSimulationMapping(); mapping.setFileId(fileMetadataInfo.getId()); @@ -2704,7 +2759,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { if (CollectionUtils.isNotEmpty(req.getSimulationPoolInfoList())) { for (SimulationPoolInfo simulationPoolInfo : req.getSimulationPoolInfoList()) { fileSimulationMappingService.lambdaUpdate() - .eq (FileSimulationMapping::getSimulationPoolId, oldFileMetadataInfo.getId()) + .eq (FileSimulationMapping::getSimulationPoolId, simulationPoolInfo.getSimulationPoolId()) .eq (FileSimulationMapping::getSimulationPoolVersion, simulationPoolInfo.getSimulationPoolVersion()) .eq(FileSimulationMapping::getFileId, oldFileMetadataInfo.getId()).remove(); for (String simulationPoolTaskId : simulationPoolInfo.getSimulationPoolTaskIds()) { @@ -2719,7 +2774,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { } // 扩展字段:作为“最新态”数据,覆盖更新主记录对应的扩展信息 - List fileMetadataExtensionRequestList = req.getFileMetadataExtensionRequest(); + List fileMetadataExtensionRequestList = req.getFileMetadataExtensionRequest(); if (fileMetadataExtensionRequestList != null && !fileMetadataExtensionRequestList.isEmpty()) { fileMetadataExtensionService.lambdaUpdate().eq(FileMetadataExtension::getTFilemetaId, oldFileMetadataInfo.getId()).remove(); List fileMetadataExtensionList = new ArrayList<>(); diff --git a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ModifyFileApproveStrategy.java b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ModifyFileApproveStrategy.java index 258d813f..d1e0e04e 100644 --- a/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ModifyFileApproveStrategy.java +++ b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ModifyFileApproveStrategy.java @@ -1,16 +1,23 @@ package com.sdm.data.service.impl.dataFileHandle; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.alibaba.fastjson2.JSONObject; import com.sdm.common.entity.constants.NumberConstants; import com.sdm.common.entity.enums.ApprovalFileDataStatusEnum; import com.sdm.common.entity.enums.ApproveFileDataTypeEnum; +import com.sdm.common.entity.req.data.FileMetadataExtensionRequest; +import com.sdm.common.entity.req.data.SimulationPoolInfo; import com.sdm.data.model.entity.*; import com.sdm.data.service.*; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Objects; @Service @Slf4j @@ -18,6 +25,7 @@ public class ModifyFileApproveStrategy implements ApproveStrategy { @Override public boolean handle(ApproveContext context) { int status = context.getApproveStatus(); + FileMetadataInfo backupHistory = context.getApproveMetadataInfos().get(0); IMinioService minioService = context.getMinioService(); IFileMetadataInfoService fileMetadataInfoService = context.getFileMetadataInfoService(); IFileMetadataExtensionService fileMetadataExtensionService = context.getFileMetadataExtensionService(); @@ -26,62 +34,174 @@ public class ModifyFileApproveStrategy implements ApproveStrategy { IFileSimulationMappingService fileSimulationMappingService = context.getFileSimulationMappingService(); IFileTagRelService fileTagRelService = context.getFileTagRelService(); - List metadataList = context.getApproveMetadataInfos(); - if (metadataList == null || metadataList.isEmpty()) { - return false; - } - FileMetadataInfo mainMetadata = metadataList.get(0); + // 解析 tempMetadata 获取审批相关信息 + String tempMetadata = backupHistory.getTempMetadata(); + FileMetadataInfo updateInfo = JSONObject.parseObject(tempMetadata, FileMetadataInfo.class); - // 备份的历史记录(id 不同于主记录,且 group 相同,version减1查询) - FileMetadataInfo backupHistory = fileMetadataInfoService.lambdaQuery() - .eq(FileMetadataInfo::getFileGroupId, mainMetadata.getFileGroupId()) - .eq(FileMetadataInfo::getVersionNo, mainMetadata.getVersionNo() - 1) - .one(); // 审批通过:主记录正式生效,备份行保留为历史版本(isLatest=false) if (NumberConstants.TWO == status) { - mainMetadata.setApprovalStatus(ApprovalFileDataStatusEnum.APPROVED.getKey()); - mainMetadata.setApproveType(ApproveFileDataTypeEnum.COMPLETED.getCode()); - mainMetadata.setIsLatest(true); - fileMetadataInfoService.updateById(mainMetadata); + // updateInfo作为新记录顶替原来的老文件,复用老文件的id,需要更新扩展参数、标签、工况库映射、文件存储表的文件名等信息 + // 处理扩展参数 + if(ObjectUtils.isNotEmpty(updateInfo.getFileMetadataExtensionRequest())){ + fileMetadataExtensionService.lambdaUpdate().eq(FileMetadataExtension::getTFilemetaId, updateInfo.getId()).remove(); - if (backupHistory != null) { - backupHistory.setIsLatest(false); - fileMetadataInfoService.updateById(backupHistory); + List fileMetadataExtensionRequestList = updateInfo.getFileMetadataExtensionRequest(); + List fileMetadataExtensionList = new ArrayList<>(); + fileMetadataExtensionRequestList.forEach(extensionRequest -> { + FileMetadataExtension fileMetadataExtension = new FileMetadataExtension(); + fileMetadataExtension.setTFilemetaId(updateInfo.getId()); + fileMetadataExtension.setExtensionKey(extensionRequest.getExtensionKey()); + fileMetadataExtension.setExtensionValue(extensionRequest.getExtensionValue()); + fileMetadataExtension.setDataType(Objects.toString(extensionRequest.getDataType(), "string")); + fileMetadataExtensionList.add(fileMetadataExtension); + }); + fileMetadataExtensionService.saveBatch(fileMetadataExtensionList); } + + // 处理标签更新(如果 tempMetadata 中包含标签信息) + if (updateInfo.getDictTagIdsCache() != null && !updateInfo.getDictTagIdsCache().isEmpty()) { + updateFileTagsAfterApproval(backupHistory, updateInfo, fileMetadataInfoService, fileTagRelService); + } + + //绑定文件和工况库的关系 + List simulationPoolInfoList = updateInfo.getSimulationPoolInfoList(); + if (CollectionUtils.isNotEmpty(simulationPoolInfoList)) { + for (SimulationPoolInfo simulationPoolInfo : simulationPoolInfoList) { + // 先删除原先所有的文件绑定关系 + fileSimulationMappingService.lambdaUpdate() + .eq (FileSimulationMapping::getSimulationPoolId, simulationPoolInfo.getSimulationPoolId()) + .eq (FileSimulationMapping::getSimulationPoolVersion, simulationPoolInfo.getSimulationPoolVersion()) + .eq(FileSimulationMapping::getFileId, updateInfo.getId()).remove(); + for (String simulationPoolTaskId : simulationPoolInfo.getSimulationPoolTaskIds()) { + FileSimulationMapping fileSimulationMapping = new FileSimulationMapping(); + fileSimulationMapping.setFileId(updateInfo.getId()); + fileSimulationMapping.setSimulationPoolId(simulationPoolInfo.getSimulationPoolId()); + fileSimulationMapping.setSimulationPoolVersion(simulationPoolInfo.getSimulationPoolVersion()); + fileSimulationMapping.setSimulationPoolTaskId(simulationPoolTaskId); + fileSimulationMappingService.save(fileSimulationMapping); + } + } + } + + // 更新文件存储信息 + fileStorageService.lambdaUpdate() + .eq(FileStorage::getFileId, updateInfo.getId()) + .set(FileStorage::getFileName, updateInfo.getOriginalName()) + .update(); + + updateInfo.setIsLatest(true); + updateInfo.setTempMetadata( null); + updateInfo.setApproveType(ApproveFileDataTypeEnum.COMPLETED.getCode()); + updateInfo.setApprovalStatus(ApprovalFileDataStatusEnum.APPROVED.getKey()); + + // backupHistory作为历史备份, 更新为历史版本,设置新id, + backupHistory.setId(null); + backupHistory.setIsLatest(false); + backupHistory.setApprovalStatus(null); + backupHistory.setApproveType(null); + backupHistory.setUpdateTime(LocalDateTime.now()); + backupHistory.setTempMetadata(null); + fileMetadataInfoService.save(backupHistory); return true; } - // 审批不通过:回滚主记录,删除新 MinIO 对象和备份行 + // 审批不通过,删除新 MinIO 临时文件对象 if (NumberConstants.THREE == status) { - // 1. 删除新上传的文件(主记录当前指向的 objectKey) - minioService.deleteFile(mainMetadata.getObjectKey(), mainMetadata.getBucketName()); - - // 2. 将主记录(ID 不变那个)回滚为备份行的数据 - if (backupHistory != null) { - mainMetadata.setObjectKey(backupHistory.getObjectKey()); - mainMetadata.setFileSize(backupHistory.getFileSize()); - mainMetadata.setVersionNo(backupHistory.getVersionNo()); - mainMetadata.setOriginalName(backupHistory.getOriginalName()); - mainMetadata.setRemarks(backupHistory.getRemarks()); - mainMetadata.setProjectId(backupHistory.getProjectId()); - mainMetadata.setAnalysisDirectionId(backupHistory.getAnalysisDirectionId()); - mainMetadata.setFileType(backupHistory.getFileType()); - } - - mainMetadata.setApprovalStatus(ApprovalFileDataStatusEnum.REJECTED.getKey()); - mainMetadata.setApproveType(ApproveFileDataTypeEnum.COMPLETED.getCode()); - mainMetadata.setIsLatest(true); - mainMetadata.setUpdateTime(LocalDateTime.now()); - fileMetadataInfoService.updateById(mainMetadata); - - // 3. 删除备份行(因为新版本已废弃,不需要保留这条历史备份) - if (backupHistory != null) { - fileMetadataInfoService.removeById(backupHistory.getId()); - } + // 1. 删除临时文件 + minioService.deleteFile(updateInfo.getObjectKey(), updateInfo.getBucketName()); + backupHistory.setTempMetadata(null); + backupHistory.setApprovalStatus(ApprovalFileDataStatusEnum.REJECTED.getKey()); + backupHistory.setApproveType(ApproveFileDataTypeEnum.COMPLETED.getCode()); + backupHistory.setIsLatest(true); + backupHistory.setUpdateTime(LocalDateTime.now()); + fileMetadataInfoService.updateById(backupHistory); return true; } return false; } + + /** + * 审批通过后更新文件标签 + * 从 updateInfo 中获取标签信息并更新到 file_tag_rel 表 + * 为当前文件所在目录及其所有祖先目录创建标签关系 + */ + private void updateFileTagsAfterApproval(FileMetadataInfo metadata, FileMetadataInfo updateInfo, + IFileMetadataInfoService fileMetadataInfoService, + IFileTagRelService fileTagRelService) { + try { + Long tenantId = metadata.getTenantId(); + Long creatorId = metadata.getCreatorId(); + Long fileId = metadata.getId(); + + // 从 updateInfo 中获取标签缓存 + Map> dictTagIdsCache = updateInfo.getDictTagIdsCache(); + if (dictTagIdsCache == null || dictTagIdsCache.isEmpty()) { + return; + } + + // 删除旧标签关系(只删除当前租户的) + fileTagRelService.lambdaUpdate() + .eq(FileTagRel::getTenantId, tenantId) + .eq(FileTagRel::getFileId, fileId) + .remove(); + + // 查询当前目录及所有祖先目录 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()) { + Map valueMap = classEntry.getValue(); + + for (Integer dictId : valueMap.values()) { + if (dictId == null) { + continue; + } + + for (Long ancestorDirId : dirIdAndAncestors) { + FileTagRel tagRel = new FileTagRel(); + tagRel.setFileId(fileId); + tagRel.setTagId(dictId); + tagRel.setDirId(ancestorDirId); + tagRel.setTenantId(tenantId); + tagRel.setCreatorId(creatorId); + tagRel.setFileSize(fileSize); + newTagRelList.add(tagRel); + } + } + } + + // 批量插入新标签关系 + if (CollectionUtils.isNotEmpty(newTagRelList)) { + fileTagRelService.saveBatch(newTagRelList); + log.info("Approved and updated file tags for fileId: {}, total: {} tags", fileId, newTagRelList.size()); + } + } catch (Exception e) { + log.error("Failed to update file tags after approval for fileId: {}", metadata.getId(), e); + // 不抛出异常,避免影响审批流程 + } + } + + /** + * 收集当前目录及其所有祖先目录的 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/ModifyMetadataApproveStrategy.java b/data/src/main/java/com/sdm/data/service/impl/dataFileHandle/ModifyMetadataApproveStrategy.java index cb67a046..85c6aa17 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 @@ -4,20 +4,25 @@ import com.alibaba.fastjson2.JSONObject; import com.sdm.common.entity.constants.NumberConstants; import com.sdm.common.entity.enums.ApprovalFileDataStatusEnum; import com.sdm.common.entity.enums.ApproveFileDataTypeEnum; +import com.sdm.common.entity.req.data.FileMetadataExtensionRequest; import com.sdm.common.entity.req.data.SimulationPoolInfo; +import com.sdm.data.model.entity.FileMetadataExtension; import com.sdm.data.model.entity.FileMetadataInfo; import com.sdm.data.model.entity.FileSimulationMapping; import com.sdm.data.model.entity.FileTagRel; +import com.sdm.data.service.IFileMetadataExtensionService; import com.sdm.data.service.IFileMetadataInfoService; import com.sdm.data.service.IFileSimulationMappingService; import com.sdm.data.service.IFileTagRelService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; @Service @Slf4j @@ -30,6 +35,7 @@ public class ModifyMetadataApproveStrategy implements ApproveStrategy { IFileMetadataInfoService service = context.getFileMetadataInfoService(); IFileSimulationMappingService fileSimulationMappingService = context.getFileSimulationMappingService(); IFileTagRelService fileTagRelService = context.getFileTagRelService(); + IFileMetadataExtensionService fileMetadataExtensionService = context.getFileMetadataExtensionService(); // 审批通过 if (NumberConstants.TWO == status) { @@ -49,9 +55,12 @@ public class ModifyMetadataApproveStrategy implements ApproveStrategy { //绑定文件和工况库的关系 List simulationPoolInfoList = updateInfo.getSimulationPoolInfoList(); if (CollectionUtils.isNotEmpty(simulationPoolInfoList)) { - // 先删除原先所有的文件绑定关系 - fileSimulationMappingService.lambdaUpdate().eq(FileSimulationMapping::getFileId, metadata.getId()).remove(); for (SimulationPoolInfo simulationPoolInfo : simulationPoolInfoList) { + // 先删除原先所有的文件绑定关系 + fileSimulationMappingService.lambdaUpdate() + .eq (FileSimulationMapping::getSimulationPoolId, simulationPoolInfo.getSimulationPoolId()) + .eq (FileSimulationMapping::getSimulationPoolVersion, simulationPoolInfo.getSimulationPoolVersion()) + .eq(FileSimulationMapping::getFileId, metadata.getId()).remove(); for (String simulationPoolTaskId : simulationPoolInfo.getSimulationPoolTaskIds()) { FileSimulationMapping fileSimulationMapping = new FileSimulationMapping(); fileSimulationMapping.setFileId(metadata.getId()); @@ -68,6 +77,23 @@ public class ModifyMetadataApproveStrategy implements ApproveStrategy { updateFileTagsAfterApproval(metadata, updateInfo, service, fileTagRelService); } + // 处理扩展参数 + if(ObjectUtils.isNotEmpty(updateInfo.getFileMetadataExtensionRequest())){ + fileMetadataExtensionService.lambdaUpdate().eq(FileMetadataExtension::getTFilemetaId, metadata.getId()).remove(); + + List fileMetadataExtensionRequestList = updateInfo.getFileMetadataExtensionRequest(); + List fileMetadataExtensionList = new ArrayList<>(); + fileMetadataExtensionRequestList.forEach(extensionRequest -> { + FileMetadataExtension fileMetadataExtension = new FileMetadataExtension(); + fileMetadataExtension.setTFilemetaId(metadata.getId()); + fileMetadataExtension.setExtensionKey(extensionRequest.getExtensionKey()); + fileMetadataExtension.setExtensionValue(extensionRequest.getExtensionValue()); + fileMetadataExtension.setDataType(Objects.toString(extensionRequest.getDataType(), "string")); + fileMetadataExtensionList.add(fileMetadataExtension); + }); + fileMetadataExtensionService.saveBatch(fileMetadataExtensionList); + } + return true; }