提交代码

This commit is contained in:
lilin 2025-04-10 16:26:26 +08:00
parent 1849b97650
commit 3122c18550

View File

@ -137,8 +137,9 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>(); QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>();
// 固定条件过滤 // 固定条件过滤
if (StringUtils.isNotBlank(taskId)) queryWrapper.eq("task_id", taskId);
if (StringUtils.isNotBlank(nodeId)) queryWrapper.eq("node_id", nodeId); 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); if (StringUtils.isNotBlank(fileName)) queryWrapper.like("file_name", fileName);
@ -2460,20 +2461,16 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
* 参数说明 id 文件id * 参数说明 id 文件id
* 返回值说明: com.yfd.platform.config.ResponseResult 返回成功或者失败 * 返回值说明: com.yfd.platform.config.ResponseResult 返回成功或者失败
***********************************/ ***********************************/
@Override @Override
public Page<TsFiles> compareLocal(List<String> dataset, String nodeId, String taskId, Page<TsFiles> page) { public Page<TsFiles> compareLocal(List<String> dataset, String nodeId, String taskId, Page<TsFiles> page) {
// ==================== 1. 构建查询条件 ==================== // ==================== 1. 构建查询条件 ====================
QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>(); QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>();
queryWrapper.select("id", "node_id", "task_id", "is_file", "parent_id", "file_name", queryWrapper.select("id", "node_id", "task_id", "is_file", "parent_id", "file_name",
"file_size", "work_path", "backup_path", "upload_time"); // 移除无用字段 "file_size", "work_path", "backup_path", "upload_time"); // 移除无用字段
if (StringUtils.isNoneEmpty(nodeId, taskId)) { if (StringUtils.isNoneEmpty(nodeId, taskId)) {
queryWrapper.eq("task_id", taskId) queryWrapper.eq("node_id", nodeId)
.eq("node_id", nodeId) .eq("task_id", taskId)
.isNotNull("work_path") .isNotNull("work_path")
.ne("work_path", "") .ne("work_path", "")
.and(wq -> wq.isNull("backup_path").or().eq("backup_path", "")); .and(wq -> wq.isNull("backup_path").or().eq("backup_path", ""));
@ -2481,104 +2478,65 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
if (CollectionUtils.isEmpty(dataset)) { if (CollectionUtils.isEmpty(dataset)) {
throw new IllegalArgumentException("dataset参数不可为空"); // 优化点9提前校验参数 throw new IllegalArgumentException("dataset参数不可为空"); // 优化点9提前校验参数
} }
queryWrapper.in("id", dataset) queryWrapper.in("id", dataset);
.isNotNull("work_path")
.ne("work_path", "") // .isNotNull("work_path")
.and(wq -> wq.isNull("backup_path").or().eq("backup_path", "")); // .ne("work_path", "")
// .and(wq -> wq.isNull("backup_path").or().eq("backup_path", ""));
} }
Page<TsFiles> tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper); Page<TsFiles> tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper);
if (tsFilesPage == null) { if (tsFilesPage == null) {
tsFilesPage = new Page<>(); tsFilesPage = new Page<>();
tsFilesPage.setRecords(new ArrayList<>()); // 确保 records 被初始化 tsFilesPage.setRecords(new ArrayList<>()); // 确保 records 被初始化
} }
List<TsFiles> records = tsFilesPage.getRecords(); List<TsFiles> records = tsFilesPage.getRecords();
// 递归查询每个记录的子节点并添加到 records
List<TsFiles> allFiles = new ArrayList<>();
for (TsFiles tsFiles : records) { for (TsFiles tsFiles : records) {
tsFiles.setWorkPath(processingPath(tsFiles.getWorkPath(), tsFiles.getNodeId())); // 优化点11路径处理内聚 tsFiles.setWorkPath(processingPath(tsFiles.getWorkPath(), tsFiles.getNodeId())); // 优化点11路径处理内聚
// 如果备份路径为空 增加 将当前节点加入结果列表
if (StringUtils.isEmpty(tsFiles.getBackupPath())) {
allFiles.add(tsFiles);
} }
tsFilesPage.setRecords(records); // 同步到 tsFilesPage // 查询该节点的所有子节点并递归添加
System.out.println("Updated records: " + records); if ("FOLDER".equals(tsFiles.getIsFile())) {
List<TsFiles> childFiles = getChildFilesRecursiveLocal(tsFiles.getId(), allFiles);
}
}
tsFilesPage.setTotal(allFiles.size());
tsFilesPage.setRecords(allFiles); // 更新 tsFilesPage 中的 records
System.out.println("Updated all files: " + allFiles);
return tsFilesPage; return tsFilesPage;
} }
// 递归查询所有子节点
private List<TsFiles> getChildFilesRecursiveLocal(String parentId, List<TsFiles> allFiles) {
// 构建查询条件获取当前parentId的所有子节点
QueryWrapper<TsFiles> 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<String> dataset, String nodeId, String taskId) { List<TsFiles> children = tsFilesMapper.selectList(childQueryWrapper);
// // ================ 优化点1改用普通集合提升性能 ================
// List<TsFilesDTO> dtos = new ArrayList<>(); if (children != null && !children.isEmpty()) {
// try {
// // ================ 优化点2分页查询避免内存溢出 ================ //allFiles.addAll(children);
// int pageSize = 1000; // 从配置文件读取示例@Value("${query.page-size:1000}")
// int currentPage = 1; // 对每个子节点递归查询其子节点
// boolean hasMore; for (TsFiles child : children) {
// child.setWorkPath(processingPath(child.getWorkPath(), child.getNodeId())); // 优化点11路径处理内聚
// do { allFiles.add(child);
// Page<TsFiles> page = new Page<>(currentPage, pageSize); if ("FOLDER".equals(child.getIsFile())) {
// QueryWrapper<TsFiles> queryWrapper = buildQueryWrapper(dataset, nodeId, taskId); List<TsFiles> childChildFiles = getChildFilesRecursiveLocal(child.getId(), allFiles);
// }
// // ================ 优化点3分页查询并直接映射DTO ================ }
// Page<TsFiles> resultPage = tsFilesMapper.selectPage(page, queryWrapper); }
// List<TsFilesDTO> pageDtos = resultPage.getRecords().stream() return allFiles;
// .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<TsFiles> buildQueryWrapper(List<String> dataset, String nodeId, String taskId) {
// QueryWrapper<TsFiles> 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;
// }
/********************************** /**********************************
@ -2598,25 +2556,23 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
public Page<TsFiles> compareMinio(List<String> dataset, String nodeId, String taskId, Page<TsFiles> page) { public Page<TsFiles> compareMinio(List<String> dataset, String nodeId, String taskId, Page<TsFiles> page) {
// ==================== 1. 构建查询条件 ==================== // ==================== 1. 构建查询条件 ====================
QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>(); QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>();
queryWrapper.select( queryWrapper.select("id", "node_id", "task_id", "is_file", "parent_id", "file_name",
"id", "node_id", "task_id", "is_file", "file_size", "work_path", "backup_path", "upload_time");
"parent_id", "file_name", "file_size",
"backup_path", "upload_time" // 明确指定返回字段
);
if (StringUtils.isNoneEmpty(nodeId, taskId)) { if (StringUtils.isNoneEmpty(nodeId, taskId)) {
// 场景1根据 nodeId + taskId 查询确保数据库有联合索引 // 场景1根据 nodeId + taskId 查询确保数据库有联合索引
queryWrapper.eq("task_id", taskId) queryWrapper.eq("node_id", nodeId)
.eq("node_id", nodeId) .eq("task_id", taskId)
.isNotNull("backup_path") .isNotNull("backup_path")
.ne("backup_path", "") .ne("backup_path", "")
.and(wq -> wq.isNull("work_path").or().eq("work_path", "")); .and(wq -> wq.isNull("work_path").or().eq("work_path", ""));
} else { } else {
// 场景2根据 id 列表查询id字段需有索引 // 场景2根据 id 列表查询id字段需有索引
queryWrapper.in("id", dataset) queryWrapper.in("id", dataset);
.isNotNull("backup_path") // .isNotNull("backup_path")
.ne("backup_path", "") // .ne("backup_path", "")
.and(wq -> wq.isNull("work_path").or().eq("work_path", "")); // .and(wq -> wq.isNull("work_path").or().eq("work_path", ""));
} }
Page<TsFiles> tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper); Page<TsFiles> tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper);
if (tsFilesPage == null) { if (tsFilesPage == null) {
@ -2625,90 +2581,52 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
} }
List<TsFiles> records = tsFilesPage.getRecords(); List<TsFiles> records = tsFilesPage.getRecords();
// 递归查询每个记录的子节点并添加到 records
List<TsFiles> allFiles = new ArrayList<>();
for (TsFiles tsFiles : records) { for (TsFiles tsFiles : records) {
tsFiles.setBackupPath(processingPath(tsFiles.getBackupPath(), tsFiles.getNodeId())); tsFiles.setBackupPath(processingPath(tsFiles.getBackupPath(), tsFiles.getNodeId()));
// 如果工作路径为空 增加 将当前节点加入结果列表
if (StringUtils.isEmpty(tsFiles.getWorkPath())) {
allFiles.add(tsFiles);
} }
tsFilesPage.setRecords(records); // 同步到 tsFilesPage // 查询该节点的所有子节点并递归添加
System.out.println("Updated records: " + records); if ("FOLDER".equals(tsFiles.getIsFile())) {
List<TsFiles> childFiles = getChildFilesRecursiveMinio(tsFiles.getId(), allFiles);
}
}
tsFilesPage.setTotal(allFiles.size());
tsFilesPage.setRecords(allFiles); // 同步到 tsFilesPage
System.out.println("Updated records: " + allFiles);
return tsFilesPage; return tsFilesPage;
} }
// 递归查询所有子节点
private List<TsFiles> getChildFilesRecursiveMinio(String parentId, List<TsFiles> allFiles) {
// 构建查询条件获取当前parentId的所有子节点
QueryWrapper<TsFiles> 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<String> dataset, String nodeId, String taskId) { List<TsFiles> children = tsFilesMapper.selectList(childQueryWrapper);
// List<TsFilesDTO> dtos = new CopyOnWriteArrayList<>();
// try { if (children != null && !children.isEmpty()) {
// // ==================== 1. 构建查询条件 ==================== // 对每个子节点递归查询其子节点
// QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>(); for (TsFiles child : children) {
// queryWrapper.select( child.setBackupPath(processingPath(child.getBackupPath(), child.getNodeId()));
// "id", "node_id", "task_id", "is_file",
// "parent_id", "file_name", "file_size", allFiles.add(child);
// "backup_path", "upload_time" // 明确指定返回字段
// ); if ("FOLDER".equals(child.getIsFile())) {
// List<TsFiles> childChildFiles = getChildFilesRecursiveLocal(child.getId(), allFiles);
// if (StringUtils.isNoneEmpty(nodeId, taskId)) { }
// // 场景1根据 nodeId + taskId 查询确保数据库有联合索引 }
// queryWrapper.eq("task_id", taskId) }
// .eq("node_id", nodeId) return allFiles;
// .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<TsFiles> page = new Page<>(currentPage, pageSize);
// Page<TsFiles> resultPage = tsFilesMapper.selectPage(page, queryWrapper);
//
// // ==================== 3. 并行流转换数据 ====================
// List<TsFilesDTO> 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);
// }
/********************************** /**********************************
@ -2724,11 +2642,31 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
StorageSourceConfig filePathConfig = getStorageConfig("filePath"); StorageSourceConfig filePathConfig = getStorageConfig("filePath");
StorageSourceConfig bucketConfig = getStorageConfig("bucketName"); StorageSourceConfig bucketConfig = getStorageConfig("bucketName");
// ================ 1. 执行原始分页查询 ================ // ================ 1. 执行原始分页查询 ================
QueryWrapper<TsFiles> queryWrapper = buildQueryWrapper(dataset, nodeId, taskId); QueryWrapper<TsFiles> queryWrapper = buildQueryWrapper(dataset, nodeId, taskId);
Page<TsFiles> tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper); Page<TsFiles> tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper);
if (StringUtils.isEmpty(nodeId) || StringUtils.isEmpty(taskId)) {
if (tsFilesPage == null) {
tsFilesPage = new Page<>();
tsFilesPage.setRecords(new ArrayList<>()); // 确保 records 被初始化
}
List<TsFiles> records = tsFilesPage.getRecords();
// 递归查询每个记录的子节点并添加到 records
List<TsFiles> allFiles = new ArrayList<>();
for (TsFiles tsFiles : records) {
// 将当前节点加入结果列表
allFiles.add(tsFiles);
// 查询该节点的所有子节点并递归添加
if ("FOLDER".equals(tsFiles.getIsFile())) {
List<TsFiles> childFiles = getChildFilesRecursiveMd5(tsFiles.getId(), allFiles);
}
}
tsFilesPage.setRecords(allFiles); // 同步到 tsFilesPage
System.out.println("Updated records: " + allFiles);
}
// ================ 2. 过滤并处理符合条件的记录 ================ // ================ 2. 过滤并处理符合条件的记录 ================
List<TsFiles> filteredRecords = tsFilesPage.getRecords().stream() List<TsFiles> filteredRecords = tsFilesPage.getRecords().stream()
@ -2752,8 +2690,6 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
// 返回是否满足过滤条件 // 返回是否满足过滤条件
return StringUtils.isNoneEmpty(localMD5, minioMD5) && !localMD5.equals(minioMD5); return StringUtils.isNoneEmpty(localMD5, minioMD5) && !localMD5.equals(minioMD5);
} catch (Exception e) { } catch (Exception e) {
LOGGER.error("MD5计算失败: {}", tsFile.getFileName(), e); LOGGER.error("MD5计算失败: {}", tsFile.getFileName(), e);
return false; return false;
@ -2773,66 +2709,34 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
); );
return resultPage; return resultPage;
// // ==================== 1. 构建查询条件 ====================
// QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>();
// if (StringUtils.isNoneEmpty(nodeId, taskId)) {
// //查询数据库中 minio路径有值 本地没有值的所有数据 根据nodeIdtaskid
// 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<TsFiles> tsFilesPage = tsFilesMapper.selectPage(page, queryWrapper);
// if (tsFilesPage == null) {
// tsFilesPage = new Page<>();
// tsFilesPage.setRecords(new ArrayList<>()); // 确保 records 被初始化
// }
//
// List<TsFiles> 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<TsFiles> getChildFilesRecursiveMd5(String parentId, List<TsFiles> allFiles) {
// 构建查询条件获取当前parentId的所有子节点
QueryWrapper<TsFiles> childQueryWrapper = new QueryWrapper<>();
childQueryWrapper.eq("parent_id", parentId)
.isNotNull("backup_path")
.ne("backup_path", "")
.isNotNull("work_path")
.ne("work_path", "");
// 获取当前父节点的子节点
List<TsFiles> children = tsFilesMapper.selectList(childQueryWrapper);
if (children != null && !children.isEmpty()) {
allFiles.addAll(children);
// 对每个子节点递归查询其子节点
for (TsFiles child : children) {
if ("FOLDER".equals(child.getIsFile())) {
List<TsFiles> childChildFiles = getChildFilesRecursiveLocal(child.getId(), allFiles);
}
}
}
return allFiles;
}
// ================ 辅助方法构建查询条件 ================ // ================ 辅助方法构建查询条件 ================
private QueryWrapper<TsFiles> buildQueryWrapper(List<String> dataset, String nodeId, String taskId) { private QueryWrapper<TsFiles> buildQueryWrapper(List<String> dataset, String nodeId, String taskId) {
QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>(); QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>();
@ -2840,8 +2744,8 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
if (StringUtils.isNoneEmpty(nodeId, taskId)) { if (StringUtils.isNoneEmpty(nodeId, taskId)) {
//查询数据库中 minio路径有值 本地没有值的所有数据 根据nodeIdtaskid //查询数据库中 minio路径有值 本地没有值的所有数据 根据nodeIdtaskid
queryWrapper.eq("task_id", taskId) queryWrapper.eq("node_id", nodeId)
.eq("node_id", nodeId) .eq("task_id", taskId)
.isNotNull("backup_path") .isNotNull("backup_path")
.ne("backup_path", "") .ne("backup_path", "")
.isNotNull("work_path") .isNotNull("work_path")
@ -2858,79 +2762,6 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
return queryWrapper; return queryWrapper;
} }
// @Override
// public Page<TsFiles> compareMd5(List<String> dataset, String nodeId, String taskId) throws IOException, NoSuchAlgorithmException {
// // 获取本地文件路径根目录和存储空间名称
// StorageSourceConfig filePathConfig = getStorageConfig("filePath");
// StorageSourceConfig bucketConfig = getStorageConfig("bucketName");
// List<TsFiles> tsFiles = new CopyOnWriteArrayList<>();
// List<TsFilesDTO> dtos = new CopyOnWriteArrayList<>();
//
// try {
// if (StringUtils.isNoneEmpty(nodeId, taskId)) {
// //查询数据库中 minio路径有值 本地没有值的所有数据 根据nodeIdtaskid
// QueryWrapper<TsFiles> 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<TsFiles> 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 // 辅助方法获取 MinIO 文件 MD5
private String getMinioMD5Data(String bucketName, String path, String name) { private String getMinioMD5Data(String bucketName, String path, String name) {
AbstractBaseFileService<?> minioService = storageSourceContext.getByStorageKey("minio"); AbstractBaseFileService<?> minioService = storageSourceContext.getByStorageKey("minio");
@ -3202,8 +3033,8 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
public String automaticFileBackup(String taskId, String nodeId) { public String automaticFileBackup(String taskId, String nodeId) {
//首先查询节点下面所有 备份路径为空的数据 //首先查询节点下面所有 备份路径为空的数据
QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>(); QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("task_id", taskId);
queryWrapper.eq("node_id", nodeId); queryWrapper.eq("node_id", nodeId);
queryWrapper.eq("task_id", taskId);
queryWrapper.and(wrapper -> wrapper.isNull("backup_path").or().eq("backup_path", "")); queryWrapper.and(wrapper -> wrapper.isNull("backup_path").or().eq("backup_path", ""));
queryWrapper.isNotNull("work_path").ne("work_path", ""); queryWrapper.isNotNull("work_path").ne("work_path", "");
List<TsFiles> tsFilelist = tsFilesMapper.selectList(queryWrapper); List<TsFiles> tsFilelist = tsFilesMapper.selectList(queryWrapper);
@ -3529,11 +3360,12 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
String targetFileName = generateTargetFileName(targetParentPhysicalPath, fileName, rename, type); String targetFileName = generateTargetFileName(targetParentPhysicalPath, fileName, rename, type);
Path targetPath = targetParentPhysicalPath.resolve(targetFileName); Path targetPath = targetParentPhysicalPath.resolve(targetFileName);
// 3. 再次检查自移动 // 3. 再次检查自移动 如果是覆盖不需要校验这个
if ("1".equals(type)) {
if (sourcePath.equals(targetPath)) { if (sourcePath.equals(targetPath)) {
throw new IllegalArgumentException("不能移动到自己当前位置"); throw new IllegalArgumentException("不能移动到自己当前位置");
} }
}
// 执行移动操作 // 执行移动操作
moveFile(sourcePath, targetPath, type); moveFile(sourcePath, targetPath, type);
@ -3649,8 +3481,8 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
newfileRecord.setFileName(targetFileName); newfileRecord.setFileName(targetFileName);
newfileRecord.setUpdateTime(new Timestamp(System.currentTimeMillis())); // 更新时间 newfileRecord.setUpdateTime(new Timestamp(System.currentTimeMillis())); // 更新时间
tsFilesMapper.updateById(newfileRecord); tsFilesMapper.updateById(newfileRecord);
// 删除原记录 // // 删除原记录 覆盖的时候不用删除原来的记录
tsFilesMapper.deleteById(fileRecord.getId()); // tsFilesMapper.deleteById(fileRecord.getId());
} else { } else {
// 插入新记录 // 插入新记录
TsFiles newRecord = new TsFiles(); TsFiles newRecord = new TsFiles();
@ -3672,9 +3504,10 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
// 先移动子项再删除原记录 // 先移动子项再删除原记录
moveChildrenRecords(oldWorkPath, newWorkPath + targetFileName + "/", newRecord.getId(), type, fileRecord.getId()); moveChildrenRecords(oldWorkPath, newWorkPath + targetFileName + "/", newRecord.getId(), type, fileRecord.getId());
} }
}
// 删除原记录 // 删除原记录
tsFilesMapper.deleteById(fileRecord.getId()); tsFilesMapper.deleteById(fileRecord.getId());
}
} else { } else {
// 重命名模式插入新记录 // 重命名模式插入新记录
@ -4075,12 +3908,12 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
LOGGER.info("Starting to build dual trees for taskId={}, nodeId={}", taskId, nodeId); LOGGER.info("Starting to build dual trees for taskId={}, nodeId={}", taskId, nodeId);
// 1. 批量查询所有相关节点 // 1. 批量查询所有相关节点
QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>(); QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>();
if (taskId != null && !taskId.isEmpty()) {
queryWrapper.eq("task_id", taskId);
}
if (nodeId != null && !nodeId.isEmpty()) { if (nodeId != null && !nodeId.isEmpty()) {
queryWrapper.eq("node_id", nodeId); queryWrapper.eq("node_id", nodeId);
} }
if (taskId != null && !taskId.isEmpty()) {
queryWrapper.eq("task_id", taskId);
}
queryWrapper.isNotNull("work_path").ne("work_path", ""); queryWrapper.isNotNull("work_path").ne("work_path", "");
// queryWrapper.eq("parent_id", "00"); // queryWrapper.eq("parent_id", "00");
@ -4131,12 +3964,13 @@ public class TsFilesServiceImpl extends ServiceImpl<TsFilesMapper, TsFiles> impl
LOGGER.info("Starting to build dual trees for taskId={}, nodeId={}", taskId, nodeId); LOGGER.info("Starting to build dual trees for taskId={}, nodeId={}", taskId, nodeId);
// 1. 批量查询所有相关节点 // 1. 批量查询所有相关节点
QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>(); QueryWrapper<TsFiles> queryWrapper = new QueryWrapper<>();
if (taskId != null && !taskId.isEmpty()) {
queryWrapper.eq("task_id", taskId);
}
if (nodeId != null && !nodeId.isEmpty()) { if (nodeId != null && !nodeId.isEmpty()) {
queryWrapper.eq("node_id", nodeId); queryWrapper.eq("node_id", nodeId);
} }
if (taskId != null && !taskId.isEmpty()) {
queryWrapper.eq("task_id", taskId);
}
queryWrapper.isNotNull("backup_path").ne("backup_path", ""); queryWrapper.isNotNull("backup_path").ne("backup_path", "");
// queryWrapper.eq("parent_id", "00"); // queryWrapper.eq("parent_id", "00");
List<TsFiles> allNodes = tsFilesMapper.selectList(queryWrapper); List<TsFiles> allNodes = tsFilesMapper.selectList(queryWrapper);