fix:优化回收站全量删除

This commit is contained in:
2026-02-12 13:51:31 +08:00
parent 37c4fa034e
commit c6a2b084e9
3 changed files with 19 additions and 7 deletions

View File

@@ -1,7 +1,6 @@
package com.sdm.common.entity.req.data; package com.sdm.common.entity.req.data;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@@ -9,7 +8,6 @@ import java.util.List;
@Data @Data
@Schema(description = "从回收站彻底删除请求") @Schema(description = "从回收站彻底删除请求")
public class PermanentDeleteFromRecycleReq { public class PermanentDeleteFromRecycleReq {
@Schema(description = "要彻底删除的文件/目录ID列表", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "要彻底删除的文件/目录ID列表(为空则全量删除)")
@NotNull(message = "文件/目录ID列表不能为空")
private List<Long> ids; private List<Long> ids;
} }

View File

@@ -118,6 +118,7 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
List<FileMetadataInfo> deliverableFileInfoList = fileMetadataInfoService.lambdaQuery() List<FileMetadataInfo> deliverableFileInfoList = fileMetadataInfoService.lambdaQuery()
.eq(FileMetadataInfo::getParentId, queryBigFileReq.getDirId()) .eq(FileMetadataInfo::getParentId, queryBigFileReq.getDirId())
.eq(FileMetadataInfo::getOriginalName, CommonConstants.DELIVERABLE_DIR_NAME) .eq(FileMetadataInfo::getOriginalName, CommonConstants.DELIVERABLE_DIR_NAME)
.isNull(FileMetadataInfo::getDeletedAt)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId()) .eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.list(); .list();
if (CollectionUtils.isNotEmpty(deliverableFileInfoList)) { if (CollectionUtils.isNotEmpty(deliverableFileInfoList)) {
@@ -128,6 +129,7 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
List<FileMetadataInfo> secondDirFileMetadataInfoList = fileMetadataInfoService.lambdaQuery() List<FileMetadataInfo> secondDirFileMetadataInfoList = fileMetadataInfoService.lambdaQuery()
.eq(FileMetadataInfo::getParentId, deliverableDirId) .eq(FileMetadataInfo::getParentId, deliverableDirId)
.eq(FileMetadataInfo::getOriginalName, secondDirName) .eq(FileMetadataInfo::getOriginalName, secondDirName)
.isNull(FileMetadataInfo::getDeletedAt)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId()) .eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.list(); .list();
if (CollectionUtils.isNotEmpty(secondDirFileMetadataInfoList)) { if (CollectionUtils.isNotEmpty(secondDirFileMetadataInfoList)) {
@@ -139,6 +141,7 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService {
List<FileMetadataInfo> fileMetadataInfoList = fileMetadataInfoService.lambdaQuery() List<FileMetadataInfo> fileMetadataInfoList = fileMetadataInfoService.lambdaQuery()
.eq(FileMetadataInfo::getParentId, secondDirId) .eq(FileMetadataInfo::getParentId, secondDirId)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId()) .eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.isNull(FileMetadataInfo::getDeletedAt)
.list(); .list();
PageInfo<FileMetadataInfo> page = new PageInfo<>(fileMetadataInfoList); PageInfo<FileMetadataInfo> page = new PageInfo<>(fileMetadataInfoList);
long total = page.getTotal(); long total = page.getTotal();

View File

@@ -4815,17 +4815,28 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public SdmResponse permanentDeleteFromRecycle(PermanentDeleteFromRecycleReq req) { public SdmResponse permanentDeleteFromRecycle(PermanentDeleteFromRecycleReq req) {
if (ObjectUtils.isEmpty(req.getIds())) { List<Long> ids = req.getIds();
return SdmResponse.failed("未选择要删除的文件"); if (ObjectUtils.isEmpty(ids)) {
Long userId = ThreadLocalContext.getUserId();
// 查询回收站中的顶层节点(避免对子节点重复触发递归删除)
List<FileMetadataInfo> list = fileMetadataInfoService.lambdaQuery()
.eq(FileMetadataInfo::getCreatorId, userId)
.isNotNull(FileMetadataInfo::getDeletedAt)
.apply("(parentId IS NULL OR NOT EXISTS (SELECT 1 FROM file_metadata_info p WHERE p.id = file_metadata_info.parentId AND p.deletedAt IS NOT NULL))")
.list();
if (CollectionUtils.isEmpty(list)) {
return SdmResponse.success("回收站为空");
}
ids = list.stream().map(FileMetadataInfo::getId).collect(Collectors.toList());
} }
for (Long id : req.getIds()) { for (Long id : ids) {
SdmResponse resp = permanentDeleteSingleFile(id); SdmResponse resp = permanentDeleteSingleFile(id);
if (!resp.isSuccess()) { if (!resp.isSuccess()) {
throw new RuntimeException("删除文件(ID:" + id + ")失败: " + resp.getMessage()); throw new RuntimeException("删除文件(ID:" + id + ")失败: " + resp.getMessage());
} }
} }
return SdmResponse.success("批量彻底删除成功"); return SdmResponse.success("彻底删除成功");
} }
private SdmResponse permanentDeleteSingleFile(Long id) { private SdmResponse permanentDeleteSingleFile(Long id) {