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 9fab438..fdccafa 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 @@ -629,18 +629,60 @@ public class TsFilesServiceImpl extends ServiceImpl impl if (flag) { //递归下面所有的文件文件夹 路径都需要修改 List resultList = new ArrayList<>(); - // 获取当前文件夹的完整路径(如 "/147/222/") - String oldFullPath = filesData.getWorkPath() + filesData.getFileName() + "/"; - String newFullPath = filesData.getWorkPath() + tsFiles.getFileName() + "/"; - querySubFilesAndUpdatePaths(resultList, tsFiles.getId(), oldFullPath, newFullPath); - // 修改数据库 - int valueUpdate = tsFilesMapper.updateById(tsFiles); - if (valueUpdate == 1) { - LOGGER.info("local和minio修改成功,表结构修改成功"); - return ResponseResult.success(); + + if (tsFiles.getBackupPath() != null && tsFiles.getBackupPath() != "") { + // 设置当前时间 + LocalDateTime now = LocalDateTime.now(); + // 转换为 Timestamp + Timestamp currentTime = Timestamp.valueOf(now); + //新通过id找到表中现有的 修改也是修改表中现有的数据 新增的一条就是重命名以后的 所有备份空间路径为空 原来的哪条数据把工作空间路径改成空 + TsFiles tsFiles2 = tsFilesMapper.selectById(tsFiles.getId());//查询原来的数据 把原来的数据 + tsFiles2.setWorkPath(""); + + TsFiles tsFiles1 = new TsFiles(); + tsFiles1.setNodeId(tsFiles.getNodeId()); + tsFiles1.setTaskId(tsFiles.getTaskId()); + tsFiles1.setIsFile(tsFiles.getIsFile()); + tsFiles1.setParentId(tsFiles.getParentId()); + tsFiles1.setFileName(tsFiles.getFileName()); + tsFiles1.setFileSize(tsFiles.getFileSize()); + tsFiles1.setWorkPath(tsFiles.getWorkPath()); + tsFiles1.setBackupPath(""); + tsFiles1.setKeywords(tsFiles.getKeywords()); + tsFiles1.setDescription(tsFiles.getDescription()); + tsFiles1.setUploadTime(currentTime); + tsFiles1.setUploader(tsFiles.getUploader()); + tsFiles1.setUpdateTime(currentTime); + int valueInsert = tsFilesMapper.insert(tsFiles1); + if (valueInsert == 1) { + int valueUpdate = tsFilesMapper.updateById(tsFiles2); + // 获取当前文件夹的完整路径(如 "/147/222/") + String oldFullPath = filesData.getWorkPath() + filesData.getFileName() + "/"; + String newFullPath = filesData.getWorkPath() + tsFiles.getFileName() + "/"; + querySubFilesAndUpdatePaths(resultList, tsFiles2.getId(), oldFullPath, newFullPath, tsFiles1.getId()); + if (valueUpdate == 1) { + LOGGER.info("local和minio修改成功,表结构修改成功"); + return ResponseResult.success(); + } else { + LOGGER.error("local和minio修改成功,表结构修改失败"); + return ResponseResult.error(); + } + } else { + LOGGER.error("local和minio修改成功,表结构修改失败"); + return ResponseResult.error(); + } + + } else { - LOGGER.error("local和minio修改成功,表结构修改失败"); - return ResponseResult.error(); + // 如果备份空间为空 直接修改数据库 + int valueUpdate = tsFilesMapper.updateById(tsFiles); + if (valueUpdate == 1) { + LOGGER.info("local和minio修改成功,表结构修改成功"); + return ResponseResult.success(); + } else { + LOGGER.error("local和minio修改成功,表结构修改失败"); + return ResponseResult.error(); + } } } else { LOGGER.error("local和minio修改失败"); @@ -668,17 +710,61 @@ public class TsFilesServiceImpl extends ServiceImpl impl renameFileRequest.setStorageKey("local"); AbstractBaseFileService fileService = storageSourceContext.getByStorageKey(renameFileRequest.getStorageKey()); Boolean flag = fileService.renameFile(renameFileRequest.getPath(), renameFileRequest.getName(), renameFileRequest.getNewName()); - //如果是true 说明至少有一个修改了文件夹 + //如果是true 说明至少有一个修改了文件 if (flag) { - // 修改数据库 - int valueUpdate = tsFilesMapper.updateById(tsFiles); - if (valueUpdate == 1) { - LOGGER.info("local和minio修改成功,表结构修改成功"); - return ResponseResult.success(); + //如果备份路径不为空 那么就先增加一条 然后修改本地的 + if (tsFiles.getBackupPath() != null && tsFiles.getBackupPath() != "") { + // 设置当前时间 + LocalDateTime now = LocalDateTime.now(); + // 转换为 Timestamp + Timestamp currentTime = Timestamp.valueOf(now); + //新通过id找到表中现有的 修改也是修改表中现有的数据 新增的一条就是重命名以后的 所有备份空间路径为空 原来的哪条数据把工作空间路径改成空 + TsFiles tsFiles2 = tsFilesMapper.selectById(tsFiles.getId());//查询原来的数据 把原来的数据 + tsFiles2.setWorkPath(""); + + TsFiles tsFiles1 = new TsFiles(); + tsFiles1.setNodeId(tsFiles.getNodeId()); + tsFiles1.setTaskId(tsFiles.getTaskId()); + tsFiles1.setIsFile(tsFiles.getIsFile()); + tsFiles1.setParentId(tsFiles.getParentId()); + tsFiles1.setFileName(tsFiles.getFileName()); + tsFiles1.setFileSize(tsFiles.getFileSize()); + tsFiles1.setWorkPath(tsFiles.getWorkPath()); + tsFiles1.setBackupPath(""); + tsFiles1.setKeywords(tsFiles.getKeywords()); + tsFiles1.setDescription(tsFiles.getDescription()); + tsFiles1.setUploadTime(currentTime); + tsFiles1.setUploader(tsFiles.getUploader()); + tsFiles1.setUpdateTime(currentTime); + int valueInsert = tsFilesMapper.insert(tsFiles1); + if (valueInsert == 1) { + int valueUpdate = tsFilesMapper.updateById(tsFiles2); + if (valueUpdate == 1) { + LOGGER.info("local和minio修改成功,表结构修改成功"); + return ResponseResult.success(); + } else { + LOGGER.error("local和minio修改成功,表结构修改失败"); + return ResponseResult.error(); + } + } else { + LOGGER.error("local和minio修改成功,表结构修改失败"); + return ResponseResult.error(); + } + + } else { - LOGGER.error("local和minio修改成功,表结构修改失败"); - return ResponseResult.error(); + // 如果备份空间为空 直接修改数据库 + int valueUpdate = tsFilesMapper.updateById(tsFiles); + if (valueUpdate == 1) { + LOGGER.info("local和minio修改成功,表结构修改成功"); + return ResponseResult.success(); + } else { + LOGGER.error("local和minio修改成功,表结构修改失败"); + return ResponseResult.error(); + } } + + } else { LOGGER.error("local和minio修改失败"); return ResponseResult.error(); @@ -695,8 +781,8 @@ public class TsFilesServiceImpl extends ServiceImpl impl } } - - private void querySubFilesAndUpdatePaths(List resultList, String id, String oldName, String newName) { + // + private void querySubFilesAndUpdatePaths(List resultList, String id, String oldName, String newName, String newid) { // 构造 QueryWrapper 查询当前文件夹下的文件 QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("parent_id", id); @@ -712,16 +798,51 @@ public class TsFilesServiceImpl extends ServiceImpl impl // 遍历每个子项,更新路径并递归查询其子项 for (TsFiles subFile : subFiles) { - String oldWorkPath = subFile.getWorkPath(); // 使用正则表达式替换目标文件夹名称 String newWorkPath = oldWorkPath.replaceAll(oldName, newName); - // 更新数据库中的路径 - subFile.setWorkPath(newWorkPath); - tsFilesMapper.updateById(subFile); - // 递归查询每个子项的子文件 - if ("FOLDER".equals(subFile.getIsFile())) { - querySubFilesAndUpdatePaths(resultList, subFile.getId(), oldName, newName); + + //判断备份空间路径是否为空 如果不为 + if (subFile.getBackupPath() != null && subFile.getBackupPath() != "") { + // 设置当前时间 + LocalDateTime now = LocalDateTime.now(); + // 转换为 Timestamp + Timestamp currentTime = Timestamp.valueOf(now); + //新通过id找到表中现有的 修改也是修改表中现有的数据 新增的一条就是重命名以后的 所有备份空间路径为空 原来的哪条数据把工作空间路径改成空 + TsFiles tsFiles2 = tsFilesMapper.selectById(subFile.getId());//查询原来的数据 把原来的数据 + tsFiles2.setWorkPath(""); + + TsFiles tsFiles1 = new TsFiles(); + tsFiles1.setNodeId(subFile.getNodeId()); + tsFiles1.setTaskId(subFile.getTaskId()); + tsFiles1.setIsFile(subFile.getIsFile()); + tsFiles1.setParentId(newid); + tsFiles1.setFileName(subFile.getFileName()); + tsFiles1.setFileSize(subFile.getFileSize()); + tsFiles1.setWorkPath(newWorkPath); + tsFiles1.setBackupPath(""); + tsFiles1.setKeywords(subFile.getKeywords()); + tsFiles1.setDescription(subFile.getDescription()); + tsFiles1.setUploadTime(currentTime); + tsFiles1.setUploader(subFile.getUploader()); + tsFiles1.setUpdateTime(currentTime); + int valueInsert = tsFilesMapper.insert(tsFiles1); + if (valueInsert == 1) { + int valueUpdate = tsFilesMapper.updateById(tsFiles2); + if (valueUpdate == 1) { + + } + } + + } else { + // 更新数据库中的路径 + subFile.setWorkPath(newWorkPath); + subFile.setParentId(newid); + tsFilesMapper.updateById(subFile); + // 递归查询每个子项的子文件 + if ("FOLDER".equals(subFile.getIsFile())) { + querySubFilesAndUpdatePaths(resultList, subFile.getId(), oldName, newName, subFile.getId()); + } } } } @@ -3649,7 +3770,6 @@ public class TsFilesServiceImpl extends ServiceImpl impl private TreeDTO buildTree(TsFiles current, Map> parentChildrenMap, boolean isLocal) { // 1. 转换为DTO并检查路径有效性 TreeDTO dto = convertToDTO(current, isLocal); - String path = isLocal ? current.getWorkPath() : current.getBackupPath(); if (dto.getPath() == null || dto.getPath().trim().isEmpty()) { LOGGER.warn("由于路径为空,跳过节点{}", current.getId()); return null; diff --git a/java/src/main/java/com/yfd/platform/modules/storage/service/base/AbstractS3BaseFileService.java b/java/src/main/java/com/yfd/platform/modules/storage/service/base/AbstractS3BaseFileService.java index df32b8b..1b456bf 100644 --- a/java/src/main/java/com/yfd/platform/modules/storage/service/base/AbstractS3BaseFileService.java +++ b/java/src/main/java/com/yfd/platform/modules/storage/service/base/AbstractS3BaseFileService.java @@ -178,7 +178,13 @@ public abstract class AbstractS3BaseFileService

extends A String targetPath = buildTargetPath(path, name, isFolder); if (isFolder) { - // 处理文件夹 + // 处理文件夹时,先添加文件夹自身 + FileItemResult folderItem = createFolderItemSelf(targetPath); + if (folderItem != null) { + fileItemList.add(folderItem); + } + + // 列出文件夹内容(包含子目录) String fullPrefix = StringUtils.trimStartSlashes( StringUtils.concat(param.getBasePath(), targetPath) ); @@ -227,7 +233,7 @@ public abstract class AbstractS3BaseFileService

extends A item.setSize(objectSummary.getSize()); item.setTime(objectSummary.getLastModified()); item.setType(FileTypeEnum.FILE); - item.setPath(extractParentPath(targetPath)); + item.setPath(extractParentPatha(targetPath)); item.setUrl(getDownloadUrl(targetPath)); return item; } catch (Exception e) { @@ -237,7 +243,43 @@ public abstract class AbstractS3BaseFileService

extends A } /** - * 列出文件夹内容(包括子目录) + * 创建目标文件夹自身的条目 + */ + private FileItemResult createFolderItemSelf(String targetPath) { + if (targetPath.equals("/") || targetPath.isEmpty()) { + return null; // 根目录不单独添加 + } + + String parentPath = extractParentPatha(targetPath); + String folderName = extractFolderName(targetPath); + + FileItemResult item = new FileItemResult(); + item.setName(folderName); + item.setType(FileTypeEnum.FOLDER); + item.setPath(parentPath); + item.setTime(new Date()); // S3 无文件夹实体,时间设为当前时间或留空 + return item; + } + + /** + * 从路径中提取父路径(如 /1/2/3/ → /1/2/) + */ + private String extractParentPatha(String path) { + path = StringUtils.trimEndSlashes(path); + int lastSlashIndex = path.lastIndexOf('/'); + return (lastSlashIndex > 0) ? path.substring(0, lastSlashIndex + 1) : "/"; + } + + /** + * 从路径中提取文件夹名称(如 /1/2/3/ → 3) + */ + private String extractFolderName(String path) { + path = StringUtils.trimEndSlashes(path); + int lastSlashIndex = path.lastIndexOf('/'); + return (lastSlashIndex > 0) ? path.substring(lastSlashIndex + 1) : path; + } + /** + * 列出文件夹内容(包括子目录,递归时不重复添加自身) */ private void listFolderContents( String bucketName, @@ -263,14 +305,14 @@ public abstract class AbstractS3BaseFileService

extends A results.add(createFileItem(fileName, s, currentPath)); }); - // 处理子文件夹 + // 处理子文件夹(通过递归添加) listing.getCommonPrefixes().forEach(commonPrefix -> { - String folderName = commonPrefix.substring(prefix.length(), commonPrefix.length()-1); - String folderPath = currentPath; - results.add(createFolderItem(folderName, folderPath)); - String folderPath1 = currentPath + folderName + "/"; - // 递归列出子目录内容 - listFolderContents(bucketName, commonPrefix, folderPath1, results); + String subFolderPrefix = commonPrefix; + String folderName = subFolderPrefix.substring(prefix.length(), subFolderPrefix.length() - 1); + String subCurrentPath = currentPath + folderName + "/"; + + // 递归调用以处理子目录(子目录的自身条目会在递归时添加) + listFolderContents(bucketName, subFolderPrefix, subCurrentPath, results); }); request.setMarker(listing.getNextMarker()); diff --git a/java/src/main/java/com/yfd/platform/modules/storage/service/impl/LocalServiceImpl.java b/java/src/main/java/com/yfd/platform/modules/storage/service/impl/LocalServiceImpl.java index ac4affe..11721f7 100644 --- a/java/src/main/java/com/yfd/platform/modules/storage/service/impl/LocalServiceImpl.java +++ b/java/src/main/java/com/yfd/platform/modules/storage/service/impl/LocalServiceImpl.java @@ -219,6 +219,11 @@ public class LocalServiceImpl extends AbstractProxyTransferService { // 2. 直接处理文件或目录 if (target.isDirectory()) { + // 添加目标文件夹自身 + FileItemResult folderItem = convertToFileItem(target, folderPath); + resultList.add(folderItem); + + // 递归列出目录内容 listFilesInDirectory(target, targetPath, resultList); } else { // 如果是文件,直接添加到结果列表 @@ -313,10 +318,16 @@ public class LocalServiceImpl extends AbstractProxyTransferService { private FileItemResult convertToFileItem(File file, String parentPath) { FileItemResult item = new FileItemResult(); item.setName(file.getName()); - item.setPath(formatSinglePath(parentPath)); // 关键修改点 - item.setType(file.isDirectory() ? FileTypeEnum.FOLDER : FileTypeEnum.FILE); + item.setPath(parentPath); item.setSize(file.isDirectory() ? 0 : file.length()); item.setTime(new Date(file.lastModified())); + item.setType(file.isDirectory() ? FileTypeEnum.FOLDER : FileTypeEnum.FILE); + + // 如果是文件,设置下载 URL + if (file.isFile()) { + item.setUrl(getDownloadUrl(parentPath + file.getName())); + } + return item; }