From c6a2b084e99cf798d7a58d9ae18f3a08eeaccbe9 Mon Sep 17 00:00:00 2001 From: gulongcheng <474084054@qq.com> Date: Thu, 12 Feb 2026 13:51:31 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BC=98=E5=8C=96=E5=9B=9E=E6=94=B6?= =?UTF-8?q?=E7=AB=99=E5=85=A8=E9=87=8F=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/PermanentDeleteFromRecycleReq.java | 4 +--- .../service/impl/DataAnalysisServiceImpl.java | 3 +++ .../impl/MinioFileIDataFileServiceImpl.java | 19 +++++++++++++++---- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/com/sdm/common/entity/req/data/PermanentDeleteFromRecycleReq.java b/common/src/main/java/com/sdm/common/entity/req/data/PermanentDeleteFromRecycleReq.java index f647109f..b16d07bf 100644 --- a/common/src/main/java/com/sdm/common/entity/req/data/PermanentDeleteFromRecycleReq.java +++ b/common/src/main/java/com/sdm/common/entity/req/data/PermanentDeleteFromRecycleReq.java @@ -1,7 +1,6 @@ package com.sdm.common.entity.req.data; import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; import lombok.Data; import java.util.List; @@ -9,7 +8,6 @@ import java.util.List; @Data @Schema(description = "从回收站彻底删除请求") public class PermanentDeleteFromRecycleReq { - @Schema(description = "要彻底删除的文件/目录ID列表", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "文件/目录ID列表不能为空") + @Schema(description = "要彻底删除的文件/目录ID列表(为空则全量删除)") private List ids; } diff --git a/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java index 2089792d..3759a7b0 100644 --- a/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/DataAnalysisServiceImpl.java @@ -118,6 +118,7 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { List deliverableFileInfoList = fileMetadataInfoService.lambdaQuery() .eq(FileMetadataInfo::getParentId, queryBigFileReq.getDirId()) .eq(FileMetadataInfo::getOriginalName, CommonConstants.DELIVERABLE_DIR_NAME) + .isNull(FileMetadataInfo::getDeletedAt) .eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId()) .list(); if (CollectionUtils.isNotEmpty(deliverableFileInfoList)) { @@ -128,6 +129,7 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { List secondDirFileMetadataInfoList = fileMetadataInfoService.lambdaQuery() .eq(FileMetadataInfo::getParentId, deliverableDirId) .eq(FileMetadataInfo::getOriginalName, secondDirName) + .isNull(FileMetadataInfo::getDeletedAt) .eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId()) .list(); if (CollectionUtils.isNotEmpty(secondDirFileMetadataInfoList)) { @@ -139,6 +141,7 @@ public class DataAnalysisServiceImpl implements IDataAnalysisService { List fileMetadataInfoList = fileMetadataInfoService.lambdaQuery() .eq(FileMetadataInfo::getParentId, secondDirId) .eq(FileMetadataInfo::getTenantId, ThreadLocalContext.getTenantId()) + .isNull(FileMetadataInfo::getDeletedAt) .list(); PageInfo page = new PageInfo<>(fileMetadataInfoList); long total = page.getTotal(); diff --git a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java index 9c51ff4c..e1c1a078 100644 --- a/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java +++ b/data/src/main/java/com/sdm/data/service/impl/MinioFileIDataFileServiceImpl.java @@ -4815,17 +4815,28 @@ public class MinioFileIDataFileServiceImpl implements IDataFileService { @Override @Transactional(rollbackFor = Exception.class) public SdmResponse permanentDeleteFromRecycle(PermanentDeleteFromRecycleReq req) { - if (ObjectUtils.isEmpty(req.getIds())) { - return SdmResponse.failed("未选择要删除的文件"); + List ids = req.getIds(); + if (ObjectUtils.isEmpty(ids)) { + Long userId = ThreadLocalContext.getUserId(); + // 查询回收站中的顶层节点(避免对子节点重复触发递归删除) + List 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); if (!resp.isSuccess()) { throw new RuntimeException("删除文件(ID:" + id + ")失败: " + resp.getMessage()); } } - return SdmResponse.success("批量彻底删除成功"); + return SdmResponse.success("彻底删除成功"); } private SdmResponse permanentDeleteSingleFile(Long id) {