From effa0d9f4d3bef434501e17f0e9527150c62d84a Mon Sep 17 00:00:00 2001 From: chenxudong Date: Wed, 18 Jun 2025 12:01:46 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B7=A5=E7=A8=8B=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E9=83=A8=E5=88=86=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/config/ElePropertyConfig.java | 31 ++ .../controller/ImportPrjController.java | 28 ++ .../controller/SysEdFileInfoController.java | 11 - .../manage/mapper/ImportPrjInfoMapper.java | 9 + .../manage/pojo/models/ImportFileInfo.java | 69 +++ .../pojo/req/AddImportTableDataDTO.java | 2 - .../pojo/req/UpdateImportTableDataDTO.java | 2 - .../manage/service/EdFileInfoService.java | 5 - .../manage/service/ImportPrjService.java | 9 + .../service/serviceimpl/CommonService.java | 2 + .../serviceimpl/EdFileInfoServiceImpl.java | 207 --------- .../serviceimpl/ImportPrjServiceImpl.java | 152 ++++++ .../serviceimpl/ImportTableServiceImpl.java | 4 +- .../_commonjs-dynamic-modules-TDtrdbi3.js | 6 +- .../_plugin-vue_export-helper-DlAUqK2U.js | 7 +- .../static/assets/backup-setting-CVjbnu-d.css | 8 +- .../assets/file-type-management-CORsQiOS.css | 8 +- .../static/assets/iconfont-BkE803Av.css | 8 +- .../static/assets/input-round-C0hN3Cc1.css | 4 +- .../static/assets/not-data-CgFOvFiq.js | 3 +- .../static/assets/not-data-legacy-DRFNaMW6.js | 9 +- .../static/assets/useActivated-j-WiA-oM.js | 13 +- .../assets/useFlexGapSupport-CEUhO-rS.js | 10 +- .../resources/static/mockServiceWorker.js | 432 ++++++++--------- .../main/resources/static/model/favicon.svg | 13 +- .../resources/static/model/index-plush.html | 433 +++++++++--------- .../main/resources/static/model/index.html | 27 +- .../src/main/resources/templates/index.html | 53 ++- .../src/test/java/ImportTableTest.java | 311 ------------- electrmangnetic/src/test/java/ImportTest.java | 35 ++ .../software/common/enums/DataOwnEnum.java | 4 +- .../software/common/util/EleCommonUtil.java | 15 + 32 files changed, 926 insertions(+), 1004 deletions(-) create mode 100644 electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ImportPrjController.java create mode 100644 electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/ImportPrjInfoMapper.java create mode 100644 electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/ImportFileInfo.java create mode 100644 electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/ImportPrjService.java create mode 100644 electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ImportPrjServiceImpl.java delete mode 100644 electrmangnetic/src/test/java/ImportTableTest.java create mode 100644 electrmangnetic/src/test/java/ImportTest.java diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/ElePropertyConfig.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/ElePropertyConfig.java index 97fc121..d109ae7 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/ElePropertyConfig.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/config/ElePropertyConfig.java @@ -43,6 +43,15 @@ public class ElePropertyConfig { @Value("${data.repo.download.path}") private String repoDownloadPath; + @Value("${data.import.prj.path}") + private String importPrjPath; + + @Value("${data.import.upload.path}") + private String importUploadPath; + + @Value("${data.import.download.path}") + private String importDownloadPath; + @Getter @Value("${backup.mysql.script.path}") private String backupMysqlScriptPath; @@ -164,6 +173,27 @@ public class ElePropertyConfig { return prjRootPath + repoDownloadPath; } + public String getImportPrjPath() { + if (EleCommonUtil.isWinOs()) { + return winPrefix + prjRootPath + importPrjPath; + } + return prjRootPath + importPrjPath; + } + + public String getImportUploadPath() { + if (EleCommonUtil.isWinOs()) { + return winPrefix + prjRootPath + importUploadPath; + } + return prjRootPath + importUploadPath; + } + + public String getImportDownloadPath() { + if (EleCommonUtil.isWinOs()) { + return winPrefix + prjRootPath + importDownloadPath; + } + return prjRootPath + importDownloadPath; + } + public String getUploadDataDir(int dataOwnCode) { if (DataOwnEnum.isSysCode(dataOwnCode)) { return getSysUploadPath(); @@ -182,4 +212,5 @@ public class ElePropertyConfig { return getRepoDownloadPath(); } + } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ImportPrjController.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ImportPrjController.java new file mode 100644 index 0000000..2540528 --- /dev/null +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ImportPrjController.java @@ -0,0 +1,28 @@ +package com.electromagnetic.industry.software.manage.controller; + +import com.electromagnetic.industry.software.common.annotations.UserOperation; +import com.electromagnetic.industry.software.common.enums.UserOperationModuleEnum; +import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController +public class ImportPrjController { + + /** + * 导入本地工程 + * + * @param + * @return + */ + @RequestMapping("/importPrj") + @UserOperation(value = "导入本地工程", modelName = UserOperationModuleEnum.SYS_PRJ_DATABASE) + public ElectromagneticResult importPrj(@RequestParam("file") MultipartFile file) { + + return null; + } + + +} 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 9233f6d..d5c6aed 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 @@ -202,16 +202,5 @@ public class SysEdFileInfoController { return ElectromagneticResultUtil.success(edFileInfoService.findFavorite(userId, fileInfoQueryDTO)); } - /** - * 导入本地工程 - * - * @param - * @return - */ - @RequestMapping("/importPrj") - @UserOperation(value = "导入本地工程", modelName = UserOperationModuleEnum.SYS_PRJ_DATABASE) - public ElectromagneticResult importPrj(@RequestParam("file") MultipartFile file, @RequestParam(name = "templateCode", defaultValue = "bhdcfzrjzt", required = false) String templateCode) { - return edFileInfoService.importPrj(file, templateCode); - } } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/ImportPrjInfoMapper.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/ImportPrjInfoMapper.java new file mode 100644 index 0000000..78ac985 --- /dev/null +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/ImportPrjInfoMapper.java @@ -0,0 +1,9 @@ +package com.electromagnetic.industry.software.manage.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.electromagnetic.industry.software.manage.pojo.models.ImportFileInfo; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ImportPrjInfoMapper extends BaseMapper { +} diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/ImportFileInfo.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/ImportFileInfo.java new file mode 100644 index 0000000..b79fc0e --- /dev/null +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/models/ImportFileInfo.java @@ -0,0 +1,69 @@ +package com.electromagnetic.industry.software.manage.pojo.models; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import lombok.experimental.FieldNameConstants; + +@EqualsAndHashCode(callSuper = true) +@TableName("import_ed_file_info") +@Accessors(chain = true) +@Data +@FieldNameConstants +public class ImportFileInfo extends BaseModel { + + /** + * 主键ID + */ + @TableField(value = "id") + private String id; + /** + * 父目录id + */ + @TableField(value = "parent_id") + private String parentId; + /** + * 文件类型 + */ + @TableField(value = "file_type") + private String fileType; + /** + * 文件名 + */ + @TableField(value = "file_name") + private String fileName; + /** + * 文件内容,保留,暂时里面为空 + */ + @TableField(value = "file_content") + private String fileContent; + /** + * 文件路径,指到文件的父目录,有各个父目录的id加下划线组成 + */ + @TableField(value = "file_path") + private String filePath; + /** + * 数据类型,0-文件夹 1-文件 + */ + @TableField(value = "data_type") + private Integer dataType; + /** + * 文件大小 + */ + @TableField(value = "file_size") + private Long fileSize; + /** + * 文件夹顺序 + */ + @TableField(value = "sort") + private Integer sort; + + /** + * 当文件被管理员永久物理删除,此时为true + */ + @TableField(value = "permanent_deleted") + private Boolean permanentDeleted; + +} diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/AddImportTableDataDTO.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/AddImportTableDataDTO.java index 648e478..6061ea1 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/AddImportTableDataDTO.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/AddImportTableDataDTO.java @@ -2,8 +2,6 @@ package com.electromagnetic.industry.software.manage.pojo.req; import lombok.Data; -import java.util.Map; - @Data public class AddImportTableDataDTO { diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/UpdateImportTableDataDTO.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/UpdateImportTableDataDTO.java index 3f6e90e..faee33f 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/UpdateImportTableDataDTO.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/req/UpdateImportTableDataDTO.java @@ -2,8 +2,6 @@ package com.electromagnetic.industry.software.manage.pojo.req; import lombok.Data; -import java.util.Map; - @Data public class UpdateImportTableDataDTO { private String id; 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 9671972..c439773 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,9 +243,4 @@ public interface EdFileInfoService { * @return */ ElectromagneticResult uploadFileAndRelation(String parentId, String id, MultipartFile file, String desc, int dataOwnCode); - - /** - * 导入工程 - */ - ElectromagneticResult importPrj(MultipartFile file, String templateCode); } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/ImportPrjService.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/ImportPrjService.java new file mode 100644 index 0000000..8bd6cfd --- /dev/null +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/ImportPrjService.java @@ -0,0 +1,9 @@ +package com.electromagnetic.industry.software.manage.service; + +import org.springframework.web.multipart.MultipartFile; + +public interface ImportPrjService { + + boolean 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 ef3ca32..78e39d3 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 @@ -124,6 +124,8 @@ public class CommonService { PATH_MAP.put(DataOwnEnum.USER_FILE.code, elePropertyConfig.getUserPrjPath()); PATH_MAP.put(DataOwnEnum.REPO_FILE.code, elePropertyConfig.getRepoPrjPath()); PATH_MAP.put(DataOwnEnum.REPO_PRJ.code, elePropertyConfig.getRepoPrjPath()); + PATH_MAP.put(DataOwnEnum.IMPORT_FILE.code, elePropertyConfig.getImportPrjPath()); + PATH_MAP.put(DataOwnEnum.IMPORT_PRJ.code, elePropertyConfig.getImportPrjPath()); } public String getPrjRootPath1(int dataOwnCode) { 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 f78b5ca..54ccdd9 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 @@ -17,7 +17,6 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; 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.FilePermission; import com.electromagnetic.industry.software.common.enums.*; import com.electromagnetic.industry.software.common.exception.BizException; import com.electromagnetic.industry.software.common.exception.PermissionDeniedException; @@ -53,7 +52,6 @@ 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.*; @@ -1526,211 +1524,6 @@ public class EdFileInfoServiceImpl extends ServiceImpl importPrj(MultipartFile file, String templateCode) { - - - - - return null; - } - - /** - * 导入工程 - * - * @param file - */ -// @Override - @Transactional(rollbackFor = Exception.class) - public ElectromagneticResult importPrj1(MultipartFile file, String templateCode) { - try { - // 创建工程 - String prjId = updateImportPrj2Db(file); - // 层级沿用,先这样写,后续根据需求扩展 - EdFileInfo prj = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class) - .eq(EdFileInfo::getTemplateCode, templateCode) - .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)); - commonService.follow(prj.getId(), prjId, DataOwnEnum.SYS_PRJ.code); - // 工程发布 - commonService.publish(prjId, DataOwnEnum.SYS_PRJ.code); - // 将文件存入到数据库和文件系统 - updateImportPrj2FileSystem(file, prjId); - // 添加所有权限 - addRoleAndPermission(prjId); - } catch (Exception e) { - String info = "导入失败,原因 " + e.getMessage(); - log.error(info, e); - throw new BizException(info, e); - } - return ElectromagneticResultUtil.success(true); - } - - private void addRoleAndPermission(String prjId) { - // 首先添加角色,这里先假设只有北航,角色名称为“936c586c88e44df7a262f0ebb4dbe3ab” - Role role = roleMapper.selectOne(Wrappers.lambdaQuery(Role.class) - .eq(Role::getEffectFlag, EffectFlagEnum.EFFECT.code) - .eq(Role::getRoleName, "936c586c88e44df7a262f0ebb4dbe3ab")); - if (Objects.isNull(role)) { - role = new Role(); - role.newInit(); - role.setRoleName("936c586c88e44df7a262f0ebb4dbe3ab"); - role.setRoleDesc("针对北航内定的角色"); - roleMapper.insert(role); - } - - List 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(EdFileInfo::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.saveOrUpdate(rolePermission); - } - } - } - - private void updateImportPrj2FileSystem(MultipartFile file, String prjId) { - String tmpZipFile = null; - String destDir = null; - try { - String orgName = file.getOriginalFilename(); - tmpZipFile = elePropertyConfig.getEleTmpPath() + File.separator + orgName; - String mainName = FileUtil.mainName(orgName); - FileUtil.del(tmpZipFile); - FileUtil.writeFromStream(file.getInputStream(), tmpZipFile); - 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")); - } - - File file1 = Objects.requireNonNull(new File(destDir).listFiles())[0]; - 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) - .eq(EdFileInfo::getDataOwn, DataOwnEnum.SYS_PRJ.code)); - 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); - } - - List files = FileUtil.loopFiles(destDir); - String tmpPath = FileUtil.normalize(destDir); - for (File importFile : files) { - Assert.isTrue(EleCommonUtil.isFileNameValid(importFile.getName()), "文件名称不符合规范"); - String parentDir = FileUtil.normalize(importFile.getParent()); - String relativeFilePath = parentDir.replace(tmpPath, ""); - 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); - Assert.notNull(edFileInfo, "导入的工程与定义的层级结构不一致"); - String id = edFileInfo.getId(); - EdFileInfo newEdFileInfo = new EdFileInfo(); - newEdFileInfo.newInit(); - String fileCode = commonService.createFileCode(id, fileType, FILE_START_VERSION, newEdFileInfo.getFileTime()); - newEdFileInfo.setParentId(id) - .setFileCode(fileCode) - .setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code) - .setDataOwn(DataOwnEnum.SYS_FILE.code) - .setFileName(FileUtil.mainName(importFile)) - .setFileContent(EleCommonUtil.parse(FileUtil.getInputStream(importFile), fileType)) - .setFileType(fileType) - .setFileVersion(FILE_START_VERSION) - .setFileSize(importFile.length()) - .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())); - UserThreadLocal.setSuccessInfo(newEdFileInfo.getParentId(), newEdFileInfo.getId(), "解析导入的工程文件成功,导入的工程名为 {},文件名为 {}", orgName, importFile.getName()); - } - } catch (Exception e) { - String info = "上传失败,原因 " + e.getMessage(); - throw new BizException(info, e); - } finally { - FileUtil.del(destDir); - FileUtil.del(tmpZipFile); - } - } - - private String updateImportPrj2Db(MultipartFile file) { - String originalFilename = file.getOriginalFilename(); - String suffix = FileUtil.getSuffix(originalFilename); - String mainName = FileUtil.mainName(originalFilename); - Assert.isTrue(StrUtil.equals(suffix, "zip"), "不支持 {} 格式的工程文件", suffix); - Assert.isTrue(EleCommonUtil.isFileNameValid(originalFilename), "项目名称不符合规范"); - // 检查工程是否存在 - 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 newPrjId; - } - /** * 统一废除文件相关数据 * diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ImportPrjServiceImpl.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ImportPrjServiceImpl.java new file mode 100644 index 0000000..720e63e --- /dev/null +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ImportPrjServiceImpl.java @@ -0,0 +1,152 @@ +package com.electromagnetic.industry.software.manage.service.serviceimpl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.electromagnetic.industry.software.common.cons.ElectromagneticConstants; +import com.electromagnetic.industry.software.common.enums.EffectFlagEnum; +import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum; +import com.electromagnetic.industry.software.common.exception.BizException; +import com.electromagnetic.industry.software.common.util.EleCommonUtil; +import com.electromagnetic.industry.software.common.util.IdWorker; +import com.electromagnetic.industry.software.manage.config.ElePropertyConfig; +import com.electromagnetic.industry.software.manage.mapper.ImportPrjInfoMapper; +import com.electromagnetic.industry.software.manage.pojo.models.ImportFileInfo; +import com.electromagnetic.industry.software.manage.service.ImportPrjService; +import jakarta.annotation.Resource; +import org.mockito.internal.util.io.IOUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.InputStream; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import static com.electromagnetic.industry.software.common.cons.ElectromagneticConstants.APPEND_NEW_FILE_NAME; +import static com.electromagnetic.industry.software.common.cons.ElectromagneticConstants.FILE_SEC_PASSWD; + +@Service +public class ImportPrjServiceImpl extends ServiceImpl implements ImportPrjService { + + @Resource + private ElePropertyConfig elePropertyConfig; + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean importPrj(MultipartFile file) { + String zipTmpPath = elePropertyConfig.getEleTmpPath() + File.pathSeparator + UUID.randomUUID() + ".zip"; + ZipFile zipFile = null; +// zipTmpPath = "D:\\tmp\\szsd\\data\\ele.zip"; + try { + FileUtil.writeFromStream(file.getInputStream(), zipTmpPath); + Map pathIdMap = new HashMap<>(); + List items = new ArrayList<>(); + zipFile = EleCommonUtil.getZipFile(zipTmpPath); + Map itemIdMap = new HashMap<>(); + Map entryMap = new HashMap<>(); + Enumeration entries = zipFile.entries(); + // 预处理:建立路径映射 + while (entries.hasMoreElements()) { + ZipEntry entry = entries.nextElement(); + String entryName = entry.getName(); + // 跳过根目录(如果存在) + if (entryName.isEmpty()) continue; + // 解析路径结构 + String[] pathParts = entryName.split("/"); + String currentPath = ""; + String parentId = ElectromagneticConstants.PRJ_PARENT_ID; // 根目录的parentId为0 + + for (int i = 0; i < pathParts.length; i++) { + String name = pathParts[i]; + if (name.isEmpty()) continue; + currentPath += (i == 0 ? "" : "/") + name; + // 如果是目录且不是最后一个元素 + boolean isDirectory = i < pathParts.length - 1 || entry.isDirectory(); + if (!pathIdMap.containsKey(currentPath)) { + String newId = IdWorker.getSnowFlakeIdString(); + pathIdMap.put(currentPath, newId); + String findIdPath = findIdPath(parentId, itemIdMap); + String filePath = StrUtil.isEmpty(findIdPath) ? newId : findIdPath + ElectromagneticConstants.MYSQL_FILE_PATH_SPLIT + newId; + ImportFileInfo importFileInfo = new ImportFileInfo() + .setId(newId) + .setParentId(parentId) + .setFileType(FileUtil.getSuffix(entryName)) + .setFileName(FileUtil.mainName(entryName)) + .setFilePath(filePath) + .setFileContent("") + .setDataType(isDirectory ? EleDataTypeEnum.FOLDER.code : EleDataTypeEnum.FILE.code) + .setFileSize(entry.getSize()) + .setPermanentDeleted(false); + resetPrjName(importFileInfo); + if (isDirectory) { + importFileInfo.setSort(createFolderSort(parentId, itemIdMap)); + } else { + entryMap.put(newId, entry); + } + items.add(importFileInfo); + itemIdMap.put(newId, importFileInfo); + parentId = newId; + } else { + parentId = pathIdMap.get(currentPath); + } + } + } + this.saveBatch(items); + for (Map.Entry entry : entryMap.entrySet()) { + String newId = entry.getKey(); + ZipEntry tmp = entry.getValue(); + InputStream inputStream = zipFile.getInputStream(tmp); + String destPath = elePropertyConfig.getEleTmpPath() + File.pathSeparator + newId; + FileUtil.writeFromStream(inputStream, destPath); + EleCommonUtil.decryptFile(destPath, SecureUtil.aes(FILE_SEC_PASSWD.getBytes())); + } + } catch (Exception e) { + throw new BizException("导入工程失败,原因 " + e.getMessage(), e); + } finally { + IOUtil.close(zipFile); + FileUtil.del(zipTmpPath); + } + return true; + } + + public void resetPrjName(ImportFileInfo importFileInfo) { + if (!StrUtil.equals(importFileInfo.getParentId(), ElectromagneticConstants.PRJ_PARENT_ID)) { + return; + } + String fileName = importFileInfo.getFileName(); + for (int i = 0; i < 1000; ++i) { + long count = this.baseMapper.selectCount(Wrappers.lambdaQuery(ImportFileInfo.class) + .eq(ImportFileInfo::getParentId, ElectromagneticConstants.PRJ_PARENT_ID) + .eq(ImportFileInfo::getFileName, fileName) + .eq(ImportFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code)); + if (count > 0) { + fileName = fileName + APPEND_NEW_FILE_NAME; + } else { + importFileInfo.setFileName(fileName); + return; + } + } + } + + private String findIdPath(String parentId, Map itemIdMap) { + List ids = new ArrayList<>(); + while (itemIdMap.containsKey(parentId)) { + ImportFileInfo zipItem = itemIdMap.get(parentId); + ids.add(zipItem.getId()); + parentId = zipItem.getParentId(); + } + CollUtil.reverse(ids); + return CollUtil.join(ids, "_"); + } + + private Integer createFolderSort(String parentId, Map itemIdMap) { + long count = itemIdMap.values().stream().filter(e -> e.getParentId().equals(parentId) && e.getDataType().equals(EleDataTypeEnum.FOLDER.code)).count(); + return Math.toIntExact(++count); + } +} diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ImportTableServiceImpl.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ImportTableServiceImpl.java index 6ba0dbe..ff90277 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ImportTableServiceImpl.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/service/serviceimpl/ImportTableServiceImpl.java @@ -78,7 +78,7 @@ public class ImportTableServiceImpl implements ImportTableService { .set(ImportTableInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code) .eq(ImportTableInfo::getId, id)); importTableDataMapper.update(new ImportTableData(), Wrappers.lambdaUpdate() - .eq(ImportTableData::getTableInfoId, id) + .eq(ImportTableData::getTableInfoId, id) .set(ImportTableData::getEffectFlag, EffectFlagEnum.EFFECT.code)); return ElectromagneticResultUtil.success(true); } @@ -106,7 +106,7 @@ public class ImportTableServiceImpl implements ImportTableService { @Transactional(rollbackFor = Exception.class) public ElectromagneticResult removeTableDataById(String id) { importTableDataMapper.update(new ImportTableData(), Wrappers.lambdaUpdate() - .eq(ImportTableData::getId, id) + .eq(ImportTableData::getId, id) .set(ImportTableData::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code)); return ElectromagneticResultUtil.success(true); } diff --git a/electrmangnetic/src/main/resources/static/assets/_commonjs-dynamic-modules-TDtrdbi3.js b/electrmangnetic/src/main/resources/static/assets/_commonjs-dynamic-modules-TDtrdbi3.js index f19d79e..6c9159d 100644 --- a/electrmangnetic/src/main/resources/static/assets/_commonjs-dynamic-modules-TDtrdbi3.js +++ b/electrmangnetic/src/main/resources/static/assets/_commonjs-dynamic-modules-TDtrdbi3.js @@ -1 +1,5 @@ -function r(o){throw new Error('Could not dynamically require "'+o+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}export{r as c}; +function r(o) { + throw new Error('Could not dynamically require "' + o + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.') +} + +export {r as c}; diff --git a/electrmangnetic/src/main/resources/static/assets/_plugin-vue_export-helper-DlAUqK2U.js b/electrmangnetic/src/main/resources/static/assets/_plugin-vue_export-helper-DlAUqK2U.js index 718edd3..f7e876c 100644 --- a/electrmangnetic/src/main/resources/static/assets/_plugin-vue_export-helper-DlAUqK2U.js +++ b/electrmangnetic/src/main/resources/static/assets/_plugin-vue_export-helper-DlAUqK2U.js @@ -1 +1,6 @@ -const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _}; +const s = (t, r) => { + const o = t.__vccOpts || t; + for (const [c, e] of r) o[c] = e; + return o +}; +export {s as _}; diff --git a/electrmangnetic/src/main/resources/static/assets/backup-setting-CVjbnu-d.css b/electrmangnetic/src/main/resources/static/assets/backup-setting-CVjbnu-d.css index 4932bc7..28af1a1 100644 --- a/electrmangnetic/src/main/resources/static/assets/backup-setting-CVjbnu-d.css +++ b/electrmangnetic/src/main/resources/static/assets/backup-setting-CVjbnu-d.css @@ -1 +1,7 @@ -.backup-setting-management[data-v-592b576d]{background-color:#fff;padding:16px 24px;display:flex;flex-direction:column;height:100%} +.backup-setting-management[data-v-592b576d] { + background-color: #fff; + padding: 16px 24px; + display: flex; + flex-direction: column; + height: 100% +} diff --git a/electrmangnetic/src/main/resources/static/assets/file-type-management-CORsQiOS.css b/electrmangnetic/src/main/resources/static/assets/file-type-management-CORsQiOS.css index 7024611..76b8399 100644 --- a/electrmangnetic/src/main/resources/static/assets/file-type-management-CORsQiOS.css +++ b/electrmangnetic/src/main/resources/static/assets/file-type-management-CORsQiOS.css @@ -1 +1,7 @@ -.file-type-management[data-v-4e509c99]{background-color:#fff;padding:16px 24px;display:flex;flex-direction:column;height:100%} +.file-type-management[data-v-4e509c99] { + background-color: #fff; + padding: 16px 24px; + display: flex; + flex-direction: column; + height: 100% +} diff --git a/electrmangnetic/src/main/resources/static/assets/iconfont-BkE803Av.css b/electrmangnetic/src/main/resources/static/assets/iconfont-BkE803Av.css index eb2a41b..c0caef3 100644 --- a/electrmangnetic/src/main/resources/static/assets/iconfont-BkE803Av.css +++ b/electrmangnetic/src/main/resources/static/assets/iconfont-BkE803Av.css @@ -1 +1,7 @@ -.icon[data-v-0273bbfb]{width:1em;height:1em;vertical-align:-.15em;fill:currentColor;overflow:hidden} +.icon[data-v-0273bbfb] { + width: 1em; + height: 1em; + vertical-align: -.15em; + fill: currentColor; + overflow: hidden +} diff --git a/electrmangnetic/src/main/resources/static/assets/input-round-C0hN3Cc1.css b/electrmangnetic/src/main/resources/static/assets/input-round-C0hN3Cc1.css index bfa2444..cbe339c 100644 --- a/electrmangnetic/src/main/resources/static/assets/input-round-C0hN3Cc1.css +++ b/electrmangnetic/src/main/resources/static/assets/input-round-C0hN3Cc1.css @@ -1 +1,3 @@ -.round[data-v-52b10b31]{border-radius:18px} +.round[data-v-52b10b31] { + border-radius: 18px +} diff --git a/electrmangnetic/src/main/resources/static/assets/not-data-CgFOvFiq.js b/electrmangnetic/src/main/resources/static/assets/not-data-CgFOvFiq.js index a683fe0..35b2e92 100644 --- a/electrmangnetic/src/main/resources/static/assets/not-data-CgFOvFiq.js +++ b/electrmangnetic/src/main/resources/static/assets/not-data-CgFOvFiq.js @@ -1 +1,2 @@ -const t=""+new URL("not-data-Byd7gMOX.png",import.meta.url).href;export{t as n}; +const t = "" + new URL("not-data-Byd7gMOX.png", import.meta.url).href; +export {t as n}; diff --git a/electrmangnetic/src/main/resources/static/assets/not-data-legacy-DRFNaMW6.js b/electrmangnetic/src/main/resources/static/assets/not-data-legacy-DRFNaMW6.js index be539c8..4ab0075 100644 --- a/electrmangnetic/src/main/resources/static/assets/not-data-legacy-DRFNaMW6.js +++ b/electrmangnetic/src/main/resources/static/assets/not-data-legacy-DRFNaMW6.js @@ -1 +1,8 @@ -System.register([],(function(e,t){"use strict";return{execute:function(){e("n",""+new URL("not-data-Byd7gMOX.png",t.meta.url).href)}}})); +System.register([], (function (e, t) { + "use strict"; + return { + execute: function () { + e("n", "" + new URL("not-data-Byd7gMOX.png", t.meta.url).href) + } + } +})); diff --git a/electrmangnetic/src/main/resources/static/assets/useActivated-j-WiA-oM.js b/electrmangnetic/src/main/resources/static/assets/useActivated-j-WiA-oM.js index 8e114e1..5dc7b21 100644 --- a/electrmangnetic/src/main/resources/static/assets/useActivated-j-WiA-oM.js +++ b/electrmangnetic/src/main/resources/static/assets/useActivated-j-WiA-oM.js @@ -1 +1,12 @@ -import{t as e,aY as a,cA as r}from"./index-larX9JiI.js";function u(){const t=e(!0);return a(()=>{t.value=!0}),r(()=>{t.value=!1}),t}export{u}; +import {aY as a, cA as r, t as e} from "./index-larX9JiI.js"; + +function u() { + const t = e(!0); + return a(() => { + t.value = !0 + }), r(() => { + t.value = !1 + }), t +} + +export {u}; diff --git a/electrmangnetic/src/main/resources/static/assets/useFlexGapSupport-CEUhO-rS.js b/electrmangnetic/src/main/resources/static/assets/useFlexGapSupport-CEUhO-rS.js index b002414..dbef8d0 100644 --- a/electrmangnetic/src/main/resources/static/assets/useFlexGapSupport-CEUhO-rS.js +++ b/electrmangnetic/src/main/resources/static/assets/useFlexGapSupport-CEUhO-rS.js @@ -1 +1,9 @@ -import{aC as a,v as o,eH as t}from"./index-larX9JiI.js";const l=()=>{const e=a(!1);return o(()=>{e.value=t()}),e};export{l as u}; +import {aC as a, eH as t, v as o} from "./index-larX9JiI.js"; + +const l = () => { + const e = a(!1); + return o(() => { + e.value = t() + }), e +}; +export {l as u}; diff --git a/electrmangnetic/src/main/resources/static/mockServiceWorker.js b/electrmangnetic/src/main/resources/static/mockServiceWorker.js index 6eb8052..511955d 100644 --- a/electrmangnetic/src/main/resources/static/mockServiceWorker.js +++ b/electrmangnetic/src/main/resources/static/mockServiceWorker.js @@ -14,143 +14,143 @@ const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() self.addEventListener('install', function () { - self.skipWaiting() + self.skipWaiting() }) self.addEventListener('activate', function (event) { - event.waitUntil(self.clients.claim()) + event.waitUntil(self.clients.claim()) }) self.addEventListener('message', async function (event) { - const clientId = event.source.id + const clientId = event.source.id - if (!clientId || !self.clients) { - return - } - - const client = await self.clients.get(clientId) - - if (!client) { - return - } - - const allClients = await self.clients.matchAll({ - type: 'window', - }) - - switch (event.data) { - case 'KEEPALIVE_REQUEST': { - sendToClient(client, { - type: 'KEEPALIVE_RESPONSE', - }) - break + if (!clientId || !self.clients) { + return } - case 'INTEGRITY_CHECK_REQUEST': { - sendToClient(client, { - type: 'INTEGRITY_CHECK_RESPONSE', - payload: { - packageVersion: PACKAGE_VERSION, - checksum: INTEGRITY_CHECKSUM, - }, - }) - break + const client = await self.clients.get(clientId) + + if (!client) { + return } - case 'MOCK_ACTIVATE': { - activeClientIds.add(clientId) + const allClients = await self.clients.matchAll({ + type: 'window', + }) - sendToClient(client, { - type: 'MOCKING_ENABLED', - payload: { - client: { - id: client.id, - frameType: client.frameType, - }, - }, - }) - break + switch (event.data) { + case 'KEEPALIVE_REQUEST': { + sendToClient(client, { + type: 'KEEPALIVE_RESPONSE', + }) + break + } + + case 'INTEGRITY_CHECK_REQUEST': { + sendToClient(client, { + type: 'INTEGRITY_CHECK_RESPONSE', + payload: { + packageVersion: PACKAGE_VERSION, + checksum: INTEGRITY_CHECKSUM, + }, + }) + break + } + + case 'MOCK_ACTIVATE': { + activeClientIds.add(clientId) + + sendToClient(client, { + type: 'MOCKING_ENABLED', + payload: { + client: { + id: client.id, + frameType: client.frameType, + }, + }, + }) + break + } + + case 'MOCK_DEACTIVATE': { + activeClientIds.delete(clientId) + break + } + + case 'CLIENT_CLOSED': { + activeClientIds.delete(clientId) + + const remainingClients = allClients.filter((client) => { + return client.id !== clientId + }) + + // Unregister itself when there are no more clients + if (remainingClients.length === 0) { + self.registration.unregister() + } + + break + } } - - case 'MOCK_DEACTIVATE': { - activeClientIds.delete(clientId) - break - } - - case 'CLIENT_CLOSED': { - activeClientIds.delete(clientId) - - const remainingClients = allClients.filter((client) => { - return client.id !== clientId - }) - - // Unregister itself when there are no more clients - if (remainingClients.length === 0) { - self.registration.unregister() - } - - break - } - } }) self.addEventListener('fetch', function (event) { - const { request } = event + const {request} = event - // Bypass navigation requests. - if (request.mode === 'navigate') { - return - } + // Bypass navigation requests. + if (request.mode === 'navigate') { + return + } - // Opening the DevTools triggers the "only-if-cached" request - // that cannot be handled by the worker. Bypass such requests. - if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { - return - } + // Opening the DevTools triggers the "only-if-cached" request + // that cannot be handled by the worker. Bypass such requests. + if (request.cache === 'only-if-cached' && request.mode !== 'same-origin') { + return + } - // Bypass all requests when there are no active clients. - // Prevents the self-unregistered worked from handling requests - // after it's been deleted (still remains active until the next reload). - if (activeClientIds.size === 0) { - return - } + // Bypass all requests when there are no active clients. + // Prevents the self-unregistered worked from handling requests + // after it's been deleted (still remains active until the next reload). + if (activeClientIds.size === 0) { + return + } - // Generate unique request ID. - const requestId = crypto.randomUUID() - event.respondWith(handleRequest(event, requestId)) + // Generate unique request ID. + const requestId = crypto.randomUUID() + event.respondWith(handleRequest(event, requestId)) }) async function handleRequest(event, requestId) { - const client = await resolveMainClient(event) - const response = await getResponse(event, client, requestId) + const client = await resolveMainClient(event) + const response = await getResponse(event, client, requestId) - // Send back the response clone for the "response:*" life-cycle events. - // Ensure MSW is active and ready to handle the message, otherwise - // this message will pend indefinitely. - if (client && activeClientIds.has(client.id)) { - ;(async function () { - const responseClone = response.clone() + // Send back the response clone for the "response:*" life-cycle events. + // Ensure MSW is active and ready to handle the message, otherwise + // this message will pend indefinitely. + if (client && activeClientIds.has(client.id)) { + ;(async function () { + const responseClone = response.clone() - sendToClient( - client, - { - type: 'RESPONSE', - payload: { - requestId, - isMockedResponse: IS_MOCKED_RESPONSE in response, - type: responseClone.type, - status: responseClone.status, - statusText: responseClone.statusText, - body: responseClone.body, - headers: Object.fromEntries(responseClone.headers.entries()), - }, - }, - [responseClone.body], - ) - })() - } + sendToClient( + client, + { + type: 'RESPONSE', + payload: { + requestId, + isMockedResponse: IS_MOCKED_RESPONSE in response, + type: responseClone.type, + status: responseClone.status, + statusText: responseClone.statusText, + body: responseClone.body, + headers: Object.fromEntries(responseClone.headers.entries()), + }, + }, + [responseClone.body], + ) + })() + } - return response + return response } // Resolve the main client for the given event. @@ -158,136 +158,136 @@ async function handleRequest(event, requestId) { // that registered the worker. It's with the latter the worker should // communicate with during the response resolving phase. async function resolveMainClient(event) { - const client = await self.clients.get(event.clientId) + const client = await self.clients.get(event.clientId) - if (activeClientIds.has(event.clientId)) { - return client - } + if (activeClientIds.has(event.clientId)) { + return client + } - if (client?.frameType === 'top-level') { - return client - } + if (client?.frameType === 'top-level') { + return client + } - const allClients = await self.clients.matchAll({ - type: 'window', - }) - - return allClients - .filter((client) => { - // Get only those clients that are currently visible. - return client.visibilityState === 'visible' - }) - .find((client) => { - // Find the client ID that's recorded in the - // set of clients that have registered the worker. - return activeClientIds.has(client.id) + const allClients = await self.clients.matchAll({ + type: 'window', }) + + return allClients + .filter((client) => { + // Get only those clients that are currently visible. + return client.visibilityState === 'visible' + }) + .find((client) => { + // Find the client ID that's recorded in the + // set of clients that have registered the worker. + return activeClientIds.has(client.id) + }) } async function getResponse(event, client, requestId) { - const { request } = event + const {request} = event - // Clone the request because it might've been already used - // (i.e. its body has been read and sent to the client). - const requestClone = request.clone() + // Clone the request because it might've been already used + // (i.e. its body has been read and sent to the client). + const requestClone = request.clone() - function passthrough() { - const headers = Object.fromEntries(requestClone.headers.entries()) + function passthrough() { + const headers = Object.fromEntries(requestClone.headers.entries()) - // Remove internal MSW request header so the passthrough request - // complies with any potential CORS preflight checks on the server. - // Some servers forbid unknown request headers. - delete headers['x-msw-intention'] + // Remove internal MSW request header so the passthrough request + // complies with any potential CORS preflight checks on the server. + // Some servers forbid unknown request headers. + delete headers['x-msw-intention'] - return fetch(requestClone, { headers }) - } - - // Bypass mocking when the client is not active. - if (!client) { - return passthrough() - } - - // Bypass initial page load requests (i.e. static assets). - // The absence of the immediate/parent client in the map of the active clients - // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet - // and is not ready to handle requests. - if (!activeClientIds.has(client.id)) { - return passthrough() - } - - // Notify the client that a request has been intercepted. - const requestBuffer = await request.arrayBuffer() - const clientMessage = await sendToClient( - client, - { - type: 'REQUEST', - payload: { - id: requestId, - url: request.url, - mode: request.mode, - method: request.method, - headers: Object.fromEntries(request.headers.entries()), - cache: request.cache, - credentials: request.credentials, - destination: request.destination, - integrity: request.integrity, - redirect: request.redirect, - referrer: request.referrer, - referrerPolicy: request.referrerPolicy, - body: requestBuffer, - keepalive: request.keepalive, - }, - }, - [requestBuffer], - ) - - switch (clientMessage.type) { - case 'MOCK_RESPONSE': { - return respondWithMock(clientMessage.data) + return fetch(requestClone, {headers}) } - case 'PASSTHROUGH': { - return passthrough() + // Bypass mocking when the client is not active. + if (!client) { + return passthrough() } - } - return passthrough() + // Bypass initial page load requests (i.e. static assets). + // The absence of the immediate/parent client in the map of the active clients + // means that MSW hasn't dispatched the "MOCK_ACTIVATE" event yet + // and is not ready to handle requests. + if (!activeClientIds.has(client.id)) { + return passthrough() + } + + // Notify the client that a request has been intercepted. + const requestBuffer = await request.arrayBuffer() + const clientMessage = await sendToClient( + client, + { + type: 'REQUEST', + payload: { + id: requestId, + url: request.url, + mode: request.mode, + method: request.method, + headers: Object.fromEntries(request.headers.entries()), + cache: request.cache, + credentials: request.credentials, + destination: request.destination, + integrity: request.integrity, + redirect: request.redirect, + referrer: request.referrer, + referrerPolicy: request.referrerPolicy, + body: requestBuffer, + keepalive: request.keepalive, + }, + }, + [requestBuffer], + ) + + switch (clientMessage.type) { + case 'MOCK_RESPONSE': { + return respondWithMock(clientMessage.data) + } + + case 'PASSTHROUGH': { + return passthrough() + } + } + + return passthrough() } function sendToClient(client, message, transferrables = []) { - return new Promise((resolve, reject) => { - const channel = new MessageChannel() + return new Promise((resolve, reject) => { + const channel = new MessageChannel() - channel.port1.onmessage = (event) => { - if (event.data && event.data.error) { - return reject(event.data.error) - } + channel.port1.onmessage = (event) => { + if (event.data && event.data.error) { + return reject(event.data.error) + } - resolve(event.data) - } + resolve(event.data) + } - client.postMessage( - message, - [channel.port2].concat(transferrables.filter(Boolean)), - ) - }) + client.postMessage( + message, + [channel.port2].concat(transferrables.filter(Boolean)), + ) + }) } async function respondWithMock(response) { - // Setting response status code to 0 is a no-op. - // However, when responding with a "Response.error()", the produced Response - // instance will have status code set to 0. Since it's not possible to create - // a Response instance with status code 0, handle that use-case separately. - if (response.status === 0) { - return Response.error() - } + // Setting response status code to 0 is a no-op. + // However, when responding with a "Response.error()", the produced Response + // instance will have status code set to 0. Since it's not possible to create + // a Response instance with status code 0, handle that use-case separately. + if (response.status === 0) { + return Response.error() + } - const mockedResponse = new Response(response.body, response) + const mockedResponse = new Response(response.body, response) - Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { - value: true, - enumerable: true, - }) + Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, { + value: true, + enumerable: true, + }) - return mockedResponse + return mockedResponse } diff --git a/electrmangnetic/src/main/resources/static/model/favicon.svg b/electrmangnetic/src/main/resources/static/model/favicon.svg index 40a4fc5..b9bdda0 100644 --- a/electrmangnetic/src/main/resources/static/model/favicon.svg +++ b/electrmangnetic/src/main/resources/static/model/favicon.svg @@ -1,10 +1,15 @@ - + - - - + + + diff --git a/electrmangnetic/src/main/resources/static/model/index-plush.html b/electrmangnetic/src/main/resources/static/model/index-plush.html index 9281707..8de8f77 100644 --- a/electrmangnetic/src/main/resources/static/model/index-plush.html +++ b/electrmangnetic/src/main/resources/static/model/index-plush.html @@ -1,19 +1,19 @@ - - - + + + chili3d - - - - - - + + + + + + - - + - + + diff --git a/electrmangnetic/src/main/resources/static/model/index.html b/electrmangnetic/src/main/resources/static/model/index.html index c4bd274..7f3c554 100644 --- a/electrmangnetic/src/main/resources/static/model/index.html +++ b/electrmangnetic/src/main/resources/static/model/index.html @@ -1,5 +1,24 @@ -chili3d - - + + + + + + + + chili3d + + + + + + + - \ No newline at end of file + + + + \ No newline at end of file diff --git a/electrmangnetic/src/main/resources/templates/index.html b/electrmangnetic/src/main/resources/templates/index.html index aef438d..0ac05df 100644 --- a/electrmangnetic/src/main/resources/templates/index.html +++ b/electrmangnetic/src/main/resources/templates/index.html @@ -1,19 +1,42 @@ - - - - + + + + 商飞数据库后台管理系统 - - - - - - -
- - - - + + + + + + +
+ + + + diff --git a/electrmangnetic/src/test/java/ImportTableTest.java b/electrmangnetic/src/test/java/ImportTableTest.java deleted file mode 100644 index c76d10b..0000000 --- a/electrmangnetic/src/test/java/ImportTableTest.java +++ /dev/null @@ -1,311 +0,0 @@ -//import cn.hutool.json.JSONUtil; -//import com.electromagnetic.industry.software.common.resp.ElectromagneticResult; -//import com.electromagnetic.industry.software.manage.Application; -//import com.electromagnetic.industry.software.manage.service.ImportTableService; -//import jakarta.annotation.Resource; -//import org.junit.jupiter.api.Test; -//import org.springframework.boot.test.context.SpringBootTest; -// -//import java.util.LinkedHashMap; -//import java.util.Map; -// -//@SpringBootTest(classes = Application.class) -//public class ImportTableTest { -// -// @Resource -// private ImportTableService importTableService; -// -// @Test -// public void test1() { -// -//// int[] ids1 = {100423, 100431, 100432, 100433, 100434, 100435}; -//// int[] ids2 = {100424, 100436, 100437, 100438, 100439, 100440}; -//// int[] ids3 = {100425, 100441, 100442, 100443, 100444, 100445}; -//// -//// Map map1 = new LinkedHashMap<>(); -//// map1.put(1, "起始频率"); -//// map1.put(2, "终止频率"); -//// map1.put(3, "M等级"); -//// map1.put(4, "O等级"); -//// map1.put(5, "R等级"); -//// map1.put(6, "S等级"); -//// map1.put(7, "T等级"); -//// map1.put(8, "W等级"); -//// map1.put(9, "Y等级"); -//// map1.put(10, "版本号"); -//// -//// Map map2 = new LinkedHashMap<>(); -//// map2.put(1, "起始频率"); -//// map2.put(2, "终止频率"); -//// map2.put(3, "B等级"); -//// map2.put(4, "D等级"); -//// map2.put(5, "F等级"); -//// map2.put(6, "G等级"); -//// map2.put(7, "L等级"); -//// map2.put(8, "R等级"); -//// map2.put(9, "S等级"); -//// map2.put(10, "T等级"); -//// map2.put(11, "W等级"); -//// map2.put(12, "Y等级"); -//// map2.put(13, "版本号"); -//// -//// Map map3 = new LinkedHashMap<>(); -//// map3.put(1, "起始频率"); -//// map3.put(2, "终止频率"); -//// map3.put(3, "B等级"); -//// map3.put(4, "F等级"); -//// map3.put(5, "S等级"); -//// map3.put(6, "G等级"); -//// map3.put(7, "L等级"); -//// map3.put(8, "R等级"); -//// map3.put(9, "版本号"); -//// -//// for (Integer id : ids1) { -//// importTableService.addTableInfo(id + "", map1); -//// } -//// -//// for (Integer id : ids2) { -//// importTableService.addTableInfo(id + "", map2); -//// } -//// -//// for (Integer id : ids3) { -//// importTableService.addTableInfo(id + "", map3); -//// } -// -// } -// -// @Test -// public void test2() { -// String[] arr1 = {"1932333966414524416", "1932333966867509248","1932333966922035200","1932333966993338368","1932333967026892800","1932333967060447232"}; -// Map map1 = new LinkedHashMap<>(); -// map1.put(1, 0.01); -// map1.put(2, 0.5); -// map1.put(3, 0.6); -// map1.put(4, 3); -// map1.put(5, 0.6); -// map1.put(6, 0.03); -// map1.put(7, 0.15); -// map1.put(8, 3); -// map1.put(9, 6); -// map1.put(10, 1); -// -// Map map2 = new LinkedHashMap<>(); -// map2.put(1, 0.5); -// map2.put(2, 1); -// map2.put(3, 30); -// map2.put(4, 150); -// map2.put(5, 30); -// map2.put(6, 1.5); -// map2.put(7, 7.5); -// map2.put(8, 150); -// map2.put(9, 300); -// map2.put(10, 1); -// -// Map map3 = new LinkedHashMap<>(); -// map3.put(1, 1); -// map3.put(2, 30); -// map3.put(3, 70); -// map3.put(4, 250); -// map3.put(5, 30); -// map3.put(6, 1.5); -// map3.put(7, 7.5); -// map3.put(8, 150); -// map3.put(9, 300); -// map3.put(10, 1); -// -// Map map4 = new LinkedHashMap<>(); -// map4.put(1, 30); -// map4.put(2, 40); -// map4.put(3, 70); -// map4.put(4, 250); -// map4.put(5, 30); -// map4.put(6, 1.5); -// map4.put(7, 7.5); -// map4.put(8, 150); -// map4.put(9, 300); -// map4.put(10, 1); -// -// Map map5 = new LinkedHashMap<>(); -// map5.put(1, 40); -// map5.put(2, 100); -// map5.put(3, 32); -// map5.put(4, 50); -// map5.put(5, 30); -// map5.put(6, 1.5); -// map5.put(7, 7.55); -// map5.put(8, 150); -// map5.put(9, 300); -// map5.put(10, 1); -// -// for (String id : arr1) { -// importTableService.addTableData(id, map1); -// importTableService.addTableData(id, map2); -// importTableService.addTableData(id, map3); -// importTableService.addTableData(id, map4); -// importTableService.addTableData(id, map5); -// } -// -// } -// -// @Test -// public void test3() { -// String[] arr1 = {"1932333967098195968", "1932333967177887744", "1932333967236608000", "1932333967274356736", "1932333967307911168", "1932333967341465600"}; -// -// Map map1 = new LinkedHashMap<>(); -// map1.put(1, 100); -// map1.put(2, 200); -// map1.put(3, 20); -// map1.put(4, 25); -// map1.put(5, 50); -// map1.put(6, 100); -// map1.put(7, 200); -// map1.put(8, 20); -// map1.put(9, 1); -// map1.put(10, 5); -// map1.put(11, 100); -// map1.put(12, 200); -// map1.put(13, 1); -// -// Map map2 = new LinkedHashMap<>(); -// map2.put(1, 200); -// map2.put(2, 400); -// map2.put(3, 20); -// map2.put(4, 25); -// map2.put(5, 50); -// map2.put(6, 100); -// map2.put(7, 200); -// map2.put(8, 20); -// map2.put(9, 1); -// map2.put(10, 5); -// map2.put(11, 100); -// map2.put(12, 200); -// map2.put(13, 1); -// -// Map map3 = new LinkedHashMap<>(); -// map3.put(1, 400); -// map3.put(2, 700); -// map3.put(3, 20); -// map3.put(4, 20); -// map3.put(5, 25); -// map3.put(6, 50); -// map3.put(7, 200); -// map3.put(8, 20); -// map3.put(9, 1); -// map3.put(10, 5); -// map3.put(11, 100); -// map3.put(12, 200); -// map3.put(13, 1); -// -// Map map4 = new LinkedHashMap<>(); -// map4.put(1, 700); -// map4.put(2, 1000); -// map4.put(3, 20); -// map4.put(4, 25); -// map4.put(5, 50); -// map4.put(6, 100); -// map4.put(7, 240); -// map4.put(8, 20); -// map4.put(9, 1); -// map4.put(10, 5); -// map4.put(11, 100); -// map4.put(12, 200); -// map4.put(13, 1); -// -// Map map5 = new LinkedHashMap<>(); -// map5.put(1, 100); -// map5.put(2, 2000); -// map5.put(3, 25); -// map5.put(4, 50); -// map5.put(5, 100); -// map5.put(6, 200); -// map5.put(7, 250); -// map5.put(8, 20); -// map5.put(9, 1); -// map5.put(10, 5); -// map5.put(11, 100); -// map5.put(12, 200); -// map5.put(13, 1); -// -// for (String id : arr1) { -// importTableService.addTableData(id, map1); -// importTableService.addTableData(id, map2); -// importTableService.addTableData(id, map3); -// importTableService.addTableData(id, map4); -// importTableService.addTableData(id, map5); -// } -// } -// -// @Test -// public void test4() { -// String[] arr1 = {"1932333967379214336", "1932333967412768768", "1932333967492460544", "1932333967555375104", "1932333967593123840", "1932333967626678272"}; -// -// Map map1 = new LinkedHashMap<>(); -// map1.put(1, 400); -// map1.put(2, 700); -// map1.put(3, 150); -// map1.put(4, 175); -// map1.put(5, 350); -// map1.put(6, 700); -// map1.put(7, 730); -// map1.put(8, 150); -// map1.put(9, 1); -// -// Map map2 = new LinkedHashMap<>(); -// map2.put(1, 700); -// map2.put(2, 1000); -// map2.put(3, 150); -// map2.put(4, 175); -// map2.put(5, 350); -// map2.put(6, 700); -// map2.put(7, 1400); -// map2.put(8, 150); -// map2.put(9, 1); -// -// Map map3 = new LinkedHashMap<>(); -// map3.put(1, 1000); -// map3.put(2, 2000); -// map3.put(3, 250); -// map3.put(4, 500); -// map3.put(5, 1000); -// map3.put(6, 2000); -// map3.put(7, 5000); -// map3.put(8, 150); -// map3.put(9, 1); -// -// Map map4 = new LinkedHashMap<>(); -// map4.put(1, 2000); -// map4.put(2, 4000); -// map4.put(3, 375); -// map4.put(4, 750); -// map4.put(5, 1500); -// map4.put(6, 3000); -// map4.put(7, 6000); -// map4.put(8, 150); -// map4.put(9, 1); -// -// Map map5 = new LinkedHashMap<>(); -// map5.put(1, 4000); -// map5.put(2, 6000); -// map5.put(3, 375); -// map5.put(4, 750); -// map5.put(5, 1500); -// map5.put(6, 3000); -// map5.put(7, 7200); -// map5.put(8, 150); -// map5.put(9, 1); -// -// for (String id : arr1) { -// importTableService.addTableData(id, map1); -// importTableService.addTableData(id, map2); -// importTableService.addTableData(id, map3); -// importTableService.addTableData(id, map4); -// importTableService.addTableData(id, map5); -// } -// } -// -// @Test -// public void test5() { -// ElectromagneticResult electromagneticResult = importTableService.selectTableDataByTableInfoId(1, 10, "1932333966867509248"); -// System.out.println(JSONUtil.toJsonStr(electromagneticResult)); -// } -//} diff --git a/electrmangnetic/src/test/java/ImportTest.java b/electrmangnetic/src/test/java/ImportTest.java new file mode 100644 index 0000000..eed7c19 --- /dev/null +++ b/electrmangnetic/src/test/java/ImportTest.java @@ -0,0 +1,35 @@ +import com.electromagnetic.industry.software.common.cons.UserConstants; +import com.electromagnetic.industry.software.common.pojo.UserLoginInfo; +import com.electromagnetic.industry.software.common.util.UserThreadLocal; +import com.electromagnetic.industry.software.manage.Application; +import com.electromagnetic.industry.software.manage.config.ElePropertyConfig; +import com.electromagnetic.industry.software.manage.service.ImportPrjService; +import com.electromagnetic.industry.software.manage.service.ImportTableService; +import jakarta.annotation.Resource; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest(classes = Application.class) +public class ImportTableTest { + + @Resource + private ImportTableService importTableService; + @Resource + private ImportPrjService importPrjService; + @Resource + private ElePropertyConfig elePropertyConfig; + + public void testImportPrj() { + UserLoginInfo userLoginInfo = new UserLoginInfo(); + userLoginInfo.setUserId("1916756770835075072"); + userLoginInfo.setUsername("北航电磁仿真用户1"); + userLoginInfo.setWorkNumber(""); + userLoginInfo.setAdminType(""); + userLoginInfo.setPrjTmpDir(elePropertyConfig.getEleTmpPath()); + UserThreadLocal.set(userLoginInfo); + importPrjService.importPrj(null); + + } + + + +} diff --git a/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/enums/DataOwnEnum.java b/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/enums/DataOwnEnum.java index a98419d..65ee73e 100644 --- a/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/enums/DataOwnEnum.java +++ b/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/enums/DataOwnEnum.java @@ -11,10 +11,12 @@ public enum DataOwnEnum { SYS_PRJ(1, "项目数据层级", "项目数据"), USER_PRJ(2, "个人数据层级", "个人数据"), REPO_PRJ(5, "库数据层级", "库数据"), + IMPORT_PRJ(6, "用户导入层级", "导入工程数据"), SYS_FILE(0, "项目数据文件(文件夹)", "项目数据"), USER_FILE(4, "个人数据文件(文件夹)", "个人数据"), - REPO_FILE(3, "库数据文件(文件夹)", "库数据"); + REPO_FILE(3, "库数据文件(文件夹)", "库数据"), + IMPORT_FILE(7, "用户导入工程", "导入工程数据"); private static final Map FILE_PRJ_MAP = new HashMap<>(); private static final Map CODE_ENUM = new HashMap<>(); diff --git a/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/util/EleCommonUtil.java b/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/util/EleCommonUtil.java index 604be7c..af5c1d2 100644 --- a/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/util/EleCommonUtil.java +++ b/electromagnetic-common/src/main/java/com/electromagnetic/industry/software/common/util/EleCommonUtil.java @@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j; import java.io.File; import java.io.InputStream; import java.io.OutputStream; +import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; import java.time.LocalDateTime; @@ -17,6 +18,7 @@ import java.time.format.DateTimeFormatter; import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; +import java.util.zip.ZipFile; @Slf4j public final class EleCommonUtil { @@ -138,4 +140,17 @@ public final class EleCommonUtil { return match ? t1 : t2; } + + public static ZipFile getZipFile(String zipFilePath) { + try { + return new ZipFile(zipFilePath); + } catch (Exception e) { + try { + return new ZipFile(zipFilePath, Charset.forName("GBK")); + } catch (Exception e1) { + return null; + } + } + } + }