From 044c9f1b423e36c2d7fb9b2d924e565065166a9f Mon Sep 17 00:00:00 2001 From: chenxudong Date: Tue, 15 Apr 2025 14:22:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AF=BC=E5=85=A5=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/pojo/models/BaseModel.java | 6 + .../manage/pojo/models/EdFileInfo.java | 6 +- .../serviceimpl/EdFileInfoServiceImpl.java | 256 ++++++++++++++---- .../common/cons/ElectromagneticConstants.java | 10 + 4 files changed, 219 insertions(+), 59 deletions(-) diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/BaseModel.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/BaseModel.java index 918d6f2..e985dd0 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/BaseModel.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/BaseModel.java @@ -33,4 +33,10 @@ public class BaseModel { */ @TableField(value = "updated_by", fill = FieldFill.UPDATE) private String updatedBy; + + /** + * 是否有效 0-无效 1-有效 + */ + @TableField(value = "effect_flag") + private Integer effectFlag; } 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 fe3a740..267572d 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 @@ -85,11 +85,7 @@ public class EdFileInfo extends BaseModel { */ @TableField(value = "pre_version") private Integer preVersion; - /** - * 是否有效 0-无效 1-有效 - */ - @TableField(value = "effect_flag") - private Integer effectFlag; + /** * 保存状态,0-上传中 1-上传成功 2-上传失败 */ 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 1e2c9ee..d0e9765 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 @@ -27,11 +27,8 @@ import com.electromagnetic.industry.software.common.pojo.RespPageVO; 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.UserMapper; -import com.electromagnetic.industry.software.manage.pojo.models.EdFileFavorite; -import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo; -import com.electromagnetic.industry.software.manage.pojo.models.User; +import com.electromagnetic.industry.software.manage.mapper.*; +import com.electromagnetic.industry.software.manage.pojo.models.*; import com.electromagnetic.industry.software.manage.pojo.other.FileInfoVO; import com.electromagnetic.industry.software.manage.pojo.other.UploadRecordDTO; import com.electromagnetic.industry.software.manage.pojo.req.*; @@ -89,6 +86,12 @@ public class EdFileInfoServiceImpl extends ServiceImpl> FILE_DB_ID_NAME = new ConcurrentHashMap<>(); @@ -490,8 +493,29 @@ public class EdFileInfoServiceImpl extends ServiceImpl importAllFiles = JSONUtil.toList(info, EdFileInfo.class); + String info = FileUtil.readString(prjDirPath + File.separator + "mysql.json", Charset.defaultCharset()); + Map importInfoMap = JSONUtil.toBean(info, Map.class); + updatePrjInfo(importInfoMap, prjDirPath, dataOwnCode); + updateCollectionInfo(importInfoMap); + updateFileTageInfo(importInfoMap); + updateFileRelationInfo(importInfoMap); + } + + private void updateFileRelationInfo(Map importInfoMap) { + + } + + private void updateFileTageInfo(Map importInfoMap) { + + } + + private void updateCollectionInfo(Map importInfoMap) { + List edFileFavorites = (List)importInfoMap.getOrDefault(ED_FILE_FAVORITE, new ArrayList<>()); + edFileFavoriteMapper.insertOrUpdate(edFileFavorites); + } + + private void updatePrjInfo(Map importInfoMap, String prjDirPath, Integer dataOwnCode) { + List importAllFiles = (List)importInfoMap.getOrDefault(PRJ_INFO, new ArrayList<>()); // 找出层级文件夹 List prjFolders = importAllFiles.stream().filter(e -> DataOwnEnum.isPrjCode(e.getDataOwn())) .toList(); @@ -546,7 +570,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl dbIdMap = dbFileInfos.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); Map importIdMap = importFiles.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); @@ -600,13 +624,13 @@ public class EdFileInfoServiceImpl extends ServiceImpl needMove2FileSystemFiles, String prjDirPath, int dataOwnCode) { Map maps = needMove2FileSystemFiles.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); List files = needMove2FileSystemFiles.stream().filter(e -> e.getDataType().equals(EleDataTypeEnum.FILE.code)).toList(); @@ -749,7 +772,87 @@ public class EdFileInfoServiceImpl extends ServiceImpl batchExport(String dataIdArr, HttpServletResponse response, int dataOwnCode) throws IOException { + + String[] ids = dataIdArr.split(","); String userDownloadDataDir = elePropertyConfig.getDownloadDataDir(dataOwnCode) + File.separator + UserThreadLocal.getUserId(); + if (DataOwnEnum.isSysCode(dataOwnCode) || DataOwnEnum.isRepoCode(dataOwnCode)) { + Map map = permissionService.filterExportIds(ids); + Assert.isTrue(!map.containsValue(Boolean.FALSE), "有未授权的层级目录,禁止导出"); + } + + Map exportInfoMap = new HashMap<>(); + // 导出工程目录信息 + exportPrjInfo(exportInfoMap, dataOwnCode, dataIdArr, userDownloadDataDir); + // 导出文件收藏相关信息 + exportCollectionInfo(exportInfoMap); + // 导出文件关系 + exportFileRelationInfo(exportInfoMap); + // 导出标签相关信息 + exportFileTagInfo(exportInfoMap); + String mysqlInfo = JSONUtil.toJsonStr(exportInfoMap); + String mysqlFilePath = userDownloadDataDir + File.separator + EXPORT_PRJ_NAME + File.separator + "mysql.json"; + String prjDirPath = userDownloadDataDir + File.separator + EXPORT_PRJ_NAME; + String exportZipFile = userDownloadDataDir + File.separator + EXPORT_PRJ_NAME + ".zip"; + String exportColibFile = userDownloadDataDir + File.separator + File.separator + EXPORT_PRJ_NAME + EXPORT_FILE_SUFFIX; + + fileSystemService.writeStringToFile(mysqlFilePath, mysqlInfo); + FileUtil.del(exportColibFile); + ZipUtil.zip(prjDirPath, exportZipFile); + AES aes = SecureUtil.aes(FILE_SEC_PASSWD.getBytes()); + try ( + InputStream inputStream = Files.newInputStream(Paths.get(exportZipFile)); + OutputStream outputStream = Files.newOutputStream(Paths.get(exportColibFile)); + ) { + aes.encrypt(inputStream, outputStream, true); + } catch (Exception e) { + String info = "导出失败。"; + log.error(info, e); + throw new BizException(info); + } finally { + fileSystemService.deleteFile(exportZipFile, prjDirPath); + } + File file = FileUtil.newFile(exportColibFile); + FileSystemResource fileSystemResource = new FileSystemResource(file); + HttpHeaders headers = new HttpHeaders(); + headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); + String fileName = Base64.encode(EleCommonUtil.getNowTimeStr() + "_" + fileSystemResource.getFilename()); + headers.add("Pragma", "no-cache"); + headers.add("Expires", "0"); + response.setHeader("content-disposition", "attachment;filename=" + fileName); + UserThreadLocal.setSuccessInfo("", "", "导出数据库成功"); + // 构建响应实体(可以返回 exportInfoMap) { + List fileInfos = (List)exportInfoMap.getOrDefault(PRJ_INFO, new ArrayList<>()); + List accessibleFileIds = fileInfos.stream().map(EdFileInfo::getId).toList(); + List fileTagRelations = fileTagRelationMapper.selectList(Wrappers.lambdaQuery(FileTagRelation.class).in(FileTagRelation::getFileId, accessibleFileIds)); + exportInfoMap.put(ED_TAG_RELATIONS, fileTagRelations); + } + + private void exportFileRelationInfo(Map exportInfoMap) { + List fileInfos = (List)exportInfoMap.getOrDefault(PRJ_INFO, new ArrayList<>()); + List accessibleFileIds = fileInfos.stream().map(EdFileInfo::getId).toList(); + List edFileRelations = edFileRelationMapper.selectList(Wrappers.lambdaQuery(EdFileRelation.class).in(EdFileRelation::getId1, accessibleFileIds) + .or() + .in(EdFileRelation::getId2, accessibleFileIds)); + exportInfoMap.put(ED_FILE_RELATION, edFileRelations); + } + + private void exportCollectionInfo(Map exportInfoMap) { + List fileInfos = (List)exportInfoMap.getOrDefault(PRJ_INFO, new ArrayList<>()); + List accessibleFileIds = fileInfos.stream().map(EdFileInfo::getId).toList(); + List edFileFavorites = edFileFavoriteMapper.selectList(Wrappers.lambdaQuery(EdFileFavorite.class).in(EdFileFavorite::getFileId, accessibleFileIds)); + exportInfoMap.put(ED_FILE_FAVORITE, edFileFavorites); + } + + private void exportPrjInfo(Map exportInfoMap, int dataOwnCode, String dataIdArr, String userDownloadDataDir) throws IOException { String[] ids = dataIdArr.split(","); if (DataOwnEnum.isSysCode(dataOwnCode) || DataOwnEnum.isRepoCode(dataOwnCode)) { Map map = permissionService.filterExportIds(ids); @@ -788,50 +891,95 @@ public class EdFileInfoServiceImpl extends ServiceImpl batchExport1(String dataIdArr, HttpServletResponse response, int dataOwnCode) throws IOException { +// String userDownloadDataDir = elePropertyConfig.getDownloadDataDir(dataOwnCode) + File.separator + UserThreadLocal.getUserId(); +// String[] ids = dataIdArr.split(","); +// if (DataOwnEnum.isSysCode(dataOwnCode) || DataOwnEnum.isRepoCode(dataOwnCode)) { +// Map map = permissionService.filterExportIds(ids); +// Assert.isTrue(!map.containsValue(Boolean.FALSE), "有未授权的层级目录,禁止导出"); +// } +// Map maps = new HashMap<>(); +// for (String id : ids) { +// Map edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) +// .like(EdFileInfo::getFilePath, MYSQL_FILE_PATH_SPLIT + id + MYSQL_FILE_PATH_SPLIT)) +// .stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); +// maps.putAll(edFileInfos); +// } +// List resFiles = new ArrayList<>(maps.values()); +// String prjId = resFiles.get(0).getFilePath().split(MYSQL_FILE_PATH_SPLIT)[0]; +// List prjFolders = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) +// .likeRight(EdFileInfo::getFilePath, prjId + MYSQL_FILE_PATH_SPLIT) +// .eq(EdFileInfo::getDataType, EleDataTypeEnum.FOLDER.code) +// .eq(EdFileInfo::getDataOwn, DataOwnEnum.getPrjCodeByFileCode(dataOwnCode)) +// .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)); +// EdFileInfo prjFileInfo = this.baseMapper.selectById(prjId); +// Map prjFoldersMap = prjFolders.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); +// Map tmps = resFiles.stream().collect(Collectors.toMap(EdFileInfo::getId, e -> e)); +// tmps.putAll(prjFoldersMap); +// resFiles.clear(); +// resFiles.addAll(tmps.values()); +// resFiles.add(prjFileInfo); +// String prjName = commonService.getPrjNameByDbPath(resFiles.get(0).getFilePath()); +// List folders = resFiles.stream().filter(e -> e.getDataType().equals(EleDataTypeEnum.FOLDER.code)).toList(); +// List files = resFiles.stream().filter(e -> e.getDataType().equals(EleDataTypeEnum.FILE.code)).toList(); +// for (EdFileInfo edFileInfo : folders) { +// String destFolderPath = userDownloadDataDir + File.separator + prjName + File.separator + commonService.getDbPath(edFileInfo.getFilePath()); // file +// fileSystemService.createDirectory(destFolderPath); +// } +// for (EdFileInfo edFileInfo : files) { +// String filePath = commonService.getFileSysPath(edFileInfo.getFilePath(), dataOwnCode); // file +// String destPath = userDownloadDataDir + File.separator + prjName + File.separator + commonService.getDbPath(edFileInfo.getFilePath()); +// fileSystemService.copyFile(filePath, destPath); +// } +// String mysqlInfo = JSONUtil.toJsonStr(resFiles); +// +// String mysqlFilePath = userDownloadDataDir + File.separator + prjName + File.separator + "mysql.json"; +// String prjDirPath = userDownloadDataDir + File.separator + prjName; +// String exportZipFile = userDownloadDataDir + File.separator + prjName + ".zip"; +// String exportColibFile = userDownloadDataDir + File.separator + File.separator + prjName + EXPORT_FILE_SUFFIX; +// +// fileSystemService.writeStringToFile(mysqlFilePath, mysqlInfo); +// if (FileUtil.exist(exportColibFile)) { +// FileUtil.del(exportColibFile); +// } +// +// ZipUtil.zip(prjDirPath, exportZipFile); +// AES aes = SecureUtil.aes(FILE_SEC_PASSWD.getBytes()); +// try ( +// InputStream inputStream = Files.newInputStream(Paths.get(exportZipFile)); +// OutputStream outputStream = Files.newOutputStream(Paths.get(exportColibFile)); +// ) { +// aes.encrypt(inputStream, outputStream, true); +// } catch (Exception e) { +// String info = "导出失败。"; +// log.error(info, e); +// throw new BizException(info); +// } finally { +// fileSystemService.deleteFile(exportZipFile, prjDirPath); +// } +// File file = FileUtil.newFile(exportColibFile); +// FileSystemResource fileSystemResource = new FileSystemResource(file); +// HttpHeaders headers = new HttpHeaders(); +// headers.add("Cache-Control", "no-cache, no-store, must-revalidate"); +// String fileName = Base64.encode(EleCommonUtil.getNowTimeStr() + "_" + fileSystemResource.getFilename()); +// headers.add("Pragma", "no-cache"); +// headers.add("Expires", "0"); +// response.setHeader("content-disposition", "attachment;filename=" + fileName); +// UserThreadLocal.setSuccessInfo("", "", "导出数据库成功"); +// // 构建响应实体(可以返回