提交代码
This commit is contained in:
parent
1849b97650
commit
3122c18550
@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
|
// 查询该节点的所有子节点并递归添加
|
||||||
|
if ("FOLDER".equals(tsFiles.getIsFile())) {
|
||||||
|
List<TsFiles> childFiles = getChildFilesRecursiveLocal(tsFiles.getId(), allFiles);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tsFilesPage.setRecords(records); // 同步到 tsFilesPage
|
tsFilesPage.setTotal(allFiles.size());
|
||||||
System.out.println("Updated records: " + records);
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
// 查询该节点的所有子节点并递归添加
|
||||||
|
if ("FOLDER".equals(tsFiles.getIsFile())) {
|
||||||
|
List<TsFiles> childFiles = getChildFilesRecursiveMinio(tsFiles.getId(), allFiles);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tsFilesPage.setRecords(records); // 同步到 tsFilesPage
|
tsFilesPage.setTotal(allFiles.size());
|
||||||
System.out.println("Updated records: " + records);
|
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路径有值 本地没有值的所有数据 根据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<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路径有值 本地没有值的所有数据 根据nodeId,taskid
|
//查询数据库中 minio路径有值 本地没有值的所有数据 根据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", "")
|
||||||
.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路径有值 本地没有值的所有数据 根据nodeId,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", "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 (sourcePath.equals(targetPath)) {
|
if ("1".equals(type)) {
|
||||||
throw new IllegalArgumentException("不能移动到自己当前位置");
|
if (sourcePath.equals(targetPath)) {
|
||||||
|
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user