From 3122c185505ba7ae43b23699ea755add51560b8f Mon Sep 17 00:00:00 2001 From: lilin Date: Thu, 10 Apr 2025 16:26:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/TsFilesServiceImpl.java | 488 ++++++------------ 1 file changed, 161 insertions(+), 327 deletions(-) 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 d877b5c..09be652 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 @@ -137,8 +137,9 @@ public class TsFilesServiceImpl extends ServiceImpl impl QueryWrapper queryWrapper = new QueryWrapper<>(); // 固定条件过滤 - if (StringUtils.isNotBlank(taskId)) queryWrapper.eq("task_id", taskId); if (StringUtils.isNotBlank(nodeId)) queryWrapper.eq("node_id", nodeId); + if (StringUtils.isNotBlank(taskId)) queryWrapper.eq("task_id", taskId); + // 模糊搜索 if (StringUtils.isNotBlank(fileName)) queryWrapper.like("file_name", fileName); @@ -2460,20 +2461,16 @@ public class TsFilesServiceImpl extends ServiceImpl impl * 参数说明 id 文件id * 返回值说明: com.yfd.platform.config.ResponseResult 返回成功或者失败 ***********************************/ - - @Override public Page compareLocal(List dataset, String nodeId, String taskId, Page page) { - - // ==================== 1. 构建查询条件 ==================== QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.select("id", "node_id", "task_id", "is_file", "parent_id", "file_name", "file_size", "work_path", "backup_path", "upload_time"); // 移除无用字段 if (StringUtils.isNoneEmpty(nodeId, taskId)) { - queryWrapper.eq("task_id", taskId) - .eq("node_id", nodeId) + queryWrapper.eq("node_id", nodeId) + .eq("task_id", taskId) .isNotNull("work_path") .ne("work_path", "") .and(wq -> wq.isNull("backup_path").or().eq("backup_path", "")); @@ -2481,104 +2478,65 @@ public class TsFilesServiceImpl extends ServiceImpl impl if (CollectionUtils.isEmpty(dataset)) { throw new IllegalArgumentException("dataset参数不可为空"); // 优化点9:提前校验参数 } - queryWrapper.in("id", dataset) - .isNotNull("work_path") - .ne("work_path", "") - .and(wq -> wq.isNull("backup_path").or().eq("backup_path", "")); + queryWrapper.in("id", dataset); + +// .isNotNull("work_path") +// .ne("work_path", "") +// .and(wq -> wq.isNull("backup_path").or().eq("backup_path", "")); } Page tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper); if (tsFilesPage == null) { tsFilesPage = new Page<>(); tsFilesPage.setRecords(new ArrayList<>()); // 确保 records 被初始化 } - List records = tsFilesPage.getRecords(); + // 递归查询每个记录的子节点,并添加到 records 中 + List allFiles = new ArrayList<>(); for (TsFiles tsFiles : records) { tsFiles.setWorkPath(processingPath(tsFiles.getWorkPath(), tsFiles.getNodeId())); // 优化点11:路径处理内聚 + // 如果备份路径为空 增加 将当前节点加入结果列表 + if (StringUtils.isEmpty(tsFiles.getBackupPath())) { + allFiles.add(tsFiles); + } + // 查询该节点的所有子节点并递归添加 + if ("FOLDER".equals(tsFiles.getIsFile())) { + List childFiles = getChildFilesRecursiveLocal(tsFiles.getId(), allFiles); + } } - tsFilesPage.setRecords(records); // 同步到 tsFilesPage - System.out.println("Updated records: " + records); - + tsFilesPage.setTotal(allFiles.size()); + tsFilesPage.setRecords(allFiles); // 更新 tsFilesPage 中的 records + System.out.println("Updated all files: " + allFiles); return tsFilesPage; } + // 递归查询所有子节点 + private List getChildFilesRecursiveLocal(String parentId, List allFiles) { + // 构建查询条件,获取当前parentId的所有子节点 + QueryWrapper childQueryWrapper = new QueryWrapper<>(); + childQueryWrapper.eq("parent_id", parentId) + .isNotNull("work_path") + .ne("work_path", "") + .and(wq -> wq.isNull("backup_path").or().eq("backup_path", "")); -// @Override -// public DualTreeResponse compareLocal(List dataset, String nodeId, String taskId) { -// // ================ 优化点1:改用普通集合提升性能 ================ -// List dtos = new ArrayList<>(); -// try { -// // ================ 优化点2:分页查询避免内存溢出 ================ -// int pageSize = 1000; // 从配置文件读取(示例:@Value("${query.page-size:1000}")) -// int currentPage = 1; -// boolean hasMore; -// -// do { -// Page page = new Page<>(currentPage, pageSize); -// QueryWrapper queryWrapper = buildQueryWrapper(dataset, nodeId, taskId); -// -// // ================ 优化点3:分页查询并直接映射DTO ================ -// Page resultPage = tsFilesMapper.selectPage(page, queryWrapper); -// List pageDtos = resultPage.getRecords().stream() -// .map(this::convertToDto) // 使用方法引用简化代码 -// .collect(Collectors.toList()); -// dtos.addAll(pageDtos); -// -// hasMore = resultPage.getCurrent() < resultPage.getPages(); -// currentPage++; -// } while (hasMore); -// -// } catch (EmptyResultDataAccessException e) { -// LOGGER.warn("无匹配数据: nodeId={}, taskId={}", nodeId, taskId); // 优化点4:细化异常类型 -// } catch (Exception e) { -// LOGGER.error("本地文件对比失败", e); // 优化点5:精简日志内容 -// if (LOGGER.isDebugEnabled()) { -// LOGGER.debug("失败详情:", e); // 优化点6:按需输出详细日志 -// } -// } -// // ================ 优化点7:移除冗余日志(原LOGGER.info) ================ -// return new DualTreeResponse(dtos); -// } -// -// // ================ 优化点8:提取查询条件构建方法 ================ -// private QueryWrapper buildQueryWrapper(List dataset, String nodeId, String taskId) { -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// queryWrapper.select("id", "node_id", "task_id", "is_file", "parent_id", "file_name", -// "file_size", "work_path", "backup_path", "upload_time"); // 移除无用字段 -// -// if (StringUtils.isNoneEmpty(nodeId, taskId)) { -// queryWrapper.eq("task_id", taskId) -// .eq("node_id", nodeId) -// .isNotNull("work_path") -// .ne("work_path", "") -// .and(wq -> wq.isNull("backup_path").or().eq("backup_path", "")); -// } else { -// if (CollectionUtils.isEmpty(dataset)) { -// throw new IllegalArgumentException("dataset参数不可为空"); // 优化点9:提前校验参数 -// } -// queryWrapper.in("id", dataset) -// .isNotNull("work_path") -// .ne("work_path", "") -// .and(wq -> wq.isNull("backup_path").or().eq("backup_path", "")); -// } -// return queryWrapper; -// } -// -// // ================ 优化点10:提取DTO转换方法 ================ -// private TsFilesDTO convertToDto(TsFiles tsFile) { -// TsFilesDTO dto = new TsFilesDTO(); -// dto.setId(tsFile.getId()); -// dto.setNodeId(tsFile.getNodeId()); -// dto.setTaskId(tsFile.getTaskId()); -// dto.setIsFile(tsFile.getIsFile()); -// dto.setParentId(tsFile.getParentId()); -// dto.setFileName(tsFile.getFileName()); -// dto.setFileSize(tsFile.getFileSize()); -// dto.setWorkPath(processingPath(tsFile.getWorkPath(), tsFile.getNodeId())); // 优化点11:路径处理内聚 -// dto.setUploadTime(tsFile.getUploadTime()); -// return dto; -// } + // 获取当前父节点的子节点 + List children = tsFilesMapper.selectList(childQueryWrapper); + + if (children != null && !children.isEmpty()) { + + //allFiles.addAll(children); + + // 对每个子节点递归查询其子节点 + for (TsFiles child : children) { + child.setWorkPath(processingPath(child.getWorkPath(), child.getNodeId())); // 优化点11:路径处理内聚 + allFiles.add(child); + if ("FOLDER".equals(child.getIsFile())) { + List childChildFiles = getChildFilesRecursiveLocal(child.getId(), allFiles); + } + } + } + return allFiles; + } /********************************** @@ -2598,25 +2556,23 @@ public class TsFilesServiceImpl extends ServiceImpl impl public Page compareMinio(List dataset, String nodeId, String taskId, Page page) { // ==================== 1. 构建查询条件 ==================== QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.select( - "id", "node_id", "task_id", "is_file", - "parent_id", "file_name", "file_size", - "backup_path", "upload_time" // 明确指定返回字段 - ); + queryWrapper.select("id", "node_id", "task_id", "is_file", "parent_id", "file_name", + "file_size", "work_path", "backup_path", "upload_time"); + if (StringUtils.isNoneEmpty(nodeId, taskId)) { // 场景1:根据 nodeId + taskId 查询(确保数据库有联合索引) - queryWrapper.eq("task_id", taskId) - .eq("node_id", nodeId) + queryWrapper.eq("node_id", nodeId) + .eq("task_id", taskId) .isNotNull("backup_path") .ne("backup_path", "") .and(wq -> wq.isNull("work_path").or().eq("work_path", "")); } else { // 场景2:根据 id 列表查询(id字段需有索引) - queryWrapper.in("id", dataset) - .isNotNull("backup_path") - .ne("backup_path", "") - .and(wq -> wq.isNull("work_path").or().eq("work_path", "")); + queryWrapper.in("id", dataset); +// .isNotNull("backup_path") +// .ne("backup_path", "") +// .and(wq -> wq.isNull("work_path").or().eq("work_path", "")); } Page tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper); if (tsFilesPage == null) { @@ -2625,90 +2581,52 @@ public class TsFilesServiceImpl extends ServiceImpl impl } List records = tsFilesPage.getRecords(); + // 递归查询每个记录的子节点,并添加到 records 中 + List allFiles = new ArrayList<>(); for (TsFiles tsFiles : records) { tsFiles.setBackupPath(processingPath(tsFiles.getBackupPath(), tsFiles.getNodeId())); + // 如果工作路径为空 增加 将当前节点加入结果列表 + if (StringUtils.isEmpty(tsFiles.getWorkPath())) { + allFiles.add(tsFiles); + } + // 查询该节点的所有子节点并递归添加 + if ("FOLDER".equals(tsFiles.getIsFile())) { + List childFiles = getChildFilesRecursiveMinio(tsFiles.getId(), allFiles); + } } - tsFilesPage.setRecords(records); // 同步到 tsFilesPage - System.out.println("Updated records: " + records); - + tsFilesPage.setTotal(allFiles.size()); + tsFilesPage.setRecords(allFiles); // 同步到 tsFilesPage + System.out.println("Updated records: " + allFiles); return tsFilesPage; } + // 递归查询所有子节点 + private List getChildFilesRecursiveMinio(String parentId, List allFiles) { + // 构建查询条件,获取当前parentId的所有子节点 + QueryWrapper childQueryWrapper = new QueryWrapper<>(); + childQueryWrapper.eq("parent_id", parentId) + .isNotNull("backup_path") + .ne("backup_path", "") + .and(wq -> wq.isNull("work_path").or().eq("work_path", "")); -// @Override -// public DualTreeResponse compareMinio(List dataset, String nodeId, String taskId) { -// List dtos = new CopyOnWriteArrayList<>(); -// try { -// // ==================== 1. 构建查询条件 ==================== -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// queryWrapper.select( -// "id", "node_id", "task_id", "is_file", -// "parent_id", "file_name", "file_size", -// "backup_path", "upload_time" // 明确指定返回字段 -// ); -// -// if (StringUtils.isNoneEmpty(nodeId, taskId)) { -// // 场景1:根据 nodeId + taskId 查询(确保数据库有联合索引) -// queryWrapper.eq("task_id", taskId) -// .eq("node_id", nodeId) -// .isNotNull("backup_path") -// .ne("backup_path", "") -// .and(wq -> wq.isNull("work_path").or().eq("work_path", "")); -// } else { -// // 场景2:根据 id 列表查询(id字段需有索引) -// if (CollectionUtils.isEmpty(dataset)) { -// LOGGER.warn("Dataset参数无效"); -// return new DualTreeResponse(dtos); -// } -// queryWrapper.in("id", dataset) -// .isNotNull("backup_path") -// .ne("backup_path", "") -// .and(wq -> wq.isNull("work_path").or().eq("work_path", "")); -// } -// -// // ==================== 2. 分页查询处理 ==================== -// int pageSize = 1000; // 根据内存调整分页大小 -// int currentPage = 1; -// boolean hasMore = true; -// -// while (hasMore) { -// Page page = new Page<>(currentPage, pageSize); -// Page resultPage = tsFilesMapper.selectPage(page, queryWrapper); -// -// // ==================== 3. 并行流转换数据 ==================== -// List pageDtos = resultPage.getRecords() -// .parallelStream() // 并行处理(确保processingPath线程安全) -// .map(tsFile -> { -// TsFilesDTO dto = new TsFilesDTO(); -// dto.setId(tsFile.getId()); -// dto.setNodeId(tsFile.getNodeId()); -// dto.setTaskId(tsFile.getTaskId()); -// dto.setIsFile(tsFile.getIsFile()); -// dto.setParentId(tsFile.getParentId()); -// dto.setFileName(tsFile.getFileName()); -// dto.setFileSize(tsFile.getFileSize()); -// dto.setBackupPath(processingPath(tsFile.getBackupPath(), tsFile.getNodeId())); -// dto.setUploadTime(tsFile.getUploadTime()); -// return dto; -// }) -// .collect(Collectors.toList()); -// -// dtos.addAll(pageDtos); -// -// // ==================== 4. 判断是否继续查询 ==================== -// hasMore = resultPage.getCurrent() < resultPage.getPages(); -// currentPage++; -// } -// -// } catch (Exception e) { -// LOGGER.error("MinIO文件对比失败: {}", e.getMessage()); // 精简日志内容 -// if (LOGGER.isDebugEnabled()) { // 仅调试模式打印堆栈 -// LOGGER.debug("详细错误信息:", e); -// } -// } -// return new DualTreeResponse(dtos); -// } + // 获取当前父节点的子节点 + List children = tsFilesMapper.selectList(childQueryWrapper); + + if (children != null && !children.isEmpty()) { + // 对每个子节点递归查询其子节点 + for (TsFiles child : children) { + child.setBackupPath(processingPath(child.getBackupPath(), child.getNodeId())); + + allFiles.add(child); + + if ("FOLDER".equals(child.getIsFile())) { + List childChildFiles = getChildFilesRecursiveLocal(child.getId(), allFiles); + } + } + } + return allFiles; + } /********************************** @@ -2724,11 +2642,31 @@ public class TsFilesServiceImpl extends ServiceImpl impl StorageSourceConfig filePathConfig = getStorageConfig("filePath"); StorageSourceConfig bucketConfig = getStorageConfig("bucketName"); - // ================ 1. 执行原始分页查询 ================ QueryWrapper queryWrapper = buildQueryWrapper(dataset, nodeId, taskId); Page tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper); + if (StringUtils.isEmpty(nodeId) || StringUtils.isEmpty(taskId)) { + if (tsFilesPage == null) { + tsFilesPage = new Page<>(); + tsFilesPage.setRecords(new ArrayList<>()); // 确保 records 被初始化 + } + + List records = tsFilesPage.getRecords(); + // 递归查询每个记录的子节点,并添加到 records 中 + List allFiles = new ArrayList<>(); + for (TsFiles tsFiles : records) { + // 将当前节点加入结果列表 + allFiles.add(tsFiles); + // 查询该节点的所有子节点并递归添加 + if ("FOLDER".equals(tsFiles.getIsFile())) { + List childFiles = getChildFilesRecursiveMd5(tsFiles.getId(), allFiles); + } + } + tsFilesPage.setRecords(allFiles); // 同步到 tsFilesPage + System.out.println("Updated records: " + allFiles); + } + // ================ 2. 过滤并处理符合条件的记录 ================ List filteredRecords = tsFilesPage.getRecords().stream() @@ -2752,8 +2690,6 @@ public class TsFilesServiceImpl extends ServiceImpl impl // 返回是否满足过滤条件 return StringUtils.isNoneEmpty(localMD5, minioMD5) && !localMD5.equals(minioMD5); - - } catch (Exception e) { LOGGER.error("MD5计算失败: {}", tsFile.getFileName(), e); return false; @@ -2773,66 +2709,34 @@ public class TsFilesServiceImpl extends ServiceImpl impl ); return resultPage; - - -// // ==================== 1. 构建查询条件 ==================== -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// if (StringUtils.isNoneEmpty(nodeId, taskId)) { -// //查询数据库中 minio路径有值 本地没有值的所有数据 根据nodeId,taskid -// queryWrapper.select("id", "node_id", "task_id", "is_file", "parent_id", "file_name", "file_size", "work_path", "backup_path", "upload_time", "update_time"); -// queryWrapper.eq("task_id", taskId) -// .eq("node_id", nodeId) -// .isNotNull("backup_path") -// .ne("backup_path", "") -// .isNotNull("work_path") -// .ne("work_path", ""); -// System.out.println("完整SQL: " + queryWrapper.getCustomSqlSegment()); -// } else { -// //查询数据库中 minio路径有值 本地没有值的所有数据 根据id -// queryWrapper.in("id", dataset) -// .isNotNull("backup_path") -// .ne("backup_path", "") -// .isNotNull("work_path") -// .ne("work_path", ""); -// } -// Page tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper); -// if (tsFilesPage == null) { -// tsFilesPage = new Page<>(); -// tsFilesPage.setRecords(new ArrayList<>()); // 确保 records 被初始化 -// } -// -// List records = tsFilesPage.getRecords(); -// for (TsFiles tsFiles : records) { -// -// File localFileObj = new File(filePathConfig.getValue() + tsFiles.getWorkPath(), tsFiles.getFileName()); -// String localMD5 = null; -// try { -// localMD5 = calculateMD5Data(new FileInputStream(localFileObj)); -// } catch (IOException e) { -// e.printStackTrace(); -// } catch (NoSuchAlgorithmException e) { -// e.printStackTrace(); -// } -// String minioMD5 = getMinioMD5Data(bucketConfig.getValue(), tsFiles.getBackupPath(), tsFiles.getFileName()); -// String WorkPath = processingPath(tsFiles.getWorkPath(), tsFiles.getNodeId()); -// String BackupPath = processingPath(tsFiles.getBackupPath(), tsFiles.getNodeId()); -// tsFiles.setWorkPath(WorkPath); -// tsFiles.setBackupPath(BackupPath); -// -// if (StringUtils.isNoneEmpty(localMD5, minioMD5) && !localMD5.equals(minioMD5)) { -// tsFiles.setLocatMd5(localMD5); -// tsFiles.setMinioMd5(minioMD5); -// } -// -// } -// tsFilesPage.setRecords(records); // 同步到 tsFilesPage -// System.out.println("Updated records: " + records); -// -// return tsFilesPage; - } + // 递归查询所有子节点 + private List getChildFilesRecursiveMd5(String parentId, List allFiles) { + // 构建查询条件,获取当前parentId的所有子节点 + QueryWrapper childQueryWrapper = new QueryWrapper<>(); + childQueryWrapper.eq("parent_id", parentId) + .isNotNull("backup_path") + .ne("backup_path", "") + .isNotNull("work_path") + .ne("work_path", ""); + + // 获取当前父节点的子节点 + List children = tsFilesMapper.selectList(childQueryWrapper); + + if (children != null && !children.isEmpty()) { + allFiles.addAll(children); + // 对每个子节点递归查询其子节点 + for (TsFiles child : children) { + if ("FOLDER".equals(child.getIsFile())) { + List childChildFiles = getChildFilesRecursiveLocal(child.getId(), allFiles); + } + } + } + return allFiles; + } + // ================ 辅助方法:构建查询条件 ================ private QueryWrapper buildQueryWrapper(List dataset, String nodeId, String taskId) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -2840,8 +2744,8 @@ public class TsFilesServiceImpl extends ServiceImpl impl if (StringUtils.isNoneEmpty(nodeId, taskId)) { //查询数据库中 minio路径有值 本地没有值的所有数据 根据nodeId,taskid - queryWrapper.eq("task_id", taskId) - .eq("node_id", nodeId) + queryWrapper.eq("node_id", nodeId) + .eq("task_id", taskId) .isNotNull("backup_path") .ne("backup_path", "") .isNotNull("work_path") @@ -2858,79 +2762,6 @@ public class TsFilesServiceImpl extends ServiceImpl impl return queryWrapper; } - -// @Override -// public Page compareMd5(List dataset, String nodeId, String taskId) throws IOException, NoSuchAlgorithmException { -// // 获取本地文件路径根目录和存储空间名称 -// StorageSourceConfig filePathConfig = getStorageConfig("filePath"); -// StorageSourceConfig bucketConfig = getStorageConfig("bucketName"); -// List tsFiles = new CopyOnWriteArrayList<>(); -// List dtos = new CopyOnWriteArrayList<>(); -// -// try { -// if (StringUtils.isNoneEmpty(nodeId, taskId)) { -// //查询数据库中 minio路径有值 本地没有值的所有数据 根据nodeId,taskid -// QueryWrapper queryWrapper = new QueryWrapper<>(); -// queryWrapper.select("id", "node_id", "task_id", "is_file", "parent_id", "file_name", "file_size", "work_path", "backup_path", "upload_time", "update_time"); -// queryWrapper.eq("task_id", taskId) -// .eq("node_id", nodeId) -// .isNotNull("backup_path") -// .ne("backup_path", "") -// .isNotNull("work_path") -// .ne("work_path", ""); -// tsFiles = tsFilesMapper.selectList(queryWrapper); -// System.out.println("完整SQL: " + queryWrapper.getCustomSqlSegment()); -// } else { -// //查询数据库中 minio路径有值 本地没有值的所有数据 根据id -// QueryWrapper queryWrapper1 = new QueryWrapper<>(); -// queryWrapper1.select("id", "node_id", "task_id", "is_file", "parent_id", "file_name", "file_size", "work_path", "backup_path", "upload_time", "update_time"); -// queryWrapper1.in("id", dataset) -// .isNotNull("backup_path") -// .ne("backup_path", "") -// .isNotNull("work_path") -// .ne("work_path", ""); -// tsFiles = tsFilesMapper.selectList(queryWrapper1); -// } -// } catch (Exception e) { -// LOGGER.error("获取Md5文件列表: {}", e.getMessage(), e); -// } -// -// dtos = tsFiles.stream() -// .map(tsFile -> { -// TsFilesDTO dto = new TsFilesDTO(); -// dto.setId(tsFile.getId()); -// dto.setNodeId(tsFile.getNodeId()); -// dto.setTaskId(tsFile.getTaskId()); -// dto.setIsFile(tsFile.getIsFile()); -// dto.setParentId(tsFile.getParentId()); -// dto.setFileName(tsFile.getFileName()); -// dto.setFileSize(tsFile.getFileSize()); -// dto.setUploadTime(tsFile.getUploadTime()); -// File localFileObj = new File(filePathConfig.getValue() + tsFile.getWorkPath(), tsFile.getFileName()); -// String localMD5 = null; -// try { -// localMD5 = calculateMD5Data(new FileInputStream(localFileObj)); -// } catch (IOException e) { -// e.printStackTrace(); -// } catch (NoSuchAlgorithmException e) { -// e.printStackTrace(); -// } -// String minioMD5 = getMinioMD5Data(bucketConfig.getValue(), tsFile.getBackupPath(), tsFile.getFileName()); -// String WorkPath = processingPath(tsFile.getWorkPath(), tsFile.getNodeId()); -// String BackupPath = processingPath(tsFile.getBackupPath(), tsFile.getNodeId()); -// dto.setWorkPath(WorkPath); -// dto.setBackupPath(BackupPath); -// -// if (StringUtils.isNoneEmpty(localMD5, minioMD5) && !localMD5.equals(minioMD5)) { -// dto.setLocatMd5(localMD5); -// dto.setMinioMd5(minioMD5); -// } -// return dto; -// }) -// .collect(Collectors.toList()); -// return dtos; -// } - // 辅助方法:获取 MinIO 文件 MD5 private String getMinioMD5Data(String bucketName, String path, String name) { AbstractBaseFileService minioService = storageSourceContext.getByStorageKey("minio"); @@ -3202,8 +3033,8 @@ public class TsFilesServiceImpl extends ServiceImpl impl public String automaticFileBackup(String taskId, String nodeId) { //首先查询节点下面所有 备份路径为空的数据 QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("task_id", taskId); queryWrapper.eq("node_id", nodeId); + queryWrapper.eq("task_id", taskId); queryWrapper.and(wrapper -> wrapper.isNull("backup_path").or().eq("backup_path", "")); queryWrapper.isNotNull("work_path").ne("work_path", ""); List tsFilelist = tsFilesMapper.selectList(queryWrapper); @@ -3529,11 +3360,12 @@ public class TsFilesServiceImpl extends ServiceImpl impl String targetFileName = generateTargetFileName(targetParentPhysicalPath, fileName, rename, type); Path targetPath = targetParentPhysicalPath.resolve(targetFileName); - // 3. 再次检查自移动 - if (sourcePath.equals(targetPath)) { - throw new IllegalArgumentException("不能移动到自己当前位置"); + // 3. 再次检查自移动 如果是覆盖不需要校验这个 + if ("1".equals(type)) { + if (sourcePath.equals(targetPath)) { + throw new IllegalArgumentException("不能移动到自己当前位置"); + } } - // 执行移动操作 moveFile(sourcePath, targetPath, type); @@ -3649,8 +3481,8 @@ public class TsFilesServiceImpl extends ServiceImpl impl newfileRecord.setFileName(targetFileName); newfileRecord.setUpdateTime(new Timestamp(System.currentTimeMillis())); // 更新时间 tsFilesMapper.updateById(newfileRecord); - // 删除原记录 - tsFilesMapper.deleteById(fileRecord.getId()); +// // 删除原记录 覆盖的时候不用删除原来的记录 +// tsFilesMapper.deleteById(fileRecord.getId()); } else { // 插入新记录 TsFiles newRecord = new TsFiles(); @@ -3672,9 +3504,10 @@ public class TsFilesServiceImpl extends ServiceImpl impl // 先移动子项再删除原记录 moveChildrenRecords(oldWorkPath, newWorkPath + targetFileName + "/", newRecord.getId(), type, fileRecord.getId()); } + // 删除原记录 + tsFilesMapper.deleteById(fileRecord.getId()); } - // 删除原记录 - tsFilesMapper.deleteById(fileRecord.getId()); + } else { // 重命名模式:插入新记录 @@ -4075,12 +3908,12 @@ public class TsFilesServiceImpl extends ServiceImpl impl LOGGER.info("Starting to build dual trees for taskId={}, nodeId={}", taskId, nodeId); // 1. 批量查询所有相关节点 QueryWrapper queryWrapper = new QueryWrapper<>(); - if (taskId != null && !taskId.isEmpty()) { - queryWrapper.eq("task_id", taskId); - } if (nodeId != null && !nodeId.isEmpty()) { queryWrapper.eq("node_id", nodeId); } + if (taskId != null && !taskId.isEmpty()) { + queryWrapper.eq("task_id", taskId); + } queryWrapper.isNotNull("work_path").ne("work_path", ""); // queryWrapper.eq("parent_id", "00"); @@ -4131,12 +3964,13 @@ public class TsFilesServiceImpl extends ServiceImpl impl LOGGER.info("Starting to build dual trees for taskId={}, nodeId={}", taskId, nodeId); // 1. 批量查询所有相关节点 QueryWrapper queryWrapper = new QueryWrapper<>(); - if (taskId != null && !taskId.isEmpty()) { - queryWrapper.eq("task_id", taskId); - } if (nodeId != null && !nodeId.isEmpty()) { queryWrapper.eq("node_id", nodeId); } + if (taskId != null && !taskId.isEmpty()) { + queryWrapper.eq("task_id", taskId); + } + queryWrapper.isNotNull("backup_path").ne("backup_path", ""); // queryWrapper.eq("parent_id", "00"); List allNodes = tsFilesMapper.selectList(queryWrapper);