diff --git a/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java b/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java index 2de5028..4362a2a 100644 --- a/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java +++ b/java/src/main/java/com/yfd/platform/modules/experimentalData/service/impl/TsFilesServiceImpl.java @@ -23,7 +23,9 @@ import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectInputStream; import com.amazonaws.util.IOUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -316,7 +318,7 @@ public class TsFilesServiceImpl extends ServiceImpl impl @Override public int countFiles(String id) { - int count = tsFilesMapper.countFiles(id); + int count = tsFilesMapper.countFiles(id); return count; } @@ -930,6 +932,8 @@ public class TsFilesServiceImpl extends ServiceImpl impl public String deleteTsFilesByIds(List dataset, String type) { List filesList = tsFilesMapper.selectBatchIds(dataset); + //新增一个查询 判断下面有没有备份路径 如果有就不能删除 + //todo 删除的时候成功以后 删除redis for (int page = 1; page <= 5; page++) { String redisKey = "tsfiles_" + filesList.get(0).getTaskId() + "_" + filesList.get(0).getNodeId() + "_parentId" + filesList.get(0).getParentId() + "_page_" + page; @@ -939,7 +943,7 @@ public class TsFilesServiceImpl extends ServiceImpl impl int LocalSuccessCount = 0, LocalFailCount = 0, Localtotal = CollUtil.size(dataset); - //Todo 最直接的办法 循环出来 一条一条删除 + //Todo 最直接的办法 循环出来 一条一条删除 如果是文件夹 要递归下面所有的文件和文件夹进行删除 for (TsFiles files : filesList) { @@ -988,16 +992,14 @@ public class TsFilesServiceImpl extends ServiceImpl impl } if (totalCount > 1) { - //return ResponseResult.success("批量删除 " + totalCount + " 个, 删除成功 " + deleteSuccessCount + " 个, 失败 " + deleteFailCount + " 个."); LOGGER.error("批量删除 " + totalCount + " 个, 删除成功 " + deleteSuccessCount + " 个, 失败 " + deleteFailCount + " 个."); } else { - //return totalCount == deleteSuccessCount ? ResponseResult.success("删除成功") : ResponseResult.error("删除失败"); LOGGER.error("批量删除 " + totalCount + " 个, 删除成功 " + deleteSuccessCount + " 个, 失败 " + deleteFailCount + " 个."); } //如果是1 说明成功删除 if (deleteSuccessCount >= 1) { - int valueDelete = deleteFolder(files.getId(), type); + int valueDelete = deleteFolderAndSubFiles(files.getId(), type); if (valueDelete > 0) { LocalSuccessCount = valueDelete; LOGGER.info("表结构成功删除"); @@ -1076,73 +1078,122 @@ public class TsFilesServiceImpl extends ServiceImpl impl return "Local批量删除 " + Localtotal + " 个, 删除成功 " + LocalSuccessCount + " 个, 失败 " + LocalFailCount + " 个."; } - // 调用删除方法并返回删除数量 - public int deleteFolder(String folderId, String type) { - return deleteFolderAndSubFiles(folderId, type); // 返回删除的记录数量 - } +// // 调用删除方法并返回删除数量 +// public int deleteFolder(String folderId, String type) { +// return deleteFolderAndSubFiles(folderId, type); // 返回删除的记录数量 +// } // 递归删除文件夹及其子文件,并返回删除的记录数量 public int deleteFolderAndSubFiles(String folderId, String type) { int deletedCount = 0; // 记录删除的数量 - // 查询该文件夹下的所有子文件 - QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("parent_id", folderId); // 根据父ID查询所有子文件 - List subFiles = tsFilesMapper.selectList(queryWrapper); + + //判断是删除本地还是minio 先通过父ID修改所有的 然后通过父ID查询下面所有的文件夹 进行递归 + if ("local".equals(type)) { + //如果是本地 先先吧所有的work_path修改成空 然后删除所有work_path和backup_path为空的数据 + LambdaUpdateWrapper updateWrapper1 = new LambdaUpdateWrapper<>(); + updateWrapper1.eq(TsFiles::getParentId, folderId).set(TsFiles::getWorkPath, ""); + int updatedCount = tsFilesMapper.update(null, updateWrapper1); + LOGGER.info("本地更新操作:将 {} 条记录的 work_path 设置为空", updatedCount); + + + // 批量删除备份路径和工作路径为空的数据 条件是父ID等于folderId + LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); + deleteWrapper.eq(TsFiles::getParentId, folderId) + .and(wrapper -> wrapper.isNull(TsFiles::getBackupPath).or().eq(TsFiles::getBackupPath, "")) + .and(wrapper -> wrapper.isNull(TsFiles::getWorkPath).or().eq(TsFiles::getWorkPath, "")); + int deletedCounts = tsFilesMapper.delete(deleteWrapper); + LOGGER.info("本地删除操作:成功删除了 {} 条 work_path 和 backup_path 都为空的记录", deletedCounts); + deletedCount += deletedCounts; + + } else { + //删除minio的时候判断本地路径是否为空 如果为空直接删除 如果不为空把BackupPath修改成空 + //如果是minio 先先吧所有的backup_path修改成空 然后删除所有work_path和backup_path为空的数据 + LambdaUpdateWrapper updateWrapper1 = new LambdaUpdateWrapper<>(); + updateWrapper1.eq(TsFiles::getParentId, folderId).set(TsFiles::getBackupPath, ""); + int updatedCount = tsFilesMapper.update(null, updateWrapper1); + LOGGER.info("minio更新操作:将 {} 条记录的 work_path 设置为空", updatedCount); + + + // 批量删除备份路径和工作路径为空的数据 条件是父ID等于folderId + LambdaQueryWrapper deleteWrapper = new LambdaQueryWrapper<>(); + deleteWrapper.eq(TsFiles::getParentId, folderId) + .and(wrapper -> wrapper.isNull(TsFiles::getBackupPath).or().eq(TsFiles::getBackupPath, "")) + .and(wrapper -> wrapper.isNull(TsFiles::getWorkPath).or().eq(TsFiles::getWorkPath, "")); + int deletedCounts = tsFilesMapper.delete(deleteWrapper); + LOGGER.info("minio删除操作:成功删除了 {} 条 work_path 和 backup_path 都为空的记录", deletedCounts); + deletedCount += deletedCounts; + } + + + // 查询该文件夹下的所有子文件夹 + QueryWrapper queryWrapperFolder = new QueryWrapper<>(); + queryWrapperFolder.eq("parent_id", folderId); // 根据父ID查询所有子文件 + queryWrapperFolder.eq("is_file", "FOLDER");//查询所有的文件夹 + List subFolder = tsFilesMapper.selectList(queryWrapperFolder); + if (subFolder.size() > 0) { + for (TsFiles subFile : subFolder) { + deletedCount += deleteFolderAndSubFiles(subFile.getId(), type); // 累加删除数量 + } + } + // 递归删除子文件 - for (TsFiles subFile : subFiles) { - // 递归调用删除子文件的逻辑 - deletedCount += deleteFolderAndSubFiles(subFile.getId(), type); // 累加删除数量 +// for (TsFiles subFile : subFiles) { +// // 递归调用删除子文件的逻辑 +// deletedCount += deleteFolderAndSubFiles(subFile.getId(), type); // 累加删除数量 +// +// //判断是删除本地还是minio +// if ("local".equals(type)) { +// //删除本地的时候判断minio路径是否为空 如果为空直接删除 如果不为空把workPath修改成空 +// if (StringUtils.isNotEmpty(subFile.getBackupPath())) { +// subFile.setWorkPath(""); +// tsFilesMapper.updateById(subFile); +// } else { +// // 删除子文件记录(从数据库中删除) +// tsFilesMapper.deleteById(subFile.getId()); +// } +// +// } else { +// //删除minio的时候判断本地路径是否为空 如果为空直接删除 如果不为空把BackupPath修改成空 +// if (StringUtils.isNotEmpty(subFile.getWorkPath())) { +// subFile.setBackupPath(""); +// tsFilesMapper.updateById(subFile); +// } else { +// // 删除子文件记录(从数据库中删除) +// tsFilesMapper.deleteById(subFile.getId()); +// } +// } +// deletedCount++; // 每删除一个文件,数量加1 +// } + //删除修改自身 + TsFiles tsFilesData = tsFilesMapper.selectById(folderId); + if (tsFilesData != null) { //判断是删除本地还是minio if ("local".equals(type)) { //删除本地的时候判断minio路径是否为空 如果为空直接删除 如果不为空把workPath修改成空 - if (StringUtils.isNotEmpty(subFile.getBackupPath())) { - subFile.setWorkPath(""); - tsFilesMapper.updateById(subFile); + if (StringUtils.isNotEmpty(tsFilesData.getBackupPath())) { + tsFilesData.setWorkPath(""); + tsFilesMapper.updateById(tsFilesData); } else { // 删除子文件记录(从数据库中删除) - tsFilesMapper.deleteById(subFile.getId()); + tsFilesMapper.deleteById(tsFilesData.getId()); } } else { //删除minio的时候判断本地路径是否为空 如果为空直接删除 如果不为空把BackupPath修改成空 - if (StringUtils.isNotEmpty(subFile.getWorkPath())) { - subFile.setBackupPath(""); - tsFilesMapper.updateById(subFile); + if (StringUtils.isNotEmpty(tsFilesData.getWorkPath())) { + tsFilesData.setBackupPath(""); + tsFilesMapper.updateById(tsFilesData); } else { // 删除子文件记录(从数据库中删除) - tsFilesMapper.deleteById(subFile.getId()); + tsFilesMapper.deleteById(tsFilesData.getId()); } } - deletedCount++; // 每删除一个文件,数量加1 + deletedCount++; // 删除文件夹本身,数量加1 } - //删除修改自身 - TsFiles tsFilesData = tsFilesMapper.selectById(folderId); - //判断是删除本地还是minio - if ("local".equals(type)) { - //删除本地的时候判断minio路径是否为空 如果为空直接删除 如果不为空把workPath修改成空 - if (StringUtils.isNotEmpty(tsFilesData.getBackupPath())) { - tsFilesData.setWorkPath(""); - tsFilesMapper.updateById(tsFilesData); - } else { - // 删除子文件记录(从数据库中删除) - tsFilesMapper.deleteById(tsFilesData.getId()); - } - - } else { - //删除minio的时候判断本地路径是否为空 如果为空直接删除 如果不为空把BackupPath修改成空 - if (StringUtils.isNotEmpty(tsFilesData.getWorkPath())) { - tsFilesData.setBackupPath(""); - tsFilesMapper.updateById(tsFilesData); - } else { - // 删除子文件记录(从数据库中删除) - tsFilesMapper.deleteById(tsFilesData.getId()); - } - } - deletedCount++; // 删除文件夹本身,数量加1 return deletedCount; // 返回删除的数量 }