fix:优化回收站全量删除

This commit is contained in:
2026-02-12 16:43:57 +08:00
parent 0ffa316aee
commit 77eb106826
2 changed files with 10 additions and 7 deletions

View File

@@ -1,6 +1,7 @@
package com.sdm.data.schedule;
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;
@@ -23,6 +24,7 @@ import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
/**
* 回收站自动清理定时任务
@@ -66,18 +68,19 @@ public class RecycleBinCleanupSchedule {
try {
LocalDateTime now = LocalDateTime.now();
// 查询所有已过期的回收站项
// 查询所有已过期的回收站项(仅查询顶层节点,避免重复删除子项)
List<FileMetadataInfo> expiredItems = fileMetadataInfoService.lambdaQuery()
.isNotNull(FileMetadataInfo::getDeletedAt)
.le(FileMetadataInfo::getRecycleExpireAt, now)
.apply("(parentId IS NULL OR EXISTS (SELECT 1 FROM file_metadata_info p WHERE p.id = file_metadata_info.parentId AND p.deletedAt IS NULL))")
.list();
if (CollectionUtils.isEmpty(expiredItems)) {
log.info("回收站中没有已过期的文件/目录");
log.info("回收站中没有已过期的顶层文件/目录");
return;
}
log.info("发现 {} 个已过期的回收站项,开始物理删除", expiredItems.size());
log.info("发现 {} 个已过期的回收站顶层项,开始物理删除", expiredItems.size());
int successCount = 0;
int failCount = 0;
@@ -85,7 +88,7 @@ public class RecycleBinCleanupSchedule {
for (FileMetadataInfo item : expiredItems) {
try {
// 如果是目录,需要递归删除所有子项
if (item.getDataType() != null && item.getDataType() == 1) { // 1表示目录
if (Objects.equals(DataTypeEnum.DIRECTORY.getValue(), item.getDataType())) {
minioFileIDataFileService.executeDirectoryDeletion(
item.getId(),
item.getObjectKey(),

View File

@@ -4817,11 +4817,11 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService {
List<Long> ids = req.getIds();
if (CollectionUtils.isEmpty(ids)) {
Long userId = ThreadLocalContext.getUserId();
// 查询回收站中的顶层节点(避免对子节点重复触发递归删除)
// 查询当前租户回收站中的顶层节点(避免对子节点重复触发递归删除)
List<FileMetadataInfo> list = fileMetadataInfoService.lambdaQuery()
.eq(FileMetadataInfo::getCreatorId, userId)
.eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId())
.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))")
.apply("(parentId IS NULL OR EXISTS (SELECT 1 FROM file_metadata_info p WHERE p.id = file_metadata_info.parentId AND p.deletedAt IS NULL))")
.list();
if (CollectionUtils.isEmpty(list)) {
return SdmResponse.success("回收站为空");