fix:优化更新文件接口
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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<>();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user