feat:删除项目文件夹接入审批流

refactor:重构文件审批流接入功能
This commit is contained in:
2026-01-22 17:59:18 +08:00
parent e104fb2ab8
commit 7175f8b7f1
5 changed files with 324 additions and 108 deletions

View File

@@ -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())){

View File

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

View File

@@ -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. 批量更新文件状态(上传完成)

View File

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