浏览代码

Merge remote-tracking branch 'origin/test-merge' into test-merge

LHB 1 月之前
父节点
当前提交
5a1e481fb8
共有 20 个文件被更改,包括 615 次插入488 次删除
  1. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsParamClient.java
  2. 6 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/TreeNodeVO.java
  3. 36 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateQueryVO.java
  4. 6 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  5. 10 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  6. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java
  7. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeContractController.java
  8. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeController.java
  9. 29 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  10. 6 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsParamClientImpl.java
  11. 4 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  12. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeContractService.java
  13. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IWbsTreeService.java
  14. 3 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  15. 32 16
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  16. 7 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/NodeBaseInfoServiceImpl.java
  17. 416 402
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  18. 0 15
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  19. 15 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  20. 35 19
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/WbsParamClient.java

@@ -1,6 +1,7 @@
 package org.springblade.manager.feign;
 
 
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -30,4 +31,6 @@ public interface WbsParamClient {
     void saveWbsParams(@RequestBody List<WbsParam> wbsParamList);
     @PostMapping(API_PREFIX + "/createFileTitle")
     String createFileTitle(@RequestBody WbsTreeContract contract);
+    @PostMapping(API_PREFIX + "/getNameRuleByPkeyId")
+    R<List<String>> getNameRuleByPkeyId(@RequestParam Long pKeyId, @RequestParam Long projectId);
 }

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

@@ -6,6 +6,8 @@ import lombok.Data;
 import org.springblade.core.tool.node.BaseNode;
 import org.springblade.core.tool.node.TreeNode;
 
+import java.util.Date;
+
 @Data
 public class TreeNodeVO extends BaseNode<TreeNode> {
     private static final long serialVersionUID = 1L;
@@ -55,6 +57,10 @@ public class TreeNodeVO extends BaseNode<TreeNode> {
 
     private String erTreeId;
 
+    private Long updateUser;
+    private Date updateTime;
+    private String updateUserName;
+
     public TreeNodeVO() {
     }
 

+ 36 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateQueryVO.java

@@ -0,0 +1,36 @@
+package org.springblade.manager.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Data
+public class WbsTreePrivateQueryVO {
+
+    @ApiModelProperty(value = "wbs Id", required = true)
+    @NotBlank(message = "wbsId不能为空")
+    private String wbsId;
+
+    @ApiModelProperty(value = "项目id", required = true)
+    @NotBlank(message = "projectId不能为空")
+    private String projectId;
+
+    @ApiModelProperty("搜索内容")
+    private String queryValue;
+
+    @ApiModelProperty("节点类型")
+    private Integer nodeType;
+
+    @ApiModelProperty("内业资料类型")
+    private Integer majorDataType;
+
+    @ApiModelProperty("标准分类")
+    private Integer className;
+
+    @ApiModelProperty(value = "单元名称")
+    private Integer unitName;
+
+    @ApiModelProperty(value = "是否在客户端新增时隐藏,0否1是")
+    private Integer isAddConceal;
+}

+ 6 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -233,7 +233,12 @@ public class InformationWriteQueryController extends BladeController {
                 String sql="select * from m_wbs_tree_contract where p_key_id="+query.getWbsId()+" and is_deleted=0";
                 WbsTreeContract contract = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
                 if(dto.getType()==1){
-                    result=wbsParamClient.createFileTitle(contract);
+                    R<List<String>>  nameRuleList = wbsParamClient.getNameRuleByPkeyId(contract.getPKeyId(), Long.valueOf(contract.getProjectId()));
+                    String nameRule = "";
+                    if (nameRuleList != null && nameRuleList.getData() != null && !nameRuleList.getData().isEmpty()) {
+                        nameRule = String.join("-", nameRuleList.getData());
+                    }
+                    result  = nodeBaseInfoServiceClient.getNameRuleByRule(nameRule, contract.getPKeyId()+"");
                 }else {
                     result=nodeNameMap.get(query.getId());
                     //同时修改工程划分节点命名规则

+ 10 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -107,12 +107,18 @@ public class ContractInfoController extends BladeController {
         List<ContractInfo> contractInfoVOS = contractInfoService.selectContractInfoPageByPid(pid);
         List<ContractInfoVO> resultAll = new ArrayList<>();
         String contractIds = contractInfoVOS.stream().filter(contractInfo -> contractInfo.getContractType().equals(4)).map(contractInfo -> contractInfo.getId() + "").collect(Collectors.joining(","));
-        List<MeterContractInfo> meterContractInfoList = jdbcTemplate.query("SELECT * FROM s_meter_contract_info WHERE contract_id in ( " + contractIds + ")", new BeanPropertyRowMapper<>(MeterContractInfo.class));
+        Map<Long, List<MeterContractInfo>> collect = new HashMap<>();
+        if (StringUtils.isNotBlank(contractIds)) {
+            List<MeterContractInfo> meterContractInfoList = jdbcTemplate.query("SELECT * FROM s_meter_contract_info WHERE contract_id in ( " + contractIds + ")", new BeanPropertyRowMapper<>(MeterContractInfo.class));
+            collect = meterContractInfoList.stream().collect(Collectors.groupingBy(MeterContractInfo::getContractId));
+        }
         String ids = contractInfoVOS.stream().map(contractInfo -> contractInfo.getId() + "").collect(Collectors.joining(","));
-        List<ContractRelationJlyz> query = jdbcTemplate.query("select * from  m_contract_relation_jlyz where contract_id_jlyz in ( " + ids + ")", new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
-        Map<Long, List<ContractRelationJlyz>> relationMap = query.stream().collect(Collectors.groupingBy(ContractRelationJlyz::getContractIdJlyz));
+        Map<Long, List<ContractRelationJlyz>> relationMap = new HashMap<>();
+        if (StringUtils.isNotBlank(ids)) {
+            List<ContractRelationJlyz> query = jdbcTemplate.query("select * from  m_contract_relation_jlyz where contract_id_jlyz in ( " + ids + ")", new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+            relationMap = query.stream().collect(Collectors.groupingBy(ContractRelationJlyz::getContractIdJlyz));
+        }
         Map<Long, ContractInfo> contractInfoMap = contractInfoVOS.stream().collect(Collectors.toMap(ContractInfo::getId, vo -> vo));
-        Map<Long, List<MeterContractInfo>> collect = meterContractInfoList.stream().collect(Collectors.groupingBy(MeterContractInfo::getContractId));
         for (ContractInfo contractInfo : contractInfoVOS) {
             ContractInfoVO vo = new ContractInfoVO();
             BeanUtil.copyProperties(contractInfo, vo);

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

@@ -282,7 +282,7 @@ public class ProjectInfoController extends BladeController {
     @PostMapping("/collectProject")
     @ApiOperationSupport(order = 14)
     @ApiOperation(value = "收藏项目、取消收藏项目", notes = "传入项目id")
-    public R<Boolean> collectProject(@RequestBody Long projectId) {
+    public R<Boolean> collectProject(@RequestParam Long projectId) {
         Long userId = AuthUtil.getUserId();
         if (userId == null) {
             return R.fail("用户未登录");

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

@@ -159,14 +159,14 @@ public class WbsTreeContractController extends BladeController {
     @ApiOperation(value = "导入工程划分树", notes = "传入MultipartFile")
     public R importTree(@RequestParam("file") MultipartFile file, @RequestParam Long pkeyId) throws IOException {
         iWbsTreeContractService.importTree(file,pkeyId);
-        return R.success("正在导入中");
+        return R.success("操作成功");
     }
 
     @GetMapping("/getIsImport")
     @ApiOperationSupport(order = 32)
     @ApiOperation(value = "判断是否可以导入")
     public R getIsImport(Long projectId,Long contractId){
-        return iWbsTreeContractService.getIsImport(projectId,contractId);
+        return R.data(iWbsTreeContractService.getIsImport(projectId,contractId));
     }
 
     @GetMapping("/getImportProgress")

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

@@ -538,8 +538,8 @@ public class WbsTreeController extends BladeController {
     @GetMapping("/getQueryValueByNodeType")
     @ApiOperationSupport(order = 21)
     @ApiOperation(value = "根据节点类型,内业资料类型查询节点数据", notes = "传入wbsId、projectId、nodeType、majorDataType")
-    public Object getQueryValueByNodeType(@RequestParam String wbsId, @RequestParam String projectId, @RequestParam String queryValue, @RequestParam(required = false,defaultValue = "6") Integer nodeType, @RequestParam(required = false, defaultValue = "-1") Integer majorDataType) {
-        Object result = wbsTreeService.getQueryValueByNodeType(wbsId, projectId, queryValue, nodeType, majorDataType);
+    public Object getQueryValueByNodeType(@RequestParam WbsTreePrivateQueryVO vo) {
+        Object result = wbsTreeService.getQueryValueByNodeType(vo);
         return R.data(result);
     }
 

+ 29 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java

@@ -31,6 +31,7 @@ import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.vo.*;
 import org.springblade.manager.wrapper.WbsTreePrivateWrapper;
+import org.springblade.system.cache.DictCache;
 import org.springframework.beans.BeanUtils;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
@@ -386,6 +387,34 @@ public class WbsTreePrivateController extends BladeController {
         return R.fail(200, "未查询到数据");
     }
 
+    /**
+     * 查询当前节点下所有表单(根据节点ID查询当前表单)
+     */
+    @GetMapping("/get-group-node-tables")
+    @ApiOperationSupport(order = 3)
+    @ApiOperation(value = "查询当前节点下所有元素表并分类", notes = "传入父节点id、wbsId、projectId")
+    public R<Map<String, List<WbsNodeTableVO>>> findAndGroupNodeTableByCondition(@RequestParam("parentId") String parentId,
+                                                            @RequestParam("wbsId") String wbsId,
+                                                            @RequestParam("projectId") String projectId) {
+        R<List<WbsNodeTableVO>> r = findNodeTableByCondition(parentId, wbsId, projectId);
+        List<WbsNodeTableVO> data = r.getData();
+        if (data != null && !data.isEmpty()) {
+            Map<String, List<WbsNodeTableVO>> groupMap = data.stream().collect(Collectors.groupingBy(vo -> {
+                String tableOwner = vo.getTableOwner();
+                if (StringUtil.isNumeric(tableOwner)) {
+                    int i = Integer.parseInt(tableOwner);
+                    if (i > 0 && i <= 3) {
+                        return "施工方";
+                    } else if (i > 3 && i <= 6) {
+                        return "监理方";
+                    }
+                }
+                return "其他";
+            }));
+            return R.data(groupMap);
+        }
+        return R.fail(200, "未查询到数据");
+    }
 
     @GetMapping("/remove-table")
     @ApiOperationSupport(order = 4)

+ 6 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/WbsParamClientImpl.java

@@ -2,6 +2,7 @@ package org.springblade.manager.feign;
 
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.springblade.core.tool.api.R;
 import org.springblade.manager.entity.WbsParam;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.service.IWbsParamService;
@@ -34,4 +35,9 @@ public class WbsParamClientImpl implements WbsParamClient{
     public String createFileTitle(WbsTreeContract contract) {
         return iWbsParamService.createFileTitle(contract);
     }
+
+    @Override
+    public R<List<String>> getNameRuleByPkeyId(Long pKeyId, Long projectId) {
+        return iWbsParamService.getNameRuleByPkeyId(pKeyId,projectId);
+    }
 }

+ 4 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml

@@ -377,7 +377,10 @@
                 m_wbs_tree_private
                 WHERE
                 parent_id = d.id and is_deleted = 0 and type != 2
-            ) AS "has_children"
+            ) AS "has_children",
+            d.update_time AS "updateTime",
+            d.update_user AS "updateUser",
+            (select name from blade_user where id = d.update_user) AS "updateUserName"
         FROM
             m_wbs_tree_private d
         WHERE

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

@@ -105,7 +105,7 @@ public interface IWbsTreeContractService extends BaseService<WbsTreeContract> {
 
     R importPartitionCode(MultipartFile file);
 
-    R getIsImport(Long projectId, Long contractId);
+    Boolean getIsImport(Long projectId, Long contractId);
 
     R getImportProgress(Long projectId, Long contractId);
 

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

@@ -80,5 +80,5 @@ public interface IWbsTreeService extends BaseService<WbsTree> {
 
     List<WbsTreePrivate> getTitleRange(String projectId);
 
-    Object getQueryValueByNodeType(String wbsId, String projectId, String queryValue, Integer nodeType, Integer majorDataType);
+    Object getQueryValueByNodeType(WbsTreePrivateQueryVO vo);
 }

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

@@ -956,8 +956,9 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
             //如果是底层节点在创建时自动生成最顶层的根节点
             if(contractInfo.getTemplateType()!=null&&contractInfo.getTemplateType().equals(2)){
                 String sql="select * from m_wbs_tree_private where  project_id="+contractInfo.getPId()+" and parent_id=0 and is_deleted=0 and wbs_type=1 limit 1";
-                WbsTreePrivate wbsTreePrivate = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-                if(wbsTreePrivate!=null){
+                List<WbsTreePrivate> wbsTreePrivates = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+                if(!wbsTreePrivates.isEmpty()){
+                    WbsTreePrivate wbsTreePrivate = wbsTreePrivates.get(0);
                     WbsTreeContract wbsTreeContract=new WbsTreeContract();
                     wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
                     wbsTreeContract.setId(wbsTreePrivate.getId());

+ 32 - 16
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1410,12 +1410,12 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             }
         }
         keySql.append("id");
-        valSql.append(id == null ? SnowFlakeUtil.getId() : id + ", ");
+        valSql.append(id == null ? SnowFlakeUtil.getId() : id);
         if (groupId ==  null) {
             groupId = dataMap2.get("group_id");
         }
         if (groupId != null) {
-            keySql.append(", group_id, ");
+            keySql.append(", group_id");
             valSql.append(", ").append(groupId);
         }
         if (pKeyId == null) {
@@ -1431,15 +1431,23 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         dataMap2.remove("group_id");
         dataMap2.remove("p_key_id");
         String fields = dataMap2.keySet().stream().map(key -> "'" + key + "'").collect(Collectors.joining(","));
-        List<Map<String, Object>> fieldMap = jdbcTemplate.queryForList("select distinct COLUMN_NAME as fieldName, CHARACTER_MAXIMUM_LENGTH as fieldLength from information_schema.COLUMNS where  TABLE_NAME = '" + tabName +
-                "' and COLUMN_NAME in (" + fields + ")");
-        Map<String, Integer> map = fieldMap.stream().collect(toMap(k -> k.get("fieldName") + "", v -> {
+        Map<String, Integer> map = new HashMap<>();
+        if (!fields.isEmpty()) {
             try {
-                return Integer.parseInt(v.get("fieldLength") + "");
+                fields = fields + ", 'key_201'";
+                List<Map<String, Object>> fieldMap = jdbcTemplate.queryForList("select distinct COLUMN_NAME as fieldName, CHARACTER_MAXIMUM_LENGTH as fieldLength from information_schema.COLUMNS where  TABLE_NAME = '" + tabName +
+                        "' and COLUMN_NAME in (" + fields + ")");
+                map = fieldMap.stream().collect(toMap(k -> k.get("fieldName") + "", v -> {
+                    try {
+                        return Integer.parseInt(v.get("fieldLength") + "");
+                    } catch (Exception e) {
+                        return 0;
+                    }
+                }, Math::min));
             } catch (Exception e) {
-                return 0;
+                e.printStackTrace();
             }
-        }, Math::min));
+        }
         for (String key : dataMap2.keySet()) {
             String[] split = key.split("_");
             if (split.length > 1 && Integer.parseInt(split[1]) > 80) {
@@ -1461,16 +1469,24 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         }
         if (!opsParamMap.isEmpty()) {
             keySql.append(", key_201");
-            Integer i = map.get("key_201");
             String data = DataStructureFormatUtils.buildData(opsParamMap);
-            if (i != null && data.length() > i) {
-                if (i < 10000) {
-                    // 65535 byte
-                    jdbcTemplate.execute("alter table " + tabName + " modify column key_201 text");
-                }else {
-                    // 16777215 byte
-                    jdbcTemplate.execute("alter table " + tabName + " modify column key_201 mediumtext");
+            try {
+                if (!map.containsKey( "key_201")) {
+                    jdbcTemplate.execute("alter table " + tabName + " add column key_201 text");
+                } else  {
+                    Integer i = map.get("key_201");
+                    if (data.length() > i) {
+                        if (i < 10000) {
+                            // 65535 byte
+                            jdbcTemplate.execute("alter table " + tabName + " modify column key_201 text");
+                        }else {
+                            // 16777215 byte
+                            jdbcTemplate.execute("alter table " + tabName + " modify column key_201 mediumtext");
+                        }
+                    }
                 }
+            } catch (Exception e) {
+                e.printStackTrace();
             }
             valSql.append(", '").append(data).append("'");
         }

+ 7 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/NodeBaseInfoServiceImpl.java

@@ -463,19 +463,19 @@ public class NodeBaseInfoServiceImpl extends BaseServiceImpl<NodeBaseInfoMapper,
         StringBuilder result = new StringBuilder();
         for (int i = 0; i < codes.length; i++) {
             if(codes[i].equals("C0")){
-                result.append(nodeBaseInfo.getUnit());
+                result.append(nodeBaseInfo.getUnit() != null ? nodeBaseInfo.getUnit() : "");
             } else if (codes[i].equals("C1")) {
-                result.append(nodeBaseInfo.getSubUnit());
+                result.append(nodeBaseInfo.getSubUnit() != null ? nodeBaseInfo.getSubUnit() : "");
             }else if (codes[i].equals("C2")) {
-                result.append(nodeBaseInfo.getDivision());
+                result.append(nodeBaseInfo.getDivision() != null ? nodeBaseInfo.getDivision() : "");
             }else if (codes[i].equals("C3")) {
-                result.append(nodeBaseInfo.getSubDivision());
+                result.append(nodeBaseInfo.getSubDivision() != null ? nodeBaseInfo.getSubDivision() : "");
             }else if (codes[i].equals("C4")) {
-                result.append(nodeBaseInfo.getItem());
+                result.append(nodeBaseInfo.getItem() != null ? nodeBaseInfo.getItem() : "");
             }else if (codes[i].equals("C5")) {
-                result.append(nodeBaseInfo.getSubItem());
+                result.append(nodeBaseInfo.getSubItem() != null ? nodeBaseInfo.getSubItem() : "");
             }else if (codes[i].equals("C6")) {
-                result.append(nodeBaseInfo.getProcesses());
+                result.append(nodeBaseInfo.getProcesses() != null ? nodeBaseInfo.getProcesses() : "");
             }
         }
         return result.toString();

+ 416 - 402
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -91,6 +91,7 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.math.MathContext;
 import java.math.RoundingMode;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Function;
@@ -2748,449 +2749,454 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     }
 
     @Override
-    @Async
     @Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
     public R importTree(MultipartFile file, Long pkeyId) throws IOException {
-        InputStream inputStream = file.getInputStream();
-        org.apache.poi.ss.usermodel.Workbook workbook = new XSSFWorkbook(inputStream);
-        Sheet sheet = workbook.getSheetAt(0);
-        unmergeCells(sheet);
-        List<ImportTreeDto> list = new ArrayList<>();
-        for (int i = 2; i <= sheet.getLastRowNum(); i++) {
-            Row row = sheet.getRow(i);
-            if (row == null) continue;
-            // 获取每一列的值
-            String unitCode = getCellValue(row.getCell(0)); // A列:单位工程编号
-            String unitName = getCellValue(row.getCell(1)); // B列:单位工程名称
-            String subUnitCode = getCellValue(row.getCell(2)); // C列:子单位工程编号
-            String subUnitName = getCellValue(row.getCell(3)); // D列:子单位工程名称
-            String divisionCode = getCellValue(row.getCell(4)); // E列:分部工程编号
-            String divisionName = getCellValue(row.getCell(5)); // F列:分部工程名称
-            String subDivisionCode = getCellValue(row.getCell(6)); // G列:子分部工程编号
-            String subDivisionName = getCellValue(row.getCell(7)); // H列:子分部工程名称
-            String itemCode = getCellValue(row.getCell(8)); // I列:分项工程编号
-            String itemName = getCellValue(row.getCell(9)); // J列:分项工程名称
-            String subItemCode = getCellValue(row.getCell(10));// K列:子分项工程编号
-            String subItemName = getCellValue(row.getCell(11)); // L列:子分项工程名称
-            ImportTreeDto dto = new ImportTreeDto(unitName, unitCode, 1, StringUtils.isEmpty(unitName), subUnitName, subUnitCode, 18, StringUtils.isEmpty(subUnitName), divisionName, divisionCode, 2, StringUtils.isEmpty(divisionName), subDivisionName, subDivisionCode, 3, StringUtils.isEmpty(subDivisionName), itemName, itemCode, 4, StringUtils.isEmpty(itemName), subItemName, subItemCode, 5, StringUtils.isEmpty(subItemName));
-            list.add(dto);
-        }
-        if (list.isEmpty()) {
-            throw new ServiceException("导入模版为空,请先填写数据");
-        }
-        //过滤出空节点
-        list = list.stream().filter(o -> !o.getIsUnit() || !o.getIsSubUnit() || !o.getIsDivision() || !o.getIsSubDivision() || !o.getIsItem() || !o.getIsSubItem()).collect(Collectors.toList());
+        //最高节点
+        WbsTreeContract wbsTreeContractRoot = baseMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getPKeyId, pkeyId));
+        bladeRedis.set("import:projectId:"+wbsTreeContractRoot.getProjectId()+"contractId:"+wbsTreeContractRoot.getContractId(), "0");
+        try (InputStream inputStream = file.getInputStream()) {
+            // 立即处理文件流
+            Workbook workbook = new XSSFWorkbook(inputStream);
+            Sheet sheet = workbook.getSheetAt(0);
+            // 处理Excel数据...
+            unmergeCells(sheet);
+            List<ImportTreeDto> list = new ArrayList<>();
+            for (int i = 2; i <= sheet.getLastRowNum(); i++) {
+                Row row = sheet.getRow(i);
+                if (row == null) continue;
+                // 获取每一列的值
+                String unitCode = getCellValue(row.getCell(0)); // A列:单位工程编号
+                String unitName = getCellValue(row.getCell(1)); // B列:单位工程名称
+                String subUnitCode = getCellValue(row.getCell(2)); // C列:子单位工程编号
+                String subUnitName = getCellValue(row.getCell(3)); // D列:子单位工程名称
+                String divisionCode = getCellValue(row.getCell(4)); // E列:分部工程编号
+                String divisionName = getCellValue(row.getCell(5)); // F列:分部工程名称
+                String subDivisionCode = getCellValue(row.getCell(6)); // G列:子分部工程编号
+                String subDivisionName = getCellValue(row.getCell(7)); // H列:子分部工程名称
+                String itemCode = getCellValue(row.getCell(8)); // I列:分项工程编号
+                String itemName = getCellValue(row.getCell(9)); // J列:分项工程名称
+                String subItemCode = getCellValue(row.getCell(10));// K列:子分项工程编号
+                String subItemName = getCellValue(row.getCell(11)); // L列:子分项工程名称
+                ImportTreeDto dto = new ImportTreeDto(unitName, unitCode, 1, StringUtils.isEmpty(unitName), subUnitName, subUnitCode, 18, StringUtils.isEmpty(subUnitName), divisionName, divisionCode, 2, StringUtils.isEmpty(divisionName), subDivisionName, subDivisionCode, 3, StringUtils.isEmpty(subDivisionName), itemName, itemCode, 4, StringUtils.isEmpty(itemName), subItemName, subItemCode, 5, StringUtils.isEmpty(subItemName));
+                list.add(dto);
+            }
+            if (list.isEmpty()) {
+                throw new ServiceException("导入模版为空,请先填写数据");
+            }
+            //过滤出空节点
+            list = list.stream().filter(o -> !o.getIsUnit() || !o.getIsSubUnit() || !o.getIsDivision() || !o.getIsSubDivision() || !o.getIsItem() || !o.getIsSubItem()).collect(Collectors.toList());
 //        //过滤出相同节点但是编号不同的情况
 //        if(hasConflictingCodes(list)){
 //            throw new ServiceException("导入模版存在相同节点但不同编号,请修改");
 //        }
-        //最高节点
-        WbsTreeContract wbsTreeContractRoot = baseMapper.selectOne(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getPKeyId, pkeyId));
-        //获取当前节点下所有子节点
-        List<WbsTreeContractVO> wbsTreeContractVOS = contractInfoMapper.tree4(wbsTreeContractRoot.getContractId(), String.valueOf(wbsTreeContractRoot.getPKeyId()));
-        // 定义 nodeType 的优先级顺序 18是子单位工程,后期加上去的,不敢动原本的顺序
-        List<Integer> priorityOrder = Arrays.asList(1, 18, 2, 3, 4, 5);
-        // 自定义 Comparator
-        Comparator<WbsTreeContractVO> comparator = (vo1, vo2) -> {
-            int index1 = priorityOrder.indexOf(vo1.getNodeType());
-            int index2 = priorityOrder.indexOf(vo2.getNodeType());
-            return Integer.compare(index1, index2);
-        };
-        // 对集合进行排序
-        wbsTreeContractVOS.sort(comparator);
-        if (wbsTreeContractVOS.size() <= 0) {
-            throw new ServiceException("未查询到当前合同段的wbs树,请先分配该合同的合同段wsb树");
-        }
-        //本次新增的节点
-        List<WbsTreeContract> insertList = new ArrayList<>();
-        //本次修改的节点
-        List<String> updateList = new ArrayList<>();
-
-        String sqlList = "Select parent_id,node_name from m_wbs_tree_contract where contract_id=" + wbsTreeContractRoot.getContractId() + " and wbs_id=" + wbsTreeContractRoot.getWbsId() + " and is_deleted=0";
-        List<WbsTreeContract> WbsTreeContractListupdate = jdbcTemplate.query(sqlList, new BeanPropertyRowMapper<>(WbsTreeContract.class));
-        //导入节点与现有节点进行比较。进行修改编号
-        List<String> updateUnitNames = new ArrayList<>();
-        for (ImportTreeDto dto : list) {
-            for (WbsTreeContractVO vo : wbsTreeContractVOS) {
-                //wbs节点和单位工程的名称类型能对应上,并且编号不一样,就修改编号
-                if (vo.getNodeName().equals(dto.getUnitName()) && vo.getNodeType() == 1) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 1, wbsTreeContractRoot);
-                    if (exist) {
-                        if (vo.getPartitionCode() == null || !vo.getPartitionCode().equals(dto.getUnitCode())) {
-                            if (updateUnitNames.size() >= 1 && updateUnitNames.contains(vo.getNodeName())) {
-                                continue;
+            //获取当前节点下所有子节点
+            List<WbsTreeContractVO> wbsTreeContractVOS = contractInfoMapper.tree4(wbsTreeContractRoot.getContractId(), String.valueOf(wbsTreeContractRoot.getPKeyId()));
+            // 定义 nodeType 的优先级顺序 18是子单位工程,后期加上去的,不敢动原本的顺序
+            List<Integer> priorityOrder = Arrays.asList(1, 18, 2, 3, 4, 5);
+            // 自定义 Comparator
+            Comparator<WbsTreeContractVO> comparator = (vo1, vo2) -> {
+                int index1 = priorityOrder.indexOf(vo1.getNodeType());
+                int index2 = priorityOrder.indexOf(vo2.getNodeType());
+                return Integer.compare(index1, index2);
+            };
+            // 对集合进行排序
+            wbsTreeContractVOS.sort(comparator);
+            if (wbsTreeContractVOS.size() <= 0) {
+                throw new ServiceException("未查询到当前合同段的wbs树,请先分配该合同的合同段wsb树");
+            }
+            //本次新增的节点
+            List<WbsTreeContract> insertList = new ArrayList<>();
+            //本次修改的节点
+            List<String> updateList = new ArrayList<>();
+
+            String sqlList = "Select parent_id,node_name from m_wbs_tree_contract where contract_id=" + wbsTreeContractRoot.getContractId() + " and wbs_id=" + wbsTreeContractRoot.getWbsId() + " and is_deleted=0";
+            List<WbsTreeContract> WbsTreeContractListupdate = jdbcTemplate.query(sqlList, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            //导入节点与现有节点进行比较。进行修改编号
+            List<String> updateUnitNames = new ArrayList<>();
+            for (ImportTreeDto dto : list) {
+                for (WbsTreeContractVO vo : wbsTreeContractVOS) {
+                    //wbs节点和单位工程的名称类型能对应上,并且编号不一样,就修改编号
+                    if (vo.getNodeName().equals(dto.getUnitName()) && vo.getNodeType() == 1) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 1, wbsTreeContractRoot);
+                        if (exist) {
+                            if (vo.getPartitionCode() == null || !vo.getPartitionCode().equals(dto.getUnitCode())) {
+                                if (updateUnitNames.size() >= 1 && updateUnitNames.contains(vo.getNodeName())) {
+                                    continue;
+                                }
+                                baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getUnitCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
+                                updateList.add(vo.getNodeName());
+                                updateUnitNames.add(vo.getNodeName());
+                                dto.setIsUnit(true);
                             }
-                            baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getUnitCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
-                            updateList.add(vo.getNodeName());
-                            updateUnitNames.add(vo.getNodeName());
-                            dto.setIsUnit(true);
+                            continue;
                         }
-                        continue;
                     }
-                }
-                //wbs节点和子单位工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
-                if (vo.getNodeName().equals(dto.getSubUnitName()) && vo.getNodeType() == 18) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 2, wbsTreeContractRoot);
-                    if (exist) {
-                        if (isTrueNode(Arrays.asList(dto.getUnitName(), dto.getSubUnitName()), vo)) {
-                            if (vo.getPartitionCode() == null || !vo.getPartitionCode().equals(dto.getSubUnitCode())) {
-                                baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getSubUnitCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
+                    //wbs节点和子单位工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
+                    if (vo.getNodeName().equals(dto.getSubUnitName()) && vo.getNodeType() == 18) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 2, wbsTreeContractRoot);
+                        if (exist) {
+                            if (isTrueNode(Arrays.asList(dto.getUnitName(), dto.getSubUnitName()), vo)) {
+                                if (vo.getPartitionCode() == null || !vo.getPartitionCode().equals(dto.getSubUnitCode())) {
+                                    baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getSubUnitCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
+                                    updateList.add(vo.getNodeName());
+                                    dto.setIsSubUnit(true);
+                                }
+
+                            }
+                            continue;
+                        }
+                    }
+                    //wbs节点和分部工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
+                    if (vo.getNodeName().equals(dto.getDivisionName()) && vo.getNodeType() == 2 && (vo.getPartitionCode() == null || vo.getPartitionCode().equals(dto.getDivisionCode()))) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 3, wbsTreeContractRoot);
+                        if (exist) {
+                            if (isTrueNode(Arrays.asList(dto.getUnitName(), dto.getSubUnitName(), dto.getDivisionName()), vo)) {
+                                baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getDivisionCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
                                 updateList.add(vo.getNodeName());
-                                dto.setIsSubUnit(true);
+                                dto.setIsDivision(true);
                             }
 
+                            continue;
                         }
-                        continue;
                     }
-                }
-                //wbs节点和分部工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
-                if (vo.getNodeName().equals(dto.getDivisionName()) && vo.getNodeType() == 2 && (vo.getPartitionCode() == null || vo.getPartitionCode().equals(dto.getDivisionCode()))) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 3, wbsTreeContractRoot);
-                    if (exist) {
-                        if (isTrueNode(Arrays.asList(dto.getUnitName(), dto.getSubUnitName(), dto.getDivisionName()), vo)) {
-                            baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getDivisionCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
-                            updateList.add(vo.getNodeName());
-                            dto.setIsDivision(true);
-                        }
+                    //wbs节点和子分部工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
+                    if (vo.getNodeName().equals(dto.getSubDivisionName()) && vo.getNodeType() == 3 && (vo.getPartitionCode() == null || !vo.getPartitionCode().equals(dto.getSubDivisionCode()))) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 4, wbsTreeContractRoot);
+                        if (exist) {
+                            if (isTrueNode(Arrays.asList(dto.getUnitName(), dto.getSubUnitName(), dto.getDivisionName(), dto.getSubDivisionName()), vo)) {
+                                baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getSubDivisionCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
+                                updateList.add(vo.getNodeName());
+                                dto.setIsSubDivision(true);
+                            }
 
-                        continue;
-                    }
-                }
-                //wbs节点和子分部工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
-                if (vo.getNodeName().equals(dto.getSubDivisionName()) && vo.getNodeType() == 3 && (vo.getPartitionCode() == null || !vo.getPartitionCode().equals(dto.getSubDivisionCode()))) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 4, wbsTreeContractRoot);
-                    if (exist) {
-                        if (isTrueNode(Arrays.asList(dto.getUnitName(), dto.getSubUnitName(), dto.getDivisionName(), dto.getSubDivisionName()), vo)) {
-                            baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getSubDivisionCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
-                            updateList.add(vo.getNodeName());
-                            dto.setIsSubDivision(true);
+                            continue;
                         }
+                    }
+                    //wbs节点和分项工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
+                    if (vo.getNodeName().equals(dto.getItemName()) && vo.getNodeType() == 4 && (vo.getPartitionCode() == null || !vo.getPartitionCode().equals(dto.getItemCode()))) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 5, wbsTreeContractRoot);
+                        if (exist) {
+                            if (isTrueNode(Arrays.asList(dto.getUnitName(), dto.getSubUnitName(), dto.getDivisionName(), dto.getSubDivisionName(), dto.getItemName()), vo)) {
+                                baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getItemCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
+                                updateList.add(vo.getNodeName());
+                                dto.setIsItem(true);
+                            }
 
-                        continue;
+                            continue;
+                        }
                     }
-                }
-                //wbs节点和分项工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
-                if (vo.getNodeName().equals(dto.getItemName()) && vo.getNodeType() == 4 && (vo.getPartitionCode() == null || !vo.getPartitionCode().equals(dto.getItemCode()))) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 5, wbsTreeContractRoot);
-                    if (exist) {
-                        if (isTrueNode(Arrays.asList(dto.getUnitName(), dto.getSubUnitName(), dto.getDivisionName(), dto.getSubDivisionName(), dto.getItemName()), vo)) {
-                            baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getItemCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
-                            updateList.add(vo.getNodeName());
-                            dto.setIsItem(true);
+                    //wbs节点和子分项工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
+                    if (vo.getNodeName().equals(dto.getSubItemName()) && vo.getNodeType() == 5 && (vo.getPartitionCode() == null || !vo.getPartitionCode().equals(dto.getSubItemCode()))) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 6, wbsTreeContractRoot);
+                        if (exist) {
+                            if (isTrueNode(Arrays.asList(dto.getUnitName(), dto.getSubUnitName(), dto.getDivisionName(), dto.getSubDivisionName(), dto.getItemName(), dto.getSubItemName()), vo)) {
+                                baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getSubItemCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
+                                updateList.add(vo.getNodeName());
+                                dto.setIsSubItem(true);
+                            }
+                            break;
                         }
 
-                        continue;
                     }
                 }
-                //wbs节点和子分项工程的名称类型能对应上,并且编号不一样,并且祖级节点也都能对应上,就修改编号
-                if (vo.getNodeName().equals(dto.getSubItemName()) && vo.getNodeType() == 5 && (vo.getPartitionCode() == null || !vo.getPartitionCode().equals(dto.getSubItemCode()))) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractListupdate, 6, wbsTreeContractRoot);
-                    if (exist) {
-                        if (isTrueNode(Arrays.asList(dto.getUnitName(), dto.getSubUnitName(), dto.getDivisionName(), dto.getSubDivisionName(), dto.getItemName(), dto.getSubItemName()), vo)) {
-                            baseMapper.update(null, Wrappers.<WbsTreeContract>lambdaUpdate().set(WbsTreeContract::getPartitionCode, dto.getSubItemCode()).eq(WbsTreeContract::getPKeyId, vo.getPKeyId()));
-                            updateList.add(vo.getNodeName());
-                            dto.setIsSubItem(true);
+            }
+            int i = 0;
+            int size = list.size();
+            try{
+                for (ImportTreeDto dto : list) {
+                    String progressStr = String.format("%.2f", ((double) ++i / size) * 100);
+                    bladeRedis.set("import:projectId:"+wbsTreeContractRoot.getProjectId()+"contractId:"+wbsTreeContractRoot.getContractId(), progressStr);
+                    //新增
+                    String sqlList1 = "Select parent_id,node_name,p_id from m_wbs_tree_contract where contract_id=" + wbsTreeContractRoot.getContractId() + " and wbs_id=" + wbsTreeContractRoot.getWbsId() + " and is_deleted=0";
+                    List<WbsTreeContract> WbsTreeContractList = jdbcTemplate.query(sqlList1, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+                    i++;
+                    //单位工程:如果没有被处理过,说明需要新增
+                    if (!dto.getIsUnit()) {
+                        //检测是否已经存在,如果存在,就不需要新增了
+                        Boolean exist = this.isExist(dto, WbsTreeContractList, 1, wbsTreeContractRoot);
+                        if (!exist) {
+                            WbsTreeContract unit = new WbsTreeContract();
+                            BeanUtil.copy(wbsTreeContractRoot, unit);
+                            unit.setPKeyId(SnowFlakeUtil.getId());
+                            unit.setId(SnowFlakeUtil.getId());
+                            unit.setParentId(wbsTreeContractRoot.getId());
+                            unit.setAncestors("0," + wbsTreeContractRoot.getPKeyId() + "," + unit.getPKeyId());
+                            unit.setIsCustom(1);
+                            unit.setPartitionCode(dto.getUnitCode());
+                            unit.setNodeType(1);
+                            unit.setNodeName(dto.getUnitName());
+                            unit.setFullName(dto.getUnitName());
+                            unit.setIsTypePrivatePid(null);
+                            unit.setSort(i);
+                            unit.setTreePId(null);
+                            unit.setDateIsComplete(null);
+                            unit.setPId(wbsTreeContractRoot.getPKeyId());
+                            unit.setAncestorsPId(wbsTreeContractRoot.getAncestorsPId() + "," + wbsTreeContractRoot.getPKeyId());
+                            baseMapper.insert(unit);
+                            insertList.add(unit);
                         }
-                        break;
                     }
+                    //子单位工程:如果没有被处理过,说明需要新增,最重要是需要找到父节点。单位工程不会有相同的,所以直接根据名称查找
+                    if (!dto.getIsSubUnit()) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractList, 2, wbsTreeContractRoot);
+                        if (!exist) {
+                            WbsTreeContract fatherNode = baseMapper.selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, dto.getUnitName()).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
+                                    .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0).last("LIMIT 1"));
+                            WbsTreeContract subUnit = new WbsTreeContract();
+                            BeanUtil.copy(fatherNode, subUnit);
+                            subUnit.setPKeyId(SnowFlakeUtil.getId());
+                            subUnit.setId(SnowFlakeUtil.getId());
+                            subUnit.setParentId(fatherNode.getId());
+                            subUnit.setAncestors(fatherNode.getAncestors() + "," + subUnit.getPKeyId());
+                            subUnit.setIsCustom(1);
+                            subUnit.setPartitionCode(dto.getSubUnitCode());
+                            subUnit.setNodeType(18);
+                            subUnit.setNodeName(dto.getSubUnitName());
+                            subUnit.setFullName(dto.getSubUnitName());
+                            subUnit.setIsTypePrivatePid(null);
+                            subUnit.setSort(i);
+                            subUnit.setTreePId(null);
+                            subUnit.setDateIsComplete(null);
+                            subUnit.setPId(fatherNode.getPKeyId());
+                            subUnit.setAncestorsPId(fatherNode.getAncestorsPId() + "," + fatherNode.getPKeyId());
+                            baseMapper.insert(subUnit);
+                            insertList.add(subUnit);
+                        }
 
-                }
-            }
-        }
-        int i = 0;
-        int size = list.size();
-        try{
-            for (ImportTreeDto dto : list) {
-                String progressStr = String.format("%.2f", ((double) ++i / size) * 100) + "%";
-                bladeRedis.set("import:projectId:"+wbsTreeContractRoot.getProjectId()+"contractId:"+wbsTreeContractRoot.getContractId(), progressStr);
-                //新增
-                String sqlList1 = "Select parent_id,node_name,p_id from m_wbs_tree_contract where contract_id=" + wbsTreeContractRoot.getContractId() + " and wbs_id=" + wbsTreeContractRoot.getWbsId() + " and is_deleted=0";
-                List<WbsTreeContract> WbsTreeContractList = jdbcTemplate.query(sqlList1, new BeanPropertyRowMapper<>(WbsTreeContract.class));
-                i++;
-                //单位工程:如果没有被处理过,说明需要新增
-                if (!dto.getIsUnit()) {
-                    //检测是否已经存在,如果存在,就不需要新增了
-                    Boolean exist = this.isExist(dto, WbsTreeContractList, 1, wbsTreeContractRoot);
-                    if (!exist) {
-                        WbsTreeContract unit = new WbsTreeContract();
-                        BeanUtil.copy(wbsTreeContractRoot, unit);
-                        unit.setPKeyId(SnowFlakeUtil.getId());
-                        unit.setId(SnowFlakeUtil.getId());
-                        unit.setParentId(wbsTreeContractRoot.getId());
-                        unit.setAncestors("0," + wbsTreeContractRoot.getPKeyId() + "," + unit.getPKeyId());
-                        unit.setIsCustom(1);
-                        unit.setPartitionCode(dto.getUnitCode());
-                        unit.setNodeType(1);
-                        unit.setNodeName(dto.getUnitName());
-                        unit.setFullName(dto.getUnitName());
-                        unit.setIsTypePrivatePid(null);
-                        unit.setSort(i);
-                        unit.setTreePId(null);
-                        unit.setDateIsComplete(null);
-                        unit.setPId(wbsTreeContractRoot.getPKeyId());
-                        unit.setAncestorsPId(wbsTreeContractRoot.getAncestorsPId() + "," + wbsTreeContractRoot.getPKeyId());
-                        baseMapper.insert(unit);
-                        insertList.add(unit);
-                    }
-                }
-                //子单位工程:如果没有被处理过,说明需要新增,最重要是需要找到父节点。单位工程不会有相同的,所以直接根据名称查找
-                if (!dto.getIsSubUnit()) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractList, 2, wbsTreeContractRoot);
-                    if (!exist) {
-                        WbsTreeContract fatherNode = baseMapper.selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, dto.getUnitName()).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
-                                .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0).last("LIMIT 1"));
-                        WbsTreeContract subUnit = new WbsTreeContract();
-                        BeanUtil.copy(fatherNode, subUnit);
-                        subUnit.setPKeyId(SnowFlakeUtil.getId());
-                        subUnit.setId(SnowFlakeUtil.getId());
-                        subUnit.setParentId(fatherNode.getId());
-                        subUnit.setAncestors(fatherNode.getAncestors() + "," + subUnit.getPKeyId());
-                        subUnit.setIsCustom(1);
-                        subUnit.setPartitionCode(dto.getSubUnitCode());
-                        subUnit.setNodeType(18);
-                        subUnit.setNodeName(dto.getSubUnitName());
-                        subUnit.setFullName(dto.getSubUnitName());
-                        subUnit.setIsTypePrivatePid(null);
-                        subUnit.setSort(i);
-                        subUnit.setTreePId(null);
-                        subUnit.setDateIsComplete(null);
-                        subUnit.setPId(fatherNode.getPKeyId());
-                        subUnit.setAncestorsPId(fatherNode.getAncestorsPId() + "," + fatherNode.getPKeyId());
-                        baseMapper.insert(subUnit);
-                        insertList.add(subUnit);
                     }
-
-                }
-                //分部工程:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
-                if (!dto.getIsDivision()) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractList, 3, wbsTreeContractRoot);
-                    if (!exist) {
-                        String fatherNodeName = "";
-                        if (dto.getSubUnitName() != null && !dto.getSubUnitName().equals("")) {
-                            fatherNodeName = dto.getSubUnitName();
-                        } else if (dto.getUnitName() != null && !dto.getUnitName().equals("")) {
-                            fatherNodeName = dto.getUnitName();
-                        }
-                        List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
-                                .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
-                        if (list1.size() > 0) {
-                            for (WbsTreeContract contract : list1) {
-                                String[] ids = contract.getAncestorsPId().split(",");
-                                ids = Arrays.stream(ids)
-                                        .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
-                                        .toArray(String[]::new);
-                                String sql = "Select node_name from m_wbs_tree_contract where p_key_id in(" + String.join(",", ids) + ")";
-                                List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
-                                String result = String.join("", nodeNames);
-                                result = result + contract.getNodeName();
-                                String ancestorsName = wbsTreeContractRoot.getNodeName() + StringUtils.defaultString(dto.getUnitName())
-                                        + StringUtils.defaultString(dto.getSubUnitName());
-                                if (result.equals(ancestorsName)) {
-                                    WbsTreeContract division = new WbsTreeContract();
-                                    BeanUtil.copy(contract, division);
-                                    division.setPKeyId(SnowFlakeUtil.getId());
-                                    division.setId(SnowFlakeUtil.getId());
-                                    division.setParentId(contract.getId());
-                                    division.setAncestors(contract.getAncestors() + "," + division.getPKeyId());
-                                    division.setIsCustom(1);
-                                    division.setPartitionCode(dto.getDivisionCode());
-                                    division.setNodeType(2);
-                                    division.setNodeName(dto.getDivisionName());
-                                    division.setFullName(dto.getDivisionName());
-                                    division.setIsTypePrivatePid(null);
-                                    division.setSort(i);
-                                    division.setTreePId(null);
-                                    division.setDateIsComplete(null);
-                                    division.setPId(contract.getPKeyId());
-                                    division.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
-                                    baseMapper.insert(division);
-                                    insertList.add(division);
-                                    break;
+                    //分部工程:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
+                    if (!dto.getIsDivision()) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractList, 3, wbsTreeContractRoot);
+                        if (!exist) {
+                            String fatherNodeName = "";
+                            if (dto.getSubUnitName() != null && !dto.getSubUnitName().equals("")) {
+                                fatherNodeName = dto.getSubUnitName();
+                            } else if (dto.getUnitName() != null && !dto.getUnitName().equals("")) {
+                                fatherNodeName = dto.getUnitName();
+                            }
+                            List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
+                                    .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
+                            if (list1.size() > 0) {
+                                for (WbsTreeContract contract : list1) {
+                                    String[] ids = contract.getAncestorsPId().split(",");
+                                    ids = Arrays.stream(ids)
+                                            .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
+                                            .toArray(String[]::new);
+                                    String sql = "Select node_name from m_wbs_tree_contract where p_key_id in(" + String.join(",", ids) + ")";
+                                    List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
+                                    String result = String.join("", nodeNames);
+                                    result = result + contract.getNodeName();
+                                    String ancestorsName = wbsTreeContractRoot.getNodeName() + StringUtils.defaultString(dto.getUnitName())
+                                            + StringUtils.defaultString(dto.getSubUnitName());
+                                    if (result.equals(ancestorsName)) {
+                                        WbsTreeContract division = new WbsTreeContract();
+                                        BeanUtil.copy(contract, division);
+                                        division.setPKeyId(SnowFlakeUtil.getId());
+                                        division.setId(SnowFlakeUtil.getId());
+                                        division.setParentId(contract.getId());
+                                        division.setAncestors(contract.getAncestors() + "," + division.getPKeyId());
+                                        division.setIsCustom(1);
+                                        division.setPartitionCode(dto.getDivisionCode());
+                                        division.setNodeType(2);
+                                        division.setNodeName(dto.getDivisionName());
+                                        division.setFullName(dto.getDivisionName());
+                                        division.setIsTypePrivatePid(null);
+                                        division.setSort(i);
+                                        division.setTreePId(null);
+                                        division.setDateIsComplete(null);
+                                        division.setPId(contract.getPKeyId());
+                                        division.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
+                                        baseMapper.insert(division);
+                                        insertList.add(division);
+                                        break;
+                                    }
                                 }
                             }
                         }
-                    }
 
-                }
-                //子分部工程:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
-                if (!dto.getIsSubDivision()) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractList, 4, wbsTreeContractRoot);
-                    if (!exist) {
-                        String fatherNodeName = "";
-                        if (dto.getDivisionName() != null && !dto.getDivisionName().equals("")) {
-                            fatherNodeName = dto.getDivisionName();
-                        } else if (dto.getSubUnitName() != null && !dto.getSubUnitName().equals("")) {
-                            fatherNodeName = dto.getSubUnitName();
-                        } else if (dto.getUnitName() != null && !dto.getUnitName().equals("")) {
-                            fatherNodeName = dto.getUnitName();
-                        }
-                        List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
-                                .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
-                        if (list1.size() > 0) {
-                            for (WbsTreeContract contract : list1) {
-                                String[] ids = contract.getAncestorsPId().split(",");
-                                ids = Arrays.stream(ids)
-                                        .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
-                                        .toArray(String[]::new);
-                                String sql = "Select node_name from m_wbs_tree_contract where p_key_id in(" + String.join(",", ids) + ")";
-                                List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
-                                String result = String.join("", nodeNames);
-                                result = result + contract.getNodeName();
-                                String ancestorsName = wbsTreeContractRoot.getNodeName() + StringUtils.defaultString(dto.getUnitName())
-                                        + StringUtils.defaultString(dto.getSubUnitName())
-                                        + StringUtils.defaultString(dto.getDivisionName());
-                                if (result.equals(ancestorsName)) {
-                                    WbsTreeContract subDivision = new WbsTreeContract();
-                                    BeanUtil.copy(contract, subDivision);
-                                    subDivision.setPKeyId(SnowFlakeUtil.getId());
-                                    subDivision.setId(SnowFlakeUtil.getId());
-                                    subDivision.setParentId(contract.getId());
-                                    subDivision.setAncestors(contract.getAncestors() + "," + subDivision.getPKeyId());
-                                    subDivision.setIsCustom(1);
-                                    subDivision.setPartitionCode(dto.getDivisionCode());
-                                    subDivision.setNodeType(3);
-                                    subDivision.setNodeName(dto.getSubDivisionName());
-                                    subDivision.setFullName(dto.getSubDivisionName());
-                                    subDivision.setIsTypePrivatePid(null);
-                                    subDivision.setSort(i);
-                                    subDivision.setTreePId(null);
-                                    subDivision.setDateIsComplete(null);
-                                    subDivision.setPId(contract.getPKeyId());
-                                    subDivision.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
-                                    baseMapper.insert(subDivision);
-                                    insertList.add(subDivision);
-                                    break;
+                    }
+                    //子分部工程:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
+                    if (!dto.getIsSubDivision()) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractList, 4, wbsTreeContractRoot);
+                        if (!exist) {
+                            String fatherNodeName = "";
+                            if (dto.getDivisionName() != null && !dto.getDivisionName().equals("")) {
+                                fatherNodeName = dto.getDivisionName();
+                            } else if (dto.getSubUnitName() != null && !dto.getSubUnitName().equals("")) {
+                                fatherNodeName = dto.getSubUnitName();
+                            } else if (dto.getUnitName() != null && !dto.getUnitName().equals("")) {
+                                fatherNodeName = dto.getUnitName();
+                            }
+                            List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
+                                    .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
+                            if (list1.size() > 0) {
+                                for (WbsTreeContract contract : list1) {
+                                    String[] ids = contract.getAncestorsPId().split(",");
+                                    ids = Arrays.stream(ids)
+                                            .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
+                                            .toArray(String[]::new);
+                                    String sql = "Select node_name from m_wbs_tree_contract where p_key_id in(" + String.join(",", ids) + ")";
+                                    List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
+                                    String result = String.join("", nodeNames);
+                                    result = result + contract.getNodeName();
+                                    String ancestorsName = wbsTreeContractRoot.getNodeName() + StringUtils.defaultString(dto.getUnitName())
+                                            + StringUtils.defaultString(dto.getSubUnitName())
+                                            + StringUtils.defaultString(dto.getDivisionName());
+                                    if (result.equals(ancestorsName)) {
+                                        WbsTreeContract subDivision = new WbsTreeContract();
+                                        BeanUtil.copy(contract, subDivision);
+                                        subDivision.setPKeyId(SnowFlakeUtil.getId());
+                                        subDivision.setId(SnowFlakeUtil.getId());
+                                        subDivision.setParentId(contract.getId());
+                                        subDivision.setAncestors(contract.getAncestors() + "," + subDivision.getPKeyId());
+                                        subDivision.setIsCustom(1);
+                                        subDivision.setPartitionCode(dto.getDivisionCode());
+                                        subDivision.setNodeType(3);
+                                        subDivision.setNodeName(dto.getSubDivisionName());
+                                        subDivision.setFullName(dto.getSubDivisionName());
+                                        subDivision.setIsTypePrivatePid(null);
+                                        subDivision.setSort(i);
+                                        subDivision.setTreePId(null);
+                                        subDivision.setDateIsComplete(null);
+                                        subDivision.setPId(contract.getPKeyId());
+                                        subDivision.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
+                                        baseMapper.insert(subDivision);
+                                        insertList.add(subDivision);
+                                        break;
+                                    }
                                 }
                             }
                         }
-                    }
 
-                }
-                //分项节点:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
-                if (!dto.getIsItem()) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractList, 5, wbsTreeContractRoot);
-                    if (!exist) {
-                        String fatherNodeName = "";
-                        if (dto.getSubDivisionName() != null && !dto.getSubDivisionName().equals("")) {
-                            fatherNodeName = dto.getSubDivisionName();
-                        } else if (dto.getDivisionName() != null && !dto.getDivisionName().equals("")) {
-                            fatherNodeName = dto.getDivisionName();
-                        } else if (dto.getSubUnitName() != null && !dto.getSubUnitName().equals("")) {
-                            fatherNodeName = dto.getSubUnitName();
-                        } else if (dto.getUnitName() != null && !dto.getUnitName().equals("")) {
-                            fatherNodeName = dto.getUnitName();
-                        }
-                        List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
-                                .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
-                        if (list1.size() > 0) {
-                            for (WbsTreeContract contract : list1) {
-                                String[] ids = contract.getAncestorsPId().split(",");
-                                ids = Arrays.stream(ids)
-                                        .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
-                                        .toArray(String[]::new);
-                                String sql = "Select node_name from m_wbs_tree_contract where p_key_id in(" + String.join(",", ids) + ")";
-                                List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
-                                String result = String.join("", nodeNames);
-                                result = result + contract.getNodeName();
-                                String ancestorsName = wbsTreeContractRoot.getNodeName() + StringUtils.defaultString(dto.getUnitName())
-                                        + StringUtils.defaultString(dto.getSubUnitName())
-                                        + StringUtils.defaultString(dto.getDivisionName())
-                                        + StringUtils.defaultString(dto.getSubDivisionName());
-                                if (result.equals(ancestorsName)) {
-                                    WbsTreeContract item = new WbsTreeContract();
-                                    BeanUtil.copy(contract, item);
-                                    item.setPKeyId(SnowFlakeUtil.getId());
-                                    item.setId(SnowFlakeUtil.getId());
-                                    item.setParentId(contract.getId());
-                                    item.setAncestors(contract.getAncestors() + "," + item.getPKeyId());
-                                    item.setIsCustom(1);
-                                    item.setPartitionCode(dto.getItemCode());
-                                    item.setNodeType(4);
-                                    item.setNodeName(dto.getItemName());
-                                    item.setFullName(dto.getItemName());
-                                    item.setIsTypePrivatePid(null);
-                                    item.setSort(i);
-                                    item.setTreePId(null);
-                                    item.setDateIsComplete(null);
-                                    item.setPId(contract.getPKeyId());
-                                    item.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
-                                    baseMapper.insert(item);
-                                    insertList.add(item);
-                                    break;
+                    }
+                    //分项节点:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
+                    if (!dto.getIsItem()) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractList, 5, wbsTreeContractRoot);
+                        if (!exist) {
+                            String fatherNodeName = "";
+                            if (dto.getSubDivisionName() != null && !dto.getSubDivisionName().equals("")) {
+                                fatherNodeName = dto.getSubDivisionName();
+                            } else if (dto.getDivisionName() != null && !dto.getDivisionName().equals("")) {
+                                fatherNodeName = dto.getDivisionName();
+                            } else if (dto.getSubUnitName() != null && !dto.getSubUnitName().equals("")) {
+                                fatherNodeName = dto.getSubUnitName();
+                            } else if (dto.getUnitName() != null && !dto.getUnitName().equals("")) {
+                                fatherNodeName = dto.getUnitName();
+                            }
+                            List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
+                                    .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
+                            if (list1.size() > 0) {
+                                for (WbsTreeContract contract : list1) {
+                                    String[] ids = contract.getAncestorsPId().split(",");
+                                    ids = Arrays.stream(ids)
+                                            .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
+                                            .toArray(String[]::new);
+                                    String sql = "Select node_name from m_wbs_tree_contract where p_key_id in(" + String.join(",", ids) + ")";
+                                    List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
+                                    String result = String.join("", nodeNames);
+                                    result = result + contract.getNodeName();
+                                    String ancestorsName = wbsTreeContractRoot.getNodeName() + StringUtils.defaultString(dto.getUnitName())
+                                            + StringUtils.defaultString(dto.getSubUnitName())
+                                            + StringUtils.defaultString(dto.getDivisionName())
+                                            + StringUtils.defaultString(dto.getSubDivisionName());
+                                    if (result.equals(ancestorsName)) {
+                                        WbsTreeContract item = new WbsTreeContract();
+                                        BeanUtil.copy(contract, item);
+                                        item.setPKeyId(SnowFlakeUtil.getId());
+                                        item.setId(SnowFlakeUtil.getId());
+                                        item.setParentId(contract.getId());
+                                        item.setAncestors(contract.getAncestors() + "," + item.getPKeyId());
+                                        item.setIsCustom(1);
+                                        item.setPartitionCode(dto.getItemCode());
+                                        item.setNodeType(4);
+                                        item.setNodeName(dto.getItemName());
+                                        item.setFullName(dto.getItemName());
+                                        item.setIsTypePrivatePid(null);
+                                        item.setSort(i);
+                                        item.setTreePId(null);
+                                        item.setDateIsComplete(null);
+                                        item.setPId(contract.getPKeyId());
+                                        item.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
+                                        baseMapper.insert(item);
+                                        insertList.add(item);
+                                        break;
+                                    }
                                 }
                             }
                         }
-                    }
 
-                }
-                //子分项节点:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
-                if (!dto.getIsSubItem()) {
-                    Boolean exist = this.isExist(dto, WbsTreeContractList, 6, wbsTreeContractRoot);
-                    if (!exist) {
-                        String fatherNodeName = "";
-                        if (dto.getItemName() != null && !dto.getItemName().equals("")) {
-                            fatherNodeName = dto.getItemName();
-                        } else if (dto.getSubDivisionName() != null && !dto.getSubDivisionName().equals("")) {
-                            fatherNodeName = dto.getSubDivisionName();
-                        } else if (dto.getDivisionName() != null && !dto.getDivisionName().equals("")) {
-                            fatherNodeName = dto.getDivisionName();
-                        } else if (dto.getSubUnitName() != null && !dto.getSubUnitName().equals("")) {
-                            fatherNodeName = dto.getSubUnitName();
-                        } else if (dto.getUnitName() != null && !dto.getUnitName().equals("")) {
-                            fatherNodeName = dto.getUnitName();
-                        }
-                        List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
-                                .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
-                        if (list1.size() > 0) {
-                            for (WbsTreeContract contract : list1) {
-                                String[] ids = contract.getAncestorsPId().split(",");
-                                ids = Arrays.stream(ids)
-                                        .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
-                                        .toArray(String[]::new);
-                                String sql = "Select node_name from m_wbs_tree_contract where p_key_id in(" + String.join(",", ids) + ")";
-                                List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
-                                String result = String.join("", nodeNames);
-                                result = result + contract.getNodeName();
-                                String ancestorsName = wbsTreeContractRoot.getNodeName() + StringUtils.defaultString(dto.getUnitName())
-                                        + StringUtils.defaultString(dto.getSubUnitName())
-                                        + StringUtils.defaultString(dto.getDivisionName())
-                                        + StringUtils.defaultString(dto.getSubDivisionName())
-                                        + StringUtils.defaultString(dto.getItemName());
-                                if (result.equals(ancestorsName)) {
-                                    WbsTreeContract subItem = new WbsTreeContract();
-                                    BeanUtil.copy(contract, subItem);
-                                    subItem.setPKeyId(SnowFlakeUtil.getId());
-                                    subItem.setId(SnowFlakeUtil.getId());
-                                    subItem.setParentId(contract.getId());
-                                    subItem.setAncestors(contract.getAncestors() + "," + subItem.getPKeyId());
-                                    subItem.setIsCustom(1);
-                                    subItem.setPartitionCode(dto.getSubItemCode());
-                                    subItem.setNodeType(5);
-                                    subItem.setNodeName(dto.getSubItemName());
-                                    subItem.setFullName(dto.getSubItemName());
-                                    subItem.setIsTypePrivatePid(null);
-                                    subItem.setSort(i);
-                                    subItem.setTreePId(null);
-                                    subItem.setDateIsComplete(null);
-                                    subItem.setPId(contract.getPKeyId());
-                                    subItem.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
-                                    baseMapper.insert(subItem);
-                                    insertList.add(subItem);
-                                    break;
+                    }
+                    //子分项节点:如果没有被处理过,说明需要新增,最重要是需要找到父节点。现在的办法是(通过祖级节点名称拼接的方式来判断)。
+                    if (!dto.getIsSubItem()) {
+                        Boolean exist = this.isExist(dto, WbsTreeContractList, 6, wbsTreeContractRoot);
+                        if (!exist) {
+                            String fatherNodeName = "";
+                            if (dto.getItemName() != null && !dto.getItemName().equals("")) {
+                                fatherNodeName = dto.getItemName();
+                            } else if (dto.getSubDivisionName() != null && !dto.getSubDivisionName().equals("")) {
+                                fatherNodeName = dto.getSubDivisionName();
+                            } else if (dto.getDivisionName() != null && !dto.getDivisionName().equals("")) {
+                                fatherNodeName = dto.getDivisionName();
+                            } else if (dto.getSubUnitName() != null && !dto.getSubUnitName().equals("")) {
+                                fatherNodeName = dto.getSubUnitName();
+                            } else if (dto.getUnitName() != null && !dto.getUnitName().equals("")) {
+                                fatherNodeName = dto.getUnitName();
+                            }
+                            List<WbsTreeContract> list1 = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getNodeName, fatherNodeName).eq(WbsTreeContract::getProjectId, wbsTreeContractRoot.getProjectId())
+                                    .eq(WbsTreeContract::getContractId, wbsTreeContractRoot.getContractId()).eq(WbsTreeContract::getIsDeleted, 0));
+                            if (list1.size() > 0) {
+                                for (WbsTreeContract contract : list1) {
+                                    String[] ids = contract.getAncestorsPId().split(",");
+                                    ids = Arrays.stream(ids)
+                                            .filter(id -> !id.equals("0")) // 过滤掉值为 "0" 的元素
+                                            .toArray(String[]::new);
+                                    String sql = "Select node_name from m_wbs_tree_contract where p_key_id in(" + String.join(",", ids) + ")";
+                                    List<String> nodeNames = jdbcTemplate.query(sql, new SingleColumnRowMapper<>(String.class));
+                                    String result = String.join("", nodeNames);
+                                    result = result + contract.getNodeName();
+                                    String ancestorsName = wbsTreeContractRoot.getNodeName() + StringUtils.defaultString(dto.getUnitName())
+                                            + StringUtils.defaultString(dto.getSubUnitName())
+                                            + StringUtils.defaultString(dto.getDivisionName())
+                                            + StringUtils.defaultString(dto.getSubDivisionName())
+                                            + StringUtils.defaultString(dto.getItemName());
+                                    if (result.equals(ancestorsName)) {
+                                        WbsTreeContract subItem = new WbsTreeContract();
+                                        BeanUtil.copy(contract, subItem);
+                                        subItem.setPKeyId(SnowFlakeUtil.getId());
+                                        subItem.setId(SnowFlakeUtil.getId());
+                                        subItem.setParentId(contract.getId());
+                                        subItem.setAncestors(contract.getAncestors() + "," + subItem.getPKeyId());
+                                        subItem.setIsCustom(1);
+                                        subItem.setPartitionCode(dto.getSubItemCode());
+                                        subItem.setNodeType(5);
+                                        subItem.setNodeName(dto.getSubItemName());
+                                        subItem.setFullName(dto.getSubItemName());
+                                        subItem.setIsTypePrivatePid(null);
+                                        subItem.setSort(i);
+                                        subItem.setTreePId(null);
+                                        subItem.setDateIsComplete(null);
+                                        subItem.setPId(contract.getPKeyId());
+                                        subItem.setAncestorsPId(contract.getAncestorsPId() + "," + contract.getPKeyId());
+                                        baseMapper.insert(subItem);
+                                        insertList.add(subItem);
+                                        break;
+                                    }
                                 }
                             }
                         }
-                    }
 
+                    }
                 }
+                bladeRedis.setEx("import:projectId:"+wbsTreeContractRoot.getProjectId()+"contractId:"+wbsTreeContractRoot.getContractId(), "100%",5L);
+            } catch (Exception e) {
+                bladeRedis.del("import:projectId:"+wbsTreeContractRoot.getProjectId()+"contractId:"+wbsTreeContractRoot.getContractId());
+            }finally {
+                bladeRedis.del("import:projectId:"+wbsTreeContractRoot.getProjectId()+"contractId:"+wbsTreeContractRoot.getContractId());
             }
-            bladeRedis.setEx("import:projectId:"+wbsTreeContractRoot.getProjectId()+"contractId:"+wbsTreeContractRoot.getContractId(), "100%",5L);
-        } catch (Exception e) {
-            bladeRedis.del("import:projectId:"+wbsTreeContractRoot.getProjectId()+"contractId:"+wbsTreeContractRoot.getContractId());
-        }finally {
-            bladeRedis.del("import:projectId:"+wbsTreeContractRoot.getProjectId()+"contractId:"+wbsTreeContractRoot.getContractId());
+            return R.success("新增了" + insertList.size() + "个节点" + "," + String.join(",", updateList) + "节点编号已被修改");
+        } catch (IOException e) {
+            return R.fail("文件处理失败: " + e.getMessage());
         }
-        return R.success("新增了" + insertList.size() + "个节点" + "," + String.join(",", updateList) + "节点编号已被修改");
     }
 
     @Override
@@ -4559,13 +4565,21 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         workbook.close();
 
         ByteArrayResource resource = new ByteArrayResource(outputStream.toByteArray());
+
+
+        // 对中文文件名进行URL编码
+        String filename = "划分导出(请勿修改隐藏列).xlsx";
+        String encodedFilename = URLEncoder.encode(filename, "UTF-8")
+                .replaceAll("\\+", "%20"); // 替换+号为%20,确保兼容性
+
         return ResponseEntity.ok()
-                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=划分.xlsx")
+                .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + encodedFilename + "\"; filename*=utf-8''" + encodedFilename)
                 .contentType(MediaType.APPLICATION_OCTET_STREAM)
                 .contentLength(resource.contentLength())
                 .body(resource);
     }
 
+
     // 列映射关系:pkeyId列 -> 划分编码列
     private static final Map<Integer, Integer> COLUMN_MAPPING = new HashMap<>();
 
@@ -4645,12 +4659,12 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
     }
 
     @Override
-    public R getIsImport(Long projectId, Long contractId) {
+    public Boolean getIsImport(Long projectId, Long contractId) {
         Object o = bladeRedis.get("import:projectId:" + projectId + "contractId:" + contractId);
         if(o!=null){
-            return R.status(false);
+            return true;
         }else {
-            return R.status(true);
+            return false;
         }
     }
 

+ 0 - 15
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -437,21 +437,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         for (WbsTreePrivateDTO2 wbsTreePrivate : wbsTreeDTO) {
             wbsTreePrivate.setSort(number);
             baseMapper.updateSortById2(wbsTreePrivate.getPKeyId(), wbsTreePrivate.getSort());
-
-            WbsTreePrivate objPrivate = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getPKeyId()));
-            if (objPrivate != null) {
-                String projectId = objPrivate.getProjectId();
-                String wbsId = objPrivate.getWbsId();
-                Long id = objPrivate.getId();
-
-//                //合同段wbs树同步排序
-//                LambdaUpdateWrapper<WbsTreeContract> updateWrapper = new LambdaUpdateWrapper<>();
-//                updateWrapper.eq(WbsTreeContract::getWbsId, wbsId);
-//                updateWrapper.eq(WbsTreeContract::getProjectId, projectId);
-//                updateWrapper.eq(WbsTreeContract::getId, id);
-//                updateWrapper.set(WbsTreeContract::getSort, number);
-//                wbsTreeContractMapper.update(null, updateWrapper);
-            }
             number++;
         }
         return true;

+ 15 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -557,25 +557,26 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     }
 
     @Override
-    public Object getQueryValueByNodeType(String wbsId, String projectId, String queryValue, Integer nodeType, Integer majorDataType) {
-        Set<WbsTreePrivate> resultNodes = new HashSet<>();
-        LambdaQueryWrapper<WbsTreePrivate> wrapper = Wrappers.<WbsTreePrivate>lambdaQuery()
-                .eq(WbsTreePrivate::getType, 1).eq(WbsTreePrivate::getWbsId, wbsId).eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getNodeType, nodeType);
-        if (majorDataType != null) {
-            if (majorDataType > 0) {
-                wrapper.eq(WbsTreePrivate::getMajorDataType, majorDataType);
-            } else if (majorDataType == -1) {
-                wrapper.and(wrapper1 -> wrapper1.isNull(WbsTreePrivate::getMajorDataType).or().eq(WbsTreePrivate::getMajorDataType, 0));
+    public Object getQueryValueByNodeType(WbsTreePrivateQueryVO vo) {
+        LambdaQueryWrapper<WbsTreePrivate> wrapper = Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getType, 1).eq(WbsTreePrivate::getWbsId, vo.getWbsId()).eq(WbsTreePrivate::getProjectId, vo.getProjectId());
+        wrapper.eq(vo.getNodeType() != null, WbsTreePrivate::getNodeType, vo.getNodeType());
+        wrapper.eq(vo.getIsAddConceal() != null, WbsTreePrivate::getIsAddConceal, vo.getIsAddConceal());
+        wrapper.eq(vo.getClassName() != null, WbsTreePrivate::getClassName, vo.getClassName());
+        wrapper.eq(vo.getUnitName() != null, WbsTreePrivate::getUnitName, vo.getUnitName());
+        wrapper.like(vo.getQueryValue() != null && !vo.getQueryValue().isEmpty() ,WbsTreePrivate::getNodeName, vo.getQueryValue());
+        if (vo.getMajorDataType() != null) {
+            if (vo.getMajorDataType() > 0) {
+                wrapper.eq(WbsTreePrivate::getMajorDataType, vo.getMajorDataType());
+            } else if (vo.getMajorDataType() == -1) {
+                wrapper.and( wrapper1 -> wrapper1.isNull(WbsTreePrivate::getMajorDataType).or().eq(WbsTreePrivate::getMajorDataType, 0));
             }
         }
-        if (queryValue != null && !queryValue.trim().isEmpty()) {
-            wrapper.like(WbsTreePrivate::getNodeName, queryValue);
-        }
         List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(wrapper);
-        this.getParentNodesPrivateWbs(wbsTreePrivates, resultNodes, projectId, wbsId);
+        Set<WbsTreePrivate> resultNodes = new HashSet<>();
+        this.getParentNodesPrivateWbs(wbsTreePrivates, resultNodes, vo.getProjectId(), vo.getWbsId());
         resultNodes.addAll(wbsTreePrivates);
         List<WbsTreePrivateQueryValueVO> wbsTreePrivateQueryValueVOS = BeanUtil.copyProperties(resultNodes, WbsTreePrivateQueryValueVO.class);
-        if (wbsTreePrivateQueryValueVOS.size() > 0) {
+        if (!wbsTreePrivateQueryValueVOS.isEmpty()) {
             List<WbsTreePrivateQueryValueVO> listRoot = wbsTreePrivateQueryValueVOS.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
             Map<Long, List<WbsTreePrivateQueryValueVO>> mapAll = wbsTreePrivateQueryValueVOS.stream().collect(Collectors.groupingBy(WbsTreePrivateQueryValueVO::getParentId));
             this.buildWbsTreePrivateByGetQueryValueByType(listRoot, mapAll);

+ 35 - 19
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

@@ -3574,12 +3574,12 @@ public class TaskController extends BladeController {
             }
         }
         keySql.append("id");
-        valSql.append(id == null ? SnowFlakeUtil.getId() : id + ", ");
+        valSql.append(id == null ? SnowFlakeUtil.getId() : id);
         if (groupId ==  null) {
             groupId = dataMap2.get("group_id");
         }
         if (groupId != null) {
-            keySql.append(", group_id, ");
+            keySql.append(", group_id");
             valSql.append(", ").append(groupId);
         }
         if (pKeyId == null) {
@@ -3595,27 +3595,35 @@ public class TaskController extends BladeController {
         dataMap2.remove("group_id");
         dataMap2.remove("p_key_id");
         String fields = dataMap2.keySet().stream().map(key -> "'" + key + "'").collect(Collectors.joining(","));
-        List<Map<String, Object>> fieldMap = jdbcTemplate.queryForList("select distinct COLUMN_NAME as fieldName, CHARACTER_MAXIMUM_LENGTH as fieldLength from information_schema.COLUMNS where  TABLE_NAME = '" + tabName +
-                "' and COLUMN_NAME in (" + fields + ")");
-        Map<String, Integer> map = fieldMap.stream().collect(toMap(k -> k.get("fieldName") + "", v -> {
+        Map<String, Integer> map = new HashMap<>();
+        if (!fields.isEmpty()) {
             try {
-                return Integer.parseInt(v.get("fieldLength") + "");
+                fields = fields + ", 'key_201'";
+                List<Map<String, Object>> fieldMap = jdbcTemplate.queryForList("select distinct COLUMN_NAME as fieldName, CHARACTER_MAXIMUM_LENGTH as fieldLength from information_schema.COLUMNS where  TABLE_NAME = '" + tabName +
+                        "' and COLUMN_NAME in (" + fields + ")");
+                map = fieldMap.stream().collect(toMap(k -> k.get("fieldName") + "", v -> {
+                    try {
+                        return Integer.parseInt(v.get("fieldLength") + "");
+                    } catch (Exception e) {
+                        return 0;
+                    }
+                }, Math::min));
             } catch (Exception e) {
-                return 0;
+                e.printStackTrace();
             }
-        }, Math::min));
+        }
         for (String key : dataMap2.keySet()) {
             String[] split = key.split("_");
             if (split.length > 1 && Integer.parseInt(split[1]) > 80) {
                 // 大于80则保留在扩展字段中
                 opsParamMap.put(key, dataMap2.get(key) == null ? "" : dataMap2.get(key) + "");
             } else {
-                Object value = dataMap2.get(key);
+                String value = dataMap2.get(key) == null ? null : dataMap2.get(key) + "";
                 if (value != null) {
                     Integer i = map.get(key);
                     // 长度超过数据库长度也保留在扩展字段中
-                    if (i != null &&  value.toString().length() > i) {
-                        opsParamMap.put(key, value.toString());
+                    if (i != null &&  value.length() > i) {
+                        opsParamMap.put(key, value);
                         continue;
                     }
                 }
@@ -3625,16 +3633,24 @@ public class TaskController extends BladeController {
         }
         if (!opsParamMap.isEmpty()) {
             keySql.append(", key_201");
-            Integer i = map.get("key_201");
             String data = DataStructureFormatUtils.buildData(opsParamMap);
-            if (i != null && data.length() > i) {
-                if (i < 10000) {
-                    // 65535 byte
-                    jdbcTemplate.execute("alter table " + tabName + " modify column key_201 text");
-                }else {
-                    // 16777215 byte
-                    jdbcTemplate.execute("alter table " + tabName + " modify column key_201 mediumtext");
+            try {
+                if (!map.containsKey( "key_201")) {
+                    jdbcTemplate.execute("alter table " + tabName + " add column key_201 text");
+                } else  {
+                    Integer i = map.get("key_201");
+                    if (data.length() > i) {
+                        if (i < 10000) {
+                            // 65535 byte
+                            jdbcTemplate.execute("alter table " + tabName + " modify column key_201 text");
+                        }else {
+                            // 16777215 byte
+                            jdbcTemplate.execute("alter table " + tabName + " modify column key_201 mediumtext");
+                        }
+                    }
                 }
+            } catch (Exception e) {
+                e.printStackTrace();
             }
             valSql.append(", '").append(data).append("'");
         }