From adb64e25c1f7e66ba1b84a92df2ad6f2d9fa9fc4 Mon Sep 17 00:00:00 2001 From: chenxudong Date: Fri, 9 May 2025 08:56:11 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserEdFileInfoController.java | 13 ++ .../manage/service/EdFileInfoService.java | 5 + .../service/serviceimpl/CommonService.java | 135 ++++++++++++++++++ .../serviceimpl/EdFileInfoServiceImpl.java | 95 ++++++++++++ .../service/serviceimpl/EdPrjServiceImpl.java | 127 +--------------- 5 files changed, 250 insertions(+), 125 deletions(-) diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/UserEdFileInfoController.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/UserEdFileInfoController.java index dc10e78..959d681 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/UserEdFileInfoController.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/UserEdFileInfoController.java @@ -176,4 +176,17 @@ public class UserEdFileInfoController { return ElectromagneticResultUtil.success(edFileInfoService.removeFavorite(userId, id)); } + + /** + * 从收藏夹移除 + * + * @param + * @return + */ + @GetMapping("/importPrj") + @UserOperation(value = "导入工程", modelName = UserOperationModuleEnum.USER_PRJ) + public ElectromagneticResult importPrj(@RequestParam("file") MultipartFile file) { + return ElectromagneticResultUtil.success(edFileInfoService.importPrj(file)); + } + } 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 c439773..517d026 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 @@ -243,4 +243,9 @@ public interface EdFileInfoService { * @return */ ElectromagneticResult uploadFileAndRelation(String parentId, String id, MultipartFile file, String desc, int dataOwnCode); + + /** + * 导入工程 + */ + ElectromagneticResult importPrj(MultipartFile file); } 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 ae9ca67..e20ae7e 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 @@ -1,6 +1,7 @@ package com.electromagnetic.industry.software.manage.service.serviceimpl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.tree.Tree; @@ -11,6 +12,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.json.JSONUtil; 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.*; import com.electromagnetic.industry.software.common.exception.BizException; @@ -751,4 +753,137 @@ public class CommonService { return newEdFileInfo; } + @Transactional(rollbackFor = Exception.class) + public ElectromagneticResult follow(String sourceId, String targetId, int dataOwnCode) { + try { + // 把source工程的层级结构copy到目标工程 + // 查找source的全部目录 + List sourceEdFileInfos = selectAllPrjFolder(sourceId, dataOwnCode); + List targetEdFileInfos = selectAllPrjFolder(targetId, dataOwnCode); + Set sourceNames = sourceEdFileInfos.stream().filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == 1).map(EdFileInfo::getFileName).collect(Collectors.toSet()); + Set targetNames = targetEdFileInfos.stream().filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == 1).map(EdFileInfo::getFileName).collect(Collectors.toSet()); + + Collection intersection = CollectionUtil.intersection(sourceNames, targetNames); + if (CollUtil.isNotEmpty(intersection)) { + String info = StrFormatter.format("层级沿用失败,源工程 {},目标工程 {},原因 存在相同子集", sourceId, targetId); + log.error(info); + return ElectromagneticResultUtil.fail("-1", info); + } + + Map idMaps = new HashMap<>(); + idMaps.put(sourceId, targetId); + for (int i = 1; i <= elePropertyConfig.getPrjFolderMaxLength(); ++i) { + int layerIndex = i; + List currentSourceLayerDirs = sourceEdFileInfos.stream().filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == layerIndex).toList(); + if (layerIndex == 1) { + targetEdFileInfos = selectAllPrjFolder(targetId, dataOwnCode); + EdFileInfo prjFileInfo = targetEdFileInfos.stream().filter(e -> e.getParentId().equals(PRJ_PARENT_ID)).findFirst().get(); + List targetChildLayerDirs = targetEdFileInfos.stream().filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == 1).toList(); + int size = targetChildLayerDirs.size(); + for (EdFileInfo edFileInfo : currentSourceLayerDirs) { + int maxFolderId = Integer.parseInt(edFileInfoMapper.maxPrjId()); + String newFolderId = String.valueOf(maxFolderId + 1); + String nowTimeStr = EleCommonUtil.getNowTimeStr(); + String fileCode = createFileCode(targetId, EleDataTypeEnum.FOLDER.desc, FILE_START_VERSION, nowTimeStr); + EdFileInfo targetFile = new EdFileInfo(); + targetFile.newInit(); + targetFile.setId(newFolderId) + .setFileId(newFolderId) + .setFileName(edFileInfo.getFileName()) + .setFileVersion(FILE_START_VERSION) + .setDataOwn(dataOwnCode) + .setParentId(idMaps.get(edFileInfo.getParentId())) + .setFileTime(nowTimeStr) + .setDataType(EleDataTypeEnum.FOLDER.code) + .setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code) + .setFileCode(fileCode) + .setFileType("文件夹") + .setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code) + .setFilePath(prjFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newFolderId) + .setSort(++size) + .setEffectFlag(EffectFlagEnum.EFFECT.code); + edFileInfoMapper.insert(targetFile); + targetEdFileInfos.add(targetFile); + idMaps.put(edFileInfo.getFileId(), newFolderId); + } + } else { + List edFileInfos = edFileInfoMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) + .select(EdFileInfo.class, file -> !StrUtil.equals(file.getColumn(), "file_content")) + .in(EdFileInfo::getId, idMaps.values())); + Map map = edFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); + for (EdFileInfo edFileInfo : currentSourceLayerDirs) { + String targetDirParentId = idMaps.get(edFileInfo.getParentId()); + EdFileInfo parentFileInfo = map.get(targetDirParentId); + + int maxFolderId = Integer.parseInt(edFileInfoMapper.maxPrjId()); + String newFolderId = String.valueOf(maxFolderId + 1); + String nowTimeStr = EleCommonUtil.getNowTimeStr(); + + String fileCode = createFileCode(targetId, EleDataTypeEnum.FOLDER.desc, FILE_START_VERSION, nowTimeStr); + EdFileInfo targetFile = new EdFileInfo(); + targetFile.newInit(); + targetFile.setId(newFolderId) + .setFileId(newFolderId) + .setFileName(edFileInfo.getFileName()) + .setFileVersion(FILE_START_VERSION) + .setDataOwn(dataOwnCode) + .setParentId(targetDirParentId) + .setFileTime(nowTimeStr) + .setDataType(EleDataTypeEnum.FOLDER.code) + .setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code) + .setFileCode(fileCode) + .setFileType("文件夹") + .setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code) + .setFilePath(parentFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newFolderId) + .setSort(edFileInfo.getSort()) + .setEffectFlag(EffectFlagEnum.EFFECT.code); + edFileInfoMapper.insert(targetFile); + targetEdFileInfos.add(targetFile); + idMaps.put(edFileInfo.getFileId(), newFolderId); + } + } + } + UserThreadLocal.setSuccessInfo("", targetId, "层级沿用成功"); + return ElectromagneticResultUtil.success(true); + } catch (Exception e) { + String info = StrFormatter.format("层级沿用失败,源工程 {},目标工程 {},原因 {}", sourceId, targetId, e.getMessage()); + log.error(info, e); + throw new BizException(info); + } + } + + @Transactional(rollbackFor = Exception.class) + public ElectromagneticResult publish(String prjId, int dataOwnCode) { + EdFileInfo fileInfo = edFileInfoMapper.selectById(prjId); + try { + // 将已经处于删除状态设置成逻辑删除 + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) + .select(EdFileInfo::getId, EdFileInfo::getFilePath, EdFileInfo::getFileName) + .eq(EdFileInfo::getDataOwn, dataOwnCode) + .eq(EdFileInfo::getDataStatus, EleDataStatusEnum.WAIT_DELETED.code) + .likeRight(EdFileInfo::getFilePath, prjId); + List edFileInfos = edFileInfoMapper.selectList(queryWrapper); + for (EdFileInfo edFileInfo : edFileInfos) { + edFileInfoMapper.update(new EdFileInfo(), Wrappers.lambdaUpdate(EdFileInfo.class) + .eq(EdFileInfo::getId, edFileInfo.getId()) + .set(EdFileInfo::getAllDeleted, true) + .set(EdFileInfo::getPermanentDeleted, true) + .set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)); + } + // 其余置为发布状态 + LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(EdFileInfo.class) + .set(EdFileInfo::getDataStatus, EleDataStatusEnum.PUBLISHED.code) + .eq(EdFileInfo::getDataStatus, EleDataStatusEnum.NOT_PUBLISHED.code) + .likeRight(EdFileInfo::getFilePath, prjId); + edFileInfoMapper.update(new EdFileInfo(), updateWrapper); + UserThreadLocal.setSuccessInfo("", prjId, "项目 {} 发布成功", fileInfo.getFileName()); + return ElectromagneticResultUtil.success(true); + } catch (Exception e) { + String info = StrFormatter.format("项目 {} 发布异常", fileInfo.getFileName()); + log.error(info, e); + throw new BizException(info, e); + } + } + + } 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 0471141..6b25c8c 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 @@ -1505,6 +1505,101 @@ public class EdFileInfoServiceImpl extends ServiceImpl importPrj(MultipartFile file) { + try { + // 创建工程 + String prjId = updateImportPrj2Db(file); + // 层级沿用 + commonService.follow("100001", prjId, DataOwnEnum.SYS_PRJ.code); + // 工程发布 + commonService.publish(prjId, DataOwnEnum.SYS_PRJ.code); + // 将文件存入到数据库和文件系统 + updateImportPrj2FileSystem(file, prjId); + } catch (Exception e) { + + } + + return null; + } + + private void updateImportPrj2FileSystem(MultipartFile file, String prjId) throws IOException { + String tmpFile = elePropertyConfig.getEleTmpPath() + File.separator + file.getOriginalFilename(); + String mainName = FileUtil.mainName(tmpFile); + FileUtil.del(tmpFile); + FileUtil.writeFromStream(file.getInputStream(), tmpFile); + ZipUtil.unzip(tmpFile); + List files = FileUtil.loopFiles(elePropertyConfig.getEleTmpPath() + File.separator + mainName); + List edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code) + .likeRight(EdFileInfo::getFilePath, prjId + MYSQL_FILE_PATH_SPLIT) + .eq(EdFileInfo::getDataOwn, DataOwnEnum.SYS_PRJ.code)); + Map fileIdMap = edFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); + + } + + private String updateImportPrj2Db(MultipartFile file) { + String originalFilename = file.getOriginalFilename(); + String suffix = FileUtil.getSuffix(originalFilename); + String mainName = FileUtil.getName(originalFilename); + Assert.isTrue(StrUtil.equals(suffix, "zip"), "不支持 {} 格式的工程文件", suffix); + // 检查工程是否存在 + List edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getFileName, mainName) + .eq(EdFileInfo::getDataOwn, DataOwnEnum.SYS_PRJ.code) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code) + .eq(EdFileInfo::getParentId, PRJ_PARENT_ID)); + + if (!edFileInfos.isEmpty()) { + // 废除工程及其下面的所有文件 + Set ids = edFileInfos.stream().map(EdFileInfo::getId).collect(Collectors.toSet()); + for (EdFileInfo edFileInfo : edFileInfos) { + String id = edFileInfo.getId(); + List edFileInfos1 = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) + .select(EdFileInfo::getId) + .eq(EdFileInfo::getFileId, id) + .likeRight(EdFileInfo::getFilePath, id + MYSQL_FILE_PATH_SPLIT)); + ids.addAll(edFileInfos1.stream().map(EdFileInfo::getId).collect(Collectors.toSet())); + } + this.baseMapper.update(new EdFileInfo(), Wrappers.lambdaUpdate(EdFileInfo.class) + .set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code) + .in(EdFileInfo::getId, ids)); + UserThreadLocal.setSuccessInfo("", "", "导入工程时,发现了同名工程 {},删除了同名工程,ids是 {}", mainName, ids); + } + + // 保存信息到MySQL + String maxPrjId = this.baseMapper.maxPrjId(); + LambdaQueryWrapper qw = Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getParentId, PRJ_PARENT_ID); + Long prjCount = this.baseMapper.selectCount(qw.eq(EdFileInfo::getDataOwn, DataOwnEnum.SYS_PRJ.code)); + int id = Integer.parseInt(StrUtil.isEmpty(maxPrjId) ? "100000" : maxPrjId); + String newPrjId = String.valueOf(id + 1); + EdFileInfo fileInfo = new EdFileInfo(); + fileInfo.newInit(); + String nowTimeStr = EleCommonUtil.getNowTimeStr(); + fileInfo.setId(newPrjId) + .setFileType("文件夹") + .setFileId(newPrjId) + .setFileName(mainName) + .setFileVersion(FILE_START_VERSION) + .setParentId(PRJ_PARENT_ID) + .setFileTime(nowTimeStr) + .setDataType(EleDataTypeEnum.FOLDER.code) + .setDataStatus(EleDataStatusEnum.PUBLISHED.code) + .setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code) + .setFilePath(newPrjId) + .setSort(prjCount.intValue() + 1) + .setFileCode(commonService.createFileCode(newPrjId, EleDataTypeEnum.FOLDER.desc, FILE_START_VERSION, nowTimeStr)) + .setDataOwn(DataOwnEnum.SYS_PRJ.code) + .setEffectFlag(EffectFlagEnum.EFFECT.code); + this.baseMapper.insert(fileInfo); + UserThreadLocal.setSuccessInfo("", newPrjId, "创建 {} 项目成功。", mainName); + return maxPrjId; + } + /** * 统一废除文件相关数据 * 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 e077f67..63617a2 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 @@ -303,35 +303,7 @@ public class EdPrjServiceImpl extends ServiceImpl @Override @Transactional(rollbackFor = Exception.class) public ElectromagneticResult publish(String prjId, int dataOwnCode) { - EdFileInfo fileInfo = this.baseMapper.selectById(prjId); - try { - // 将已经处于删除状态设置成逻辑删除 - LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) - .select(EdFileInfo::getId, EdFileInfo::getFilePath, EdFileInfo::getFileName) - .eq(EdFileInfo::getDataOwn, dataOwnCode) - .eq(EdFileInfo::getDataStatus, EleDataStatusEnum.WAIT_DELETED.code) - .likeRight(EdFileInfo::getFilePath, prjId); - List edFileInfos = this.baseMapper.selectList(queryWrapper); - for (EdFileInfo edFileInfo : edFileInfos) { - this.update(new EdFileInfo(), Wrappers.lambdaUpdate(EdFileInfo.class) - .eq(EdFileInfo::getId, edFileInfo.getId()) - .set(EdFileInfo::getAllDeleted, true) - .set(EdFileInfo::getPermanentDeleted, true) - .set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)); - } - // 其余置为发布状态 - LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(EdFileInfo.class) - .set(EdFileInfo::getDataStatus, EleDataStatusEnum.PUBLISHED.code) - .eq(EdFileInfo::getDataStatus, EleDataStatusEnum.NOT_PUBLISHED.code) - .likeRight(EdFileInfo::getFilePath, prjId); - this.update(new EdFileInfo(), updateWrapper); - UserThreadLocal.setSuccessInfo("", prjId, "项目 {} 发布成功", fileInfo.getFileName()); - return ElectromagneticResultUtil.success(true); - } catch (Exception e) { - String info = StrFormatter.format("项目 {} 发布异常", fileInfo.getFileName()); - log.error(info, e); - throw new BizException(info, e); - } + return commonService.publish(prjId, dataOwnCode); } /** @@ -356,102 +328,7 @@ public class EdPrjServiceImpl extends ServiceImpl @Override @Transactional(rollbackFor = Exception.class) public ElectromagneticResult follow(String sourceId, String targetId, int dataOwnCode) { - - try { - // 把source工程的层级结构copy到目标工程 - // 查找source的全部目录 - List sourceEdFileInfos = commonService.selectAllPrjFolder(sourceId, dataOwnCode); - List targetEdFileInfos = commonService.selectAllPrjFolder(targetId, dataOwnCode); - Set sourceNames = sourceEdFileInfos.stream().filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == 1).map(EdFileInfo::getFileName).collect(Collectors.toSet()); - Set targetNames = targetEdFileInfos.stream().filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == 1).map(EdFileInfo::getFileName).collect(Collectors.toSet()); - - Collection intersection = CollectionUtil.intersection(sourceNames, targetNames); - if (CollUtil.isNotEmpty(intersection)) { - String info = StrFormatter.format("层级沿用失败,源工程 {},目标工程 {},原因 存在相同子集", sourceId, targetId); - log.error(info); - return ElectromagneticResultUtil.fail("-1", info); - } - - Map idMaps = new HashMap<>(); - idMaps.put(sourceId, targetId); - for (int i = 1; i <= elePropertyConfig.getPrjFolderMaxLength(); ++i) { - int layerIndex = i; - List currentSourceLayerDirs = sourceEdFileInfos.stream().filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == layerIndex).toList(); - if (layerIndex == 1) { - targetEdFileInfos = commonService.selectAllPrjFolder(targetId, dataOwnCode); - EdFileInfo prjFileInfo = targetEdFileInfos.stream().filter(e -> e.getParentId().equals(PRJ_PARENT_ID)).findFirst().get(); - List targetChildLayerDirs = targetEdFileInfos.stream().filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == 1).toList(); - int size = targetChildLayerDirs.size(); - for (EdFileInfo edFileInfo : currentSourceLayerDirs) { - int maxFolderId = Integer.parseInt(this.baseMapper.maxPrjId()); - String newFolderId = String.valueOf(maxFolderId + 1); - String nowTimeStr = EleCommonUtil.getNowTimeStr(); - String fileCode = commonService.createFileCode(targetId, EleDataTypeEnum.FOLDER.desc, FILE_START_VERSION, nowTimeStr); - EdFileInfo targetFile = new EdFileInfo(); - targetFile.newInit(); - targetFile.setId(newFolderId) - .setFileId(newFolderId) - .setFileName(edFileInfo.getFileName()) - .setFileVersion(FILE_START_VERSION) - .setDataOwn(dataOwnCode) - .setParentId(idMaps.get(edFileInfo.getParentId())) - .setFileTime(nowTimeStr) - .setDataType(EleDataTypeEnum.FOLDER.code) - .setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code) - .setFileCode(fileCode) - .setFileType("文件夹") - .setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code) - .setFilePath(prjFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newFolderId) - .setSort(++size) - .setEffectFlag(EffectFlagEnum.EFFECT.code); - this.save(targetFile); - targetEdFileInfos.add(targetFile); - idMaps.put(edFileInfo.getFileId(), newFolderId); - } - } else { - List edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) - .select(EdFileInfo.class, file -> !StrUtil.equals(file.getColumn(), "file_content")) - .in(EdFileInfo::getId, idMaps.values())); - Map map = edFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); - for (EdFileInfo edFileInfo : currentSourceLayerDirs) { - String targetDirParentId = idMaps.get(edFileInfo.getParentId()); - EdFileInfo parentFileInfo = map.get(targetDirParentId); - - int maxFolderId = Integer.parseInt(this.baseMapper.maxPrjId()); - String newFolderId = String.valueOf(maxFolderId + 1); - String nowTimeStr = EleCommonUtil.getNowTimeStr(); - - String fileCode = commonService.createFileCode(targetId, EleDataTypeEnum.FOLDER.desc, FILE_START_VERSION, nowTimeStr); - EdFileInfo targetFile = new EdFileInfo(); - targetFile.newInit(); - targetFile.setId(newFolderId) - .setFileId(newFolderId) - .setFileName(edFileInfo.getFileName()) - .setFileVersion(FILE_START_VERSION) - .setDataOwn(dataOwnCode) - .setParentId(targetDirParentId) - .setFileTime(nowTimeStr) - .setDataType(EleDataTypeEnum.FOLDER.code) - .setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code) - .setFileCode(fileCode) - .setFileType("文件夹") - .setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code) - .setFilePath(parentFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newFolderId) - .setSort(edFileInfo.getSort()) - .setEffectFlag(EffectFlagEnum.EFFECT.code); - this.save(targetFile); - targetEdFileInfos.add(targetFile); - idMaps.put(edFileInfo.getFileId(), newFolderId); - } - } - } - UserThreadLocal.setSuccessInfo("", targetId, "层级沿用成功"); - return ElectromagneticResultUtil.success(true); - } catch (Exception e) { - String info = StrFormatter.format("层级沿用失败,源工程 {},目标工程 {},原因 {}", sourceId, targetId, e.getMessage()); - log.error(info, e); - throw new BizException(info); - } + return commonService.follow(sourceId, targetId, dataOwnCode); } /** From 8f61c95cfed870023a14eaecac78eff47338d09f Mon Sep 17 00:00:00 2001 From: chenxudong Date: Fri, 9 May 2025 17:03:27 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E7=9B=AE=E5=89=8D=E8=BF=98=20=E5=89=A9?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E7=9A=84=E5=AF=BC=E5=85=A5=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E8=B0=83=E9=80=9A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SysEdFileInfoController.java | 13 +++ .../controller/UserEdFileInfoController.java | 13 --- .../service/serviceimpl/CommonService.java | 3 +- .../serviceimpl/EdFileInfoServiceImpl.java | 110 ++++++++++++++++-- 4 files changed, 114 insertions(+), 25 deletions(-) diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/SysEdFileInfoController.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/SysEdFileInfoController.java index 21d3316..151e0c4 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/SysEdFileInfoController.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/SysEdFileInfoController.java @@ -201,4 +201,17 @@ public class SysEdFileInfoController { String userId = UserThreadLocal.getUserId(); return ElectromagneticResultUtil.success(edFileInfoService.findFavorite(userId, fileInfoQueryDTO)); } + + /** + * 从收藏夹移除 + * + * @param + * @return + */ + @GetMapping("/importPrj") + @UserOperation(value = "导入工程", modelName = UserOperationModuleEnum.USER_PRJ) + public ElectromagneticResult importPrj(@RequestParam("file") MultipartFile file) { + return edFileInfoService.importPrj(file); + } + } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/UserEdFileInfoController.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/UserEdFileInfoController.java index 959d681..dc10e78 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/UserEdFileInfoController.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/UserEdFileInfoController.java @@ -176,17 +176,4 @@ public class UserEdFileInfoController { return ElectromagneticResultUtil.success(edFileInfoService.removeFavorite(userId, id)); } - - /** - * 从收藏夹移除 - * - * @param - * @return - */ - @GetMapping("/importPrj") - @UserOperation(value = "导入工程", modelName = UserOperationModuleEnum.USER_PRJ) - public ElectromagneticResult importPrj(@RequestParam("file") MultipartFile file) { - return ElectromagneticResultUtil.success(edFileInfoService.importPrj(file)); - } - } 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 e20ae7e..90498d8 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 @@ -237,7 +237,8 @@ public class CommonService { case REPO_PRJ, REPO_FILE -> queryWrapper.eq(EdFileInfo::getDataOwn, DataOwnEnum.REPO_PRJ.code); default -> throw new BizException("参数错误"); } - return edFileInfoMapper.selectList(queryWrapper); + List edFileInfos = edFileInfoMapper.selectList(queryWrapper); + return edFileInfos; } @Transactional(rollbackFor = Exception.class) 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 6b25c8c..d598ea8 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 @@ -21,6 +21,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.*; +import com.electromagnetic.industry.software.common.enums.FilePermission; import com.electromagnetic.industry.software.common.exception.BizException; import com.electromagnetic.industry.software.common.exception.PermissionDeniedException; import com.electromagnetic.industry.software.common.pojo.RespPageVO; @@ -28,6 +29,8 @@ import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; import com.electromagnetic.industry.software.common.util.*; import com.electromagnetic.industry.software.manage.config.ElePropertyConfig; import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper; +import com.electromagnetic.industry.software.manage.mapper.RoleMapper; +import com.electromagnetic.industry.software.manage.mapper.RolePermissionMapper; import com.electromagnetic.industry.software.manage.mapper.UserMapper; import com.electromagnetic.industry.software.manage.pojo.models.*; import com.electromagnetic.industry.software.manage.pojo.other.FileInfoVO; @@ -52,6 +55,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.*; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.*; @@ -85,6 +89,8 @@ public class EdFileInfoServiceImpl extends ServiceImpl edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) + .eq(EdFileInfo::getDataOwn, DataOwnEnum.SYS_PRJ.code) + .likeRight(EdFileInfo::getFilePath, prjId + MYSQL_FILE_PATH_SPLIT)); + Set ids = edFileInfos.stream().map(e -> e.getId()).collect(Collectors.toSet()); + ids.add(prjId); + for (String id : ids) { + for (FilePermission permission : FilePermission.values()) { + RolePermission rolePermission = new RolePermission(); + rolePermission.newInit(); + rolePermission.setRoleId(role.getId()); + rolePermission.setFileId(id); + rolePermission.setPermissionCode(permission.getCode()); + rolePermissionService.save(rolePermission); + } + } } private void updateImportPrj2FileSystem(MultipartFile file, String prjId) throws IOException { - String tmpFile = elePropertyConfig.getEleTmpPath() + File.separator + file.getOriginalFilename(); - String mainName = FileUtil.mainName(tmpFile); - FileUtil.del(tmpFile); - FileUtil.writeFromStream(file.getInputStream(), tmpFile); - ZipUtil.unzip(tmpFile); - List files = FileUtil.loopFiles(elePropertyConfig.getEleTmpPath() + File.separator + mainName); + String orgName = file.getOriginalFilename(); + String tmpZipFile = elePropertyConfig.getEleTmpPath() + File.separator + orgName; + String mainName = FileUtil.mainName(orgName); + String suffix = FileUtil.getSuffix(orgName); + FileUtil.del(tmpZipFile); + FileUtil.writeFromStream(file.getInputStream(), tmpZipFile); + String destDir = elePropertyConfig.getEleTmpPath() + File.separator + IdUtil.fastSimpleUUID(); + try { + ZipUtil.unzip(tmpZipFile, destDir, StandardCharsets.UTF_8); + } catch (Exception e) { + ZipUtil.unzip(tmpZipFile, destDir, Charset.forName("GBK")); + } + List files = FileUtil.loopFiles(destDir); List edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code) .likeRight(EdFileInfo::getFilePath, prjId + MYSQL_FILE_PATH_SPLIT) .eq(EdFileInfo::getDataOwn, DataOwnEnum.SYS_PRJ.code)); - Map fileIdMap = edFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); - + Map idNameMap = edFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, EdFileInfo::getFileName)); + idNameMap.put(prjId, mainName); + Map filePathMap = new HashMap<>(); + for (EdFileInfo edFileInfo : edFileInfos) { + StringBuilder names = new StringBuilder(); + for (String id : edFileInfo.getFilePath().split(MYSQL_FILE_PATH_SPLIT)) { + String name = idNameMap.get(id); + names.append(MYSQL_FILE_PATH_SPLIT).append(name); + } + filePathMap.put(names.substring(1), edFileInfo); + } + String tmpPath = FileUtil.normalize(destDir); + for (File importFile : files) { + String parentDir = FileUtil.normalize(importFile.getParent()); + String relativeFilePath = parentDir.replace(tmpPath, ""); + while (relativeFilePath.startsWith(File.separator)) { + relativeFilePath = relativeFilePath.substring(1); + } + String fileType = FileUtil.getSuffix(importFile.getName()); + relativeFilePath = relativeFilePath.startsWith("/") ? relativeFilePath.substring(1) : relativeFilePath; + relativeFilePath = relativeFilePath.replace("/", MYSQL_FILE_PATH_SPLIT); + EdFileInfo edFileInfo = filePathMap.get(relativeFilePath); + String id = edFileInfo.getId(); + EdFileInfo newEdFileInfo = new EdFileInfo(); + newEdFileInfo.newInit(); + String fileCode = commonService.createFileCode(edFileInfo.getFilePath(), fileType, FILE_START_VERSION, newEdFileInfo.getFileTime()); + newEdFileInfo.setParentId(id) + .setFileCode(fileCode) + .setSaveStatus(EleDataSaveStatusEnum.UPLOADING.code) + .setDataOwn(DataOwnEnum.SYS_FILE.code) + .setFileName(mainName) + .setFileContent(EleCommonUtil.parse(file.getInputStream(), suffix)) + .setFileType(suffix) + .setFileVersion(FILE_START_VERSION) + .setFileSize(file.getSize()) + .setFilePath(edFileInfo.getFilePath() + MYSQL_FILE_PATH_SPLIT + newEdFileInfo.getId()) + .setDataType(EleDataTypeEnum.FILE.code) + .setDataStatus(PublishEnum.PUBLISHED.getCode()) + .setEffectFlag(EffectFlagEnum.EFFECT.code); + this.baseMapper.insert(newEdFileInfo); + String destPath = commonService.getPrjRootPath1(DataOwnEnum.SYS_FILE.code) + File.separator + newEdFileInfo.getId(); + FileUtil.move(importFile, new File(destPath), false); + EleCommonUtil.encryptFile(destPath, SecureUtil.aes(FILE_SEC_PASSWD.getBytes())); + } } private String updateImportPrj2Db(MultipartFile file) { String originalFilename = file.getOriginalFilename(); String suffix = FileUtil.getSuffix(originalFilename); - String mainName = FileUtil.getName(originalFilename); + String mainName = FileUtil.mainName(originalFilename); Assert.isTrue(StrUtil.equals(suffix, "zip"), "不支持 {} 格式的工程文件", suffix); // 检查工程是否存在 List edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class).eq(EdFileInfo::getFileName, mainName) @@ -1597,7 +1685,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl Date: Fri, 9 May 2025 17:52:26 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=91=E7=8E=B0?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/serviceimpl/EdFileInfoServiceImpl.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) 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 d598ea8..ef52ce0 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 @@ -1580,6 +1580,12 @@ public class EdFileInfoServiceImpl extends ServiceImpl files = FileUtil.loopFiles(destDir); List edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code) @@ -1613,11 +1619,11 @@ public class EdFileInfoServiceImpl extends ServiceImpl Date: Mon, 12 May 2025 10:13:34 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E9=81=87=E5=88=B0?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../software/manage/service/serviceimpl/CommonService.java | 4 ++-- .../manage/service/serviceimpl/EdFileInfoServiceImpl.java | 7 ++----- 2 files changed, 4 insertions(+), 7 deletions(-) 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 90498d8..c316ffd 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 @@ -844,7 +844,7 @@ public class CommonService { } } } - UserThreadLocal.setSuccessInfo("", targetId, "层级沿用成功"); + UserThreadLocal.setSuccessInfo("", targetId, "层级沿用成功,源工程id {},目标工程id {},", sourceId, targetId); return ElectromagneticResultUtil.success(true); } catch (Exception e) { String info = StrFormatter.format("层级沿用失败,源工程 {},目标工程 {},原因 {}", sourceId, targetId, e.getMessage()); @@ -877,7 +877,7 @@ public class CommonService { .eq(EdFileInfo::getDataStatus, EleDataStatusEnum.NOT_PUBLISHED.code) .likeRight(EdFileInfo::getFilePath, prjId); edFileInfoMapper.update(new EdFileInfo(), updateWrapper); - UserThreadLocal.setSuccessInfo("", prjId, "项目 {} 发布成功", fileInfo.getFileName()); + UserThreadLocal.setSuccessInfo("", prjId, "项目 {} 发布成功, 项目id {}", fileInfo.getFileName(), prjId); return ElectromagneticResultUtil.success(true); } catch (Exception e) { String info = StrFormatter.format("项目 {} 发布异常", fileInfo.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 ef52ce0..b326779 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 @@ -1571,7 +1571,6 @@ public class EdFileInfoServiceImpl extends ServiceImpl Date: Mon, 12 May 2025 10:35:58 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/serviceimpl/EdFileInfoServiceImpl.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) 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 b326779..540f053 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 @@ -1530,7 +1530,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl files = FileUtil.loopFiles(destDir); + FileUtil.rename(file1, mainName, true); List edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code) .likeRight(EdFileInfo::getFilePath, prjId + MYSQL_FILE_PATH_SPLIT) @@ -1601,6 +1597,8 @@ public class EdFileInfoServiceImpl extends ServiceImpl files = FileUtil.loopFiles(destDir); String tmpPath = FileUtil.normalize(destDir); for (File importFile : files) { String parentDir = FileUtil.normalize(importFile.getParent()); @@ -1609,6 +1607,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl