试验任务扫描
This commit is contained in:
parent
e598ff9cae
commit
0ce8d92a5a
@ -2,6 +2,9 @@ package com.yfd.platform.modules.experimentalData.mapper;
|
|||||||
|
|
||||||
import com.yfd.platform.modules.experimentalData.domain.TsFiles;
|
import com.yfd.platform.modules.experimentalData.domain.TsFiles;
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@ -13,4 +16,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
*/
|
*/
|
||||||
public interface TsFilesMapper extends BaseMapper<TsFiles> {
|
public interface TsFilesMapper extends BaseMapper<TsFiles> {
|
||||||
|
|
||||||
|
int batchInsertTsFiles(List<TsFiles> tsFilesToCreate);
|
||||||
|
|
||||||
|
int updateParentIdByPathHierarchy(@Param("taskId") String taskId, @Param("nodeId") String nodeId);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package com.yfd.platform.modules.experimentalData.service.impl;
|
package com.yfd.platform.modules.experimentalData.service.impl;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.IdUtil;
|
||||||
import cn.hutool.core.util.ObjUtil;
|
import cn.hutool.core.util.ObjUtil;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
@ -21,6 +22,8 @@ import com.yfd.platform.modules.specialDocument.domain.Files;
|
|||||||
import com.yfd.platform.modules.specialDocument.domain.Nodes;
|
import com.yfd.platform.modules.specialDocument.domain.Nodes;
|
||||||
import com.yfd.platform.modules.specialDocument.domain.Project;
|
import com.yfd.platform.modules.specialDocument.domain.Project;
|
||||||
import com.yfd.platform.modules.storage.context.StorageSourceContext;
|
import com.yfd.platform.modules.storage.context.StorageSourceContext;
|
||||||
|
import com.yfd.platform.modules.storage.mapper.StorageSourceConfigMapper;
|
||||||
|
import com.yfd.platform.modules.storage.model.entity.StorageSourceConfig;
|
||||||
import com.yfd.platform.modules.storage.model.enums.FileTypeEnum;
|
import com.yfd.platform.modules.storage.model.enums.FileTypeEnum;
|
||||||
import com.yfd.platform.modules.storage.model.request.BatchDeleteRequest;
|
import com.yfd.platform.modules.storage.model.request.BatchDeleteRequest;
|
||||||
import com.yfd.platform.modules.storage.model.request.NewFolderRequest;
|
import com.yfd.platform.modules.storage.model.request.NewFolderRequest;
|
||||||
@ -30,6 +33,7 @@ import com.yfd.platform.modules.storage.service.base.AbstractBaseFileService;
|
|||||||
import com.yfd.platform.system.domain.LoginUser;
|
import com.yfd.platform.system.domain.LoginUser;
|
||||||
import com.yfd.platform.utils.StringUtils;
|
import com.yfd.platform.utils.StringUtils;
|
||||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||||
|
import lombok.val;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@ -86,6 +90,10 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
|||||||
@Resource
|
@Resource
|
||||||
private StorageSourceService storageSourceService;
|
private StorageSourceService storageSourceService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private StorageSourceConfigMapper storageSourceConfigMapper;
|
||||||
|
|
||||||
|
|
||||||
//顶级父节点 Top level parent node
|
//顶级父节点 Top level parent node
|
||||||
public static final String TOP_LEVEL_PARENT_NODE = "00";
|
public static final String TOP_LEVEL_PARENT_NODE = "00";
|
||||||
|
|
||||||
@ -647,6 +655,21 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
|||||||
TsTask tsTask = tsTaskMapper.selectById(id);
|
TsTask tsTask = tsTaskMapper.selectById(id);
|
||||||
|
|
||||||
|
|
||||||
|
//文件的第一层是节点 下面的层级是文件夹
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//获取文件列表
|
//获取文件列表
|
||||||
String absolutePath = "/" + tsTask.getTaskName() + "/";
|
String absolutePath = "/" + tsTask.getTaskName() + "/";
|
||||||
FileListRequest fileListRequest = buildFileRequest(absolutePath);
|
FileListRequest fileListRequest = buildFileRequest(absolutePath);
|
||||||
@ -664,16 +687,7 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
|||||||
if (fileItemList.size() == 0) {
|
if (fileItemList.size() == 0) {
|
||||||
throw new Exception("该试验任务管理项目目录不存在或没有项目文档,请先建立项目目录和文档。");
|
throw new Exception("该试验任务管理项目目录不存在或没有项目文档,请先建立项目目录和文档。");
|
||||||
}
|
}
|
||||||
|
firstLayerData(fileItemList, id);
|
||||||
// //获取数据库父节点为0的数据 任务ID 上级节点时00
|
|
||||||
// List<TsNodes> tsNodes = tsNodesMapper.selectList(new LambdaQueryWrapper<TsNodes>().eq(TsNodes::getParentId, "00").eq(TsNodes::getTaskId, id));
|
|
||||||
//
|
|
||||||
// // 步骤 1:提取现有的 nodeName
|
|
||||||
// Set<String> existingNodeNames = tsNodes.stream().map(TsNodes::getNodeName).collect(Collectors.toSet());
|
|
||||||
//
|
|
||||||
// // 步骤 2:筛选新增数据 找到需要新增到数据库的文件夹 这个属于第一层架
|
|
||||||
// List<FileItemResult> fileItemNewList = fileItemList.stream().filter(fileItem -> !existingNodeNames.contains(fileItem.getName())).collect(Collectors.toList());
|
|
||||||
firstLayerData(fileItemList, id);
|
|
||||||
|
|
||||||
return "扫描完成";
|
return "扫描完成";
|
||||||
}
|
}
|
||||||
@ -705,27 +719,6 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
// else {
|
|
||||||
// //获取节点名称
|
|
||||||
// String nodeName = getLastPathSegment(item.getPath());
|
|
||||||
// //获取节点信息 主要用到ID
|
|
||||||
// QueryWrapper<Nodes> queryWrapper = new QueryWrapper<>();
|
|
||||||
// queryWrapper.eq("node_name", nodeName);
|
|
||||||
// queryWrapper.eq("parent_id", TOP_LEVEL_PARENT_NODE);
|
|
||||||
// Nodes node = nodesMapper.selectOne(queryWrapper);
|
|
||||||
//
|
|
||||||
// //新增之前先查询
|
|
||||||
// LambdaQueryWrapper<Files> queryWrapper1 = new LambdaQueryWrapper<>();
|
|
||||||
// queryWrapper1.eq(Files::getProjectId, projectId);
|
|
||||||
// queryWrapper1.eq(Files::getNodeId, node.getId());
|
|
||||||
// queryWrapper1.eq(Files::getFilePath, item.getPath());
|
|
||||||
// queryWrapper1.eq(Files::getFileName, item.getName());
|
|
||||||
// Files files = filesMapper.selectOne(queryWrapper1);
|
|
||||||
// if (files == null) {
|
|
||||||
// //保存文件信息
|
|
||||||
// saveFiles(projectId, node.getId(), item.getPath(), item.getName(), String.valueOf(item.getSize()));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -739,62 +732,264 @@ public class TsNodesServiceImpl extends ServiceImpl<TsNodesMapper, TsNodes> impl
|
|||||||
*/
|
*/
|
||||||
private void otherLevelsData(String taskId, String nodeId, String nodeName, String path, String parentId) throws Exception {
|
private void otherLevelsData(String taskId, String nodeId, String nodeName, String path, String parentId) throws Exception {
|
||||||
|
|
||||||
//通过节点的路径加名称 查询下面的文件及文件夹
|
|
||||||
String absolutePath = path + nodeName + "/";
|
|
||||||
//获取文件列表
|
|
||||||
FileListRequest fileListRequest = buildFileRequest(absolutePath);
|
|
||||||
String storageKey = fileListRequest.getStorageKey();
|
|
||||||
Integer storageId = storageSourceService.findIdByKey(storageKey);
|
|
||||||
if (storageId == null) {
|
|
||||||
throw new InvalidStorageSourceException("通过存储源 key 未找到存储源, key: " + storageKey);
|
|
||||||
}
|
|
||||||
// 处理请求参数默认值
|
|
||||||
fileListRequest.handleDefaultValue();
|
|
||||||
AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageId(storageId);
|
|
||||||
//todo 首先获取两个集合 对比出数据库中没有的文件夹以及文件,递归增加
|
|
||||||
List<FileItemResult> fileItemList = fileService.fileList(fileListRequest.getPath());
|
|
||||||
|
|
||||||
for (FileItemResult item : fileItemList) {
|
// 存储所有目录和文件的列表
|
||||||
//思路就是 如果是文件夹 就查询一下 没有就新增, 新的的时候递归往下走
|
List<TsFiles> tsFilesToCreate = new ArrayList<>();
|
||||||
if (item.getType() == FileTypeEnum.FOLDER) {
|
|
||||||
//先查询有没有 如果没有就新增 条件 节点ID 任务ID 上级ID 工作空间路径 文件名称
|
|
||||||
LambdaQueryWrapper<TsFiles> queryWrapper = new LambdaQueryWrapper<>();
|
|
||||||
queryWrapper.eq(TsFiles::getTaskId, taskId);
|
|
||||||
queryWrapper.eq(TsFiles::getNodeId, nodeId);
|
|
||||||
queryWrapper.eq(TsFiles::getParentId, parentId);
|
|
||||||
queryWrapper.eq(TsFiles::getFileName, item.getName());
|
|
||||||
queryWrapper.eq(TsFiles::getWorkPath, item.getPath());
|
|
||||||
TsFiles tsFiles = tsFilesMapper.selectOne(queryWrapper);
|
|
||||||
//如果没有 新增 并且递归
|
|
||||||
if (tsFiles == null) {
|
|
||||||
//保存文件
|
|
||||||
TsFiles tsFilesData = savetsFiles(taskId, nodeId, item.getName(), item.getPath(), parentId, "FOLDER", String.valueOf(item.getSize()));
|
|
||||||
otherLevelsData(taskId, nodeId, item.getName(), item.getPath(), tsFilesData.getId());
|
|
||||||
|
|
||||||
} else {
|
// 设置当前时间
|
||||||
otherLevelsData(taskId, nodeId, item.getName(), item.getPath(), tsFiles.getId());
|
LocalDateTime now = LocalDateTime.now();
|
||||||
}
|
// 转换为 Timestamp
|
||||||
|
Timestamp currentTime = Timestamp.valueOf(now);
|
||||||
|
|
||||||
|
|
||||||
|
// 查询本地文件路径根目录(如 E:\yun)
|
||||||
|
QueryWrapper<StorageSourceConfig> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("name", "filePath");
|
||||||
|
queryWrapper.eq("type", "local");
|
||||||
|
StorageSourceConfig storageSourceConfig = storageSourceConfigMapper.selectOne(queryWrapper);
|
||||||
|
|
||||||
|
//获取文件列表 这个地方path+name
|
||||||
|
File projectDir = new File(storageSourceConfig.getValue()+path+nodeName);
|
||||||
|
|
||||||
|
// 获取所有子目录
|
||||||
|
List<File> allSubDirs = new ArrayList<>();
|
||||||
|
getAllSubDirectories(projectDir, allSubDirs);
|
||||||
|
String storageSourceConfigPath = storageSourceConfig.getValue().replace("\\", "/");
|
||||||
|
// 批量处理子目录
|
||||||
|
long startBuildNodes = System.currentTimeMillis();
|
||||||
|
for (File subDir : allSubDirs) {
|
||||||
|
String normalizedSubDirPath = subDir.getAbsolutePath().replace("\\", "/");
|
||||||
|
// 获取上一级目录
|
||||||
|
String parentPath = normalizedSubDirPath.substring(0, normalizedSubDirPath.lastIndexOf("/"));
|
||||||
|
// 去掉 D:/yun 部分
|
||||||
|
String finalPath = parentPath.replace(storageSourceConfigPath, "");
|
||||||
|
//保存文件信息
|
||||||
|
TsFiles tsFiles1 = new TsFiles();
|
||||||
|
//任务
|
||||||
|
tsFiles1.setTaskId(taskId);
|
||||||
|
//节点
|
||||||
|
tsFiles1.setNodeId(nodeId);
|
||||||
|
//文件 文件夹 区分
|
||||||
|
tsFiles1.setIsFile("FOLDER");
|
||||||
|
//上级ID
|
||||||
|
tsFiles1.setParentId("00");
|
||||||
|
//文件名称
|
||||||
|
tsFiles1.setFileName(subDir.getName());
|
||||||
|
//工作空间路径
|
||||||
|
tsFiles1.setWorkPath(ensurePathFormat(finalPath));
|
||||||
|
tsFiles1.setUploadTime(currentTime);
|
||||||
|
|
||||||
|
|
||||||
|
if ("null".equals(String.valueOf(subDir.length()))) {
|
||||||
|
tsFiles1.setFileSize("0.001");
|
||||||
} else {
|
} else {
|
||||||
//todo 如果是文件 直接新增就可以了 不需要其他的操作
|
//文件大小
|
||||||
//先查询有没有 如果没有就新增 条件 节点ID 任务ID 上级ID 工作空间路径 文件名称
|
if ("0.000".equals(String.valueOf(subDir.length()))) {
|
||||||
LambdaQueryWrapper<TsFiles> queryWrapper = new LambdaQueryWrapper<>();
|
tsFiles1.setFileSize("0.001");
|
||||||
queryWrapper.eq(TsFiles::getTaskId, taskId);
|
} else {
|
||||||
queryWrapper.eq(TsFiles::getNodeId, nodeId);
|
tsFiles1.setFileSize(String.valueOf(subDir.length()));
|
||||||
queryWrapper.eq(TsFiles::getParentId, parentId);
|
}
|
||||||
queryWrapper.eq(TsFiles::getFileName, item.getName());
|
}
|
||||||
queryWrapper.eq(TsFiles::getWorkPath, item.getPath());
|
tsFilesToCreate.add(tsFiles1);
|
||||||
TsFiles tsFiles = tsFilesMapper.selectOne(queryWrapper);
|
}
|
||||||
if (tsFiles == null) {
|
LOGGER.info("[构建文件表中的文件夹列表] 耗时 {} ms | 待处理数量: {} 条",
|
||||||
|
System.currentTimeMillis() - startBuildNodes,
|
||||||
|
tsFilesToCreate.size());
|
||||||
|
|
||||||
// 获取文件大小(字节)
|
|
||||||
long fileSizeInBytes = item.getSize();
|
|
||||||
// 转换为 MB 并保留两位小数
|
|
||||||
double fileSizeInMB = fileSizeInBytes / (1024.0 * 1024.0);
|
|
||||||
String fileSizeFormatted = String.format("%.2f", fileSizeInMB); // 保留两位小数
|
|
||||||
|
|
||||||
//保存文件信息
|
// 获取所有文件
|
||||||
TsFiles tsFilesData = savetsFiles(taskId, nodeId, item.getName(), item.getPath(), parentId, "FILE", fileSizeFormatted);
|
List<File> allFiles = new ArrayList<>();
|
||||||
LOGGER.info("保存文件信息:{}", item.getPath() + item.getName());
|
getAllFiles(projectDir, allFiles);
|
||||||
|
System.out.println("allFiles=" + allFiles.size());
|
||||||
|
long startBuildFiles = System.currentTimeMillis();
|
||||||
|
// 批量处理文件
|
||||||
|
for (File file : allFiles) {
|
||||||
|
String normalizedFilesPath = file.getAbsolutePath().replace("\\", "/");
|
||||||
|
// 获取上一级目录
|
||||||
|
String parentPath = normalizedFilesPath.substring(0, normalizedFilesPath.lastIndexOf("/"));
|
||||||
|
// 去掉 D:/yun 部分
|
||||||
|
String finalPath = parentPath.replace(storageSourceConfigPath, "");
|
||||||
|
//保存文件信息
|
||||||
|
TsFiles tsFiles1 = new TsFiles();
|
||||||
|
tsFiles1.setId(IdUtil.fastSimpleUUID());
|
||||||
|
//任务
|
||||||
|
tsFiles1.setTaskId(taskId);
|
||||||
|
//节点
|
||||||
|
tsFiles1.setNodeId(nodeId);
|
||||||
|
//文件 文件夹 区分
|
||||||
|
tsFiles1.setIsFile("FILE");
|
||||||
|
//上级ID
|
||||||
|
tsFiles1.setParentId("00");
|
||||||
|
//文件名称
|
||||||
|
tsFiles1.setFileName(file.getName());
|
||||||
|
//工作空间路径
|
||||||
|
tsFiles1.setWorkPath(ensurePathFormat(finalPath));
|
||||||
|
tsFiles1.setUploadTime(currentTime);
|
||||||
|
|
||||||
|
|
||||||
|
if ("null".equals(String.valueOf(file.length()))) {
|
||||||
|
tsFiles1.setFileSize("0.001");
|
||||||
|
} else {
|
||||||
|
//文件大小
|
||||||
|
if ("0.000".equals(String.valueOf(file.length()))) {
|
||||||
|
tsFiles1.setFileSize("0.001");
|
||||||
|
} else {
|
||||||
|
tsFiles1.setFileSize(String.valueOf(file.length()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tsFilesToCreate.add(tsFiles1);
|
||||||
|
}
|
||||||
|
LOGGER.info("[构建文件表中的文件列表] 耗时 {} ms | 待处理数量: {} 条",
|
||||||
|
System.currentTimeMillis() - startBuildFiles,
|
||||||
|
tsFilesToCreate.size());
|
||||||
|
|
||||||
|
// 批量插入文件表(忽略重复)
|
||||||
|
if (!tsFilesToCreate.isEmpty()) {
|
||||||
|
long startBatchInsertFiles = System.currentTimeMillis();
|
||||||
|
int affectedRowsFiles = tsFilesMapper.batchInsertTsFiles(tsFilesToCreate);
|
||||||
|
LOGGER.info("[批量插入试验任务文件表] 耗时 {} ms | 实际新增数量: {} 条",
|
||||||
|
System.currentTimeMillis() - startBatchInsertFiles,
|
||||||
|
affectedRowsFiles);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 记录开始时间
|
||||||
|
long startTimeFiles = System.currentTimeMillis();
|
||||||
|
// 执行更新操作 taskId, String nodeId
|
||||||
|
int affectedLevelFilesRows = tsFilesMapper.updateParentIdByPathHierarchy(taskId,nodeId);
|
||||||
|
// 记录结束时间
|
||||||
|
long endTimeFiles = System.currentTimeMillis();
|
||||||
|
// 计算耗时
|
||||||
|
long costTimeFiles = endTimeFiles - startTimeFiles;
|
||||||
|
// 打印日志
|
||||||
|
LOGGER.info("文件表中的节点ID更新完成,影响 {} 行,总耗时 {} 毫秒", affectedLevelFilesRows, costTimeFiles);
|
||||||
|
|
||||||
|
|
||||||
|
// //获取文件列表
|
||||||
|
// String absolutePath =path + "/" + nodeName + "/";
|
||||||
|
// //获取当前登录用户 上传人是当前登录人
|
||||||
|
// UsernamePasswordAuthenticationToken authentication =
|
||||||
|
// (UsernamePasswordAuthenticationToken) SecurityContextHolder.getContext().getAuthentication();
|
||||||
|
// LoginUser loginuser = null;
|
||||||
|
// if (authentication != null) {
|
||||||
|
// loginuser = (LoginUser) authentication.getPrincipal();
|
||||||
|
// }
|
||||||
|
// //登录人
|
||||||
|
// String uploader = null;
|
||||||
|
// if (loginuser != null) {
|
||||||
|
// uploader = loginuser.getUsername();
|
||||||
|
// }
|
||||||
|
// // 设置当前时间
|
||||||
|
// LocalDateTime now = LocalDateTime.now();
|
||||||
|
// // 转换为 Timestamp
|
||||||
|
// Timestamp currentTime = Timestamp.valueOf(now);
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// //获取文件列表
|
||||||
|
// FileListRequest fileListRequest = buildFileRequest(absolutePath);
|
||||||
|
// String storageKey = fileListRequest.getStorageKey();
|
||||||
|
// Integer storageId = storageSourceService.findIdByKey(storageKey);
|
||||||
|
// if (storageId == null) {
|
||||||
|
// throw new InvalidStorageSourceException("通过存储源 key 未找到存储源, key: " + storageKey);
|
||||||
|
// }
|
||||||
|
// // 处理请求参数默认值
|
||||||
|
// fileListRequest.handleDefaultValue();
|
||||||
|
// AbstractBaseFileService<?> fileService = storageSourceContext.getByStorageId(storageId);
|
||||||
|
// //todo 首先获取两个集合 对比出数据库中没有的文件夹以及文件,递归增加
|
||||||
|
// List<FileItemResult> fileItemList = fileService.fileList(fileListRequest.getPath());
|
||||||
|
//
|
||||||
|
// for (FileItemResult item : fileItemList) {
|
||||||
|
// //思路就是 如果是文件夹 就查询一下 没有就新增, 新的的时候递归往下走
|
||||||
|
// if (item.getType() == FileTypeEnum.FOLDER) {
|
||||||
|
// //先查询有没有 如果没有就新增 条件 节点ID 任务ID 上级ID 工作空间路径 文件名称
|
||||||
|
// LambdaQueryWrapper<TsFiles> queryWrapper1 = new LambdaQueryWrapper<>();
|
||||||
|
// queryWrapper1.eq(TsFiles::getTaskId, taskId);
|
||||||
|
// queryWrapper1.eq(TsFiles::getNodeId, nodeId);
|
||||||
|
// queryWrapper1.eq(TsFiles::getParentId, parentId);
|
||||||
|
// queryWrapper1.eq(TsFiles::getFileName, item.getName());
|
||||||
|
// queryWrapper1.eq(TsFiles::getWorkPath, item.getPath());
|
||||||
|
// TsFiles tsFiles = tsFilesMapper.selectOne(queryWrapper1);
|
||||||
|
// //如果没有 新增 并且递归
|
||||||
|
// if (tsFiles == null) {
|
||||||
|
// //保存文件
|
||||||
|
// TsFiles tsFilesData = savetsFiles(taskId, nodeId, item.getName(), item.getPath(), parentId, "FOLDER", String.valueOf(item.getSize()));
|
||||||
|
// otherLevelsData(taskId, nodeId, item.getName(), item.getPath(), tsFilesData.getId());
|
||||||
|
//
|
||||||
|
// } else {
|
||||||
|
// otherLevelsData(taskId, nodeId, item.getName(), item.getPath(), tsFiles.getId());
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// //todo 如果是文件 直接新增就可以了 不需要其他的操作
|
||||||
|
// //先查询有没有 如果没有就新增 条件 节点ID 任务ID 上级ID 工作空间路径 文件名称
|
||||||
|
// LambdaQueryWrapper<TsFiles> queryWrapper2 = new LambdaQueryWrapper<>();
|
||||||
|
// queryWrapper2.eq(TsFiles::getTaskId, taskId);
|
||||||
|
// queryWrapper2.eq(TsFiles::getNodeId, nodeId);
|
||||||
|
// queryWrapper2.eq(TsFiles::getParentId, parentId);
|
||||||
|
// queryWrapper2.eq(TsFiles::getFileName, item.getName());
|
||||||
|
// queryWrapper2.eq(TsFiles::getWorkPath, item.getPath());
|
||||||
|
// TsFiles tsFiles = tsFilesMapper.selectOne(queryWrapper2);
|
||||||
|
// if (tsFiles == null) {
|
||||||
|
//
|
||||||
|
// // 获取文件大小(字节)
|
||||||
|
// long fileSizeInBytes = item.getSize();
|
||||||
|
// // 转换为 MB 并保留两位小数
|
||||||
|
// double fileSizeInMB = fileSizeInBytes / (1024.0 * 1024.0);
|
||||||
|
// String fileSizeFormatted = String.format("%.2f", fileSizeInMB); // 保留两位小数
|
||||||
|
//
|
||||||
|
// //保存文件信息
|
||||||
|
// TsFiles tsFilesData = savetsFiles(taskId, nodeId, item.getName(), item.getPath(), parentId, "FILE", fileSizeFormatted);
|
||||||
|
// LOGGER.info("保存文件信息:{}", item.getPath() + item.getName());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确保路径格式为以 "/" 开头和结尾(例如 "/data/test/")
|
||||||
|
* 若路径为空或非法,返回根路径 "/"
|
||||||
|
*/
|
||||||
|
private String ensurePathFormat(String path) {
|
||||||
|
if (StringUtils.isBlank(path)) {
|
||||||
|
return "/";
|
||||||
|
}
|
||||||
|
// 统一替换反斜杠为斜杠(兼容 Windows 路径)
|
||||||
|
String normalized = path.replaceAll("\\\\", "/");
|
||||||
|
// 去掉多余的斜杠
|
||||||
|
normalized = normalized.replaceAll("/{2,}", "/");
|
||||||
|
// 确保以 "/" 开头
|
||||||
|
if (!normalized.startsWith("/")) {
|
||||||
|
normalized = "/" + normalized;
|
||||||
|
}
|
||||||
|
// 确保以 "/" 结尾
|
||||||
|
if (!normalized.endsWith("/")) {
|
||||||
|
normalized += "/";
|
||||||
|
}
|
||||||
|
return normalized;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void getAllSubDirectories(File dir, List<File> subDirs) {
|
||||||
|
File[] files = dir.listFiles();
|
||||||
|
if (files != null) {
|
||||||
|
for (File file : files) {
|
||||||
|
if (file.isDirectory()) {
|
||||||
|
subDirs.add(file);
|
||||||
|
getAllSubDirectories(file, subDirs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void getAllFiles(File dir, List<File> files) {
|
||||||
|
File[] fileList = dir.listFiles();
|
||||||
|
if (fileList != null) {
|
||||||
|
for (File file : fileList) {
|
||||||
|
if (file.isFile()) {
|
||||||
|
files.add(file);
|
||||||
|
} else if (file.isDirectory()) {
|
||||||
|
getAllFiles(file, files);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,4 +2,27 @@
|
|||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.yfd.platform.modules.experimentalData.mapper.TsFilesMapper">
|
<mapper namespace="com.yfd.platform.modules.experimentalData.mapper.TsFilesMapper">
|
||||||
|
|
||||||
|
<!-- 批量插入试验任务文件表(存在唯一键冲突时忽略) -->
|
||||||
|
<insert id="batchInsertTsFiles">
|
||||||
|
INSERT INTO ts_files
|
||||||
|
(id,node_id, task_id, is_file, parent_id, file_name, file_size, work_path,upload_time)
|
||||||
|
VALUES
|
||||||
|
<foreach collection="list" item="item" separator=",">
|
||||||
|
(#{item.id},#{item.nodeId}, #{item.taskId}, #{item.isFile}, #{item.parentId},
|
||||||
|
#{item.fileName}, #{item.fileSize}, #{item.workPath}, #{item.uploadTime})
|
||||||
|
</foreach>
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<update id="updateParentIdByPathHierarchy">
|
||||||
|
UPDATE ts_files a
|
||||||
|
LEFT JOIN ts_files b
|
||||||
|
ON b.task_id = a.task_id
|
||||||
|
AND b.node_id = a.node_id
|
||||||
|
AND a.work_path = CONCAT( b.work_path, b.file_name, '/' )
|
||||||
|
SET a.parent_id = b.id
|
||||||
|
WHERE
|
||||||
|
b.task_id = #{taskId}
|
||||||
|
AND b.node_id = #{nodeId}
|
||||||
|
</update>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
Loading…
Reference in New Issue
Block a user