fix:文件删除,可以控制直接删,不放回收站

This commit is contained in:
2026-03-24 12:44:52 +08:00
parent fd7b630337
commit 02c40e9986
2 changed files with 128 additions and 0 deletions

View File

@@ -0,0 +1,25 @@
package com.sdm.data.service;
import java.util.List;
/**
* 文件/目录彻底删除编排服务
*/
public interface IFileDeleteService {
/**
* 彻底删除文件所有相关数据元数据、扩展、权限、映射、标签、存储、MinIO对象
*
* @param fileIds 文件ID集合
*/
void deleteAllFileReleateInfo(List<Long> fileIds);
/**
* 彻底删除目录及其所有子项相关数据
*
* @param rootDirId 根目录ID
* @param rootDirObjectKey 根目录对象Key
* @param bucketName 桶名
*/
void deleteAllDirReleateInfo(Long rootDirId, String rootDirObjectKey, String bucketName);
}

View File

@@ -0,0 +1,103 @@
package com.sdm.data.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sdm.common.entity.enums.DataTypeEnum;
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.FileStorage;
import com.sdm.data.model.entity.FileTagRel;
import com.sdm.data.model.entity.FileUserPermission;
import com.sdm.data.service.IFileDeleteService;
import com.sdm.data.service.IFileMetadataExtensionService;
import com.sdm.data.service.IFileMetadataInfoService;
import com.sdm.data.service.IFileSimulationMappingService;
import com.sdm.data.service.IFileStorageService;
import com.sdm.data.service.IFileTagRelService;
import com.sdm.data.service.IFileUserPermissionService;
import com.sdm.data.service.IMinioService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@Service
public class FileDeleteServiceImpl implements IFileDeleteService {
@Autowired
private IMinioService minioService;
@Autowired
private IFileMetadataInfoService fileMetadataInfoService;
@Autowired
private IFileMetadataExtensionService fileMetadataExtensionService;
@Autowired
private IFileUserPermissionService fileUserPermissionService;
@Autowired
private IFileStorageService fileStorageService;
@Autowired
private IFileSimulationMappingService fileSimulationMappingService;
@Autowired
private IFileTagRelService fileTagRelService;
@Override
public void deleteAllFileReleateInfo(List<Long> fileIds) {
fileMetadataInfoService.lambdaQuery().in(FileMetadataInfo::getId, fileIds).list().forEach(deleteFileMetadataInfo -> {
minioService.deleteFile(deleteFileMetadataInfo.getObjectKey(), deleteFileMetadataInfo.getBucketName());
});
fileMetadataInfoService.removeByIds(fileIds);
fileStorageService.remove(new LambdaQueryWrapper<FileStorage>().in(FileStorage::getFileId, fileIds));
fileMetadataExtensionService.remove(new LambdaQueryWrapper<FileMetadataExtension>().in(FileMetadataExtension::getTFilemetaId, fileIds));
fileUserPermissionService.remove(new LambdaQueryWrapper<FileUserPermission>().in(FileUserPermission::getTFilemetaId, fileIds));
fileSimulationMappingService.remove(new LambdaQueryWrapper<FileSimulationMapping>().in(FileSimulationMapping::getFileId, fileIds));
fileTagRelService.remove(new LambdaQueryWrapper<FileTagRel>().in(FileTagRel::getFileId, fileIds));
}
@Override
public void deleteAllDirReleateInfo(Long rootDirId, String rootDirObjectKey, String bucketName) {
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();
fileTagRelService.lambdaUpdate().in(FileTagRel::getFileId, allFileIds).or().in(FileTagRel::getDirId, allFileIds).remove();
fileStorageService.lambdaUpdate()
.in(FileStorage::getFileId, allFileIds)
.or()
.in(FileStorage::getDirId, allDirIds)
.remove();
}
minioService.deleteDirectoryRecursively(rootDirObjectKey, bucketName);
}
/**
* 递归收集目录下所有子文件和子目录的 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());
}
}
}
}
}