From e76449212e0f2c38d9d4323747e00091c67ace5e Mon Sep 17 00:00:00 2001 From: chenxudong Date: Wed, 18 Dec 2024 15:34:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BC=80=E5=8F=91=E5=AE=8C=E6=88=90=E5=B1=82?= =?UTF-8?q?=E7=BA=A7=E5=AE=9A=E4=B9=89=E7=9B=B8=E5=85=B3=E7=9A=84=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E8=BF=98=E6=B2=A1=E8=87=AA=E6=B5=8B=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/controller/EDDataController.java | 2 +- .../manage/controller/ProjectController.java | 16 +- .../manage/mapper/EdFileInfoMapper.java | 4 + .../manage/pojo/models/EdFileInfo.java | 2 + .../software/manage/pojo/resp/ProjectVO.java | 17 ++ .../manage/service/EdFileInfoService.java | 23 ++ .../serviceimpl/EdFileInfoServiceImpl.java | 262 +++++++++++++++--- .../resources/sqlmapper/EdFileInfoMapper.xml | 7 + 8 files changed, 300 insertions(+), 33 deletions(-) create mode 100644 electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/ProjectVO.java diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/EDDataController.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/EDDataController.java index c147180..96c1a9a 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/EDDataController.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/EDDataController.java @@ -15,7 +15,7 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; -@RequestMapping("/data/ed/file") +@RequestMapping("/data1/ed/file") @RestController public class EDDataController { diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ProjectController.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ProjectController.java index 61e9537..9dcab0e 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ProjectController.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/controller/ProjectController.java @@ -40,12 +40,21 @@ public class ProjectController { return edFileInfoService.queryAllPrjInfo(); } - @RequestMapping("addFolder") public ElectromagneticResult addFolder(@RequestParam String folderName, @RequestParam String parentId) { return edFileInfoService.addFolder(parentId, folderName); } + @RequestMapping("modifyFolder") + public ElectromagneticResult modifyFolder(@RequestParam String newFolderName, @RequestParam String id) { + return edFileInfoService.modifyFolder(id, newFolderName); + } + + @RequestMapping("deleteFolder") + public ElectromagneticResult deleteFolder(@RequestParam String fileId) { + return edFileInfoService.deleteFolder(fileId); + } + @RequestMapping("folderResort") public ElectromagneticResult folderResort(@RequestBody List folderResortDTOList) { return edFileInfoService.folderResort(folderResortDTOList); @@ -55,4 +64,9 @@ public class ProjectController { public ElectromagneticResult publish(@RequestParam String prjId) { return edFileInfoService.publish(prjId); } + + @RequestMapping("follow") + public ElectromagneticResult follow(@RequestParam String sourceId, @RequestParam String targetId) { + return edFileInfoService.follow(sourceId, targetId); + } } diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/EdFileInfoMapper.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/EdFileInfoMapper.java index 39df6df..68d5fec 100644 --- a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/EdFileInfoMapper.java +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/mapper/EdFileInfoMapper.java @@ -4,9 +4,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo; import org.apache.ibatis.annotations.Mapper; +import java.util.List; + @Mapper public interface EdFileInfoMapper extends BaseMapper { String maxPrjId(); + List selectAllAdminFolder(String prjId); + } 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 bdd7fc1..017ad7b 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 @@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; import lombok.experimental.Accessors; +import lombok.experimental.FieldNameConstants; @EqualsAndHashCode(callSuper = true) @TableName("ed_file_info") @Accessors(chain = true) @Data +@FieldNameConstants public class EdFileInfo extends BaseModel { /** * 主键ID diff --git a/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/ProjectVO.java b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/ProjectVO.java new file mode 100644 index 0000000..45c3b26 --- /dev/null +++ b/electrmangnetic/src/main/java/com/electromagnetic/industry/software/manage/pojo/resp/ProjectVO.java @@ -0,0 +1,17 @@ +package com.electromagnetic.industry.software.manage.pojo.resp; + +import lombok.Data; + +import java.util.List; + +@Data +public class ProjectVO { + + private String id; + private String fileName; + private String parentId; + private int sort; + + private List children; + +} 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 845bb01..8d7034c 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 @@ -55,4 +55,27 @@ public interface EdFileInfoService { * @return */ ElectromagneticResult publish(String prjId); + + /** + * 删除子集 + * @param fileId + * @return + */ + ElectromagneticResult deleteFolder(String fileId); + + /** + * 层级沿用 + * @param sourceId + * @param targetId + * @return + */ + ElectromagneticResult follow(String sourceId, String targetId); + + /** + * 修改子集名称 + * @param id + * @param newFolderName + * @return + */ + ElectromagneticResult modifyFolder(String id, String newFolderName); } 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 a3c85ed..6644afc 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 @@ -1,12 +1,18 @@ package com.electromagnetic.industry.software.manage.service.serviceimpl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNodeConfig; +import cn.hutool.core.lang.tree.TreeUtil; import cn.hutool.core.text.StrFormatter; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; 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.EleDataSaveStatusEnum; import com.electromagnetic.industry.software.common.enums.EleDataStatusEnum; @@ -16,9 +22,9 @@ import com.electromagnetic.industry.software.common.util.*; import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper; import com.electromagnetic.industry.software.manage.pojo.models.EdFileInfo; import com.electromagnetic.industry.software.manage.pojo.req.FolderResortDTO; +import com.electromagnetic.industry.software.manage.pojo.resp.ProjectVO; import com.electromagnetic.industry.software.manage.service.EdFileInfoService; import com.electromagnetic.industry.software.manage.service.FileSystemService; -import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; @@ -33,6 +39,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static com.electromagnetic.industry.software.common.cons.ElectromagneticConstants.*; + @Service public class EdFileInfoServiceImpl extends ServiceImpl implements EdFileInfoService { @@ -63,6 +71,14 @@ public class EdFileInfoServiceImpl extends ServiceImpl createNewPrj(String prjName) { + + Assert.isTrue(EleCommonUtil.isFileNameValid(prjName), "文件名不符合规范,只能包含中文字符、下划线、连字符、加号、数字和英文字符且长度小于32。"); + if (!EleCommonUtil.isFileNameValid(prjName)) { + String info = StrFormatter.format("工程名称{}不符合要求", prjName); + log.error(info); + return ElectromagneticResultUtil.fail("-1", info); + } + // 首先检查工程是否存在 // TODO 一个项目如果被废除了,然后又新建了一个同名工程,这种情况怎么处理,需要产品确认。当前这里先按照同名如果存在则抛出异常处理。 LambdaQueryWrapper existPrjWrapper = Wrappers.lambdaQuery(EdFileInfo.class) @@ -85,7 +101,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) .select(EdFileInfo::getId) - .likeRight(EdFileInfo::getFilePath, prjId + ElectromagneticConstants.MYSQL_FILE_PATH_SPLIT); + .likeRight(EdFileInfo::getFilePath, prjId + MYSQL_FILE_PATH_SPLIT); List edFileInfos = this.baseMapper.selectList(queryWrapper); edFileInfos.forEach(e -> ids.add(e.getId())); Wrappers.lambdaUpdate(EdFileInfo.class).set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code).in(EdFileInfo::getId, ids); @@ -171,18 +187,27 @@ public class EdFileInfoServiceImpl extends ServiceImpl addFolder(String parentId, String folderName) { + // 验证名称是否合法 + Assert.isTrue(EleCommonUtil.isFileNameValid(folderName), "文件名不符合规范,只能包含中文字符、下划线、连字符、加号、数字和英文字符且长度小于32。"); + + if (!EleCommonUtil.isFileNameValid(folderName)) { + String info = StrFormatter.format("子集名称{}不符合要求", folderName); + log.error(info); + return ElectromagneticResultUtil.fail("-1", info); + } // 首先判断判断当前深度是否已经达到6层 LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) .select(EdFileInfo::getId, EdFileInfo::getFilePath) .eq(EdFileInfo::getId, parentId); EdFileInfo edFileInfo = this.baseMapper.selectOne(queryWrapper); String currentPath = edFileInfo.getFilePath(); - List paths = CollUtil.newArrayList(edFileInfo.getFilePath().split(ElectromagneticConstants.MYSQL_FILE_PATH_SPLIT)); + List paths = CollUtil.newArrayList(edFileInfo.getFilePath().split(MYSQL_FILE_PATH_SPLIT)); if (paths.size() >= prjFolderMaxLength) { String info = "当前子集已达到最大层级,禁止创建子集。"; log.error(info); return ElectromagneticResultUtil.fail("-1", info); } + // 判断文件夹名称是否存在 List edFileInfos = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) .select(EdFileInfo::getId, EdFileInfo::getFileName) @@ -194,31 +219,32 @@ public class EdFileInfoServiceImpl extends ServiceImpl queryAllPrjInfo() { - return null; + + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) + .select(EdFileInfo::getId) + .eq(EdFileInfo::getParentId, 0) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code); + List ids = this.baseMapper.selectList(queryWrapper).stream().map(EdFileInfo::getId).collect(Collectors.toList()); + + List projectVOS = new ArrayList<>(); + + for (String id : ids) { + LambdaQueryWrapper queryWrapper1 = Wrappers.lambdaQuery(EdFileInfo.class) + .select(EdFileInfo::getId, EdFileInfo::getFileName, EdFileInfo::getParentId, EdFileInfo::getSort) + .like(EdFileInfo::getFilePath, MYSQL_FILE_PATH_SPLIT + id + MYSQL_FILE_PATH_SPLIT); + List edFileInfos = this.baseMapper.selectList(queryWrapper1); + // 转换为树 + TreeNodeConfig config = new TreeNodeConfig(); + config.setIdKey(EdFileInfo.Fields.id); + config.setParentIdKey(EdFileInfo.Fields.parentId); + config.setWeightKey(EdFileInfo.Fields.sort); + + List> trees = TreeUtil.build(edFileInfos, "0", config, ((obj, treeNode) -> { + treeNode.putExtra(EdFileInfo.Fields.id, obj.getId()); + treeNode.putExtra(EdFileInfo.Fields.parentId, obj.getParentId()); + treeNode.putExtra(EdFileInfo.Fields.sort, obj.getSort()); + treeNode.putExtra(EdFileInfo.Fields.fileName, obj.getFileName()); + })); + + String jsonStr = JSONUtil.toJsonStr(trees); + ProjectVO projectVO = JSONUtil.toList(jsonStr, ProjectVO.class).get(0); + projectVOS.add(projectVO); + } + return ElectromagneticResultUtil.success(projectVOS); } /** @@ -265,6 +322,149 @@ public class EdFileInfoServiceImpl extends ServiceImpl deleteFolder(String fileId) { + // TODO是否需要判断文件夹是否为空 + LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) + .select(EdFileInfo::getId, EdFileInfo::getFilePath) + .like(EdFileInfo::getFilePath, MYSQL_FILE_PATH_SPLIT + fileId + MYSQL_FILE_PATH_SPLIT) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code); + List edFileInfos = this.baseMapper.selectList(queryWrapper); + List ids = edFileInfos.stream().map(EdFileInfo::getId).collect(Collectors.toList()); + ids.add(fileId); + LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate(EdFileInfo.class) + .set(EdFileInfo::getEffectFlag, EffectFlagEnum.NOT_EFFECTIVE.code) + .set(EdFileInfo::getSort, -1) + .in(EdFileInfo::getId, ids); + this.baseMapper.update(null, updateWrapper); + + String[] tmpFileIds = edFileInfos.get(0).getFilePath().split(MYSQL_FILE_PATH_SPLIT); + String parentId = tmpFileIds[0]; + for (String tmpPathId : tmpFileIds) { + parentId = this.baseMapper.maxPrjId(); + if (fileId.equals(tmpPathId)) { + break; + } + } + // 同层级的resort + List edFileInfos1 = this.baseMapper.selectList(Wrappers.lambdaQuery(EdFileInfo.class) + .select(EdFileInfo::getId, EdFileInfo::getSort) + .eq(EdFileInfo::getEffectFlag, EffectFlagEnum.EFFECT.code) + .eq(EdFileInfo::getParentId, parentId) + .orderByAsc(EdFileInfo::getSort)); + for (int i = 1; i <= edFileInfos1.size(); i++) { + String id = edFileInfos1.get(i).getId(); + this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class) + .set(EdFileInfo::getSort, i) + .eq(EdFileInfo::getId, id)); + } + return ElectromagneticResultUtil.success(true); + } + + /** + * 层级沿用 + * + * @param sourceId + * @param targetId + * @return + */ + @Override + public ElectromagneticResult follow(String sourceId, String targetId) { + + try { + String currentUserId = UserThreadLocal.getUserId(); + // 把source工程的层级结构copy到目标工程 + // 查找source的全部目录 + List sourceEdFileInfos = this.baseMapper.selectAllAdminFolder(sourceId); + List targetEdFileInfos = this.baseMapper.selectAllAdminFolder(targetId); + // 确定层级最大为prjFolderMaxLength层,现在逐层来处理。 + for (int i = 1; i <= prjFolderMaxLength; ++i) { + // 先查找source第i层下有那些子集 + final int count = i; + EdFileInfo targetParentFile = targetEdFileInfos.stream() + .filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == count - 1) + .collect(Collectors.toList()).get(0); + List sourceTmpEdFiles = sourceEdFileInfos.stream() + .filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == count) + .collect(Collectors.toList()); + List targetTmpEdFiles = targetEdFileInfos.stream() + .filter(e -> StrUtil.count(e.getFilePath(), MYSQL_FILE_PATH_SPLIT) == count) + .collect(Collectors.toList()); + Map sourceFileNameMap= sourceTmpEdFiles.stream().collect(Collectors.toMap(EdFileInfo::getFileName, e -> e)); + List targetFileNames = targetTmpEdFiles.stream().map(EdFileInfo::getFileName).collect(Collectors.toList()); + for (EdFileInfo edFileInfo : sourceTmpEdFiles) { + String sourceFileName = edFileInfo.getFileName(); + if (!targetFileNames.contains(sourceFileName)) { + EdFileInfo sourceFile = sourceFileNameMap.get(sourceFileName); + EdFileInfo targetFile = new EdFileInfo(); + int maxFolderId = Integer.parseInt(this.baseMapper.maxPrjId()); + String newFolderId = String.valueOf(maxFolderId + 1); + Date now = new Date(); + targetFile.setId(newFolderId) + .setFileId(newFolderId) + .setFileName(sourceFile.getFileName()) + .setFileVersion(100) + .setParentId(targetParentFile.getParentId()) + .setFileTime(EleCommonUtil.getNowTimeStr()) + .setDataType(EleDataTypeEnum.FOLDER.code) + .setDataStatus(EleDataStatusEnum.NOT_PUBLISHED.code) + .setEffectFlag(EffectFlagEnum.EFFECT.code) + .setSaveStatus(EleDataSaveStatusEnum.SUCCESS.code) + .setFilePath(targetParentFile.getFilePath() + MYSQL_FILE_PATH_SPLIT + newFolderId) + .setSort(targetTmpEdFiles.size() + 1) + .setCreatedTime(now) + .setUpdateTime(now) + .setCreatedBy(currentUserId) + .setUpdatedBy(currentUserId); + this.save(targetFile); + String targetSysFilePath = getSysFilePathByDbPath(targetFile.getFilePath()) + File.separator + sourceFileName; + FileUtil.mkdir(targetSysFilePath); + targetEdFileInfos = this.baseMapper.selectAllAdminFolder(targetId); + } + } + } + return ElectromagneticResultUtil.success(true); + } catch (Exception e) { + String info = StrFormatter.format("层级沿用失败"); + log.error(info, e); + return ElectromagneticResultUtil.fail("-1", info); + } + } + + /** + * 修改子集名称 + * + * @param id + * @param newFolderName + * @return + */ + @Override + public ElectromagneticResult modifyFolder(String id, String newFolderName) { + try { + EdFileInfo fileInfo = this.baseMapper.selectOne(Wrappers.lambdaQuery(EdFileInfo.class) + .eq(EdFileInfo::getId, id)); + String sysFilePath = getSysFilePathByDbPath(fileInfo.getFilePath()); + this.baseMapper.update(null, Wrappers.lambdaUpdate(EdFileInfo.class) + .set(EdFileInfo::getFileName, newFolderName)); + FileUtil.rename(new File(sysFilePath), newFolderName, true); + return ElectromagneticResultUtil.success(true); + } catch(Exception e) { + String info = StrFormatter.format("修改子集名称为{}失败", newFolderName); + log.error(info, e); + return ElectromagneticResultUtil.fail("-1", info); + } + } + + private String getSysFilePathByDbPath(String dbPath) { + ArrayList paths = CollUtil.newArrayList(dbPath.split(MYSQL_FILE_PATH_SPLIT)); + return getPath(paths); + } private String getPath(List ids) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(EdFileInfo.class) diff --git a/electrmangnetic/src/main/resources/sqlmapper/EdFileInfoMapper.xml b/electrmangnetic/src/main/resources/sqlmapper/EdFileInfoMapper.xml index 09989d8..14bb52f 100644 --- a/electrmangnetic/src/main/resources/sqlmapper/EdFileInfoMapper.xml +++ b/electrmangnetic/src/main/resources/sqlmapper/EdFileInfoMapper.xml @@ -7,4 +7,11 @@ select max(id) from ed_file_info where length(id) = 6 and (parent_id is null or parent_id = "") + + + \ No newline at end of file