fix:优化更新文件接口

This commit is contained in:
2026-02-13 11:51:26 +08:00
parent e7bbb3adcf
commit 2964d0db69
7 changed files with 295 additions and 107 deletions

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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<String, Map<String, Integer>> dictTagIdsCache;
@Schema(description = "文件元数据扩展信息")
@TableField(exist = false)
private List<FileMetadataExtensionRequest> fileMetadataExtensionRequest;
}

View File

@@ -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<UploadFilesReq.FileMetadataExtensionRequest> 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> fileMetadataExtensionRequest;
}

View File

@@ -2308,7 +2308,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
private void saveFileExtensions(UploadFilesReq req, FileMetadataInfo fileInfo) {
List<FileMetadataExtension> fileMetadataExtensionList = new ArrayList<>();
List<UploadFilesReq.FileMetadataExtensionRequest> fileMetadataExtensionRequestList = req.getFileMetadataExtensionRequest();
List<FileMetadataExtensionRequest> 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 {
}
/**
* 发起元数据更新审批
* 文件更新审批处理(统一入口)
* <p>
* 1) 暂存待修改的元数据JSONObject 序列化)到 tempMetadata 字段;
* 2) 构建审批请求对象包含变更前后Before/After的数据及相关元信息项目、人员等);
* 根据是否有文件上传,走不同的审批流程:
* 1) 无文件上传:仅更新元数据(项目/分析方向/备注/标签/工况绑定等);
* 2) 有文件上传:元数据 + 文件版本更新(鸠占鹊巢,审批通过后执行)。
* </p>
* <p>
* 审批流程:
* 1) 暂存待修改的元数据到 tempMetadata 字段;
* 2) 构建审批请求对象包含变更前后Before/After的数据
* 3) 提交审批中心,由其统一管理后续的文件状态流转。
* </p>
*
@@ -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<String, Map<String, Integer>> 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<UploadFilesReq.FileMetadataExtensionRequest> fileMetadataExtensionRequestList = req.getFileMetadataExtensionRequest();
List<FileMetadataExtensionRequest> fileMetadataExtensionRequestList = req.getFileMetadataExtensionRequest();
if (fileMetadataExtensionRequestList != null && !fileMetadataExtensionRequestList.isEmpty()) {
fileMetadataExtensionService.lambdaUpdate().eq(FileMetadataExtension::getTFilemetaId, oldFileMetadataInfo.getId()).remove();
List<FileMetadataExtension> fileMetadataExtensionList = new ArrayList<>();

View File

@@ -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<FileMetadataInfo> 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<FileMetadataExtensionRequest> fileMetadataExtensionRequestList = updateInfo.getFileMetadataExtensionRequest();
List<FileMetadataExtension> 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<SimulationPoolInfo> 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<String, Map<String, Integer>> 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<Long> dirIdAndAncestors = dirId != null ? collectDirIdAndAncestorIds(dirId, fileMetadataInfoService) : new ArrayList<>();
// 构建新标签关系(为当前目录及每个祖先目录各创建一条)
List<FileTagRel> newTagRelList = new ArrayList<>();
Long fileSize = updateInfo.getFileSize() != null ? updateInfo.getFileSize() : 0L;
for (Map.Entry<String, Map<String, Integer>> classEntry : dictTagIdsCache.entrySet()) {
Map<String, Integer> 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<Long> collectDirIdAndAncestorIds(Long dirId, IFileMetadataInfoService fileMetadataInfoService) {
List<Long> 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;
}
}

View File

@@ -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<SimulationPoolInfo> 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<FileMetadataExtensionRequest> fileMetadataExtensionRequestList = updateInfo.getFileMetadataExtensionRequest();
List<FileMetadataExtension> 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;
}