Forráskód Böngészése

合同段划分导入相关

liuyc 2 éve
szülő
commit
ba498ae054
25 módosított fájl, 528 hozzáadás és 235 törlés
  1. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTree.java
  2. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContract.java
  3. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java
  4. 12 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO.java
  5. 2 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO4.java
  6. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeVO.java
  7. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeController.java
  8. 5 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  9. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsInfoController.java
  10. 9 10
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  11. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  12. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  13. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelBatchUtil.java
  14. 29 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelUtil.java
  15. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  16. 3 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.java
  17. 4 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.xml
  18. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  19. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml
  20. 10 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  21. 2 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  22. 235 113
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  23. 21 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  24. 125 80
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  25. 37 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/DiffListUtil.java

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTree.java

@@ -159,4 +159,10 @@ public class WbsTree extends BaseEntity {
     @ApiModelProperty(value = "填报率百分比")
     private String fillRate;
 
+    /**
+     * 导入wbs划分匹配字段
+     */
+    @ApiModelProperty(value = "导入wbs划分匹配字段")
+    private String importMatchingInfo;
+
 }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreeContract.java

@@ -232,4 +232,10 @@ public class WbsTreeContract extends BaseEntity {
     @ApiModelProperty(value = "节点导入是否识别成功 '0'否 '1'是")
     private Integer isImportIdentificationNode;
 
+    /**
+     * 导入wbs划分匹配字段
+     */
+    @ApiModelProperty(value = "导入wbs划分匹配字段")
+    private String importMatchingInfo;
+
 }

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsTreePrivate.java

@@ -170,4 +170,10 @@ public class WbsTreePrivate extends BaseEntity {
     @ApiModelProperty(value = "填报率百分比")
     private String fillRate;
 
+    /**
+     * 导入wbs划分匹配字段
+     */
+    @ApiModelProperty(value = "导入wbs划分匹配字段")
+    private String importMatchingInfo;
+
 }

+ 12 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.vo;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
@@ -51,6 +52,8 @@ public class WbsTreeContractVO implements INode<WbsTreeContractVO> {
 
     private Integer isImportIdentificationNode;
 
+    private String importMatchingInfo;
+
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private Boolean hasChildren;
 
@@ -142,6 +145,14 @@ public class WbsTreeContractVO implements INode<WbsTreeContractVO> {
         this.nodeName = nodeName;
     }
 
+    public String getImportMatchingInfo() {
+        return importMatchingInfo;
+    }
+
+    public void setImportMatchingInfo(String importMatchingInfo) {
+        this.importMatchingInfo = importMatchingInfo;
+    }
+
     public boolean equals(final Object o) {
         if (o == this) {
             return true;
@@ -226,6 +237,7 @@ public class WbsTreeContractVO implements INode<WbsTreeContractVO> {
                 ", partitionCode='" + partitionCode +
                 ", oldId='" + oldId +
                 ", isImportIdentificationNode='" + isImportIdentificationNode +
+                ", importMatchingInfo='" + importMatchingInfo +
                 ", hasChildren=" + hasChildren +
                 '}';
     }

+ 2 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO4.java

@@ -10,12 +10,12 @@ public class WbsTreeContractVO4 implements Serializable {
     private static final long serialVersionUID = 1L;
 
     /**
-     * 已匹配
+     * 合同段wbs划分导入已匹配节点参数
      */
     private List<WbsTreeContractVO> matchedData;
 
     /**
-     * 未匹配
+     * 合同段wbs划分导入未匹配节点参数
      */
     private List<WbsTreeContractVO> unmatchedData;
 

+ 6 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeVO.java

@@ -73,4 +73,10 @@ public class WbsTreeVO extends WbsTree implements INode<WbsTreeVO> {
 	 * wbs类型
 	 */
 	private Integer wbsType;
+
+	/**
+	 * fullName映射ImportMatchingInfo字段
+	 */
+	private String fullName;
+
 }

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeController.java

@@ -29,7 +29,7 @@ import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/archiveTree")
-@Api(value = "归档树管理", tags = "归档树管理接口")
+@Api(value = "归档wbs树", tags = "归档wbs树接口")
 public class ArchiveTreeController extends BladeController {
 
     private final IArchiveTreeService archiveTreeService;

+ 5 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -41,7 +41,7 @@ import java.util.*;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/contractInfo")
-@Api(value = "合同段", tags = "合同段接口")
+@Api(value = "合同段管理", tags = "合同段管理接口")
 public class ContractInfoController extends BladeController {
 
     private final IContractInfoService contractInfoService;
@@ -169,6 +169,10 @@ public class ContractInfoController extends BladeController {
         if (list.size() > 0) {
             return R.fail("当前合同段存在关联用户,删除失败");
         }
+        List<ContractRelationJlyz> list2 = saveUserInfoByProjectMapper.selectSGJL(ids);
+        if (list2.size() > 0) {
+            return R.fail("当前监理合同段存在关联的施工合同信息,删除失败");
+        }
         return R.status(contractInfoService.deleteLogic(Func.toLongList(ids)));
     }
 

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsInfoController.java

@@ -30,7 +30,7 @@ import java.util.List;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/wbsInfo")
-@Api(value = "wbs动态库信息", tags = "wbs动态库信息接口")
+@Api(value = "公有wbs树基础信息", tags = "公有wbs树基础信息接口")
 public class WbsInfoController extends BladeController {
 
     private final IWbsInfoService wbsInfoService;

+ 9 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -37,7 +37,6 @@ public class WbsTreeContractController extends BladeController {
         return R.fail(200, "未查询到数据");
     }
 
-
     @GetMapping("/searchParentAllNode")
     @ApiOperationSupport(order = 2)
     @ApiOperation(value = "获取当前节点的父集合", notes = "获取当前节点的父集合")
@@ -55,19 +54,19 @@ public class WbsTreeContractController extends BladeController {
 
     @PostMapping("/import-wbs-contract")
     @ApiOperationSupport(order = 3)
-    @ApiOperation(value = "导入合同段wbs划分", notes = "获取当前节点的父集合")
+    @ApiOperation(value = "导入合同段wbs划分", notes = "传入file、contractId、type、isSplicingNumber")
     @ApiImplicitParams(value = {
-            @ApiImplicitParam(name = "excelMode", value = "excel模板", required = true),
+            @ApiImplicitParam(name = "file", value = "excel模板", required = true),
             @ApiImplicitParam(name = "contractId", value = "合同段Id", required = true),
-            @ApiImplicitParam(name = "type", value = "工程类别", required = true)})
+            @ApiImplicitParam(name = "type", value = "工程类别", required = true),
+            @ApiImplicitParam(name = "isSplicingNumber", value = "是否拼接划分编号", required = true)
+    })
     public R<WbsTreeContractVO4> importWbsContract(@RequestPart("file") MultipartFile file,
                                                    @RequestParam("contractId") String contractId,
-                                                   @RequestParam("type") Integer type) throws IOException {
-        WbsTreeContractVO4 list = iWbsTreeContractService.importWbsContract(file, contractId, type);
-        if (list != null) {
-            return R.data(list);
-        }
-        return R.fail("匹配失败");
+                                                   @RequestParam("type") Integer type,
+                                                   @RequestParam("isSplicingNumber") Integer isSplicingNumber) throws IOException {
+        WbsTreeContractVO4 list = iWbsTreeContractService.importWbsContract(file, contractId, type, isSplicingNumber);
+        return R.data(list);
     }
 
 }

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java

@@ -46,7 +46,7 @@ import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/wbsTree")
-@Api(value = "wbs动态库节点", tags = "wbs动态库节点接口")
+@Api(value = "公有wbs树", tags = "公有wbs树接口")
 public class WbsTreeController extends BladeController {
 
     private final IWbsTreeService wbsTreeService;
@@ -67,6 +67,7 @@ public class WbsTreeController extends BladeController {
             WbsInfo wbsInfo = wbsInfoMapper.selectOne(Wrappers.<WbsInfo>query().lambda().eq(WbsInfo::getId, detail.getWbsId()));
             WbsTreeVO wbsTreeVO = Objects.requireNonNull(BeanUtil.copy(detail, WbsTreeVO.class));
             wbsTreeVO.setWbsType(wbsInfo.getWbsType());
+            wbsTreeVO.setFullName(detail.getImportMatchingInfo());
             return R.data(wbsTreeVO);
         }
         return R.fail(200, "未查询到信息");

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -42,7 +42,7 @@ import static org.springblade.core.cache.constant.CacheConstant.SYS_CACHE;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/wbsPrivate")
-@Api(value = "项目级私有wbs动态库", tags = "项目级私有wbs动态库接口")
+@Api(value = "私有wbs树", tags = "私有wbs树接口")
 public class WbsTreePrivateController extends BladeController {
 
     private final IWbsTreePrivateService wbsTreePrivateService;
@@ -306,6 +306,7 @@ public class WbsTreePrivateController extends BladeController {
     public R<WbsTreePrivateVO> detail(WbsTreePrivate wbsTree) {
         WbsTreePrivate detail = wbsTreePrivateService.getOne(Condition.getQueryWrapper(wbsTree));
         if (detail != null) {
+            detail.setFullName(detail.getImportMatchingInfo());
             return R.data(WbsTreePrivateWrapper.build().entityVO(detail));
         }
         return R.fail(200, "未查询到信息");

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelBatchUtil.java

@@ -26,6 +26,7 @@ public class WbsExcelBatchUtil {
 
 
     /**
+     * 深拷贝
      * @param src
      * @throws IOException
      * @throws ClassNotFoundException

+ 29 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelUtil.java

@@ -7,6 +7,7 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springblade.manager.utils.DiffListUtil;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
@@ -16,32 +17,47 @@ import java.util.stream.Collectors;
 
 public class WbsExcelUtil {
     /*public static void main(String[] args) throws IOException {
-        WbsExcelUtil excelUtil = new WbsExcelUtil();
+        *//*WbsExcelUtil excelUtil = new WbsExcelUtil();
         //读取excel数据
-        ArrayList<Map<String, String>> result = excelUtil.readExcelToObjContract("D:\\Download\\合同段工程节点导入.xlsx");
-        ArrayList<Map<String, String>> resultNow = excelUtil.getInfoByType(result, 1);
-
+        ArrayList<Map<String, String>> result = excelUtil.readExcelToObjContract("C:\\Users\\泓创开发\\Desktop\\合同段工程节点导入.xlsx");
+        ArrayList<Map<String, String>> resultNow = excelUtil.getDataListByType(result, 1);
         List<Map<Integer, String>> resultList = new ArrayList<>();
+
+        //构造map
+        String str = "\\s*|\r|\n|\t";
         for (Map<String, String> map : resultNow) {
             Map<Integer, String> maps = new HashMap<>();
-            map.forEach((k1, v1) -> {
-                map.forEach((k2, v2) -> {
+            map.forEach((k1, value1) -> {
+                String v1 = value1.replaceAll(str, "");
+                map.forEach((k2, value2) -> {
+                    String v2 = value2.replaceAll(str, "");
                     if ("1".equals(k1) && "2".equals(k2)) {
-                        maps.put(1, v1 + ":" + v2);
+                        maps.put(1, v1 + ":::" + v2);
                     } else if ("3".equals(k1) && "4".equals(k2)) {
-                        maps.put(2, v1 + ":" + v2);
+                        maps.put(2, v1 + ":::" + v2);
                     } else if ("5".equals(k1) && "6".equals(k2)) {
-                        maps.put(3, v1 + ":" + v2);
+                        maps.put(3, v1 + ":::" + v2);
                     } else if ("7".equals(k1) && "8".equals(k2)) {
-                        maps.put(4, v1 + ":" + v2);
+                        maps.put(4, v1 + ":::" + v2);
                     } else if ("9".equals(k1) && "10".equals(k2)) {
-                        maps.put(5, v1 + ":" + v2);
+                        maps.put(5, v1 + ":::" + v2);
                     }
                 });
             });
             resultList.add(maps);
         }
-        System.out.println(resultList);
+        resultList.forEach(System.out::println);*//*
+
+        String s1 = "K14+544~K16+176路基工程";
+        String s2 = "测试树-lyc,路基工程";
+
+        float similarityRatio = DiffListUtil.getSimilarityRatio(s1, s2);
+        boolean similarityRatio1 = DiffListUtil.getContains(s1, s2);
+        boolean similarityRatio2 = s1.contains(s2);
+        System.out.println(similarityRatio);
+        System.out.println(similarityRatio1);
+        System.out.println(similarityRatio2);
+
     }*/
 
     /**
@@ -387,7 +403,7 @@ public class WbsExcelUtil {
         return convFile;
     }
 
-    public ArrayList<Map<String, String>> getInfoByType(ArrayList<Map<String, String>> result, Integer type) {
+    public ArrayList<Map<String, String>> getDataListByType(ArrayList<Map<String, String>> result, Integer type) {
         String nodeName = getNodeNameByType(type);
         ArrayList<Map<String, String>> list = new ArrayList<>();
         if (StringUtils.isNotEmpty(nodeName)) {

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -265,6 +265,7 @@
         IFNULL(if(length(trim(full_name)) > 0, full_name, node_name),node_name) AS title,
         d.node_name AS "nodeName",
         d.full_name AS "fullName",
+        d.import_matching_info AS "importMatchingInfo",
         d.type AS "type",
         d.node_type AS "nodeType",
         d.id AS "value",

+ 3 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.java

@@ -3,6 +3,7 @@ package org.springblade.manager.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import io.lettuce.core.dynamic.annotation.Param;
 import org.springblade.manager.dto.SaveUserInfoByProjectDTO;
+import org.springblade.manager.entity.ContractRelationJlyz;
 import org.springblade.system.user.entity.User;
 
 import java.util.List;
@@ -25,4 +26,6 @@ public interface SaveUserInfoByProjectMapper extends BaseMapper<SaveUserInfoByPr
 
     int deleteByIdsPhysical(@Param("idsList") List<Long> idsList);
 
+    List<ContractRelationJlyz> selectSGJL(String ids);
+
 }

+ 4 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/SaveUserInfoByProjectMapper.xml

@@ -102,4 +102,8 @@
         </foreach>
     </select>
 
+    <select id="selectSGJL" resultType="org.springblade.manager.entity.ContractRelationJlyz">
+        select count(1) from m_contract_relation_jlyz where contract_id_jlyz = #{ids}
+    </select>
+
 </mapper>

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -47,6 +47,7 @@
         <result column="is_tab_pdf" property="isTabPdf"/>
         <result column="is_type_private_pid" property="isTypePrivatePid"/>
         <result column="is_import_identification_node" property="isImportIdentificationNode"/>
+        <result column="import_matching_info" property="importMatchingInfo"/>
     </resultMap>
 
     <resultMap id="resultMap2" type="org.springblade.manager.vo.WbsTreeContractVO">

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeMapper.xml

@@ -32,6 +32,7 @@
         <result column="init_table_name" property="initTableName"/>
         <result column="is_link_table" property="isLinkTable"/>
         <result column="is_exist_form" property="isExistForm"/>
+        <result column="import_matching_info" property="importMatchingInfo"/>
     </resultMap>
 
     <resultMap id="treeNodeResultMap" type="org.springblade.manager.vo.TreeNodeVO">

+ 10 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -33,6 +33,7 @@
         <result column="major_data_type" property="majorDataType"/>
         <result column="init_table_name" property="initTableName"/>
         <result column="is_link_table" property="isLinkTable"/>
+        <result column="import_matching_info" property="importMatchingInfo"/>
     </resultMap>
 
     <resultMap id="resultMap2" type="org.springblade.manager.vo.WbsTreePrivateVO2">
@@ -141,6 +142,7 @@
             parent_id       = #{wbsTP.parentId},
             node_type   = #{wbsTP.nodeType},
             node_name       = #{wbsTP.nodeName},
+            full_name       = #{wbsTP.nodeName},
             ancestors       = #{wbsTP.ancestors},
             unique_code     = #{wbsTP.uniqueCode},
             partition_code  = #{wbsTP.partitionCode},
@@ -222,14 +224,15 @@
     <update id="updateBatchByIds2">
         UPDATE m_wbs_tree_private
         SET node_name = #{wbsTreePrivate.nodeName},
-        full_name = #{wbsTreePrivate.nodeName},
+        full_name = #{wbsTreePrivate.fullName},
         node_type = #{wbsTreePrivate.nodeType},
         major_data_type = #{wbsTreePrivate.majorDataType},
         unique_code = #{wbsTreePrivate.uniqueCode},
         partition_code = #{wbsTreePrivate.partitionCode},
         table_type = #{wbsTreePrivate.tableType},
-        table_owner = #{wbsTreePrivate.tableOwner}
-        fill_rate = #{wbsTreePrivate.fillRate}
+        table_owner = #{wbsTreePrivate.tableOwner},
+        fill_rate = #{wbsTreePrivate.fillRate},
+        import_matching_info = #{item.importMatchingInfo}
         <if test="wbsTreePrivate.sort != null and wbsTreePrivate.sort != ''">
             , sort = #{wbsTreePrivate.sort}
         </if>
@@ -245,14 +248,15 @@
             UPDATE m_wbs_tree_private
             <set>
                 node_name = #{item.nodeName},
-                full_name = #{item.nodeName},
+                full_name = #{item.fullName},
                 node_type = #{item.nodeType},
                 major_data_type = #{item.majorDataType},
                 unique_code = #{item.uniqueCode},
                 partition_code = #{item.partitionCode},
                 table_type = #{item.tableType},
-                table_owner = #{item.tableOwner}
-                fill_rate = #{item.fillRate}
+                table_owner = #{item.tableOwner},
+                fill_rate = #{item.fillRate},
+                import_matching_info = #{item.importMatchingInfo}
             </set>
             WHERE id = #{item.id}
             AND project_id = #{item.projectId}

+ 2 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java

@@ -3,7 +3,6 @@ package org.springblade.manager.service;
 import org.springblade.core.mp.base.BaseService;
 import org.springblade.manager.dto.WbsTreeContractDTO;
 import org.springblade.manager.entity.ContractRelationJlyz;
-import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.vo.*;
@@ -34,12 +33,12 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     List<WbsTreeContractTreeVO3> lazyTreeThree(String contractIdRelation, Long parentId, String contractId);
 
-    List<WbsTreeContract> searchNodeAllTable(String primaryKeyId, String tableOwner,String contractId, String projectId);
+    List<WbsTreeContract> searchNodeAllTable(String primaryKeyId, String tableOwner, String contractId, String projectId);
 
     List<WbsTreeContract> searchParentAllNode(long primaryKeyId, Long contractId);
 
     List<WbsTreeContract> updateAllNodeTabById(WbsTreePrivate aPrivate);
 
-    WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String contractId, Integer type) throws IOException;
+    WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String contractId, Integer type, Integer isSplicingNumber) throws IOException;
 
 }

+ 235 - 113
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -1,13 +1,7 @@
 package org.springblade.manager.service.impl;
 
-import cn.hutool.json.JSONString;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import jodd.util.ArraysUtil;
 import lombok.AllArgsConstructor;
-import org.apache.commons.lang.StringEscapeUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.ConstructionLedger;
 import org.springblade.business.feign.ConstructionLedgerFeignClient;
@@ -21,6 +15,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringUtil;
 import org.springblade.manager.dto.WbsTreeContractDTO;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.excel.WbsExcelBatchUtil;
 import org.springblade.manager.excel.WbsExcelUtil;
 import org.springblade.manager.mapper.ContractInfoMapper;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
@@ -141,7 +136,19 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 wbsTreePrivateList.forEach(wbsTreePrivate -> {
                     diffRent1.forEach(id -> {
                         if (Long.parseLong(id) == (wbsTreePrivate.getId())) {
-                            WbsTreeContract wbsTreeContract = getWbsTreeContract(wbsTreePrivate, pawDTO);
+                            //WbsTreeContract wbsTreeContract = getWbsTreeContract(wbsTreePrivate, pawDTO);
+                            WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(wbsTreePrivate, WbsTreeContract.class);
+                            if (wbsTreeContract != null) {
+                                wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                wbsTreeContract.setWbsId(pawDTO.getWbsId());
+                                wbsTreeContract.setProjectId(pawDTO.getProjectId());
+                                wbsTreeContract.setContractId(pawDTO.getContractId());
+                                if (wbsTreePrivate.getType() == 2) {
+                                    wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
+                                }
+                                //导入划分匹配字段
+                                //wbsTreeContract.setImportMatchingInfo(wbsTreePrivate.getFullName());
+                            }
                             wbsTreeContracts.add(wbsTreeContract);
                         }
                     });
@@ -206,18 +213,32 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 //初始化
                 wbsTreePrivatesList.forEach(wbsTreePrivate -> {
                     //节点、表
-                    WbsTreeContract wbsTreeContract = getWbsTreeContract(wbsTreePrivate, pawDTO);
-                    wbsTreeContractList.add(wbsTreeContract);
-
-                    //台账
-                    if (wbsTreeContract.getNodeType() == 6) {
-                        ConstructionLedger constructionLedger = new ConstructionLedger();
-                        constructionLedger.setIsBeton(0);
-                        constructionLedger.setWbsId(wbsTreeContract.getPKeyId());
-                        constructionLedger.setSite(wbsTreeContract.getNodeName());
-                        constructionLedger.setStation(wbsTreeContract.getNodeName());
-                        constructionLedger.setContractId(Long.parseLong(pawDTO.getContractId()));
-                        constructionLedgerList.add(constructionLedger);
+                    //WbsTreeContract wbsTreeContract = getWbsTreeContract(wbsTreePrivate, pawDTO);
+                    WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(wbsTreePrivate, WbsTreeContract.class);
+                    if (wbsTreeContract != null) {
+                        wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                        wbsTreeContract.setWbsId(pawDTO.getWbsId());
+                        wbsTreeContract.setProjectId(pawDTO.getProjectId());
+                        wbsTreeContract.setContractId(pawDTO.getContractId());
+                        if (wbsTreePrivate.getType() == 2) {
+                            wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
+                        }
+                        //导入划分匹配字段
+                        if (wbsTreePrivate.getType() == 1) {
+                            wbsTreeContract.setImportMatchingInfo(wbsTreePrivate.getFullName());
+                        }
+                        wbsTreeContractList.add(wbsTreeContract);
+
+                        //台账
+                        if (wbsTreeContract.getNodeType() == 6) {
+                            ConstructionLedger constructionLedger = new ConstructionLedger();
+                            constructionLedger.setIsBeton(0);
+                            constructionLedger.setWbsId(wbsTreeContract.getPKeyId());
+                            constructionLedger.setSite(wbsTreeContract.getNodeName());
+                            constructionLedger.setStation(wbsTreeContract.getNodeName());
+                            constructionLedger.setContractId(Long.parseLong(pawDTO.getContractId()));
+                            constructionLedgerList.add(constructionLedger);
+                        }
                     }
                 });
 
@@ -348,23 +369,23 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     }
 
     @Override
-    public WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String contractId, Integer type) throws IOException {
+    public WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String contractId, Integer type, Integer isSplicingNumber) throws IOException {
         File file = WbsExcelUtil.convert(excelFile);
         String canonicalPath = file.getCanonicalPath();
         try {
-            //解析excel
-            WbsExcelUtil excelUtil = new WbsExcelUtil();
-            ArrayList<Map<String, String>> result = excelUtil.readExcelToObjContract(canonicalPath);
-            //获取对应工程类别树信息
-            ArrayList<Map<String, String>> resultNow = excelUtil.getInfoByType(result, type);
-
-            if (resultNow.size() <= 0) {
-                throw new ServiceException("请选择一个工程类别进行匹配导入");
-            }
-
-            //匹配对应工程类别修改对应合同段节点名称
-            return this.updateContractNodeNames(resultNow, contractId);
+            if (StringUtils.isNotEmpty(contractId) && type != null && isSplicingNumber != null) {
+                //解析excel
+                WbsExcelUtil excelUtil = new WbsExcelUtil();
+                ArrayList<Map<String, String>> result = excelUtil.readExcelToObjContract(canonicalPath);
+                //获取对应工程类别树信息
+                ArrayList<Map<String, String>> resultNow = excelUtil.getDataListByType(result, type);
+                if (resultNow.size() <= 0) {
+                    throw new ServiceException("请选择一个工程类别进行匹配导入");
+                }
 
+                //匹配对应工程类别修改对应合同段节点名称
+                return this.updateContractNodeNames(resultNow, contractId, isSplicingNumber);
+            }
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
@@ -377,11 +398,18 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return null;
     }
 
-    private WbsTreeContractVO4 updateContractNodeNames(ArrayList<Map<String, String>> resultNow, String contractId) {
+    private WbsTreeContractVO4 updateContractNodeNames(ArrayList<Map<String, String>> resultNow, String contractId, Integer isSplicingNumber) {
         //获取当前合同段树
         List<WbsTreeContractVO> wbsTreeContractVOS = contractInfoMapper.tree2(null, null, contractId, null, null);
+        if (wbsTreeContractVOS.size() <= 0) {
+            throw new ServiceException("请从项目级中分配合同段wbs划分模板");
+        }
         List<Map<Integer, String>> resultList = new ArrayList<>();
 
+        if (isSplicingNumber == 1) {
+            //构建拼接划分编号
+        }
+
         //构造map
         String str = "\\s*|\r|\n|\t";
         for (Map<String, String> map : resultNow) {
@@ -421,28 +449,75 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 String nodeName = split[0];
                 String partitionCode = split[1];
 
+                //先判断是否循环到下一行,是否已经匹配成功名称类似节点
+                int count = 0;
+                if (successData.size() > 0) {
+                    for (WbsTreeContractVO successDatum : successData) {
+                        //同类型、名称相似、且划分编码不一样
+                        if (successDatum.getNodeType().equals(k)
+                                && nodeName.contains(successDatum.getImportMatchingInfo())
+                                && !successDatum.getPartitionCode().equals(partitionCode)) {
+                            //构造类似名称节点
+                            Long id = SnowFlakeUtil.getId();
+                            successDatum.setPrimaryKeyId(String.valueOf(id));
+                            successDatum.setId(id);
+                            successDatum.setFullName(nodeName);
+                            successDatum.setPartitionCode(partitionCode);
+                            successDatum.setIsImportIdentificationNode(1); //识别成功
+                            WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(successDatum, WbsTreeContract.class);
+                            assert wbsTreeContract != null;
+                            wbsTreeContract.setPKeyId(id);
+                            wbsTreeContract.setId(id);
+                            baseMapper.insert(wbsTreeContract);
+                            successData.add(successDatum);
+                            count = 1;
+                            break;
+                        }
+                    }
+                }
+
+                if (count == 1) {
+                    //如果添加了类似名称节点成功,那么结束当前循环,进入下一列,不执行修改、失败构造
+                    continue;
+                }
+
                 for (WbsTreeContractVO nodeOld : wbsTreeContractVOS) {
                     if (nodeOld.getNodeType().equals(k)) {
                         String nodeNameOld = nodeOld.getNodeName();
-                        String fullNameOld = nodeOld.getFullName();
-                        List<WbsTreeContractVO> collect = successData.stream().filter(f -> DiffListUtil.getContains(f.getNodeName(), nodeName)).collect(Collectors.toList());
+                        String importMatchingInfoOld = nodeOld.getImportMatchingInfo();
+                        List<WbsTreeContractVO> collect = successData.stream().filter(f ->
+                                f.getFullName().contains(nodeName)
+                                        && f.getPartitionCode().equals(partitionCode)
+                        ).collect(Collectors.toList());
                         //匹配名称、别名
                         if (collect.size() == 0) {
-                            if (DiffListUtil.getContains(nodeName, nodeNameOld) || DiffListUtil.getContains(nodeName, fullNameOld)) {
-                                //匹配成功 修改名称、划分编号
-                                nodeOld.setNodeName(nodeName);
+                            if (nodeName.contains(nodeNameOld) || nodeName.contains(importMatchingInfoOld)) {
+                                //匹配成功 修改名称、划分编号 不修改原始节点id,只修改别名id
+                                nodeOld.setFullName(nodeName);
                                 nodeOld.setPartitionCode(partitionCode);
                                 nodeOld.setIsImportIdentificationNode(1); //识别成功
+                                nodeOld.setImportMatchingInfo(importMatchingInfoOld);
                                 successData.add(nodeOld);
+                                count = 2;
+                                break;
                             }
                         }
                     }
                 }
 
-                List<WbsTreeContractVO> collect1 = successData.stream().filter(f -> DiffListUtil.getContains(f.getNodeName(), nodeName)).collect(Collectors.toList());
-                List<WbsTreeContractVO> collect2 = failData.stream().filter(f -> DiffListUtil.getContains(f.getNodeName(), nodeName)).collect(Collectors.toList());
+                if (count == 2) {
+                    //不执行失败构造
+                    continue;
+                }
+
+                List<WbsTreeContractVO> collect = successData.stream().filter(f ->
+                        f.getFullName().contains(nodeName)
+                ).collect(Collectors.toList());
+                List<WbsTreeContractVO> collect1 = failData.stream().filter(f ->
+                        f.getFullName().contains(nodeName)
+                ).collect(Collectors.toList());
 
-                if (collect1.size() == 0 && collect2.size() == 0) {
+                if (collect.size() == 0 && collect1.size() == 0) {
                     //未匹配成功 构建参数
                     WbsTreeContract wbsTreeContract = this.buildFailData(k, nodeName, partitionCode);
                     WbsTreeContractVO wbsTreeContractVO = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContractVO.class);
@@ -451,43 +526,54 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             }
         }
 
-        //修改节点信息
-        List<WbsTreeContract> wbsTreeContracts = BeanUtil.copyProperties(successData, WbsTreeContract.class);
-        this.saveOrUpdateBatch(wbsTreeContracts, 1000);
-
         WbsTreeContractVO4 res = new WbsTreeContractVO4();
+        try {
+            //修改节点信息
+            List<WbsTreeContract> wbsTreeContracts = BeanUtil.copyProperties(successData, WbsTreeContract.class);
+            this.saveOrUpdateBatch(wbsTreeContracts, 1000);
+
+            //导入识别匹配成功树
+            ArrayList<WbsTreeContractVO> collect = successData.stream().collect(
+                    Collectors.collectingAndThen(
+                            Collectors.toCollection(() -> new TreeSet<>(
+                                    Comparator.comparing(o -> o.getId() + ";" + o.getFullName()))), ArrayList::new)
+            );
+            List<WbsTreeContractVO> successWbsTreeContractVOS = this.buildWbsTreeByStream(collect);
+            res.setMatchedData(successWbsTreeContractVOS);
+
+            List<WbsTreeContractVO> successDataCopyToFail = WbsExcelBatchUtil.deepCopy(collect);
+            //构建导入识别匹配失败树failDataTree
+            List<WbsTreeContractVO> failDataTree = this.buildFailDataTree(resultList, failData, successDataCopyToFail);
+            List<WbsTreeContractVO> collect1 = failDataTree.stream().collect(
+                    Collectors.collectingAndThen(
+                            Collectors.toCollection(() -> new TreeSet<>(
+                                    Comparator.comparing(o -> o.getId() + ";" + o.getFullName()))), ArrayList::new)
+            );
+            List<WbsTreeContractVO> failWbsTreeContractVOS = this.buildWbsTreeByStream(collect1);
+            res.setUnmatchedData(failWbsTreeContractVOS);
 
-        //导入识别匹配成功树
-        List<WbsTreeContractVO> successWbsTreeContractVOS = contractInfoService.buildWbsTreeByStream(successData);
-        res.setMatchedData(successWbsTreeContractVOS);
-
-        //构建导入识别匹配失败树failDataTree
-        List<WbsTreeContractVO> failDataTree = this.buildFailDataTree(resultList, failData, successData);
-        List<WbsTreeContractVO> failWbsTreeContractVOS = contractInfoService.buildWbsTreeByStream(failDataTree);
-        res.setUnmatchedData(failWbsTreeContractVOS);
-
+            return res;
+        } catch (IOException | ClassNotFoundException e) {
+            e.printStackTrace();
+        }
         return res;
     }
 
-    private List<WbsTreeContractVO> buildFailDataTree(List<Map<Integer, String>> resultList, List<WbsTreeContractVO> failData, List<WbsTreeContractVO> successData) {
-
+    private List<WbsTreeContractVO> buildFailDataTree
+            (List<Map<Integer, String>> resultList, List<WbsTreeContractVO> failData, List<WbsTreeContractVO> successData) {
         List<WbsTreeContractVO> resultData = new ArrayList<>();
-
-        for (Map<Integer, String> map : resultList) {
-
+        for (Map<Integer, String> map : resultList) {//行
             Long nodeParentIdLv1 = 0L;
             Long nodeParentIdLv2 = 0L;
             Long nodeParentIdLv3 = 0L;
             Long nodeParentIdLv4 = 0L;
             Long nodeParentIdLv5 = 0L;
-
             //当前行,失败节点
             List<WbsTreeContractVO> failList = new ArrayList<>();
             //当前行,成功节点
             List<WbsTreeContractVO> successList = new ArrayList<>();
 
-            for (Map.Entry<Integer, String> entry : map.entrySet()) {
-
+            for (Map.Entry<Integer, String> entry : map.entrySet()) {//每行的列
                 Integer k = entry.getKey();
                 String v = entry.getValue();
                 if (StringUtil.isEmpty(v.replaceAll(":::", ""))) {
@@ -496,112 +582,122 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 String[] split = v.split(":::");
                 String nodeName = split[0];
 
-                //当前行,失败节点
                 for (WbsTreeContractVO failDatum : failData) {
-                    if (nodeName.equals(failDatum.getNodeName())) {
+                    if (k.equals(failDatum.getNodeType()) && nodeName.equals(failDatum.getFullName())) {
                         failList.add(failDatum);
                     }
                 }
 
-                //当前行,成功节点
                 for (WbsTreeContractVO successDatum : successData) {
-                    if (nodeName.equals(successDatum.getNodeName())) {
+                    if (k.equals(successDatum.getNodeType()) && nodeName.equals(successDatum.getFullName())) {
                         successList.add(successDatum);
                     }
                 }
+            }
 
-                //初始化父级id
-                for (WbsTreeContractVO successDatum : successList) {
-                    if (nodeName.equals(successDatum.getNodeName())) {
-                        if (successDatum.getNodeType() == 1) {
-                            nodeParentIdLv1 = successDatum.getParentId();
-                        } else if (successDatum.getNodeType() == 2) {
-                            nodeParentIdLv2 = successDatum.getParentId();
-                        } else if (successDatum.getNodeType() == 3) {
-                            nodeParentIdLv3 = successDatum.getParentId();
-                        } else if (successDatum.getNodeType() == 4) {
-                            nodeParentIdLv4 = successDatum.getParentId();
-                        } else if (successDatum.getNodeType() == 5) {
-                            nodeParentIdLv5 = successDatum.getParentId();
-                        }
-                    }
+            //初始化上级id
+            for (WbsTreeContractVO successDatum : successList) {
+                if (successDatum.getNodeType() == 1) {
+                    nodeParentIdLv1 = successDatum.getId();
+                } else if (successDatum.getNodeType() == 2) {
+                    nodeParentIdLv2 = successDatum.getId();
+                } else if (successDatum.getNodeType() == 3) {
+                    nodeParentIdLv3 = successDatum.getId();
+                } else if (successDatum.getNodeType() == 4) {
+                    nodeParentIdLv4 = successDatum.getId();
+                } else if (successDatum.getNodeType() == 5) {
+                    nodeParentIdLv5 = successDatum.getId();
                 }
+            }
 
-                //构建未成功节点的父级id
-                for (WbsTreeContractVO failDatum : failList) {
-                    if (failDatum.getNodeType() == 1) {
+            //构建未成功节点的父级id
+            for (WbsTreeContractVO failDatum : failList) {
+                if (failDatum.getNodeType() == 1) {
+                    failDatum.setParentId(nodeParentIdLv1);
+
+                } else if (failDatum.getNodeType() == 2) {
+                    if (nodeParentIdLv2 == 0L) {
                         failDatum.setParentId(nodeParentIdLv1);
-                    } else if (failDatum.getNodeType() == 2) {
+                    } else {
+                        failDatum.setParentId(nodeParentIdLv2);
+                        nodeParentIdLv2 = failDatum.getId();
+                    }
+
+                } else if (failDatum.getNodeType() == 3) {
+                    if (nodeParentIdLv3 == 0L) {
                         if (nodeParentIdLv2 == 0L) {
                             failDatum.setParentId(nodeParentIdLv1);
                         } else {
                             failDatum.setParentId(nodeParentIdLv2);
+                            nodeParentIdLv3 = failDatum.getId();
                         }
-                    } else if (failDatum.getNodeType() == 3) {
+                    } else {
+                        failDatum.setParentId(nodeParentIdLv3);
+                        nodeParentIdLv3 = failDatum.getId();
+                    }
+
+                } else if (failDatum.getNodeType() == 4) {
+                    if (nodeParentIdLv4 == 0L) {
                         if (nodeParentIdLv3 == 0L) {
                             if (nodeParentIdLv2 == 0L) {
                                 failDatum.setParentId(nodeParentIdLv1);
                             } else {
                                 failDatum.setParentId(nodeParentIdLv2);
+                                nodeParentIdLv4 = failDatum.getId();
                             }
                         } else {
                             failDatum.setParentId(nodeParentIdLv3);
+                            nodeParentIdLv4 = failDatum.getId();
                         }
-                    } else if (failDatum.getNodeType() == 4) {
+                    } else {
+                        failDatum.setParentId(nodeParentIdLv4);
+                        nodeParentIdLv4 = failDatum.getId();
+                    }
+
+                } else if (failDatum.getNodeType() == 5) {
+                    if (nodeParentIdLv5 == 0L) {
                         if (nodeParentIdLv4 == 0L) {
                             if (nodeParentIdLv3 == 0L) {
                                 if (nodeParentIdLv2 == 0L) {
                                     failDatum.setParentId(nodeParentIdLv1);
                                 } else {
                                     failDatum.setParentId(nodeParentIdLv2);
+                                    nodeParentIdLv5 = failDatum.getId();
                                 }
                             } else {
                                 failDatum.setParentId(nodeParentIdLv3);
+                                nodeParentIdLv5 = failDatum.getId();
                             }
                         } else {
                             failDatum.setParentId(nodeParentIdLv4);
+                            nodeParentIdLv5 = failDatum.getId();
                         }
-                    } else if (failDatum.getNodeType() == 5) {
-                        if (nodeParentIdLv5 == 0L) {
-                            if (nodeParentIdLv4 == 0L) {
-                                if (nodeParentIdLv3 == 0L) {
-                                    if (nodeParentIdLv2 == 0L) {
-                                        failDatum.setParentId(nodeParentIdLv1);
-                                    } else {
-                                        failDatum.setParentId(nodeParentIdLv2);
-                                    }
-                                } else {
-                                    failDatum.setParentId(nodeParentIdLv3);
-                                }
-                            } else {
-                                failDatum.setParentId(nodeParentIdLv4);
-                            }
-                        } else {
-                            failDatum.setParentId(nodeParentIdLv5);
-                        }
+                    } else {
+                        failDatum.setParentId(nodeParentIdLv5);
+                        nodeParentIdLv5 = failDatum.getId();
                     }
                 }
-
             }
 
-            //添加未成功节点
-            resultData.addAll(failData);
-        }
+            //移除当前行构建成功节点,执行下一行时不再构建该节点
+            failData.removeAll(failList);
 
-        //添加父级节点
-        resultData.addAll(successData);
+            //添加构建成功节点
+            resultData.addAll(failList);
+            resultData.addAll(successList);
+        }
 
         return resultData;
     }
 
     private WbsTreeContract buildFailData(Integer nodeType, String nodeName, String partitionCode) {
-        //获取当前节点的parentId
         WbsTreeContract wbsTreeContract = new WbsTreeContract();
         Long id = SnowFlakeUtil.getId();
         wbsTreeContract.setPKeyId(id);
         wbsTreeContract.setId(id);
         wbsTreeContract.setNodeName(nodeName);
         wbsTreeContract.setFullName(nodeName);
+        wbsTreeContract.setImportMatchingInfo(nodeName);
         wbsTreeContract.setPartitionCode(partitionCode);
         wbsTreeContract.setType(1);
         wbsTreeContract.setNodeType(nodeType);
@@ -609,6 +705,28 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return wbsTreeContract;
     }
 
+    private List<WbsTreeContractVO> buildWbsTreeByStream(List<WbsTreeContractVO> wbsTreeVO2s) {
+        //根节点
+        List<WbsTreeContractVO> list = wbsTreeVO2s.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
+        //子节点分组
+        Map<Long, List<WbsTreeContractVO>> map = wbsTreeVO2s.stream().collect(Collectors.groupingBy(WbsTreeContractVO::getParentId));
+        this.recursionFnTree(list, map);
+        return list;
+    }
+
+    private void recursionFnTree(List<WbsTreeContractVO> list, Map<Long, List<WbsTreeContractVO>> map) {
+        for (WbsTreeContractVO wbsTreeContractVO : list) {
+            List<WbsTreeContractVO> childrenList = map.get(wbsTreeContractVO.getId());
+            wbsTreeContractVO.setChildren(childrenList);
+            if (childrenList != null && childrenList.size() > 0) {
+                //存在子级
+                wbsTreeContractVO.setHasChildren(true);
+                //递归查询
+                recursionFnTree(childrenList, map);
+            }
+        }
+    }
+
     private List<WbsTreeContract> findAllNodeList(String wbsTreeIds, String projectId, String contractId, String
             wbsId) {
         String[] ids = wbsTreeIds.split(",");
@@ -629,9 +747,9 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         wbsTreeContract.setPKeyId(snowId);
         wbsTreeContract.setId(wbsTree.getId());
         wbsTreeContract.setWbsId(pawDTO.getWbsId());
-        wbsTreeContract.setWbsType(wbsTree.getType());
         wbsTreeContract.setProjectId(pawDTO.getProjectId());
         wbsTreeContract.setContractId(pawDTO.getContractId());
+        wbsTreeContract.setWbsType(wbsTree.getType());
         wbsTreeContract.setContractType(1);
         wbsTreeContract.setTenantId(wbsTree.getTenantId());
         wbsTreeContract.setParentId(wbsTree.getParentId());
@@ -664,6 +782,10 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         if (wbsTree.getType() == 2) {
             wbsTreeContract.setIsTypePrivatePid(wbsTree.getPKeyId());
         }
+
+        //导入划分匹配字段
+        wbsTreeContract.setImportMatchingInfo(wbsTree.getFullName());
+
         return wbsTreeContract;
     }
 

+ 21 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -55,10 +55,12 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         //修改
         if (wbsTreePrivate.getPKeyId() != null) {
             Long pKeyId = wbsTreePrivate.getPKeyId();
+            wbsTreePrivate.setFullName(wbsTreePrivate.getNodeName());
             int row = baseMapper.updateByPKeyId(pKeyId, wbsTreePrivate);
 
             if (row > 0) {
                 WbsTreePrivate wbsTreePrivate1 = baseMapper.getByPKeyId(pKeyId);
+                wbsTreePrivate1.setFullName(wbsTreePrivate1.getNodeName());
                 wbsTreeContractMapper.updateByCondition1(wbsTreePrivate1);
                 return true;
             }
@@ -316,7 +318,9 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 || (wbsTree.getUniqueCode() != null && !wbsTree.getUniqueCode().equals(wbsTreePrivate.getUniqueCode()))
                                 || (wbsTree.getMajorDataType() != null && !wbsTree.getMajorDataType().equals(wbsTreePrivate.getMajorDataType()))
                                 || (wbsTree.getTableType() != null && !wbsTree.getTableType().equals(wbsTreePrivate.getTableType()))
-                                || (wbsTree.getTableOwner() != null && !wbsTree.getTableOwner().equals(wbsTreePrivate.getTableOwner())))) {
+                                || (wbsTree.getTableOwner() != null && !wbsTree.getTableOwner().equals(wbsTreePrivate.getTableOwner()))
+                                || (wbsTree.getImportMatchingInfo() != null && !wbsTree.getImportMatchingInfo().equals(wbsTreePrivate.getImportMatchingInfo()))
+                        )) {
                     //修改项目wbs信息
                     //baseMapper.updateBatchByIds(wbsTree, projectId);
                     WbsTreePrivate wbsPrivate = new WbsTreePrivate();
@@ -363,7 +367,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 || (wbsTreePrivate.getUniqueCode() != null && !wbsTreePrivate.getUniqueCode().equals(treePrivateNow.getUniqueCode()))
                                 || (wbsTreePrivate.getMajorDataType() != null && !wbsTreePrivate.getMajorDataType().equals(treePrivateNow.getMajorDataType()))
                                 || (wbsTreePrivate.getTableType() != null && !wbsTreePrivate.getTableType().equals(treePrivateNow.getTableType()))
-                                || (wbsTreePrivate.getTableOwner() != null && !wbsTreePrivate.getTableOwner().equals(treePrivateNow.getTableOwner())))) {
+                                || (wbsTreePrivate.getTableOwner() != null && !wbsTreePrivate.getTableOwner().equals(treePrivateNow.getTableOwner()))
+                                || (wbsTreePrivate.getImportMatchingInfo() != null && !wbsTreePrivate.getImportMatchingInfo().equals(treePrivateNow.getImportMatchingInfo())))) {
 
                     //修改项目wbs信息
                     //baseMapper.updateBatchByIds2(wbsTreePrivate, projectId, wbsId);
@@ -416,10 +421,23 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     @Override
     public boolean submitFullName(String pKeyId, String fullNames) {
         if (StringUtils.isNotEmpty(pKeyId)) {
+            //修改项目节点基础信息
             LambdaUpdateWrapper<WbsTreePrivate> updateWrapper = new LambdaUpdateWrapper<>();
             updateWrapper.eq(WbsTreePrivate::getPKeyId, pKeyId);
-            updateWrapper.set(WbsTreePrivate::getFullName, fullNames);
+            updateWrapper.set(WbsTreePrivate::getImportMatchingInfo, fullNames);
             baseMapper.update(null, updateWrapper);
+
+            //修改到该项目下所有合同段对应节点ImportMatchingInfo字段
+            WbsTreePrivate wbsTreePrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, pKeyId));
+            List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getPId, wbsTreePrivate.getProjectId()));
+            List<Long> contractIds = contractInfos.stream().map(ContractInfo::getId).collect(Collectors.toList());
+            for (Long cId : contractIds) {
+                LambdaUpdateWrapper<WbsTreeContract> updateWrapper1 = new LambdaUpdateWrapper<>();
+                updateWrapper1.eq(WbsTreeContract::getId,wbsTreePrivate.getId());
+                updateWrapper1.eq(WbsTreeContract::getContractId,cId);
+                updateWrapper1.set(WbsTreeContract::getImportMatchingInfo,fullNames);
+                wbsTreeContractMapper.update(null, updateWrapper1);
+            }
             return true;
         }
         return false;

+ 125 - 80
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -125,6 +125,10 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         wbsTree.setStatus(1);
         wbsTree.setIsDeleted(BladeConstant.DB_NOT_DELETED);
 
+        wbsTree.setImportMatchingInfo(wbsTree.getFullName());
+        wbsTree.setFullName(wbsTree.getNodeName());
+
+
         //当前同级节点
         if (wbsTree.getId() == null) {
             List<WbsTree> trees = baseMapper.selectList(Wrappers.<WbsTree>query().lambda()
@@ -301,7 +305,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     public boolean submitFullName(String id, String fullNames) {
         if (StringUtils.isNotEmpty(id)) {
             LambdaUpdateWrapper<WbsTree> updateWrapper = new LambdaUpdateWrapper<WbsTree>();
-            updateWrapper.set(WbsTree::getFullName, fullNames);
+            updateWrapper.set(WbsTree::getImportMatchingInfo, fullNames);
             updateWrapper.eq(WbsTree::getId, id);
             baseMapper.update(null, updateWrapper);
             return true;
@@ -694,43 +698,54 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                                 WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, snowId1));
 
                                 for (ContractInfo contractInfoId : contractInfoIds) {
-                                    WbsTreeContract wbsTreeContract = getWbsTreeContract(wbsTreePrivate, pawDTO);
-                                    wbsTreeContract.setContractId(String.valueOf(contractInfoId.getId()));
-
-                                    //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
-                                    WbsTreeContract wbsTreeContract1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
-                                            .eq(WbsTreeContract::getProjectId, wbsTreeContract.getProjectId())
-                                            .eq(WbsTreeContract::getContractId, contractInfoId.getId())
-                                            .eq(WbsTreeContract::getType, 1)
-                                            .eq(WbsTreeContract::getId, wbsTreePrivate.getParentId())
-                                    );
-                                    if (wbsTreeContract1 != null) {
-                                        wbsTreeContractMapper.insert(wbsTreeContract);
-
-                                        //新增同步到对应的复制或新增的父级节点下
-                                        //获取当前新增表单的上级父节点
-                                        WbsTreeContract wbsTreeContracts1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
-                                                .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
+                                    //WbsTreeContract wbsTreeContract = getWbsTreeContract(wbsTreePrivate, pawDTO);
+                                    WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(wbsTreePrivate, WbsTreeContract.class);
+                                    if (wbsTreeContract != null) {
+                                        wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                        wbsTreeContract.setWbsId(pawDTO.getWbsId());
+                                        wbsTreeContract.setProjectId(pawDTO.getProjectId());
+                                        wbsTreeContract.setContractType(pawDTO.getContractType());
+                                        wbsTreeContract.setContractId(String.valueOf(contractInfoId.getId()));
+                                        wbsTreeContract.setIsBussShow(1);
+                                        if (wbsTreePrivate.getType() == 2) {
+                                            wbsTreeContract.setIsTypePrivatePid(wbsTreePrivate.getPKeyId());
+                                        }
+
+                                        //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
+                                        WbsTreeContract wbsTreeContract1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                                                .eq(WbsTreeContract::getProjectId, wbsTreeContract.getProjectId())
                                                 .eq(WbsTreeContract::getContractId, contractInfoId.getId())
-                                                .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
-                                                .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
                                                 .eq(WbsTreeContract::getType, 1)
+                                                .eq(WbsTreeContract::getId, wbsTreePrivate.getParentId())
                                         );
-                                        if (wbsTreeContracts1 != null) {
-                                            //获取上级父级节点同级别的复制或新增节点
-                                            List<WbsTreeContract> wbsTreeContracts2 = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
-                                                    .eq(WbsTreeContract::getOldId, wbsTreeContracts1.getId())
+                                        if (wbsTreeContract1 != null) {
+                                            wbsTreeContractMapper.insert(wbsTreeContract);
+
+                                            //新增同步到对应的复制或新增的父级节点下
+                                            //获取当前新增表单的上级父节点
+                                            WbsTreeContract wbsTreeContracts1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                                                    .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
                                                     .eq(WbsTreeContract::getContractId, contractInfoId.getId())
                                                     .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
                                                     .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
                                                     .eq(WbsTreeContract::getType, 1)
                                             );
-                                            if (wbsTreeContracts2.size() > 0) {
-                                                //将表单同步到复制或新增的节点下
-                                                for (WbsTreeContract treeContract : wbsTreeContracts2) {
-                                                    wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                                    wbsTreeContract.setParentId(treeContract.getId());
-                                                    wbsTreeContractMapper.insert(wbsTreeContract);
+                                            if (wbsTreeContracts1 != null) {
+                                                //获取上级父级节点同级别的复制或新增节点
+                                                List<WbsTreeContract> wbsTreeContracts2 = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
+                                                        .eq(WbsTreeContract::getOldId, wbsTreeContracts1.getId())
+                                                        .eq(WbsTreeContract::getContractId, contractInfoId.getId())
+                                                        .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
+                                                        .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
+                                                        .eq(WbsTreeContract::getType, 1)
+                                                );
+                                                if (wbsTreeContracts2.size() > 0) {
+                                                    //将表单同步到复制或新增的节点下
+                                                    for (WbsTreeContract treeContract : wbsTreeContracts2) {
+                                                        wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                                        wbsTreeContract.setParentId(treeContract.getId());
+                                                        wbsTreeContractMapper.insert(wbsTreeContract);
+                                                    }
                                                 }
                                             }
                                         }
@@ -815,45 +830,58 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
                                 //同步到该项目下的所有合同段
                                 for (ContractInfo contractInfoId : contractInfoIds) {
-                                    WbsTreeContract wbsTreeContract = getWbsTreeContract(list, pawDTO);
-                                    wbsTreeContract.setContractId(String.valueOf(contractInfoId.getId()));
-                                    wbsTreeContract.setWbsId(pawDTO.getPrimaryKeyId());
-
-                                    //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
-                                    WbsTreeContract wbsTreeContract1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
-                                            .eq(WbsTreeContract::getProjectId, wbsTreeContract.getProjectId())
-                                            .eq(WbsTreeContract::getContractId, wbsTreeContract.getContractId())
-                                            .eq(WbsTreeContract::getWbsId, wbsTreeContract.getWbsId())
-                                            .eq(WbsTreeContract::getType, 1)
-                                            .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
-                                    );
-                                    if (wbsTreeContract1 != null) {
-                                        wbsTreeContractMapper.insert(wbsTreeContract);
-
-                                        //新增同步到对应的复制或新增的父级节点下
-                                        //获取当前新增表单的上级父节点
-                                        WbsTreeContract wbsTreeContracts1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
-                                                .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
-                                                .eq(WbsTreeContract::getContractId, contractInfoId.getId())
-                                                .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
-                                                .eq(WbsTreeContract::getWbsId, pawDTO.getPrimaryKeyId())
+                                    //WbsTreeContract wbsTreeContract = getWbsTreeContract(list, pawDTO);
+                                    //wbsTreeContract.setContractId(String.valueOf(contractInfoId.getId()));
+                                    //wbsTreeContract.setWbsId(pawDTO.getPrimaryKeyId());
+
+                                    WbsTreeContract wbsTreeContract = BeanUtil.copyProperties(list, WbsTreeContract.class);
+                                    if (wbsTreeContract != null) {
+                                        wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                        wbsTreeContract.setWbsId(pawDTO.getPrimaryKeyId());
+                                        wbsTreeContract.setProjectId(pawDTO.getProjectId());
+                                        wbsTreeContract.setContractType(pawDTO.getContractType());
+                                        wbsTreeContract.setContractId(String.valueOf(contractInfoId.getId()));
+                                        wbsTreeContract.setIsBussShow(1);
+                                        if (list.getType() == 2) {
+                                            wbsTreeContract.setIsTypePrivatePid(list.getPKeyId());
+                                        }
+
+                                        //判断元素表是否存在上级节点,存在则新增;不存在则表示没被引用,不新增
+                                        WbsTreeContract wbsTreeContract1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                                                .eq(WbsTreeContract::getProjectId, wbsTreeContract.getProjectId())
+                                                .eq(WbsTreeContract::getContractId, wbsTreeContract.getContractId())
+                                                .eq(WbsTreeContract::getWbsId, wbsTreeContract.getWbsId())
                                                 .eq(WbsTreeContract::getType, 1)
+                                                .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
                                         );
-                                        if (wbsTreeContracts1 != null) {
-                                            //获取上级父级节点同级别的复制或新增节点
-                                            List<WbsTreeContract> wbsTreeContracts2 = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
-                                                    .eq(WbsTreeContract::getOldId, wbsTreeContracts1.getId())
+                                        if (wbsTreeContract1 != null) {
+                                            wbsTreeContractMapper.insert(wbsTreeContract);
+
+                                            //新增同步到对应的复制或新增的父级节点下
+                                            //获取当前新增表单的上级父节点
+                                            WbsTreeContract wbsTreeContracts1 = wbsTreeContractMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                                                    .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
                                                     .eq(WbsTreeContract::getContractId, contractInfoId.getId())
                                                     .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
                                                     .eq(WbsTreeContract::getWbsId, pawDTO.getPrimaryKeyId())
                                                     .eq(WbsTreeContract::getType, 1)
                                             );
-                                            if (wbsTreeContracts2.size() > 0) {
-                                                //将表单同步到复制或新增的节点下
-                                                for (WbsTreeContract treeContract : wbsTreeContracts2) {
-                                                    wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
-                                                    wbsTreeContract.setParentId(treeContract.getId());
-                                                    wbsTreeContractMapper.insert(wbsTreeContract);
+                                            if (wbsTreeContracts1 != null) {
+                                                //获取上级父级节点同级别的复制或新增节点
+                                                List<WbsTreeContract> wbsTreeContracts2 = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
+                                                        .eq(WbsTreeContract::getOldId, wbsTreeContracts1.getId())
+                                                        .eq(WbsTreeContract::getContractId, contractInfoId.getId())
+                                                        .eq(WbsTreeContract::getProjectId, pawDTO.getProjectId())
+                                                        .eq(WbsTreeContract::getWbsId, pawDTO.getPrimaryKeyId())
+                                                        .eq(WbsTreeContract::getType, 1)
+                                                );
+                                                if (wbsTreeContracts2.size() > 0) {
+                                                    //将表单同步到复制或新增的节点下
+                                                    for (WbsTreeContract treeContract : wbsTreeContracts2) {
+                                                        wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                                                        wbsTreeContract.setParentId(treeContract.getId());
+                                                        wbsTreeContractMapper.insert(wbsTreeContract);
+                                                    }
                                                 }
                                             }
                                         }
@@ -953,8 +981,15 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     }
 
                     addListData.forEach(tree -> {
-                        WbsTreePrivate wbsTreePrivate2 = getWbsTreePrivate1(tree, pawDTO);
-                        insertData1.add(wbsTreePrivate2);
+                        //WbsTreePrivate wbsTreePrivate2 = getWbsTreePrivate1(tree, pawDTO);
+                        WbsTreePrivate wbsTreePrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                        if (wbsTreePrivate != null) {
+                            wbsTreePrivate.setPKeyId(SnowFlakeUtil.getId());
+                            wbsTreePrivate.setWbsType(String.valueOf(pawDTO.getWbsType()));
+                            wbsTreePrivate.setProjectId(pawDTO.getProjectId());
+                            wbsTreePrivate.setFullName(wbsTreePrivate.getNodeName());
+                        }
+                        insertData1.add(wbsTreePrivate);
                     });
 
                 } else if (pawDTO.getReferenceType().equals("private")) {
@@ -988,21 +1023,30 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
                     addListData.forEach(tree -> {
                         //构造参数
-                        WbsTreePrivate wbsTreePrivate2 = getWbsTreePrivate2(tree, pawDTO);
-                        insertData2.add(wbsTreePrivate2);
-
-                        //构造电签位置配置信息、编辑默认信息数据
-                        if (wbsTreePrivate2.getType() == 2) {
-                            if (textDictInfoData.size() > 0) {
-                                textDictInfoData.forEach((k, v) -> {
-                                    if (tree.getPKeyId().equals(k)) {
-                                        for (TextdictInfo textdictInfo : v) {
-                                            textdictInfo.setTabId(String.valueOf(wbsTreePrivate2.getPKeyId()));
-                                            textdictInfo.setId(SnowFlakeUtil.getId());
+                        //WbsTreePrivate wbsTreePrivate2 = getWbsTreePrivate2(tree, pawDTO);
+                        WbsTreePrivate wbsTreePrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
+                        if (wbsTreePrivate != null) {
+                            wbsTreePrivate.setPKeyId(SnowFlakeUtil.getId());
+                            wbsTreePrivate.setWbsId(pawDTO.getPrimaryKeyId());
+                            wbsTreePrivate.setWbsType(String.valueOf(pawDTO.getWbsType()));
+                            wbsTreePrivate.setProjectId(pawDTO.getProjectId());
+                            wbsTreePrivate.setFullName(wbsTreePrivate.getNodeName());
+
+                            insertData2.add(wbsTreePrivate);
+
+                            //构造电签位置配置信息、编辑默认信息数据
+                            if (wbsTreePrivate.getType() == 2) {
+                                if (textDictInfoData.size() > 0) {
+                                    textDictInfoData.forEach((k, v) -> {
+                                        if (tree.getPKeyId().equals(k)) {
+                                            for (TextdictInfo textdictInfo : v) {
+                                                textdictInfo.setTabId(String.valueOf(wbsTreePrivate.getPKeyId()));
+                                                textdictInfo.setId(SnowFlakeUtil.getId());
+                                            }
+                                            insertData3.addAll(v);
                                         }
-                                        insertData3.addAll(v);
-                                    }
-                                });
+                                    });
+                                }
                             }
                         }
                     });
@@ -1259,15 +1303,15 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         wbsTreeContract.setPKeyId(snowId);
         wbsTreeContract.setId(wbsTree.getId());
         wbsTreeContract.setWbsId(pawDTO.getWbsId());
-        wbsTreeContract.setWbsType(wbsTree.getType());
         wbsTreeContract.setProjectId(pawDTO.getProjectId());
         wbsTreeContract.setContractType(pawDTO.getContractType());
+        wbsTreeContract.setWbsType(wbsTree.getType());
         wbsTreeContract.setTenantId(wbsTree.getTenantId());
         wbsTreeContract.setParentId(wbsTree.getParentId());
         wbsTreeContract.setAncestors(wbsTree.getAncestors());
         wbsTreeContract.setNodeName(wbsTree.getNodeName());
         wbsTreeContract.setNodeType(wbsTree.getNodeType());
-        wbsTreeContract.setFullName(wbsTree.getFullName());
+        wbsTreeContract.setFullName(wbsTree.getNodeName());
         wbsTreeContract.setSort(wbsTree.getSort());
         wbsTreeContract.setRemark(wbsTree.getRemark());
         wbsTreeContract.setType(wbsTree.getType());
@@ -1297,6 +1341,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         if (wbsTree.getType() == 2) {
             wbsTreeContract.setIsTypePrivatePid(wbsTree.getPKeyId());
         }
+
         return wbsTreeContract;
     }
 

+ 37 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/DiffListUtil.java

@@ -52,4 +52,41 @@ public class DiffListUtil {
         return result;
     }
 
+    public static float getSimilarityRatio(String str, String target) {
+        int d[][]; // 矩阵
+        int n = str.length();
+        int m = target.length();
+        int i; // 遍历str的
+        int j; // 遍历target的
+        char ch1; // str的
+        char ch2; // target的
+        int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1
+        if (n == 0 || m == 0) {
+            return 0;
+        }
+        d = new int[n + 1][m + 1];
+        for (i = 0; i <= n; i++) { // 初始化第一列
+            d[i][0] = i;
+        }
+        for (j = 0; j <= m; j++) { // 初始化第一行
+            d[0][j] = j;
+        }
+        for (i = 1; i <= n; i++) { // 遍历str
+            ch1 = str.charAt(i - 1);
+            // 去匹配target
+            for (j = 1; j <= m; j++) {
+                ch2 = target.charAt(j - 1);
+                if (ch1 == ch2 || ch1 == ch2 + 32 || ch1 + 32 == ch2) {
+                    temp = 0;
+                } else {
+                    temp = 1;
+                }
+                // 左边+1,上边+1, 左上角+temp取最小
+                d[i][j] = Math.min(Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1), d[i - 1][j - 1] + temp);
+            }
+        }
+        return (1 - (float) d[n][m] / Math.max(str.length(), target.length())) * 100F;
+    }
+
+
 }