diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/FileSystemService.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/FileSystemService.java index f92c639..268ddb6 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/FileSystemService.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/FileSystemService.java @@ -8,7 +8,7 @@ public interface FileSystemService { void copyFile(String source, String destination); - void moveFile(String source, String destination, boolean deleteSource); + void moveFile(String source, String destination); void save(InputStream inputStream, String destination); diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/CommonService.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/CommonService.java index e322ea9..4fb002f 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/CommonService.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/CommonService.java @@ -112,18 +112,22 @@ public class CommonService { return getDbPath(paths); } - public String getDbPath(List ids) { - + private String getDbPath(List ids) { // TODO cache - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) - .select(EdFileInfo::getId, EdFileInfo::getFileName) + .select(EdFileInfo::getId, EdFileInfo::getFileName, EdFileInfo::getDataType, EdFileInfo::getFileType, EdFileInfo::getFileCode) .in(EdFileInfo::getId, ids); List edFileInfos = edFileInfoMapper.selectList(queryWrapper); - Map map = edFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, EdFileInfo::getFileName)); + Map map = edFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); StringBuilder path = new StringBuilder(); for (String id : ids) { - String tmp = map.get(id) + File.separator; + EdFileInfo fileInfo = map.get(id); + String tmp; + if (fileInfo.getDataType().equals(EleDataTypeEnum.FILE.code)) { + tmp = fileInfo.getFileName() + "." + fileInfo.getFileType() + "." + fileInfo.getFileCode(); + } else { + tmp = fileInfo.getFileName() + File.separator; + } path.append(tmp); } return path.toString(); diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java index ff238f8..c1c5ccf 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdFileInfoServiceImpl.java @@ -151,7 +151,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl delete(String id) { EdFileInfo fileInfo = this.baseMapper.selectById(id); String parentId = fileInfo.getParentId(); - if (fileInfo.getDataType() == 0) { + if (fileInfo.getDataType() == EleDataTypeEnum.FOLDER.code) { return commonService.deleteFolder(id, parentId); } @@ -171,7 +171,7 @@ public class EdFileInfoServiceImpl extends ServiceImpllambdaQuery().eq(EdFileInfo::getId, id)); - String fileSysPath = commonService.getFileSysPath(fileInfo.getFilePath()) + "." + fileInfo.getFileCode(); + String fileSysPath = commonService.getFileSysPath(fileInfo.getFilePath()); Assert.isTrue(FileUtil.exist(fileSysPath), "下载文件不存在。"); FileSystemResource fileSystemResource = new FileSystemResource(fileSysPath); HttpHeaders headers = new HttpHeaders(); @@ -207,7 +207,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl folders = resFiles.stream().filter(e -> e.getDataType().equals(EleDataTypeEnum.FOLDER.code)).collect(Collectors.toList()); List files = resFiles.stream().filter(e -> e.getDataType().equals(EleDataTypeEnum.FILE.code)).collect(Collectors.toList()); for (EdFileInfo edFileInfo : folders) { - String destFolderPath = downloadDataDir + File.separator + prjName + File.separator + commonService.getFileSysPath(edFileInfo.getFileId()); + String destFolderPath = downloadDataDir + File.separator + prjName + File.separator + commonService.getFileSysPath(edFileInfo.getFileId()); // file fileSystemService.createDirectory(destFolderPath); } for (EdFileInfo edFileInfo : files) { - String filePath = commonService.getFileSysPath(edFileInfo.getFileId()) + edFileInfo.getFileCode() + "." + edFileInfo.getFileCode(); + String filePath = commonService.getFileSysPath(edFileInfo.getFileId()); // file String destPath = downloadDataDir + File.separator + prjName + File.separator + commonService.getDbPath(edFileInfo.getFileId()); fileSystemService.copyFile(filePath, destPath); } @@ -597,7 +597,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl moveFile(String id, String targetFolderId, Integer strategy) { - return moveFile(id, targetFolderId, strategy, true); + + // 获取原文件mysql模型 + EdFileInfo srcFileInfo = this.baseMapper.selectById(id); + String srcFileDbPath = srcFileInfo.getFilePath(); + String fileCode = srcFileInfo.getFileCode(); + // 判断目标路径下是否有同名文件,如果所有的同名文件:1)如果所有文件都已经被作废,则该文件为新文件,版本号从100开始。2)如果有没有被作废的文件,则冲突处理方式按---1-跳过冲突文件 2-做版本更新 3-重命名,文件名加"_1" + long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class) + .eq(EdFileInfo::getParentId, targetFolderId) + .eq(EdFileInfo::getFileName, srcFileInfo.getFileName()) + .eq(EdFileInfo::getFileType, srcFileInfo.getFileType()) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)); + EdFileInfo destFolderInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class) + .eq(EdFileInfo::getId, targetFolderId)); + if (count == 0) { + // 没有同名文件 + // 首先将信息保存到MySQL + String fileTime = EleCommonUtil.getNowTimeStr(); + String codePathByDbPath = commonService.getCodePathByDbPath(destFolderInfo.getFilePath()); + String newFileCode = commonService.createFileCode(codePathByDbPath, srcFileInfo.getFileType(), FILE_START_VERSION, fileTime); + srcFileInfo.setParentId(targetFolderId) + .setFileVersion(FILE_START_VERSION) + .setFileTime(fileTime) + .setFilePath(destFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + srcFileInfo.getId()) + .setFileCode(newFileCode); + this.baseMapper.updateById(srcFileInfo); + // 文件系统移动文件 + String srcFilePath = commonService.getFileSysPath(srcFileDbPath); + String destFilePath = commonService.getFileSysPath(destFolderInfo.getFilePath()); + fileSystemService.moveFile(srcFilePath, destFilePath); + } else { + return handMoveConflict(targetFolderId, strategy, srcFileInfo, destFolderInfo); + } + return ElectromagneticResultUtil.success(true); } - private void handMoveConflict(String targetFolderId, Integer strategy, EdFileInfo srcFileInfo, EdFileInfo destFolderInfo, boolean deleteSrc) { + private ElectromagneticResult handMoveConflict(String targetFolderId, Integer strategy, EdFileInfo srcFileInfo, EdFileInfo destFolderInfo) { + + // 禁止同目录下移动和复制 + if (srcFileInfo.getParentId().equals(destFolderInfo.getId())) { + String info = "禁止相同文件夹下移动文件"; + log.info(info); + return ElectromagneticResultUtil.fail("-1", info); + } + if (strategy == 2) { // 做版本更新 List sameFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) @@ -646,69 +686,44 @@ public class EdFileInfoServiceImpl extends ServiceImpl e.getEffectFlag().equals(EffectFlagEnum.EFFECT.code)).findFirst().orElseThrow(RuntimeException::new); + EdFileInfo destSaveFileInfo = BeanUtil.copyProperties(fileInfoTmp, EdFileInfo.class); + destSaveFileInfo.setId(newFileDbId); destSaveFileInfo.setFileVersion(maxFileVersion + 1) - .setFilePath(destSaveFileInfo + MYSQL_FILE_PATH_SPLIT + newFileDbId) + .setFilePath(destFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newFileDbId) .setPreVersion(maxFileVersion) .setEffectFlag(EffectFlagEnum.EFFECT.code) .setFileCode(fileCode); this.baseMapper.insert(destSaveFileInfo); + String srcFilePath = commonService.getFileSysPath(srcFileInfo.getFilePath()); + String destFilePath = commonService.getFileSysPath(destSaveFileInfo.getFilePath()); + fileSystemService.copyFile(srcFilePath, destFilePath); + this.baseMapper.deleteById(srcFileInfo.getId()); + this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class) + .set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code) + .eq(EdFileInfo::getId, fileInfoTmp.getId())); } else if (strategy == 3) { // 文件名加“_1”,版本号从100开始 // 处理MySQL相关逻辑 EdFileInfo newEdFileInfo = BeanUtil.copyProperties(srcFileInfo, EdFileInfo.class); newEdFileInfo.newInit(); + String dbPathByDbPath = commonService.getCodePathByDbPath(destFolderInfo.getFilePath()); newEdFileInfo.setParentId(targetFolderId) .setFileVersion(FILE_START_VERSION) .setFileName(srcFileInfo.getFileName() + "_1") - .setFileCode(commonService.createFileCode(targetFolderId, srcFileInfo.getFileType(), FILE_START_VERSION, newEdFileInfo.getFileTime())) + .setFileCode(commonService.createFileCode(dbPathByDbPath, srcFileInfo.getFileType(), FILE_START_VERSION, newEdFileInfo.getFileTime())) .setFilePath(destFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId()); + resetFileInfoName(newEdFileInfo); this.baseMapper.insert(newEdFileInfo); // 移动文件 String srcFileSysPath = commonService.getFileSysPath(srcFileInfo.getFilePath()); - String destFileSysPath = commonService.getFileSysPath(destFolderInfo.getFilePath()); - fileSystemService.moveFile(srcFileSysPath, destFileSysPath, deleteSrc); + String destFileSysPath = commonService.getFileSysPath(newEdFileInfo.getFilePath()); + fileSystemService.moveFile(srcFileSysPath, destFileSysPath); + this.baseMapper.deleteById(srcFileInfo.getId()); } - } - - private ElectromagneticResult moveFile(String id, String targetFolderId, Integer strategy, boolean deleteSrc) { - // 获取原文件mysql模型 - EdFileInfo srcFileInfo = this.baseMapper.selectById(id); - // 判断目标路径下是否有同名文件,如果所有的同名文件:1)如果所有文件都已经被作废,则该文件为新文件,版本号从100开始。2)如果有没有被作废的文件,则冲突处理方式按---1-跳过冲突文件 2-做版本更新 3-重命名,文件名加"_1" - List destFolderFiles = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getParentId, targetFolderId)); - EdFileInfo destFolderInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getId, targetFolderId)); - List effectFileInfos = destFolderFiles.stream().filter(e -> Objects.equals(e.getEffectFlag(), EffectFlagEnum.EFFECT.code)).collect(Collectors.toList()); - if (CollUtil.isEmpty(effectFileInfos) || CollUtil.isEmpty(destFolderFiles)) { - // 没有同名文件 - // 首先将信息保存到MySQL - EdFileInfo destSaveFileInfo = BeanUtil.copyProperties(srcFileInfo, EdFileInfo.class); - destSaveFileInfo.newInit(); - String fileTime = EleCommonUtil.getNowTimeStr(); - String newFileCode = commonService.createFileCode(targetFolderId, srcFileInfo.getFileType(), FILE_START_VERSION, fileTime); - destSaveFileInfo.setParentId(targetFolderId) - .setFileVersion(FILE_START_VERSION) - .setFileTime(fileTime) - .setFilePath(destFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + destSaveFileInfo.getId()) - .setFileCode(newFileCode); - this.baseMapper.insert(destSaveFileInfo); - // 文件系统移动文件 - String srcFilePath = commonService.getFileSysPath(srcFileInfo.getFileId()) + File.separator + srcFileInfo.getFileCode(); - String destFilePath = commonService.getFileSysPath(destFolderInfo.getFileId()) + File.separator + destFolderInfo.getFileCode(); - fileSystemService.moveFile(srcFilePath, destFilePath, deleteSrc); - } else { - handMoveConflict(targetFolderId, strategy, srcFileInfo, destFolderInfo, deleteSrc); - } - // 将以前的版本effect全部置为false,删除原目录下的同名文件 - if (deleteSrc) { - this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class) - .set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code) - .eq(EdFileInfo::getParentId, srcFileInfo.getParentId()) - .eq(EdFileInfo::getFileName, srcFileInfo.getFileName()) - .eq(EdFileInfo::getFileType, srcFileInfo.getFileType())); - } - return null; + return ElectromagneticResultUtil.success(true); } /** @@ -719,7 +734,91 @@ public class EdFileInfoServiceImpl extends ServiceImpl copyFile(String id, String targetFolderId, Integer strategy) { - return moveFile(id, targetFolderId, strategy, false); + // 获取原文件mysql模型 + EdFileInfo srcFileInfo = this.baseMapper.selectById(id); + String srcFileDbPath = srcFileInfo.getFilePath(); + // 判断目标路径下是否有同名文件,如果所有的同名文件:1)如果所有文件都已经被作废,则该文件为新文件,版本号从100开始。2)如果有没有被作废的文件,则冲突处理方式按---1-跳过冲突文件 2-做版本更新 3-重命名,文件名加"_1" + long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class) + .eq(EdFileInfo::getParentId, targetFolderId) + .eq(EdFileInfo::getFileName, srcFileInfo.getFileName()) + .eq(EdFileInfo::getFileType, srcFileInfo.getFileType()) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)); + EdFileInfo destFolderInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class) + .eq(EdFileInfo::getId, targetFolderId)); + if (count == 0) { + // 没有同名文件 + // 首先将信息保存到MySQL + String fileTime = EleCommonUtil.getNowTimeStr(); + String codePathByDbPath = commonService.getCodePathByDbPath(destFolderInfo.getFilePath()); + String newFileCode = commonService.createFileCode(codePathByDbPath, srcFileInfo.getFileType(), FILE_START_VERSION, fileTime); + EdFileInfo destFileInfo = BeanUtil.copyProperties(srcFileInfo, EdFileInfo.class); + destFileInfo.newInit(); + destFileInfo.setParentId(targetFolderId) + .setFileVersion(FILE_START_VERSION) + .setFileTime(fileTime) + .setFilePath(destFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + destFileInfo.getId()) + .setFileCode(newFileCode); + this.baseMapper.insert(destFileInfo); + // 文件系统移动文件 + String srcFilePath = commonService.getFileSysPath(srcFileDbPath); + String destFilePath = commonService.getFileSysPath(destFileInfo.getFilePath()); + fileSystemService.copyFile(srcFilePath, destFilePath); + } else { + return handCopyConflict(targetFolderId, strategy, srcFileInfo, destFolderInfo); + } + return ElectromagneticResultUtil.success(true); + } + + private ElectromagneticResult handCopyConflict(String targetFolderId, Integer strategy, EdFileInfo srcFileInfo, EdFileInfo destFolderInfo) { + // 禁止同目录下移动和复制 + if (srcFileInfo.getParentId().equals(destFolderInfo.getId())) { + String info = "禁止相同文件夹下移动文件"; + log.info(info); + return ElectromagneticResultUtil.fail("-1", info); + } + + if (strategy == 2) { + // 做版本更新 + List sameFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) + .eq(EdFileInfo::getParentId, targetFolderId) + .eq(EdFileInfo::getFileName, srcFileInfo.getFileName()) + .eq(EdFileInfo::getFileType, srcFileInfo.getFileType())); + Integer maxFileVersion = Collections.max(sameFileInfos, Comparator.comparing(EdFileInfo::getFileVersion)).getFileVersion(); + String newFileDbId = IdWorker.getSnowFlakeIdString(); + String fileTime = EleCommonUtil.getNowTimeStr(); + String codePathByDbPath = commonService.getCodePathByDbPath(destFolderInfo.getFilePath()); + String fileCode = commonService.createFileCode(codePathByDbPath, srcFileInfo.getFileType(), maxFileVersion + 1, fileTime); + EdFileInfo fileInfoTmp = sameFileInfos.stream().filter(e -> e.getEffectFlag().equals(EffectFlagEnum.EFFECT.code)).findFirst().orElseThrow(RuntimeException::new); + EdFileInfo destSaveFileInfo = BeanUtil.copyProperties(fileInfoTmp, EdFileInfo.class); + destSaveFileInfo.setId(newFileDbId); + destSaveFileInfo.setFileVersion(maxFileVersion + 1) + .setFilePath(destFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newFileDbId) + .setPreVersion(maxFileVersion) + .setEffectFlag(EffectFlagEnum.EFFECT.code) + .setFileCode(fileCode); + this.baseMapper.insert(destSaveFileInfo); + String srcFilePath = commonService.getFileSysPath(srcFileInfo.getFilePath()); + String destFilePath = commonService.getFileSysPath(destSaveFileInfo.getFilePath()); + fileSystemService.copyFile(srcFilePath, destFilePath); + } else if (strategy == 3) { + // 文件名加“_1”,版本号从100开始 + // 处理MySQL相关逻辑 + EdFileInfo newEdFileInfo = BeanUtil.copyProperties(srcFileInfo, EdFileInfo.class); + newEdFileInfo.newInit(); + String dbPathByDbPath = commonService.getCodePathByDbPath(destFolderInfo.getFilePath()); + newEdFileInfo.setParentId(targetFolderId) + .setFileVersion(FILE_START_VERSION) + .setFileName(srcFileInfo.getFileName() + "_1") + .setFileCode(commonService.createFileCode(dbPathByDbPath, srcFileInfo.getFileType(), FILE_START_VERSION, newEdFileInfo.getFileTime())) + .setFilePath(destFolderInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId()); + resetFileInfoName(newEdFileInfo); + this.baseMapper.insert(newEdFileInfo); + // 移动文件 + String srcFileSysPath = commonService.getFileSysPath(srcFileInfo.getFilePath()); + String destFileSysPath = commonService.getFileSysPath(newEdFileInfo.getFilePath()); + fileSystemService.copyFile(srcFileSysPath, destFileSysPath); + } + return ElectromagneticResultUtil.success(true); } @Transactional(rollbackFor = Exception.class) @@ -770,7 +869,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl .setCreatedBy(currentUserId) .setUpdatedBy(currentUserId); this.save(targetFile); - String targetSysFilePath = commonService.getFileSysPath(targetFile.getFilePath()) + File.separator + sourceFileName; + String targetSysFilePath = commonService.getFileSysPath(targetFile.getFilePath()); fileSystemService.createDirectory(targetSysFilePath); targetEdFileInfos = commonService.selectAllAdminFolder(targetId); } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/FileSystemServiceImpl.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/FileSystemServiceImpl.java index bbc806e..79f943d 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/FileSystemServiceImpl.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/FileSystemServiceImpl.java @@ -18,16 +18,12 @@ public class FileSystemServiceImpl implements FileSystemService { @Override public void copyFile(String source, String destination) { - moveFile(source, destination, false); + FileUtil.copy(source, destination, true); } @Override - public void moveFile(String source, String destination, boolean deleteSource) { - if (deleteSource) { - FileUtil.move(new File(source), new File(destination), true); - return; - } - FileUtil.copy(new File(source), new File(destination), false); + public void moveFile(String source, String destination) { + FileUtil.move(new File(source), new File(destination), true); } @Override