diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/EdFileInfoController.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/EdFileInfoController.java index b514500..71bea90 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/EdFileInfoController.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/EdFileInfoController.java @@ -5,7 +5,6 @@ import com.electromagnetic.industry.software.manage.pojo.req.FileChunkDTO; import com.electromagnetic.industry.software.manage.pojo.req.FileInfoQueryDTO; import com.electromagnetic.industry.software.manage.pojo.req.UpdateFileInfoDTO; import com.electromagnetic.industry.software.manage.service.EdFileInfoService; -import io.swagger.annotations.ApiOperation; import org.springframework.core.io.InputStreamResource; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -32,9 +31,9 @@ public class EdFileInfoController { return edFileInfoService.createFolder(parentId, newFolderName); } - @RequestMapping("deleteFolder") - public ElectromagneticResult deleteFolder(@RequestParam String id, @RequestParam Integer dataType) { - return edFileInfoService.deleteFolder(id, dataType); + @RequestMapping("delete") + public ElectromagneticResult delete(@RequestParam String id) { + return edFileInfoService.delete(id); } @RequestMapping("info") diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ProjectController.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ProjectController.java index ee506c5..99dce33 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ProjectController.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ProjectController.java @@ -34,7 +34,6 @@ public class ProjectController { return edPrjService.modifyPrjName(prjId, newPrjName); } - @RequestMapping("queryAll") public ElectromagneticResult queryAll() { return edPrjService.queryAllPrjInfo(); diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileInfo.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileInfo.java index 561bdd6..db5039e 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileInfo.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/EdFileInfo.java @@ -18,7 +18,7 @@ import java.util.Date; @Accessors(chain = true) @Data @FieldNameConstants -public class EdFileInfo extends BaseModel { +public class EdFileInfo extends BaseModel{ public void newInit() { String userId = UserThreadLocal.getUserId(); diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdFileInfoService.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdFileInfoService.java index 52ad34c..fa9ae60 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdFileInfoService.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdFileInfoService.java @@ -38,10 +38,9 @@ public interface EdFileInfoService { * 删除目录 * * @param id - * @param dataType * @return */ - ElectromagneticResult deleteFolder(String id, Integer dataType); + ElectromagneticResult delete(String id); /** * 下载文件 diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdPrjService.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdPrjService.java index ec4effe..7ce09c3 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdPrjService.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/EdPrjService.java @@ -66,11 +66,11 @@ public interface EdPrjService { /** * 删除子集 * - * @param fileId + * @param id * @param parentId * @return */ - ElectromagneticResult deleteFolder(String fileId, String parentId); + ElectromagneticResult deleteFolder(String id, String parentId); /** * 层级沿用 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 41cd016..f92c639 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); + void moveFile(String source, String destination, boolean deleteSource); void save(InputStream inputStream, String destination); @@ -17,4 +17,8 @@ public interface FileSystemService { void renameFile(String sourcePath, String sourceName, String newName); boolean checkFolderExist(String newPath); + + boolean writeStringToFile(String filePath, String contents); + + boolean deleteFile(String filePath); } 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 2d6fbd5..e322ea9 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 @@ -8,9 +8,7 @@ import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.text.StrFormatter; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.MybatisConfiguration; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.electromagnetic.industry.software.common.enums.EffectFlagEnum; import com.electromagnetic.industry.software.common.enums.EleDataSaveStatusEnum; @@ -30,6 +28,7 @@ import lombok.Getter; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.PostConstruct; import javax.annotation.Resource; @@ -142,17 +141,11 @@ public class CommonService { .likeRight(EdFileInfo::getFilePath, id)); } + @Transactional(rollbackFor = Exception.class) public ElectromagneticResult addFolder(String parentId, String folderName, boolean maxLengthCheck, boolean isPrjDir, String folderId) { // 验证名称是否合法 Assert.isTrue(EleCommonUtil.isFileNameValid(folderName), "文件名不符合规范,只能包含中文字符、下划线、连字符、加号、数字和英文字符且长度小于32。"); - - if (!EleCommonUtil.isFileNameValid(folderName)) { - String info = StrFormatter.format("子集名称{}不符合要求", folderName); - log.error(info); - return ElectromagneticResultUtil.fail("-1", info); - } - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) .select(EdFileInfo::getId, EdFileInfo::getFilePath) .eq(EdFileInfo::getId, parentId); @@ -170,10 +163,11 @@ public class CommonService { // 判断文件夹名称是否存在 List edFileInfos = edFileInfoMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) .select(EdFileInfo::getId, EdFileInfo::getFileName) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code) .eq(EdFileInfo::getParentId, parentId)); List names = edFileInfos.stream().map(EdFileInfo::getFileName).collect(Collectors.toList()); if (names.contains(folderName)) { - String info = "该子集名称已存在"; + String info = "该名称已存在"; log.error(info); return ElectromagneticResultUtil.fail("-1", info); } @@ -208,7 +202,7 @@ public class CommonService { fileSystemService.createDirectory(targetFilePath); return ElectromagneticResultUtil.success(true); } catch (Exception e) { - String info = "添加子集失败"; + String info = "添加失败"; log.error(info, e); throw new BizException(-1, info); } @@ -253,51 +247,58 @@ public class CommonService { } } - public ElectromagneticResult deleteFolder(String fileId, String parentId, boolean needResort) { - + public ElectromagneticResult deleteFolder(String id, String parentId) { + // 如果文件夹下存在文件(包括文件夹和已经逻辑删除的文件),则不允许删除。后面管理员选择会有物理删除文件夹和文件的功能,此时MySQL和文件系统则会进行物理删除该文件。 try { - // TODO 如果文件夹下存在文件(不包括文件夹,包括已经删除的文件),则不允许删除 - Long count = edFileInfoMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class) - .like(EdFileInfo::getFilePath, MYSQL_FILE_PATH_SPLIT + fileId + MYSQL_FILE_PATH_SPLIT) - .eq(EdFileInfo::getDataType, EleDataTypeEnum.FILE.code)); - if (count > 0) { - String info = "禁止删除非空文件夹"; - log.info(info); - throw new BizException(-1, info); - } - - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) - .select(EdFileInfo::getId, EdFileInfo::getFilePath) - .like(EdFileInfo::getFilePath, MYSQL_FILE_PATH_SPLIT + fileId + MYSQL_FILE_PATH_SPLIT) - .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code); - List edFileInfos = edFileInfoMapper.selectList(queryWrapper); - List ids = edFileInfos.stream().map(EdFileInfo::getId).collect(Collectors.toList()); - ids.add(fileId); - LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(EdFileInfo.class) - .set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code) - .set(EdFileInfo::getSort, -1) - .set(EdFileInfo::getUpdateTime, new Date()) - .set(EdFileInfo::getUpdatedBy, UserThreadLocal.getUserId()) - .in(EdFileInfo::getId, ids); - edFileInfoMapper.update(null, updateWrapper); - if (!needResort) { - return ElectromagneticResultUtil.success(true); - } - // 同层级的resort - List edFileInfos1 = edFileInfoMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) - .select(EdFileInfo::getId, EdFileInfo::getSort) - .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code) - .eq(EdFileInfo::getParentId, parentId) - .orderByAsc(EdFileInfo::getSort)); - Date now = new Date(); - String currentUserId = UserThreadLocal.getUserId(); - for (int i = 0; i < edFileInfos1.size(); i++) { - String id = edFileInfos1.get(i).getId(); - edFileInfoMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class) - .set(EdFileInfo::getSort, i + 1) - .set(EdFileInfo::getUpdatedBy, currentUserId) - .set(EdFileInfo::getUpdateTime, now) - .eq(EdFileInfo::getId, id)); + // 这里要分两种情况,1是删除层级目录,2是删除用户创建的文件夹 + EdFileInfo fileInfo = edFileInfoMapper.selectOne(Wrappers.lambdaQuery().eq(EdFileInfo::getId, id)); + if (fileInfo.getPrjDir()) { // 删除的是层级目录 + long count = edFileInfoMapper.selectCount(Wrappers.lambdaQuery() + .eq(EdFileInfo::getPrjDir, false) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code) + .like(EdFileInfo::getFilePath, MYSQL_FILE_PATH_SPLIT + id + MYSQL_FILE_PATH_SPLIT)); + if (count > 0) { + String info = "禁止删除非空文件夹"; + log.info(info); + return ElectromagneticResultUtil.fail("-1", info); + } else { + // 先逻辑删除文件夹 + edFileInfoMapper.update(null, Wrappers.lambdaUpdate() + .eq(EdFileInfo::getId, id) + .set(EdFileInfo::getSort, -1) + .set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)); + // 层级文件夹重排序 + List edFileInfos1 = edFileInfoMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) + .select(EdFileInfo::getId, EdFileInfo::getSort) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code) + .eq(EdFileInfo::getParentId, parentId) + .orderByAsc(EdFileInfo::getSort)); + Date now = new Date(); + String currentUserId = UserThreadLocal.getUserId(); + for (int i = 0; i < edFileInfos1.size(); i++) { + String tmp = edFileInfos1.get(i).getId(); + edFileInfoMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class) + .set(EdFileInfo::getSort, i + 1) + .set(EdFileInfo::getUpdatedBy, currentUserId) + .set(EdFileInfo::getUpdateTime, now) + .eq(EdFileInfo::getId, tmp)); + } + } + } else { // 删除的是用户自己创建的文件夹 + // 检查该文件夹下是否有没有被废除的文件 + long count = edFileInfoMapper.selectCount(Wrappers.lambdaQuery() + .eq(EdFileInfo::getParentId, id) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)); + if (count > 0) { + String info = "禁止删除非空文件夹"; + log.info(info); + return ElectromagneticResultUtil.fail("-1", info); + } else { + // 逻辑文件夹重排序 + edFileInfoMapper.update(null, Wrappers.lambdaUpdate() + .eq(EdFileInfo::getId, id) + .set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)); + } } return ElectromagneticResultUtil.success(true); } catch (Exception e) { @@ -317,4 +318,10 @@ public class CommonService { } return null; } + + public String getPrjNameByDbPath(String dbPath) { + List paths = StrUtil.split(dbPath, MYSQL_FILE_PATH_SPLIT); + String prjId = paths.get(0); + return edFileInfoMapper.selectById(prjId).getFileName(); + } } 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 95927a4..ff238f8 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 @@ -7,6 +7,7 @@ import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.text.StrFormatter; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import cn.hutool.crypto.SecureUtil; @@ -17,6 +18,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.electromagnetic.industry.software.common.enums.EffectFlagEnum; +import com.electromagnetic.industry.software.common.enums.EleDataSaveStatusEnum; import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum; import com.electromagnetic.industry.software.common.enums.PublishEnum; import com.electromagnetic.industry.software.common.exception.BizException; @@ -42,6 +44,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -49,7 +52,6 @@ import javax.annotation.PostConstruct; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.util.*; @@ -71,7 +73,6 @@ public class EdFileInfoServiceImpl extends ServiceImpl deleteFolder(String id, Integer dataType) { - - Assert.isTrue(dataType == 0 || dataType == 1, "参数错误"); - if (dataType == 0) { - return commonService.deleteFolder(id, null, false); + public ElectromagneticResult delete(String id) { + EdFileInfo fileInfo = this.baseMapper.selectById(id); + String parentId = fileInfo.getParentId(); + if (fileInfo.getDataType() == 0) { + return commonService.deleteFolder(id, parentId); } this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class) @@ -300,6 +300,9 @@ public class EdFileInfoServiceImpl extends ServiceImpl mergeChunks(String identifier, String fileName, Integer totalChunks) { - String destZipPath = doSysFileMerge(identifier, fileName, totalChunks); - int index = destZipPath.lastIndexOf(".zip"); - String zipDirPath = destZipPath.substring(0, index); + String currentUserId = UserThreadLocal.getUserId(); + String destColibPath = doSysFileMerge(identifier, fileName, totalChunks); + String mainName = FileUtil.mainName(destColibPath); + String parentDir = FileUtil.getParent(destColibPath, 1); + String zipDirPath = parentDir + File.separator + mainName + ".zip"; AES aes = SecureUtil.aes(password.getBytes()); try( - InputStream inputStream = Files.newInputStream(Paths.get(destZipPath)); + InputStream inputStream = Files.newInputStream(Paths.get(destColibPath)); OutputStream outputStream = Files.newOutputStream(Paths.get(zipDirPath)); ) { aes.decrypt(inputStream, outputStream, true); } catch (Exception e) { String info = "文件上传错误"; log.error(info, e); - throw new BizException(-1, e.getMessage()); - } - update2Database(zipDirPath); - update2FileSystem(zipDirPath); - return null; - } - - private void update2Database(String colibDirPath) { - - // 首先解密该文件 - AES aes = SecureUtil.aes(password.getBytes()); - String zipFilePath = ""; - try( - InputStream inputStream = Files.newInputStream(Paths.get(colibDirPath)); - OutputStream outputStream = Files.newOutputStream(Paths.get(zipFilePath)); - ) { - aes.decrypt(inputStream, outputStream, true); - } catch (Exception e) { - String info = "文件上传失败"; - log.error(info, e); throw new BizException(-1, info); } - String tmpDir = ""; - -// ZipUtil.unzipq - - // TODO 注意 需要reversion + String uuid = IdUtil.fastSimpleUUID(); + String tmpDir = uploadDataDir + currentUserId + File.separator + uuid + File.separator; + ZipUtil.unzip(zipDirPath, tmpDir); + update2Database(zipDirPath); + return ElectromagneticResultUtil.success(true); } - private void update2FileSystem(String zipDirPath) { + @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) + public void update2Database(String prjDirPath) { + + List importFileInfos = JSONUtil.toList(prjDirPath + File.separator + "mysql.info", EdFileInfo.class); + // 首先处理导入的文件夹及其下属文件 + // 找出文件夹 + List needMove2FileSystemFiles = new ArrayList<>(); + List importDirs = importFileInfos.stream() + .filter(e -> e.getDataType().equals(EleDataTypeEnum.FOLDER.code)) + .filter(e -> !e.getPrjDir()).collect(Collectors.toList()); + for (EdFileInfo edFileInfo : importDirs) { + String fileName = edFileInfo.getFileName(); + String parentId = edFileInfo.getParentId(); + List folders = queryChildFolders(parentId); + Map foldersMap = folders.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); + List folderNames = folders.stream().map(EdFileInfo::getFileName).collect(Collectors.toList()); + String saveSysFilePath; + if (folderNames.contains(fileName)) { // 有同名文件夹 + // 判断id是否相同 + if (foldersMap.get(fileName).getId().equals(edFileInfo.getId())) { // id相同,不做处理 + log.info("id相同,不做处理"); + } else { // 文件名重复,导入的文件名需要添加“_1” + edFileInfo.setFileNote(fileName + "_1"); + this.baseMapper.insert(edFileInfo); + } + } else { // 没有同名文件夹 + this.saveOrUpdate(edFileInfo); // 如果导出的文件夹在线上已经被作废,这里则直接恢复,需要注意的是,在作废文件时,需要将作废文件移动到回收站 + } + needMove2FileSystemFiles.add(edFileInfo); + } + // 处理文件 + importFileInfos = importFileInfos.stream() + .filter(e -> e.getDataType().equals(EleDataTypeEnum.FILE.code)) + .collect(Collectors.toList()); + + Map> fileInfoMap = new HashMap<>(); + for (EdFileInfo edFileInfo : importFileInfos) { + List list = fileInfoMap.getOrDefault(edFileInfo.getFileId(), new ArrayList<>()); + list.add(edFileInfo); + fileInfoMap.put(edFileInfo.getFileId(), list); + } + + fileInfoMap.forEach((k, v) -> { + List dbFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getFileId, k).orderByAsc(EdFileInfo::getFileVersion)); + if (CollUtil.isEmpty(dbFileInfos)) { // 在线上没有找到,则该批文件是从线下上传的 + EdFileInfo fileInfo = v.stream().filter(e -> e.getEffectFlag().equals(EffectFlagEnum.EFFECT.code)).findFirst().get(); + resetFileInfoName(fileInfo); + this.saveBatch(v); + needMove2FileSystemFiles.addAll(v); + } else { + Map dbIdMap = dbFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); + Map importIdMap = v.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); + importIdMap.putAll(dbIdMap); + List deepCopyV = JSONUtil.toList(JSONUtil.toJsonStr(v), EdFileInfo.class); + List deepCopyDb = JSONUtil.toList(JSONUtil.toJsonStr(dbFileInfos), EdFileInfo.class); + EdFileInfo importEffectFile = deepCopyV.stream().filter(e -> e.getEffectFlag().equals(EffectFlagEnum.EFFECT.code)).findFirst().get(); + EdFileInfo dbEffectFile = deepCopyDb.stream().filter(e -> e.getEffectFlag().equals(EffectFlagEnum.EFFECT.code)).findFirst().get(); + String effectId = importEffectFile.getUpdateTime().after(dbEffectFile.getUpdateTime()) ? importEffectFile.getId() : dbEffectFile.getId(); + Map importVersionRelation = getVersionRelation(deepCopyV); + Map dbVersionRelation = getVersionRelation(deepCopyDb); + dbVersionRelation.putAll(importVersionRelation); + int start = FILE_START_VERSION; + List saveObjs = new ArrayList<>(); + for (EdFileInfo importFileInfo : v) { + if (dbIdMap.containsKey(importFileInfo.getId())) { // 该文件在数据库中存在,是从线上导出的。 + EdFileInfo dbFileInfo = dbIdMap.get(importFileInfo.getId()); + if (dbFileInfo.getUpdateTime().before(importFileInfo.getUpdateTime())) { // 线下版本的修改时间比线上的新,用线下的版本 + importFileInfo.setFileVersion(start); + saveObjs.add(importFileInfo); + } else { // 线上版本的修改时间比线下新,用线上的版本。 + dbFileInfo.setFileVersion(start); + saveObjs.add(dbFileInfo); + } + } else { // 该文件是线下上传的。 + importFileInfo.setFileVersion(start); + saveObjs.add(importFileInfo); + needMove2FileSystemFiles.add(importFileInfo); + } + ++start; + } + for (EdFileInfo saveObj : saveObjs) { + String id = saveObj.getId(); + String preVersionId = dbVersionRelation.get(id); + EdFileInfo tmp = importIdMap.get(preVersionId); + saveObj.setPreVersion(tmp.getFileVersion()); + int effect = Objects.equals(saveObj.getId(), effectId) ? EffectFlagEnum.EFFECT.code : EffectFlagEnum.NOT_EFFECTIVE.code; + saveObj.setEffectFlag(effect); + } + this.saveOrUpdateBatch(saveObjs); + } + }); + update2FileSystem(needMove2FileSystemFiles, prjDirPath); + } + + private void resetFileInfoName(EdFileInfo fileInfo) { + String fileName = fileInfo.getFileName(); + String parentId = fileInfo.getParentId(); + for (int i = 0; i < 1000; ++i) { + long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(EdFileInfo.class) + .eq(EdFileInfo::getFileName, fileName) + .eq(EdFileInfo::getFileType, fileInfo.getFileType()) + .eq(EdFileInfo::getParentId, parentId) + .eq(EdFileInfo::getDataType, EleDataTypeEnum.FILE.code) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)); + if (count > 0) { + fileName = fileName + "_1"; + } else { + fileInfo.setFileName(fileName); + return; + } + } + } + + private void update2FileSystem(List needMove2FileSystemFiles, String prjDirPath) { + Map idNameMaps = needMove2FileSystemFiles.stream().collect(Collectors.toMap(EdFileInfo::getId, EdFileInfo::getFileName)); + List files = needMove2FileSystemFiles.stream().filter(e -> e.getDataType().equals(EleDataTypeEnum.FILE.code)).collect(Collectors.toList()); + for (EdFileInfo edFileInfo : files) { + String filePath = edFileInfo.getFilePath(); + StringBuilder sysFilePath = new StringBuilder(); + for (String id : filePath.split(MYSQL_FILE_PATH_SPLIT)) { + sysFilePath.append(idNameMaps.get(id)).append(File.separator); + } + String destPath = commonService.getEleDataPath() + File.separator + sysFilePath; + String sourcePath = prjDirPath + File.separator + sysFilePath; + fileSystemService.moveFile(sourcePath, destPath, true); + } + } + + private Map getVersionRelation(List edFileInfos) { + Map versionRelation = new HashMap<>(); + Map versionMap = edFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getFileVersion, e -> e)); + for (EdFileInfo edFileInfo : edFileInfos) { + Integer preVersion = edFileInfo.getPreVersion(); + EdFileInfo fileInfo = versionMap.get(preVersion); + String preVersionId = Objects.isNull(fileInfo) ? null : fileInfo.getId(); + versionRelation.put(edFileInfo.getId(), preVersionId); + } + return versionRelation; + } + + private List queryChildFolders(String parentId) { + return this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getParentId, parentId) + .eq(EdFileInfo::getDataType, EleDataTypeEnum.FOLDER.code) + .eq(EdFileInfo::getEffectFlag, false)); } /** * 导出 - * * @param dataIdArr * @return */ @@ -368,23 +495,30 @@ public class EdFileInfoServiceImpl extends ServiceImpl e.getParentId().equals(PRJ_PARENT_ID)).findFirst().get().getFileName(); + + List prjFolders = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getPrjDir, true).eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)); + Map prjFoldersMap = prjFolders.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); + Map tmps = resFiles.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); + resFiles.clear(); + resFiles.addAll(tmps.values()); + resFiles.addAll(prjFoldersMap.values()); + String prjName = commonService.getPrjNameByDbPath(resFiles.get(0).getFilePath()); List 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 + commonService.getFileSysPath(edFileInfo.getFileId()); - FileUtil.mkdir(destFolderPath); + String destFolderPath = downloadDataDir + File.separator + prjName + File.separator + commonService.getFileSysPath(edFileInfo.getFileId()); + fileSystemService.createDirectory(destFolderPath); } for (EdFileInfo edFileInfo : files) { String filePath = commonService.getFileSysPath(edFileInfo.getFileId()) + edFileInfo.getFileCode() + "." + edFileInfo.getFileCode(); - String destPath = downloadDataDir + File.separator + commonService.getDbPath(edFileInfo.getFileId()); - FileUtil.copy(filePath, destPath, false); + String destPath = downloadDataDir + File.separator + prjName + File.separator + commonService.getDbPath(edFileInfo.getFileId()); + fileSystemService.copyFile(filePath, destPath); } String mysqlInfo = JSONUtil.toJsonStr(resFiles); - FileUtil.writeString(mysqlInfo, downloadDataDir + File.separator + "mysql.info", Charset.defaultCharset()); + fileSystemService.writeStringToFile(downloadDataDir + File.separator + prjName + File.separator + "mysql.info", mysqlInfo); String exportZipFile = downloadDataDir + File.separator + prjName + ".zip"; String exportColibFile = downloadDataDir + File.separator + prjName + EXPORT_FILE_SUFFIX; - ZipUtil.zip(downloadDataDir + File.separator + prjName, exportZipFile); + ZipUtil.zip(downloadDataDir + File.separator + prjName + File.separator + prjName, exportZipFile); AES aes = SecureUtil.aes(password.getBytes()); try( InputStream inputStream = Files.newInputStream(Paths.get(exportZipFile)); @@ -396,18 +530,16 @@ public class EdFileInfoServiceImpl extends ServiceImpl e.getEffectFlag().equals(true)).collect(Collectors.toList()).get(0); + EdFileInfo effectFileInfo = parentFileInfos.stream().filter(e -> e.getEffectFlag().equals(EffectFlagEnum.EFFECT.code)).collect(Collectors.toList()).get(0); String codePathByDbPath = commonService.getCodePathByDbPath(effectFileInfo.getFilePath()); String timeStr = EleCommonUtil.getNowTimeStr(); String fileCode = commonService.createFileCode(codePathByDbPath, suffix, FILE_START_VERSION, timeStr); @@ -629,10 +767,11 @@ public class EdFileInfoServiceImpl extends ServiceImpl FileUtil.del(e.getAbsolutePath())); - return destZipPath; + return destColibPath; } } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdPrjServiceImpl.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdPrjServiceImpl.java index 9ea77a9..568e1b9 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdPrjServiceImpl.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/EdPrjServiceImpl.java @@ -73,9 +73,9 @@ public class EdPrjServiceImpl extends ServiceImpl .eq(EdFileInfo::getFileName, prjName)); if (count > 0) { - String info = StrFormatter.format("{} 已经存在", prjName); + String info = StrFormatter.format("{} 项目已经存在", prjName); log.info(info); - ElectromagneticResultUtil.fail("-1", "该项目名称已经存在。"); + return ElectromagneticResultUtil.fail("-1", info); } try { @@ -132,16 +132,16 @@ public class EdPrjServiceImpl extends ServiceImpl .eq(EdFileInfo::getFileName, newPrjName)); if (count > 0) { - String info = StrFormatter.format("{} 已经存在", newPrjName); + String info = StrFormatter.format("{} 项目已经存在", newPrjName); log.info(info); - ElectromagneticResultUtil.fail("-1", "该项目名称已经存在。"); + return ElectromagneticResultUtil.fail("-1", info); } EdFileInfo fileInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class) .select(EdFileInfo::getFileName) .eq(EdFileInfo::getId, prjId)); String oldPrjName = fileInfo.getFileName(); - String newPath = commonService.getEleDataPath(); + String newPath = commonService.getEleDataPath() + File.separator + newPrjName; if (fileSystemService.checkFolderExist(newPath)) { String info = StrFormatter.format("工程名{}已经存在", newPrjName); log.error(info); @@ -275,7 +275,7 @@ public class EdPrjServiceImpl extends ServiceImpl @Override @Transactional(rollbackFor = Exception.class) public ElectromagneticResult deleteFolder(String fileId, String parentId) { - return commonService.deleteFolder(fileId, parentId, true); + return commonService.deleteFolder(fileId, parentId); } /** @@ -363,7 +363,7 @@ public class EdPrjServiceImpl extends ServiceImpl if (commonService.checkSameFolder(parentId, newFolderName)) { String info = "存在同名子集,禁止修改"; log.error(info); - throw new BizException(-1, info); + return ElectromagneticResultUtil.fail("-1", info); } String currentUserId = UserThreadLocal.getUserId(); Date now = new Date(); 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 cfe4c2a..bbc806e 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 @@ -6,6 +6,7 @@ import org.springframework.stereotype.Service; import java.io.File; import java.io.InputStream; +import java.nio.charset.Charset; @Service public class FileSystemServiceImpl implements FileSystemService { @@ -17,10 +18,16 @@ public class FileSystemServiceImpl implements FileSystemService { @Override public void copyFile(String source, String destination) { + moveFile(source, destination, false); } @Override - public void moveFile(String source, String destination) { + 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); } @Override @@ -43,4 +50,16 @@ public class FileSystemServiceImpl implements FileSystemService { public boolean checkFolderExist(String newPath) { return FileUtil.exist(newPath); } + + @Override + public boolean writeStringToFile(String filePath, String contents) { + FileUtil.writeString(contents, filePath, Charset.defaultCharset()); + return true; + } + + @Override + public boolean deleteFile(String filePath) { + FileUtil.del(filePath); + return false; + } }