xiexiang 1 năm trước cách đây
mục cha
commit
ac76670891

+ 3 - 12
src/main/java/cn/cslg/pas/common/dto/business/TreeNodeDTO.java

@@ -28,29 +28,20 @@ public class TreeNodeDTO {
     private Integer type;
 
     /**
-     * 父id
-     */
-    private Integer parentId;
-
-    /**
      * 抽象id
      * (所属产品/产品类别/自定义树/技术分类)
      */
     private Integer typeId;
 
     /**
-     * 路径
-     */
-    private String path;
-
-    /**
-     * 层级
+     * 父id
      */
-    private Integer level;
+    private Integer parentId;
 
     /**
      * 说明
      */
     private String description;
 
+
 }

+ 25 - 0
src/main/java/cn/cslg/pas/common/dto/business/UpdateTreeNodeDTO.java

@@ -0,0 +1,25 @@
+package cn.cslg.pas.common.dto.business;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 更新架构DTO
+ * @Author xiexiang
+ * @Date 2023/11/3
+ */
+@Data
+public class UpdateTreeNodeDTO {
+    @Schema(description = "id")
+    private Integer id;
+    @Schema(description = "节点名称")
+    private String name;
+    @Schema(description = "父id")
+    private Integer parentId;
+    @Schema(description = "说明")
+    private String description;
+    @Schema(description = "文件guid")
+    private List<String> guids;
+}

+ 6 - 3
src/main/java/cn/cslg/pas/controller/TreeNodeController.java

@@ -1,8 +1,10 @@
 package cn.cslg.pas.controller;
 
 import cn.cslg.pas.common.core.base.Constants;
+import cn.cslg.pas.common.dto.business.ProductCategoryDTO;
 import cn.cslg.pas.common.dto.business.QueryTreeNodeDTO;
 import cn.cslg.pas.common.dto.business.TreeNodeDTO;
+import cn.cslg.pas.common.dto.business.UpdateTreeNodeDTO;
 import cn.cslg.pas.common.model.cronModel.Records;
 import cn.cslg.pas.common.model.request.StringRequest;
 import cn.cslg.pas.common.utils.Response;
@@ -12,6 +14,7 @@ import cn.cslg.pas.exception.XiaoShiException;
 import cn.cslg.pas.factorys.businessFactory.Business;
 import cn.cslg.pas.factorys.businessFactory.BusinessFactory;
 import cn.cslg.pas.service.business.TreeNodeService;
+import com.alibaba.fastjson.JSONObject;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -48,7 +51,7 @@ public class TreeNodeController {
     @PostMapping("/addTreeNode")
     public Response addTreeNode(String treeNode, List<MultipartFile> files) throws Exception {
         if(treeNode != null){
-            TreeNodeDTO treeNodeDTO = new TreeNodeDTO();
+            TreeNodeDTO treeNodeDTO = JSONObject.parseObject(treeNode, TreeNodeDTO.class);
             Business business = businessFactory.getClass("treeNodeService");
             Integer id = null;
             try {
@@ -72,9 +75,9 @@ public class TreeNodeController {
     @PostMapping("/updateTreeNode")
     public Response updateTreeNode(String treeNode, List<MultipartFile> files) throws Exception {
         if (treeNode != null) {
-            TreeNodeDTO treeNodeDTO = new TreeNodeDTO();
+            UpdateTreeNodeDTO updateTreeNodeDTO = JSONObject.parseObject(treeNode, UpdateTreeNodeDTO.class);
             Business business = businessFactory.getClass("treeNodeService");
-            business.updateMessage(treeNodeDTO, files);
+            business.updateMessage(updateTreeNodeDTO, files);
             return Response.success(1);
         } else {
             return Response.error("网络异常");

+ 2 - 1
src/main/java/cn/cslg/pas/domain/business/ProductCategory.java

@@ -1,6 +1,7 @@
 package cn.cslg.pas.domain.business;
 
 import cn.cslg.pas.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
@@ -37,7 +38,7 @@ public class ProductCategory extends BaseEntity<ProductCategory> {
     /**
      * 描述
      */
-    @TableField(value = "description")
+    @TableField(value = "description",updateStrategy= FieldStrategy.IGNORED)
     private String description;
     /**
      * 创建人

+ 5 - 2
src/main/java/cn/cslg/pas/domain/business/TreeNode.java

@@ -2,10 +2,13 @@ package cn.cslg.pas.domain.business;
 
 import cn.cslg.pas.domain.BaseEntity;
 import cn.hutool.core.date.DateTime;
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 
+import java.util.Date;
+
 /**
  * <p>
  *  架构实体类
@@ -46,7 +49,7 @@ public class TreeNode extends BaseEntity<TreeNode> {
     /**
      * 路径
      */
-    @TableField(value = "path")
+    @TableField(value = "path",updateStrategy= FieldStrategy.IGNORED)
     private String path;
 
     /**
@@ -65,7 +68,7 @@ public class TreeNode extends BaseEntity<TreeNode> {
      * 创建时间
      */
     @TableField(value = "create_time")
-    private DateTime createTime;
+    private Date createTime;
 
     /**
      * 说明

+ 2 - 2
src/main/java/cn/cslg/pas/service/business/ProductCategoryService.java

@@ -109,7 +109,7 @@ public class ProductCategoryService extends ServiceImpl<ProductCategoryMapper, P
         LambdaQueryWrapper<ProductCategory> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(ProductCategory::getName, name);
         List<ProductCategory> productCategories = this.list(queryWrapper);
-        if(productCategories != null && productCategories.size() != 0){
+        if (productCategories != null && productCategories.size() != 0) {
             throw new XiaoShiException("参数错误");
         }
         //获取登陆人信息 用于设置创建人
@@ -324,8 +324,8 @@ public class ProductCategoryService extends ServiceImpl<ProductCategoryMapper, P
         List<String> updateFileGuIds = new ArrayList<>();
         if(updateProductCategoryDTO.getGuids() != null && updateProductCategoryDTO.getGuids().size() != 0){
             updateFileGuIds = updateProductCategoryDTO.getGuids();
+            fileGuIds.retainAll(updateFileGuIds);
         }
-        fileGuIds.retainAll(updateFileGuIds);
         //做差获得被删除的文件id
         if(fileGuIds.size() != 0){
             //根据文件id删除产品类别与文件关联表记录

+ 2 - 2
src/main/java/cn/cslg/pas/service/business/ProductService.java

@@ -104,7 +104,7 @@ public class ProductService extends ServiceImpl<ProductMapper, Product> implemen
         queryWrapper.eq(Product::getName, name);
         List<Product> products = this.list(queryWrapper);
         if (products != null && products.size() != 0) {
-            throw new XiaoShiException("参数错误");
+            throw new XiaoShiException("产品名称不能重复!");
         }
         //获取登陆人信息 用于设置创建人
         PersonnelVO personnelVO = new PersonnelVO();
@@ -315,8 +315,8 @@ public class ProductService extends ServiceImpl<ProductMapper, Product> implemen
         List<String> updateFileGuIds = new ArrayList<>();
         if(updateProductDTO.getGuids() != null && updateProductDTO.getGuids().size() != 0){
             updateFileGuIds = updateProductDTO.getGuids();
+            fileGuIds.retainAll(updateFileGuIds);
         }
-        fileGuIds.retainAll(updateFileGuIds);
         //做差获得被删除的文件id
         if(fileGuIds.size() != 0){
             //根据文件id删除产品与文件关联表记录

+ 89 - 15
src/main/java/cn/cslg/pas/service/business/TreeNodeService.java

@@ -2,6 +2,7 @@ package cn.cslg.pas.service.business;
 
 import cn.cslg.pas.common.dto.business.QueryTreeNodeDTO;
 import cn.cslg.pas.common.dto.business.TreeNodeDTO;
+import cn.cslg.pas.common.dto.business.UpdateTreeNodeDTO;
 import cn.cslg.pas.common.model.cronModel.*;
 import cn.cslg.pas.common.model.request.GroupRequest;
 import cn.cslg.pas.common.model.request.QueryRequest;
@@ -100,7 +101,7 @@ public class TreeNodeService extends ServiceImpl<TreeNodeMapper, TreeNode> imple
      */
     @Override
     public Object addMessage(Object object, List<MultipartFile> files) {
-        //object to treeNode
+        //object to treeNodeDTO
         TreeNodeDTO treeNodeDTO = (TreeNodeDTO) object;
         //检测名称是否规范
         treeNodeDTO.setName(treeNodeDTO.getName().trim());
@@ -110,7 +111,7 @@ public class TreeNodeService extends ServiceImpl<TreeNodeMapper, TreeNode> imple
         queryWrapper.eq(TreeNode::getName, name);
         List<TreeNode> treeNodes = this.list(queryWrapper);
         if (treeNodes != null && treeNodes.size() != 0) {
-            throw new XiaoShiException("参数错误");
+            throw new XiaoShiException("名称不能重复!");
         }
         //获取登录人信息
         PersonnelVO personnelVO = new PersonnelVO();
@@ -122,6 +123,28 @@ public class TreeNodeService extends ServiceImpl<TreeNodeMapper, TreeNode> imple
         //赋值
         TreeNode treeNode = new TreeNode();
         BeanUtils.copyProperties(treeNodeDTO, treeNode);
+        Integer parentId = treeNodeDTO.getParentId();
+        //若父id为0,则代表这是顶层id
+        if (parentId.equals(0)) {
+            treeNode.setPath("");
+            treeNode.setLevel(0);
+        } else {//有父id,根据父id获取它的路径,然后加上父id拼接成该条路径
+            TreeNode parentNode = this.getById(parentId);
+            String parentPath = parentNode.getPath();
+            if (parentPath != null) {
+                //父id若为顶层id,则父id没有路径
+                if (parentPath.equals("")) {
+                    treeNode.setPath(parentId + "/");
+                    treeNode.setLevel(1);
+                } else {
+                    //父id不是顶层id,父id有路径
+                    treeNode.setPath(parentPath + "/" + parentId + "/");
+                    treeNode.setLevel(parentNode.getLevel() + 1);
+                }
+            } else {
+                throw new XiaoShiException("数据库中路径错误");
+            }
+        }
         treeNode.setCreateId(personnelVO.getId());
         treeNode.insert();
         //处理文件
@@ -182,29 +205,81 @@ public class TreeNodeService extends ServiceImpl<TreeNodeMapper, TreeNode> imple
     @Override
     public Object updateMessage(Object object, List<MultipartFile> files) {
         //object to treeNode
-        TreeNodeDTO treeNodeDTO = (TreeNodeDTO) object;
+        UpdateTreeNodeDTO updateTreeNodeDTO = (UpdateTreeNodeDTO) object;
+        //检测传入参数合理性
+        if (updateTreeNodeDTO == null || updateTreeNodeDTO.getId() == null) {
+            throw new XiaoShiException("传入参数不能为空");
+        }
         //获取登录人信息
-        PersonnelVO personnelVO;
+        PersonnelVO personnelVO = new PersonnelVO();
         try {
             personnelVO = cacheUtils.getLoginUser(loginUtils.getId());
         } catch (Exception e) {
             throw new UnLoginException("未登录");
         }
-        treeNodeDTO.setName(treeNodeDTO.getName().trim());
+        TreeNode treeNode = this.getById(updateTreeNodeDTO.getId());
+        //检查名称是否规范
+        updateTreeNodeDTO.setName(updateTreeNodeDTO.getName().trim());
         //根据名称查询是否重复
-        String name = treeNodeDTO.getName();
+        String name = updateTreeNodeDTO.getName();
         LambdaQueryWrapper<TreeNode> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(TreeNode::getName, name);
         List<TreeNode> treeNodes = this.list(queryWrapper);
-        if (treeNodes == null && treeNodes.size() == 0) {
-            return null;
+        if (!updateTreeNodeDTO.getName().equals(treeNode.getName()) && treeNodes.size() != 0) {
+            throw new XiaoShiException("节点名称重复");
+        }
+        BeanUtils.copyProperties(updateTreeNodeDTO, treeNode);
+        Integer parentId = updateTreeNodeDTO.getParentId();
+        //若父id为0,则代表这是顶层id
+        if (parentId.equals(0)) {
+            treeNode.setPath("");
+            treeNode.setLevel(0);
+        } else {//有父id,根据父id获取它的路径,然后加上父id拼接成该条路径
+            TreeNode parentNode = this.getById(parentId);
+            String parentPath = parentNode.getPath();
+            if (parentPath != null) {
+                //父id若为顶层id,则父id没有路径
+                if (parentPath.equals("")) {
+                    treeNode.setPath(parentId + "/");
+                    treeNode.setLevel(1);
+                } else {
+                    //父id不是顶层id,父id有路径
+                    treeNode.setPath(parentPath + parentId + "/");
+                    treeNode.setLevel(parentNode.getLevel() + 1);
+                }
+            } else {
+                throw new XiaoShiException("数据库中路径错误");
+            }
         }
-        //赋值
-        TreeNode treeNode = this.getById(treeNodeDTO.getId());
-        BeanUtils.copyProperties(treeNodeDTO, treeNode);
-        treeNode.setCreateId(null);
         //数据入表
-        treeNode.insert();
+        treeNode.updateById();
+        /**
+         * 与架构节点有关文件的处理
+         */
+        //根据架构id查询对应的附件id
+        LambdaQueryWrapper<AssoTreeNodeFile> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(AssoTreeNodeFile::getTreeNodeId, updateTreeNodeDTO.getId());
+        List<AssoTreeNodeFile> assoFiles = assoTreeNodeFileService.list(wrapper);
+        List<String> fileGuIds = assoFiles.stream().map(AssoTreeNodeFile::getFileGuid).collect(Collectors.toList());
+        //获取更新后的附件ids
+        List<String> updateFileGuIds = new ArrayList<>();
+        if (updateTreeNodeDTO.getGuids() != null && updateTreeNodeDTO.getGuids().size() != 0) {
+            updateFileGuIds = updateTreeNodeDTO.getGuids();
+            fileGuIds.retainAll(updateFileGuIds);
+        }
+        //做差获得被删除的文件id
+        if (fileGuIds.size() != 0) {
+            //根据文件id删除架构与文件关联表记录
+            LambdaQueryWrapper<AssoTreeNodeFile> deleteWrapper = new LambdaQueryWrapper<>();
+            deleteWrapper.in(AssoTreeNodeFile::getFileGuid, fileGuIds);
+            assoTreeNodeFileService.remove(deleteWrapper);
+            //远程删除服务器上的文件
+            try {
+                fileManagerService.deleteFileFromFMS(fileGuIds);
+            } catch (Exception e) {
+
+            }
+        }
         //处理文件
         if (files != null && files.size() != 0) {
             try {
@@ -214,8 +289,7 @@ public class TreeNodeService extends ServiceImpl<TreeNodeMapper, TreeNode> imple
                     AssoTreeNodeFile assoTreeNodeFile = new AssoTreeNodeFile();
                     assoTreeNodeFile.setTreeNodeId(treeNode.getId());
                     assoTreeNodeFile.setFileGuid(item);
-                    //TODO
-                    assoTreeNodeFile.setCreateId(null);
+                    assoTreeNodeFile.setCreateId(personnelVO.getId());
                     assoTreeNodeFiles.add(assoTreeNodeFile);
                 }
                 if (assoTreeNodeFiles != null && assoTreeNodeFiles.size() != 0) {

+ 0 - 3
src/test/java/cn/cslg/pas/service/ProductCategoryServiceTests.java

@@ -1,6 +1,5 @@
 package cn.cslg.pas.service;
 
-import cn.cslg.pas.common.model.request.OrderDTO;
 import cn.cslg.pas.common.model.request.StringRequest;
 import cn.cslg.pas.common.utils.Response;
 import cn.cslg.pas.controller.ProductCategoryController;
@@ -10,8 +9,6 @@ import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
-import java.util.ArrayList;
-import java.util.List;
 
 /**
  * @Author xiexiang

+ 35 - 0
src/test/java/cn/cslg/pas/service/TreeNodeServiceTests.java

@@ -0,0 +1,35 @@
+package cn.cslg.pas.service;
+
+import cn.cslg.pas.common.utils.Response;
+import cn.cslg.pas.controller.TreeNodeController;
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+/**
+ * @Author xiexiang
+ * @Date 2023/11/3
+ */
+@SpringBootTest
+public class TreeNodeServiceTests {
+    @Autowired
+    private TreeNodeController treeNodeController;
+
+    @Test
+    void update() throws Exception {
+        List<MultipartFile> files = null;
+        String treeNode = "{\n" +
+                "    \"id\": 3,\n" +
+                "    \"name\": \"名称8\",\n" +
+                "    \"parentId\": 1,\n" +
+                "    \"description\": \"将名称2改成名称8,其余不变\",\n" +
+                "    \"guids\": []\n" +
+                "}";
+        Response response = treeNodeController.updateTreeNode(treeNode, files);
+        Assert.assertEquals(200,Integer.parseInt(response.getCode().toString()));
+    }
+}