feat:删除项目文件夹接入审批流
refactor:重构文件审批流接入功能
This commit is contained in:
@@ -11,7 +11,6 @@ import com.sdm.common.entity.req.system.LaunchApproveReq;
|
||||
import com.sdm.common.feign.inter.system.IApproveFeignClient;
|
||||
import com.sdm.data.model.bo.ApprovalFileDataContentsModel;
|
||||
import com.sdm.data.model.entity.FileMetadataInfo;
|
||||
import com.sdm.data.model.enums.ApproveFileActionENUM;
|
||||
import com.sdm.data.service.IFileMetadataInfoService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
@@ -40,15 +39,12 @@ public class FileApproveExecutor {
|
||||
/**
|
||||
* 发起审批并更新文件状态
|
||||
*
|
||||
* @param builder 审批请求构建器
|
||||
* @param filesToUpdate 待更新文件列表
|
||||
* @param fileApproveType 文件审批类型
|
||||
*
|
||||
* @param builder 审批请求构建器
|
||||
* @param fileApproveType 文件审批类型
|
||||
* @return cidFlowId
|
||||
* @throws RuntimeException 审批创建失败时抛出
|
||||
*/
|
||||
public String launchApproveAndUpdateStatus(FileApproveRequestBuilder builder,
|
||||
List<FileMetadataInfo> filesToUpdate,
|
||||
ApproveFileDataTypeEnum fileApproveType) {
|
||||
String approveContents = buildApproveContents(builder);
|
||||
|
||||
@@ -67,11 +63,36 @@ public class FileApproveExecutor {
|
||||
|
||||
String cidFlowId = result.getRight();
|
||||
|
||||
updateFileApproveStatus(filesToUpdate, cidFlowId, fileApproveType);
|
||||
// 使用 fileIds 批量更新状态
|
||||
updateFileApproveStatusByIds(builder.getToUpdateFileIds(), cidFlowId, fileApproveType);
|
||||
|
||||
return cidFlowId;
|
||||
}
|
||||
|
||||
private void updateFileApproveStatusByIds(List<Long> fileIds,
|
||||
String cidFlowId,
|
||||
ApproveFileDataTypeEnum approveType) {
|
||||
if (CollectionUtils.isEmpty(fileIds)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 批量查询所有受影响的文件
|
||||
List<FileMetadataInfo> files = fileMetadataInfoService.listByIds(fileIds);
|
||||
if (CollectionUtils.isEmpty(files)) {
|
||||
log.warn("批量更新审批状态失败,未找到对应文件: fileIds={}", fileIds);
|
||||
return;
|
||||
}
|
||||
|
||||
// 更新所有文件的审批状态
|
||||
for (FileMetadataInfo file : files) {
|
||||
file.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
|
||||
file.setApproveType(approveType.getCode());
|
||||
file.setCidFlowId(cidFlowId);
|
||||
}
|
||||
fileMetadataInfoService.updateBatchById(files);
|
||||
log.info("批量更新审批状态成功: count={}, cidFlowId={}", files.size(), cidFlowId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 仅发起审批,不更新状态(供需要自定义状态更新的场景使用)
|
||||
*/
|
||||
@@ -86,20 +107,6 @@ public class FileApproveExecutor {
|
||||
);
|
||||
}
|
||||
|
||||
private void updateFileApproveStatus(List<FileMetadataInfo> files,
|
||||
String cidFlowId,
|
||||
ApproveFileDataTypeEnum approveType) {
|
||||
if (CollectionUtils.isEmpty(files)) {
|
||||
return;
|
||||
}
|
||||
for (FileMetadataInfo file : files) {
|
||||
file.setApprovalStatus(ApprovalFileDataStatusEnum.PENDING.getKey());
|
||||
file.setApproveType(approveType.getCode());
|
||||
file.setCidFlowId(cidFlowId);
|
||||
}
|
||||
fileMetadataInfoService.updateBatchById(files);
|
||||
}
|
||||
|
||||
|
||||
// 发起仿真知识库文件审核 true 成功 false失败
|
||||
private Pair<Boolean, String> doLaunchApprove(String templateId, String templateName, String approveContents, int approveAction, ApproveTypeEnum approveTypeEnum) {
|
||||
@@ -146,7 +153,7 @@ public class FileApproveExecutor {
|
||||
private String buildApproveContents(FileApproveRequestBuilder builder) {
|
||||
ApprovalFileDataContentsModel contentsModel = new ApprovalFileDataContentsModel();
|
||||
contentsModel.setKnowledgeBaseName(builder.getKnowledgeBaseName());
|
||||
contentsModel.setIds(builder.getFileIds());
|
||||
contentsModel.setIds(builder.getToUpdateFileIds());
|
||||
contentsModel.setContents(builder.getContents());
|
||||
contentsModel.setApproveAction(builder.getApproveFileActionENUM().getCode());
|
||||
if(CollectionUtils.isNotEmpty(builder.getBeforeData())){
|
||||
|
||||
@@ -14,7 +14,7 @@ import java.util.List;
|
||||
@Data
|
||||
@Builder
|
||||
public class FileApproveRequestBuilder {
|
||||
private List<Long> fileIds;
|
||||
private List<Long> toUpdateFileIds;
|
||||
private String contents;
|
||||
private ApproveTypeEnum approveType;
|
||||
private ApproveFileActionENUM approveFileActionENUM;
|
||||
|
||||
@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import com.google.common.collect.Sets;
|
||||
import com.sdm.common.common.SdmResponse;
|
||||
import com.sdm.common.common.ThreadLocalContext;
|
||||
import com.sdm.common.entity.ExportExcelFormat;
|
||||
@@ -470,6 +471,29 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归收集目录下所有子文件和子目录的 ID
|
||||
*/
|
||||
private void collectRecursiveIds(Long currentDirId, Set<Long> allFileIds, Set<Long> allDirIds) {
|
||||
allDirIds.add(currentDirId);
|
||||
allFileIds.add(currentDirId);
|
||||
|
||||
// 查询当前目录下所有的直接子项(包括文件和目录)
|
||||
List<FileMetadataInfo> children = fileMetadataInfoService.lambdaQuery()
|
||||
.eq(FileMetadataInfo::getParentId, currentDirId)
|
||||
.list();
|
||||
|
||||
if (CollectionUtils.isNotEmpty(children)) {
|
||||
for (FileMetadataInfo child : children) {
|
||||
if (Objects.equals(DataTypeEnum.DIRECTORY.getValue(), child.getDataType())) {
|
||||
collectRecursiveIds(child.getId(), allFileIds, allDirIds);
|
||||
} else {
|
||||
allFileIds.add(child.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public SdmResponse delDir(DelDirReq req) {
|
||||
@@ -485,57 +509,130 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
return SdmResponse.failed("目录不存在");
|
||||
}
|
||||
|
||||
String dirMinioObjectKey = deleteDirMetadataInfo.getObjectKey();
|
||||
Long deleteDirId = deleteDirMetadataInfo.getId();
|
||||
Long rootDirId = deleteDirMetadataInfo.getId();
|
||||
String rootDirObjectKey = deleteDirMetadataInfo.getObjectKey();
|
||||
String bucketName = deleteDirMetadataInfo.getBucketName();
|
||||
Integer dirType = deleteDirMetadataInfo.getDirType();
|
||||
|
||||
boolean hasDeletePermission = fileUserPermissionService.hasFilePermission(deleteDirId, ThreadLocalContext.getUserId(), FilePermissionEnum.DELETE);
|
||||
// 1. 权限校验(仅校验根目录删除权限)
|
||||
boolean hasDeletePermission = fileUserPermissionService.hasFilePermission(rootDirId, ThreadLocalContext.getUserId(), FilePermissionEnum.DELETE);
|
||||
if (!hasDeletePermission) {
|
||||
return SdmResponse.failed("没有删除权限");
|
||||
}
|
||||
|
||||
// 数据库批量删除文件信息
|
||||
LambdaQueryWrapper<FileStorage> fileMetaDataQuery = new LambdaQueryWrapper<>();
|
||||
fileMetaDataQuery.select(FileStorage::getFileId).eq(FileStorage::getDirId, deleteDirId);
|
||||
List<Long> deleteFileIdList = fileStorageService.list(fileMetaDataQuery).stream().map(FileStorage::getFileId).collect(Collectors.toList());
|
||||
// 2. 空目录快速判定:检查是否存在子项
|
||||
boolean hasChildren = fileMetadataInfoService.lambdaQuery()
|
||||
.eq(FileMetadataInfo::getParentId, rootDirId)
|
||||
.exists();
|
||||
|
||||
deleteFileIdList.add(deleteDirId);
|
||||
// 3. 知识库且非空目录判定:需要走审批流程
|
||||
boolean isKnowledgeDir = Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirType);
|
||||
if (isKnowledgeDir && hasChildren) {
|
||||
// 递归收集所有待删除的子项
|
||||
Set<Long> allFileIds = new HashSet<>();
|
||||
Set<Long> allDirIds = new HashSet<>();
|
||||
collectRecursiveIds(rootDirId, allFileIds, allDirIds);
|
||||
|
||||
if(ObjectUtils.isNotEmpty(deleteFileIdList)){
|
||||
fileMetadataInfoService.removeByIds(deleteFileIdList);
|
||||
fileMetadataExtensionService.lambdaUpdate().in(FileMetadataExtension::getTFilemetaId, deleteFileIdList).remove();
|
||||
fileStorageService.lambdaUpdate().in(FileStorage::getFileId, deleteFileIdList).remove();
|
||||
fileUserPermissionService.lambdaUpdate().in(FileUserPermission::getTFilemetaId, deleteFileIdList).remove();
|
||||
fileSimulationMappingService.lambdaUpdate().in(FileSimulationMapping::getFileId, deleteFileIdList).remove();
|
||||
// 发起审批(仅传父目录元数据,但 fileIds 包含所有子项)
|
||||
return launchKnowledgeBaseDeletionApproval(
|
||||
List.of(deleteDirMetadataInfo), // 仅父目录
|
||||
Sets.union(allFileIds,allDirIds), // allFileIds+allDirIds 所有受影响的 ID(用于批量状态更新)
|
||||
deleteDirMetadataInfo,
|
||||
"知识库目录删除",
|
||||
req.getTemplateId(),
|
||||
req.getTemplateName()
|
||||
);
|
||||
}
|
||||
|
||||
fileStorageService.lambdaUpdate().eq(FileStorage::getDirId, deleteDirId).remove();
|
||||
//删除文件夹权限
|
||||
deleteDirectoryPermission(deleteDirId);
|
||||
// 4. 非知识库目录 或 空知识库目录:直接删除
|
||||
return executeDirectoryDeletion(rootDirId, rootDirObjectKey, bucketName);
|
||||
|
||||
|
||||
// minio文件系统批量删除文件
|
||||
minioService.deleteDirectoryRecursively(dirMinioObjectKey,deleteDirMetadataInfo.getBucketName());
|
||||
log.info("删除目录文件元数据和Minio文件成功: " + dirMinioObjectKey);
|
||||
|
||||
|
||||
|
||||
// 子文件夹一并删除
|
||||
List<FileMetadataInfo> childDirs = fileMetadataInfoService.lambdaQuery()
|
||||
.eq(FileMetadataInfo::getParentId, deleteDirId)
|
||||
.eq(FileMetadataInfo::getDataType, DataTypeEnum.DIRECTORY.getValue())
|
||||
.list();
|
||||
if (CollectionUtils.isNotEmpty(childDirs)) {
|
||||
for (FileMetadataInfo childDir : childDirs) {
|
||||
DelDirReq delDirReq = new DelDirReq();
|
||||
delDirReq.setDelDirId(childDir.getId());
|
||||
delDir(delDirReq);
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("删除目录失败", e);
|
||||
// 重新抛出异常,确保事务回滚
|
||||
throw new RuntimeException("删除目录失败: " + e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 发起知识库删除审批(统一处理文件和目录)
|
||||
*
|
||||
* @param displayMetadata 用于审批展示的元数据(通常是父级目录或单个文件)
|
||||
* @param allAffectedIds 所有受影响的文件/目录 ID(用于状态批量更新)
|
||||
* @param parentDirMetadata 父目录元数据(用于提取 knowledgeBaseName)
|
||||
* @param approvalContents 审批内容描述
|
||||
* @param templateId 审批模板ID
|
||||
* @param templateName 审批模板名称
|
||||
* @return 审批发起结果
|
||||
*/
|
||||
private SdmResponse launchKnowledgeBaseDeletionApproval(List<FileMetadataInfo> displayMetadata,
|
||||
Set<Long> allAffectedIds,
|
||||
FileMetadataInfo parentDirMetadata,
|
||||
String approvalContents,
|
||||
String templateId,
|
||||
String templateName) {
|
||||
if (CollectionUtils.isEmpty(displayMetadata)) {
|
||||
return SdmResponse.failed("获取待删除元数据失败");
|
||||
}
|
||||
|
||||
// 填充审批所需的附加信息
|
||||
setCreatorNames(displayMetadata);
|
||||
setProjectName(displayMetadata);
|
||||
setAnalysisDirectionName(displayMetadata);
|
||||
setSimulationPoolAndTaskInfo(displayMetadata);
|
||||
|
||||
// 构建审批请求
|
||||
FileApproveRequestBuilder approveRequestBuilder = FileApproveRequestBuilder.builder()
|
||||
.toUpdateFileIds(new ArrayList<>(allAffectedIds))
|
||||
.contents(approvalContents)
|
||||
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
|
||||
.approveFileActionENUM(ApproveFileActionENUM.DELETE)
|
||||
.beforeData(displayMetadata)
|
||||
.templateId(templateId)
|
||||
.templateName(templateName)
|
||||
.knowledgeBaseName(extractRelativePath(parentDirMetadata))
|
||||
.build();
|
||||
|
||||
// 发起审批并更新状态为 DELETE_REVIEWING
|
||||
fileApproveExecutor.launchApproveAndUpdateStatus(
|
||||
approveRequestBuilder,
|
||||
ApproveFileDataTypeEnum.DELETE_REVIEWING
|
||||
);
|
||||
|
||||
return SdmResponse.success("操作成功," + approvalContents + "待审批");
|
||||
}
|
||||
|
||||
/**
|
||||
* 执行目录的物理删除(数据库 + MinIO)
|
||||
*/
|
||||
private SdmResponse executeDirectoryDeletion(Long rootDirId, String rootDirObjectKey, String bucketName) {
|
||||
// 递归收集所有待删除的 ID
|
||||
Set<Long> allFileIds = new HashSet<>();
|
||||
Set<Long> allDirIds = new HashSet<>();
|
||||
collectRecursiveIds(rootDirId, allFileIds, allDirIds);
|
||||
|
||||
// 数据库批量删除元数据
|
||||
if (CollectionUtils.isNotEmpty(allFileIds)) {
|
||||
// 删除基础元数据
|
||||
fileMetadataInfoService.removeByIds(allFileIds);
|
||||
// 删除扩展信息
|
||||
fileMetadataExtensionService.lambdaUpdate().in(FileMetadataExtension::getTFilemetaId, allFileIds).remove();
|
||||
// 删除权限信息
|
||||
fileUserPermissionService.lambdaUpdate().in(FileUserPermission::getTFilemetaId, allFileIds).remove();
|
||||
// 删除仿真映射
|
||||
fileSimulationMappingService.lambdaUpdate().in(FileSimulationMapping::getFileId, allFileIds).remove();
|
||||
// 删除存储统计(包含 fileId 关联和 dirId 关联)
|
||||
fileStorageService.lambdaUpdate()
|
||||
.in(FileStorage::getFileId, allFileIds)
|
||||
.or()
|
||||
.in(FileStorage::getDirId, allDirIds)
|
||||
.remove();
|
||||
}
|
||||
|
||||
// MinIO 物理删除(仅调用一次递归删除根目录前缀)
|
||||
minioService.deleteDirectoryRecursively(rootDirObjectKey, bucketName);
|
||||
|
||||
log.info("成功删除目录及其所有子项: id={}, objectKey={}", rootDirId, rootDirObjectKey);
|
||||
return SdmResponse.success("删除成功");
|
||||
}
|
||||
|
||||
@@ -567,26 +664,15 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
|
||||
// 知识库
|
||||
if(dirMetadataInfo!=null&&Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType())){
|
||||
// 发送审批电子流,成功继续西面操作,失败直接返回
|
||||
FileApproveRequestBuilder deleteFileApproveRequestBuilder = FileApproveRequestBuilder.builder()
|
||||
.fileIds(List.of(delFileId))
|
||||
.contents("知识库文件删除")
|
||||
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
|
||||
.approveFileActionENUM(ApproveFileActionENUM.DELETE)
|
||||
.beforeData(List.of(deleteFileMetadataInfo))
|
||||
.templateId(req.getTemplateId())
|
||||
.templateName(req.getTemplateName())
|
||||
.knowledgeBaseName(extractRelativePath(dirMetadataInfo))
|
||||
.build();
|
||||
if(CollectionUtils.isNotEmpty(deleteFileApproveRequestBuilder.getBeforeData())){
|
||||
setCreatorNames(deleteFileApproveRequestBuilder.getBeforeData());
|
||||
setProjectName(deleteFileApproveRequestBuilder.getBeforeData());
|
||||
setAnalysisDirectionName(deleteFileApproveRequestBuilder.getBeforeData());
|
||||
setSimulationPoolAndTaskInfo(deleteFileApproveRequestBuilder.getBeforeData());
|
||||
}
|
||||
|
||||
fileApproveExecutor.launchApproveAndUpdateStatus(deleteFileApproveRequestBuilder, List.of(deleteFileMetadataInfo), ApproveFileDataTypeEnum.DELETE_REVIEWING);
|
||||
return SdmResponse.success("操作成功,删除文件待审批");
|
||||
// 发起审批
|
||||
return launchKnowledgeBaseDeletionApproval(
|
||||
List.of(deleteFileMetadataInfo),
|
||||
Set.of(delFileId),
|
||||
dirMetadataInfo,
|
||||
"知识库文件删除",
|
||||
req.getTemplateId(),
|
||||
req.getTemplateName()
|
||||
);
|
||||
}else{
|
||||
// 删除MinIO文件
|
||||
minioService.deleteFile(deleteFileMetadataInfo.getObjectKey(), deleteFileMetadataInfo.getBucketName());
|
||||
@@ -1699,7 +1785,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
// 只有知识库的文件需要审核
|
||||
if( Objects.equals(DirTypeEnum.KNOWLEDGE_BASE_DIR.getValue(), dirMetadataInfo.getDirType())){
|
||||
FileApproveRequestBuilder uploadFileApproveRequestBuilder = FileApproveRequestBuilder.builder()
|
||||
.fileIds(List.of(fileInfo.getId()))
|
||||
.toUpdateFileIds(List.of(fileInfo.getId()))
|
||||
.contents("知识库文件新增")
|
||||
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
|
||||
.approveFileActionENUM(ApproveFileActionENUM.ADD)
|
||||
@@ -1715,7 +1801,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
setSimulationPoolAndTaskInfo(uploadFileApproveRequestBuilder.getBeforeData());
|
||||
}
|
||||
|
||||
fileApproveExecutor.launchApproveAndUpdateStatus(uploadFileApproveRequestBuilder, List.of(fileInfo), ApproveFileDataTypeEnum.UPLOAD_REVIEWING);
|
||||
fileApproveExecutor.launchApproveAndUpdateStatus(uploadFileApproveRequestBuilder, ApproveFileDataTypeEnum.UPLOAD_REVIEWING);
|
||||
}
|
||||
|
||||
// 需要保存文件的历史版本记录,同一文件的所有版本共享一个ID,
|
||||
@@ -1875,7 +1961,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
|
||||
//发起审批
|
||||
FileApproveRequestBuilder updateFileMetaIntoApproveRequestBuilder = FileApproveRequestBuilder.builder()
|
||||
.fileIds(List.of(fileMetadataInfo.getId()))
|
||||
.toUpdateFileIds(List.of(fileMetadataInfo.getId()))
|
||||
.contents("知识库文件元数据修改")
|
||||
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
|
||||
.approveFileActionENUM(ApproveFileActionENUM.MODIFY)
|
||||
@@ -1899,7 +1985,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
setAnalysisDirectionName(updateFileMetaIntoApproveRequestBuilder.getAfterData());
|
||||
setSimulationPoolAndTaskInfo(updateFileMetaIntoApproveRequestBuilder.getAfterData());
|
||||
}
|
||||
fileApproveExecutor.launchApproveAndUpdateStatus(updateFileMetaIntoApproveRequestBuilder, List.of(fileMetadataInfo), ApproveFileDataTypeEnum.MODIFY_METADATA_REVIEWING);
|
||||
fileApproveExecutor.launchApproveAndUpdateStatus(updateFileMetaIntoApproveRequestBuilder, ApproveFileDataTypeEnum.MODIFY_METADATA_REVIEWING);
|
||||
|
||||
}else {
|
||||
// 其他场景修改
|
||||
@@ -2012,7 +2098,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
// 新增的一条暂时不展示
|
||||
newFileInfo.setIsLatest(false);
|
||||
FileApproveRequestBuilder uploadAndUpdateFileApproveRequestBuilder = FileApproveRequestBuilder.builder()
|
||||
.fileIds(List.of(newFileInfo.getId()))
|
||||
.toUpdateFileIds(List.of(newFileInfo.getId()))
|
||||
.contents("知识库文件修改")
|
||||
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
|
||||
.approveFileActionENUM(ApproveFileActionENUM.MODIFY)
|
||||
@@ -2037,7 +2123,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
setSimulationPoolAndTaskInfo(uploadAndUpdateFileApproveRequestBuilder.getAfterData());
|
||||
}
|
||||
|
||||
fileApproveExecutor.launchApproveAndUpdateStatus(uploadAndUpdateFileApproveRequestBuilder, List.of(newFileInfo), ApproveFileDataTypeEnum.MODIFY_REVIEWING);
|
||||
fileApproveExecutor.launchApproveAndUpdateStatus(uploadAndUpdateFileApproveRequestBuilder, ApproveFileDataTypeEnum.MODIFY_REVIEWING);
|
||||
}else {
|
||||
// 非知识库的,设置 历史版本 文件为非最新
|
||||
oldFileMetadataInfo.setIsLatest(false);
|
||||
@@ -2843,7 +2929,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
if (isKnowledge) {
|
||||
// 构建审批内容
|
||||
FileApproveRequestBuilder batchUploadFileApproveRequestBuilder = FileApproveRequestBuilder.builder()
|
||||
.fileIds(succBusinessIds)
|
||||
.toUpdateFileIds(succBusinessIds)
|
||||
.contents("知识库文档新增")
|
||||
.approveType(ApproveTypeEnum.KNOWLEDGE_APPROVE)
|
||||
.approveFileActionENUM(ApproveFileActionENUM.ADD)
|
||||
@@ -2859,7 +2945,7 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
|
||||
setSimulationPoolAndTaskInfo(batchUploadFileApproveRequestBuilder.getBeforeData());
|
||||
}
|
||||
|
||||
fileApproveExecutor.launchApproveAndUpdateStatus(batchUploadFileApproveRequestBuilder, succFileMetadataInfos, ApproveFileDataTypeEnum.UPLOAD_REVIEWING);
|
||||
fileApproveExecutor.launchApproveAndUpdateStatus(batchUploadFileApproveRequestBuilder, ApproveFileDataTypeEnum.UPLOAD_REVIEWING);
|
||||
}
|
||||
|
||||
// 3. 批量更新文件状态(上传完成)
|
||||
|
||||
@@ -5,22 +5,48 @@ 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.enums.ApproveTypeEnum;
|
||||
import com.sdm.common.entity.enums.DataTypeEnum;
|
||||
import com.sdm.data.model.entity.*;
|
||||
import com.sdm.data.service.*;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@Slf4j
|
||||
public class DeleteApproveStrategy implements ApproveStrategy {
|
||||
@Override
|
||||
public boolean handle(ApproveContext context) {
|
||||
// FileMetadataInfo metadata = context.getApproveMetadataInfo();
|
||||
FileMetadataInfo metadata = context.getApproveMetadataInfos().get(0);
|
||||
int status = context.getApproveStatus();
|
||||
int type = context.getApproveType();
|
||||
|
||||
// 审批通过
|
||||
if (NumberConstants.TWO == status) {
|
||||
// 根据数据类型分流处理
|
||||
if (Objects.equals(DataTypeEnum.DIRECTORY.getValue(), metadata.getDataType())) {
|
||||
return handleDirDeletion(context, metadata);
|
||||
} else {
|
||||
return handleFileDeletion(context, metadata, type);
|
||||
}
|
||||
}
|
||||
|
||||
// 审批不通过
|
||||
if (NumberConstants.THREE == status) {
|
||||
return handleRejection(context, metadata);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理文件删除审批通过
|
||||
*/
|
||||
private boolean handleFileDeletion(ApproveContext context, FileMetadataInfo metadata, int type) {
|
||||
IFileMetadataInfoService service = context.getFileMetadataInfoService();
|
||||
IMinioService minioService = context.getMinioService();
|
||||
IFileMetadataExtensionService fileMetadataExtensionService = context.getFileMetadataExtensionService();
|
||||
@@ -29,33 +55,124 @@ public class DeleteApproveStrategy implements ApproveStrategy {
|
||||
ISimulationParameterLibraryCategoryObjectService paramObjectService = context.getParamObjectService();
|
||||
IFileSimulationMappingService fileSimulationMappingService = context.getFileSimulationMappingService();
|
||||
|
||||
// 审批通过
|
||||
if (NumberConstants.TWO == status) {
|
||||
// 删除MinIO文件
|
||||
minioService.deleteFile(metadata.getObjectKey(),metadata.getBucketName() );
|
||||
// 删除数据库记录
|
||||
service.removeById(metadata.getId());
|
||||
fileStorageService.remove(new LambdaQueryWrapper<FileStorage>().eq(FileStorage::getFileId, metadata.getId()));
|
||||
fileMetadataExtensionService.remove(new LambdaQueryWrapper<FileMetadataExtension>().eq(FileMetadataExtension::getTFilemetaId, metadata.getId()));
|
||||
fileUserPermissionService.remove(new LambdaQueryWrapper<FileUserPermission>().eq(FileUserPermission::getTFilemetaId, metadata.getId()));
|
||||
fileSimulationMappingService.remove(new LambdaQueryWrapper<FileSimulationMapping>().eq(FileSimulationMapping::getFileId, metadata.getId()));
|
||||
// 如果是参数库审批 删除参数库对象
|
||||
if (ApproveTypeEnum.PARAM_APPROVE.getCode() == type) {
|
||||
paramObjectService.remove(new LambdaQueryWrapper<SimulationParameterLibraryCategoryObject>().eq(SimulationParameterLibraryCategoryObject::getFileId, metadata.getId()));
|
||||
}
|
||||
return true;
|
||||
// 删除MinIO文件
|
||||
minioService.deleteFile(metadata.getObjectKey(), metadata.getBucketName());
|
||||
|
||||
// 删除数据库记录
|
||||
service.removeById(metadata.getId());
|
||||
fileStorageService.remove(new LambdaQueryWrapper<FileStorage>().eq(FileStorage::getFileId, metadata.getId()));
|
||||
fileMetadataExtensionService.remove(new LambdaQueryWrapper<FileMetadataExtension>().eq(FileMetadataExtension::getTFilemetaId, metadata.getId()));
|
||||
fileUserPermissionService.remove(new LambdaQueryWrapper<FileUserPermission>().eq(FileUserPermission::getTFilemetaId, metadata.getId()));
|
||||
fileSimulationMappingService.remove(new LambdaQueryWrapper<FileSimulationMapping>().eq(FileSimulationMapping::getFileId, metadata.getId()));
|
||||
|
||||
// 如果是参数库审批 删除参数库对象
|
||||
if (ApproveTypeEnum.PARAM_APPROVE.getCode() == type) {
|
||||
paramObjectService.remove(new LambdaQueryWrapper<SimulationParameterLibraryCategoryObject>().eq(SimulationParameterLibraryCategoryObject::getFileId, metadata.getId()));
|
||||
}
|
||||
|
||||
// 审批不通过
|
||||
if (NumberConstants.THREE == status) {
|
||||
// 恢复状态
|
||||
log.info("审批通过,成功删除文件: id={}, objectKey={}", metadata.getId(), metadata.getObjectKey());
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理目录删除审批通过
|
||||
*/
|
||||
private boolean handleDirDeletion(ApproveContext context, FileMetadataInfo rootDirMetadata) {
|
||||
IFileMetadataInfoService service = context.getFileMetadataInfoService();
|
||||
IMinioService minioService = context.getMinioService();
|
||||
IFileMetadataExtensionService fileMetadataExtensionService = context.getFileMetadataExtensionService();
|
||||
IFileUserPermissionService fileUserPermissionService = context.getFileUserPermissionService();
|
||||
IFileStorageService fileStorageService = context.getFileStorageService();
|
||||
IFileSimulationMappingService fileSimulationMappingService = context.getFileSimulationMappingService();
|
||||
|
||||
Long rootDirId = rootDirMetadata.getId();
|
||||
String rootDirObjectKey = rootDirMetadata.getObjectKey();
|
||||
String bucketName = rootDirMetadata.getBucketName();
|
||||
|
||||
// 递归收集所有待删除的 ID
|
||||
Set<Long> allFileIds = new HashSet<>();
|
||||
Set<Long> allDirIds = new HashSet<>();
|
||||
collectRecursiveIds(service, rootDirId, allFileIds, allDirIds);
|
||||
|
||||
// 批量删除数据库元数据
|
||||
if (CollectionUtils.isNotEmpty(allFileIds)) {
|
||||
service.removeByIds(allFileIds);
|
||||
fileMetadataExtensionService.lambdaUpdate().in(FileMetadataExtension::getTFilemetaId, allFileIds).remove();
|
||||
fileUserPermissionService.lambdaUpdate().in(FileUserPermission::getTFilemetaId, allFileIds).remove();
|
||||
fileSimulationMappingService.lambdaUpdate().in(FileSimulationMapping::getFileId, allFileIds).remove();
|
||||
fileStorageService.lambdaUpdate()
|
||||
.in(FileStorage::getFileId, allFileIds)
|
||||
.or()
|
||||
.in(FileStorage::getDirId, allDirIds)
|
||||
.remove();
|
||||
}
|
||||
|
||||
// MinIO 递归删除
|
||||
minioService.deleteDirectoryRecursively(rootDirObjectKey, bucketName);
|
||||
|
||||
log.info("审批通过,成功删除目录及所有子项: id={}, objectKey={}", rootDirId, rootDirObjectKey);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 处理审批拒绝
|
||||
*/
|
||||
private boolean handleRejection(ApproveContext context, FileMetadataInfo metadata) {
|
||||
IFileMetadataInfoService service = context.getFileMetadataInfoService();
|
||||
|
||||
// 如果是目录,需要递归恢复所有子项状态
|
||||
if (Objects.equals(DataTypeEnum.DIRECTORY.getValue(), metadata.getDataType())) {
|
||||
Set<Long> allFileIds = new HashSet<>();
|
||||
Set<Long> allDirIds = new HashSet<>();
|
||||
collectRecursiveIds(service, metadata.getId(), allFileIds, allDirIds);
|
||||
|
||||
// 批量恢复状态
|
||||
if (CollectionUtils.isNotEmpty(allFileIds)) {
|
||||
List<FileMetadataInfo> allMetadataList = service.listByIds(allFileIds);
|
||||
allMetadataList.forEach(item -> {
|
||||
item.setTempMetadata(null);
|
||||
item.setApprovalStatus(ApprovalFileDataStatusEnum.REJECTED.getKey());
|
||||
item.setApproveType(ApproveFileDataTypeEnum.COMPLETED.getCode());
|
||||
item.setUpdateTime(LocalDateTime.now());
|
||||
});
|
||||
service.updateBatchById(allMetadataList);
|
||||
}
|
||||
|
||||
log.info("审批拒绝,已恢复目录及所有子项状态: id={}", metadata.getId());
|
||||
} else {
|
||||
// 单文件恢复状态
|
||||
metadata.setTempMetadata(null);
|
||||
metadata.setApprovalStatus(ApprovalFileDataStatusEnum.REJECTED.getKey());
|
||||
metadata.setApproveType(ApproveFileDataTypeEnum.COMPLETED.getCode());
|
||||
metadata.setUpdateTime(LocalDateTime.now());
|
||||
service.updateById(metadata);
|
||||
return true;
|
||||
|
||||
log.info("审批拒绝,已恢复文件状态: id={}", metadata.getId());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归收集目录下所有子文件和子目录的 ID
|
||||
*/
|
||||
private void collectRecursiveIds(IFileMetadataInfoService service, Long currentDirId,
|
||||
Set<Long> allFileIds, Set<Long> allDirIds) {
|
||||
allDirIds.add(currentDirId);
|
||||
allFileIds.add(currentDirId);
|
||||
|
||||
List<FileMetadataInfo> children = service.lambdaQuery()
|
||||
.eq(FileMetadataInfo::getParentId, currentDirId)
|
||||
.list();
|
||||
|
||||
if (CollectionUtils.isNotEmpty(children)) {
|
||||
for (FileMetadataInfo child : children) {
|
||||
if (Objects.equals(DataTypeEnum.DIRECTORY.getValue(), child.getDataType())) {
|
||||
collectRecursiveIds(service, child.getId(), allFileIds, allDirIds);
|
||||
} else {
|
||||
allFileIds.add(child.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user