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

View File

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