liuyc 2 жил өмнө
parent
commit
341f0da85c

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

@@ -226,4 +226,10 @@ public class WbsTreeContract extends BaseEntity {
     @ApiModelProperty(value = "填报率百分比")
     private String fillRate;
 
+    /**
+     * 节点导入是否识别成功 '0'否 '1'是
+     */
+    @ApiModelProperty(value = "节点导入是否识别成功 '0'否 '1'是")
+    private Integer isImportIdentificationNode;
+
 }

+ 27 - 5
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO.java

@@ -47,6 +47,10 @@ public class WbsTreeContractVO implements INode<WbsTreeContractVO> {
 
     private String oldId;
 
+    private String fullName;
+
+    private Integer isImportIdentificationNode;
+
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private Boolean hasChildren;
 
@@ -114,10 +118,26 @@ public class WbsTreeContractVO implements INode<WbsTreeContractVO> {
         this.value = value;
     }
 
+    public Integer getIsImportIdentificationNode() {
+        return isImportIdentificationNode;
+    }
+
+    public void setIsImportIdentificationNode(Integer isImportIdentificationNode) {
+        this.isImportIdentificationNode = isImportIdentificationNode;
+    }
+
     public String getNodeName() {
         return nodeName;
     }
 
+    public String getFullName() {
+        return fullName;
+    }
+
+    public void setFullName(String fullName) {
+        this.fullName = fullName;
+    }
+
     public void setNodeName(String nodeName) {
         this.nodeName = nodeName;
     }
@@ -194,16 +214,18 @@ public class WbsTreeContractVO implements INode<WbsTreeContractVO> {
                 "id=" + id +
                 ", parentId=" + parentId +
                 ", children=" + children +
-                ", title='" + title + '\'' +
+                ", title='" + title +
                 ", key=" + key +
                 ", value=" + value +
-                ", nodeName='" + nodeName + '\'' +
+                ", nodeName='" + nodeName +
+                ", fullName='" + fullName +
                 ", type=" + type +
                 ", wbsType=" + wbsType +
                 ", nodeType=" + nodeType +
-                ", primaryKeyId='" + primaryKeyId + '\'' +
-                ", partitionCode='" + partitionCode + '\'' +
-                ", oldId='" + oldId + '\'' +
+                ", primaryKeyId='" + primaryKeyId +
+                ", partitionCode='" + partitionCode +
+                ", oldId='" + oldId +
+                ", isImportIdentificationNode='" + isImportIdentificationNode +
                 ", hasChildren=" + hasChildren +
                 '}';
     }

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

@@ -0,0 +1,22 @@
+package org.springblade.manager.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+public class WbsTreeContractVO4 implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 已匹配
+     */
+    private List<WbsTreeContractVO> matchedData;
+
+    /**
+     * 未匹配
+     */
+    private List<WbsTreeContractVO> unmatchedData;
+
+}

+ 23 - 3
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java

@@ -10,10 +10,12 @@ import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.service.IWbsTreeContractService;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springblade.manager.vo.WbsTreeContractVO;
+import org.springblade.manager.vo.WbsTreeContractVO4;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 
 @RestController
@@ -50,4 +52,22 @@ public class WbsTreeContractController extends BladeController {
         return R.fail(200, "未查询到数据");
     }
 
+
+    @PostMapping("/import-wbs-contract")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "导入合同段wbs划分", notes = "获取当前节点的父集合")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "excelMode", value = "excel模板", required = true),
+            @ApiImplicitParam(name = "contractId", value = "合同段Id", required = true),
+            @ApiImplicitParam(name = "type", 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("匹配失败");
+    }
+
 }

+ 144 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/excel/WbsExcelUtil.java

@@ -1,5 +1,6 @@
 package org.springblade.manager.excel;
 
+import com.mixsmart.utils.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFCell;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
@@ -9,6 +10,7 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.*;
+import java.lang.reflect.Array;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -16,12 +18,31 @@ public class WbsExcelUtil {
     /*public static void main(String[] args) throws IOException {
         WbsExcelUtil excelUtil = new WbsExcelUtil();
         //读取excel数据
-        ArrayList<Map<String, String>> result = excelUtil.readExcelToObj("C:\\Users\\泓创开发\\Desktop\\excel节点模板\\路面工程.xls");
-        result.forEach(map -> map.forEach((k, v) -> {
-            System.out.println(k + " : " + v);
-        }));
-    }*/
+        ArrayList<Map<String, String>> result = excelUtil.readExcelToObjContract("D:\\Download\\合同段工程节点导入.xlsx");
+        ArrayList<Map<String, String>> resultNow = excelUtil.getInfoByType(result, 1);
 
+        List<Map<Integer, String>> resultList = new ArrayList<>();
+        for (Map<String, String> map : resultNow) {
+            Map<Integer, String> maps = new HashMap<>();
+            map.forEach((k1, v1) -> {
+                map.forEach((k2, v2) -> {
+                    if ("1".equals(k1) && "2".equals(k2)) {
+                        maps.put(1, v1 + ":" + v2);
+                    } else if ("3".equals(k1) && "4".equals(k2)) {
+                        maps.put(2, v1 + ":" + v2);
+                    } else if ("5".equals(k1) && "6".equals(k2)) {
+                        maps.put(3, v1 + ":" + v2);
+                    } else if ("7".equals(k1) && "8".equals(k2)) {
+                        maps.put(4, v1 + ":" + v2);
+                    } else if ("9".equals(k1) && "10".equals(k2)) {
+                        maps.put(5, v1 + ":" + v2);
+                    }
+                });
+            });
+            resultList.add(maps);
+        }
+        System.out.println(resultList);
+    }*/
 
     /**
      * 读取excel数据
@@ -90,6 +111,81 @@ public class WbsExcelUtil {
         return result;
     }
 
+
+    /**
+     * 读取excel数据-合同段
+     *
+     * @param path
+     */
+    public ArrayList<Map<String, String>> readExcelToObjContract(String path) throws IOException {
+        Workbook wb = null;
+        ArrayList<Map<String, String>> result = null;
+        try {
+            wb = WorkbookFactory.create(new File(path));
+            result = readExcelContract(wb, 0, 3, 0);
+        } catch (InvalidFormatException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            wb.close();
+        }
+        return result;
+    }
+
+    /**
+     * 读取excel文件-合同段
+     *
+     * @param wb
+     * @param sheetIndex    sheet页下标:从0开始
+     * @param startReadLine 开始读取的行:从0开始
+     * @param tailLine      去除最后读取的行
+     */
+    private ArrayList<Map<String, String>> readExcelContract(Workbook wb, int sheetIndex, int startReadLine, int tailLine) {
+        Sheet sheet = wb.getSheetAt(sheetIndex);
+        Row row = null;
+        ArrayList<Map<String, String>> result = new ArrayList<Map<String, String>>();
+        for (int i = startReadLine; i < sheet.getLastRowNum() - tailLine + 1; i++) {
+            row = sheet.getRow(i);
+            Map<String, String> map = new HashMap<String, String>();
+            for (Cell c : row) {
+                String returnStr = "";
+                boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
+                //判断是否具有合并单元格
+                if (isMerge) {
+                    String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
+                    returnStr = rs;
+                } else {
+                    c.setCellType(CellType.STRING);
+                    returnStr = c.getRichStringCellValue().getString();
+                }
+                if (c.getColumnIndex() == 0) {
+                    map.put("1", returnStr);
+                } else if (c.getColumnIndex() == 1) {
+                    map.put("2", returnStr);
+                } else if (c.getColumnIndex() == 2) {
+                    map.put("3", returnStr);
+                } else if (c.getColumnIndex() == 3) {
+                    map.put("4", returnStr);
+                } else if (c.getColumnIndex() == 4) {
+                    map.put("5", returnStr);
+                } else if (c.getColumnIndex() == 5) {
+                    map.put("6", returnStr);
+                } else if (c.getColumnIndex() == 6) {
+                    map.put("7", returnStr);
+                } else if (c.getColumnIndex() == 7) {
+                    map.put("8", returnStr);
+                } else if (c.getColumnIndex() == 8) {
+                    map.put("9", returnStr);
+                } else if (c.getColumnIndex() == 9) {
+                    map.put("10", returnStr);
+                }
+            }
+            result.add(map);
+        }
+        return result;
+    }
+
     /**
      * 获取合并单元格的值
      *
@@ -290,4 +386,47 @@ public class WbsExcelUtil {
         }
         return convFile;
     }
+
+    public ArrayList<Map<String, String>> getInfoByType(ArrayList<Map<String, String>> result, Integer type) {
+        String nodeName = getNodeNameByType(type);
+        ArrayList<Map<String, String>> list = new ArrayList<>();
+        if (StringUtils.isNotEmpty(nodeName)) {
+            for (Map<String, String> map : result) {
+                for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
+                    if (stringStringEntry.getValue().contains(nodeName)) {
+                        list.add(map);
+                        break;
+                    }
+                }
+            }
+        }
+        return list;
+    }
+
+    private String getNodeNameByType(Integer type) {
+        if (type != null) {
+            switch (type) {
+                case 1:
+                    return "路基工程";
+                case 2:
+                    return "路面工程";
+                case 3:
+                    return "桥梁工程";
+                case 4:
+                    return "机电工程";
+                case 5:
+                    return "绿化工程";
+                case 6:
+                    return "隧道工程";
+                case 7:
+                    return "声屏障工程";
+                case 8:
+                    return "交通与安全工程";
+                case 9:
+                    return "特大斜拉桥、特大悬索桥";
+            }
+        }
+        return "";
+    }
+
 }

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

@@ -78,6 +78,7 @@
         <result column="partition_code" property="partitionCode"/>
         <result column="old_id" property="oldId"/>
         <result column="nodeName" property="nodeName"/>
+        <result column="fullName" property="fullName"/>
     </resultMap>
 
     <resultMap id="resultMap2" type="org.springblade.manager.vo.ContractInfoVO">
@@ -263,6 +264,7 @@
         d.parent_id AS "parentId",
         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.type AS "type",
         d.node_type AS "nodeType",
         d.id AS "value",

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

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

+ 5 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java

@@ -7,7 +7,9 @@ import org.springblade.manager.entity.WbsTree;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.vo.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.util.List;
 
 public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
@@ -37,4 +39,7 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
     List<WbsTreeContract> searchParentAllNode(long primaryKeyId, Long contractId);
 
     List<WbsTreeContract> updateAllNodeTabById(WbsTreePrivate aPrivate);
+
+    WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String contractId, Integer type) throws IOException;
+
 }

+ 2 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -132,7 +132,7 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         return buildWbsTreeByStream(wbsTreeContractVOS);
     }
 
-    private List<WbsTreeContractVO> buildWbsTreeByStream(List<WbsTreeContractVO> wbsTreeVO2s) {
+    public List<WbsTreeContractVO> buildWbsTreeByStream(List<WbsTreeContractVO> wbsTreeVO2s) {
         //根节点
         List<WbsTreeContractVO> list = wbsTreeVO2s.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
         //子节点分组
@@ -141,7 +141,7 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         return list;
     }
 
-    private void recursionFnTree(List<WbsTreeContractVO> list, Map<Long, List<WbsTreeContractVO>> map) {
+    public void recursionFnTree(List<WbsTreeContractVO> list, Map<Long, List<WbsTreeContractVO>> map) {
         for (WbsTreeContractVO wbsTreeContractVO : list) {
             List<WbsTreeContractVO> childrenList = map.get(wbsTreeContractVO.getId());
             wbsTreeContractVO.setChildren(childrenList);

+ 280 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -1,7 +1,13 @@
 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;
@@ -10,19 +16,27 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.core.tool.utils.BeanUtil;
 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.WbsExcelUtil;
+import org.springblade.manager.mapper.ContractInfoMapper;
 import org.springblade.manager.mapper.WbsTreeContractMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springblade.manager.utils.DiffListUtil;
 import org.springblade.manager.vo.WbsTreeContractTreeVO;
 import org.springblade.manager.vo.WbsTreeContractTreeVO3;
+import org.springblade.manager.vo.WbsTreeContractVO;
+import org.springblade.manager.vo.WbsTreeContractVO4;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.File;
+import java.io.IOException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -32,6 +46,8 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
 
     private final ConstructionLedgerFeignClient constructionLedgerFeign;
     private final WbsTreePrivateMapper wbsTreePrivateMapper;
+    private final ContractInfoMapper contractInfoMapper;
+    private final ContractInfoServiceImpl contractInfoService;
 
     @Override
     public List<WbsTreeContract> selectQueryCurrentNodeByAncestors(List<String> ids, String contractId) {
@@ -331,7 +347,270 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         return baseMapper.updateAllNodeTabById(aPrivate);
     }
 
-    private List<WbsTreeContract> findAllNodeList(String wbsTreeIds, String projectId, String contractId, String wbsId) {
+    @Override
+    public WbsTreeContractVO4 importWbsContract(MultipartFile excelFile, String contractId, Integer type) 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);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            File file2 = new File(canonicalPath);
+            if (file2.isFile() && file2.exists()) {
+                file2.delete();
+                System.gc();
+            }
+        }
+        return null;
+    }
+
+    private WbsTreeContractVO4 updateContractNodeNames(ArrayList<Map<String, String>> resultNow, String contractId) {
+        //获取当前合同段树
+        List<WbsTreeContractVO> wbsTreeContractVOS = contractInfoMapper.tree2(null, null, contractId, null, null);
+        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, 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);
+                    } else if ("3".equals(k1) && "4".equals(k2)) {
+                        maps.put(2, v1 + ":::" + v2);
+                    } else if ("5".equals(k1) && "6".equals(k2)) {
+                        maps.put(3, v1 + ":::" + v2);
+                    } else if ("7".equals(k1) && "8".equals(k2)) {
+                        maps.put(4, v1 + ":::" + v2);
+                    } else if ("9".equals(k1) && "10".equals(k2)) {
+                        maps.put(5, v1 + ":::" + v2);
+                    }
+                });
+            });
+            resultList.add(maps);
+        }
+
+        List<WbsTreeContractVO> successData = new ArrayList<>();
+        List<WbsTreeContractVO> failData = new ArrayList<>();
+
+        //解析mapList
+        for (Map<Integer, String> map : resultList) {
+            for (Map.Entry<Integer, String> entry : map.entrySet()) {
+                Integer k = entry.getKey();
+                String v = entry.getValue();
+                if (StringUtil.isEmpty(v.replaceAll(":::", ""))) {
+                    continue;
+                }
+                String[] split = v.split(":::");
+                String nodeName = split[0];
+                String partitionCode = split[1];
+
+                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());
+                        //匹配名称、别名
+                        if (collect.size() == 0) {
+                            if (DiffListUtil.getContains(nodeName, nodeNameOld) || DiffListUtil.getContains(nodeName, fullNameOld)) {
+                                //匹配成功 修改名称、划分编号
+                                nodeOld.setNodeName(nodeName);
+                                nodeOld.setPartitionCode(partitionCode);
+                                nodeOld.setIsImportIdentificationNode(1); //识别成功
+                                successData.add(nodeOld);
+                            }
+                        }
+                    }
+                }
+
+                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 (collect1.size() == 0 && collect2.size() == 0) {
+                    //未匹配成功 构建参数
+                    WbsTreeContract wbsTreeContract = this.buildFailData(k, nodeName, partitionCode);
+                    WbsTreeContractVO wbsTreeContractVO = BeanUtil.copyProperties(wbsTreeContract, WbsTreeContractVO.class);
+                    failData.add(wbsTreeContractVO);
+                }
+            }
+        }
+
+        //修改节点信息
+        List<WbsTreeContract> wbsTreeContracts = BeanUtil.copyProperties(successData, WbsTreeContract.class);
+        this.saveOrUpdateBatch(wbsTreeContracts, 1000);
+
+        WbsTreeContractVO4 res = new WbsTreeContractVO4();
+
+        //导入识别匹配成功树
+        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;
+    }
+
+    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) {
+
+            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()) {
+
+                Integer k = entry.getKey();
+                String v = entry.getValue();
+                if (StringUtil.isEmpty(v.replaceAll(":::", ""))) {
+                    continue;
+                }
+                String[] split = v.split(":::");
+                String nodeName = split[0];
+
+                //当前行,失败节点
+                for (WbsTreeContractVO failDatum : failData) {
+                    if (nodeName.equals(failDatum.getNodeName())) {
+                        failList.add(failDatum);
+                    }
+                }
+
+                //当前行,成功节点
+                for (WbsTreeContractVO successDatum : successData) {
+                    if (nodeName.equals(successDatum.getNodeName())) {
+                        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 failDatum : failList) {
+                    if (failDatum.getNodeType() == 1) {
+                        failDatum.setParentId(nodeParentIdLv1);
+                    } else if (failDatum.getNodeType() == 2) {
+                        if (nodeParentIdLv2 == 0L) {
+                            failDatum.setParentId(nodeParentIdLv1);
+                        } else {
+                            failDatum.setParentId(nodeParentIdLv2);
+                        }
+                    } else if (failDatum.getNodeType() == 3) {
+                        if (nodeParentIdLv3 == 0L) {
+                            if (nodeParentIdLv2 == 0L) {
+                                failDatum.setParentId(nodeParentIdLv1);
+                            } else {
+                                failDatum.setParentId(nodeParentIdLv2);
+                            }
+                        } else {
+                            failDatum.setParentId(nodeParentIdLv3);
+                        }
+                    } else if (failDatum.getNodeType() == 4) {
+                        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 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);
+                        }
+                    }
+                }
+
+            }
+
+            //添加未成功节点
+            resultData.addAll(failData);
+        }
+
+        //添加父级节点
+        resultData.addAll(successData);
+
+        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.setPartitionCode(partitionCode);
+        wbsTreeContract.setType(1);
+        wbsTreeContract.setNodeType(nodeType);
+        wbsTreeContract.setIsImportIdentificationNode(0);  //识别失败
+        return wbsTreeContract;
+    }
+
+    private List<WbsTreeContract> findAllNodeList(String wbsTreeIds, String projectId, String contractId, String
+            wbsId) {
         String[] ids = wbsTreeIds.split(",");
         List<Long> idList = new ArrayList<>();
         List<WbsTreeContract> list = new ArrayList<>();

+ 4 - 21
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
+import org.apache.xmlbeans.impl.tool.Diff;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.redis.cache.BladeRedis;
@@ -422,11 +423,11 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     if (wbsTreeZi.getNodeType() == 6 && !(("中间交工证书").equals(wbsTreeZi.getNodeName()) || ("分项工程质量检验评定表").equals(wbsTreeZi.getNodeName()) || ("分项工程开工报告").equals(wbsTreeZi.getNodeName()))) {
                         wbsTreeZi.setMajorDataType(4);
                     } else if (wbsTreeZi.getNodeType() == 5 || wbsTreeZi.getNodeType() == 4 || wbsTreeZi.getNodeType() == 3 || wbsTreeZi.getNodeType() == 2) {
-                        if (getContains(wbsTreeZi.getNodeName(), "开工报告")) {
+                        if (DiffListUtil.getContains(wbsTreeZi.getNodeName(), "开工报告")) {
                             wbsTreeZi.setMajorDataType(1);
-                        } else if (getContains(wbsTreeZi.getNodeName(), "质量评定")) {
+                        } else if (DiffListUtil.getContains(wbsTreeZi.getNodeName(), "质量评定")) {
                             wbsTreeZi.setMajorDataType(2);
-                        } else if (getContains(wbsTreeZi.getNodeName(), "中间交工")) {
+                        } else if (DiffListUtil.getContains(wbsTreeZi.getNodeName(), "中间交工")) {
                             wbsTreeZi.setMajorDataType(3);
                         }
                     }
@@ -513,24 +514,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return wbsTree;
     }
 
-    private boolean getContains(String A, String B) {
-        boolean result = false;
-        char[] arrayA = A.toCharArray();
-        char[] arrayB = B.toCharArray();
-        int intLen = 0;
-        for (int i = 0; i < arrayB.length; i++) {
-            for (int j = 0; j < arrayA.length; j++) {
-                if (arrayB[i] == arrayA[j]) {
-                    intLen++;
-                    break;
-                }
-            }
-        }
-        if (intLen == arrayB.length)
-            result = true;
-        return result;
-    }
-
     @Override
     public int deleteBatchByProjectNodeId(Long projectNodeId) {
         return baseMapper.deleteBatchProjectNodeId(projectNodeId);

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

@@ -34,4 +34,22 @@ public class DiffListUtil {
         return diff;
     }
 
+    public static boolean getContains(String A, String B) {
+        boolean result = false;
+        char[] arrayA = A.toCharArray();
+        char[] arrayB = B.toCharArray();
+        int intLen = 0;
+        for (int i = 0; i < arrayB.length; i++) {
+            for (int j = 0; j < arrayA.length; j++) {
+                if (arrayB[i] == arrayA[j]) {
+                    intLen++;
+                    break;
+                }
+            }
+        }
+        if (intLen == arrayB.length)
+            result = true;
+        return result;
+    }
+
 }