浏览代码

Merge branch 'master' of http://47.110.251.215:3000/java_org/bladex

“zhifk” 2 年之前
父节点
当前提交
309ffc1afa
共有 55 个文件被更改,包括 1654 次插入928 次删除
  1. 1 9
      blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java
  2. 9 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java
  3. 2 1
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/MileageClient.java
  4. 11 2
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOptionVo.java
  5. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/FormulaOption.java
  6. 15 8
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsParam.java
  7. 19 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java
  8. 53 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeAllVO.java
  9. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractVO.java
  10. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java
  11. 144 15
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  12. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  13. 6 0
      blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java
  14. 5 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java
  15. 17 2
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml
  16. 9 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java
  17. 1 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java
  18. 11 2
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java
  19. 83 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java
  20. 1 44
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java
  21. 2 2
      blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java
  22. 6 17
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  23. 8 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java
  24. 34 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java
  25. 173 76
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  26. 24 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  27. 15 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ProjectInfoController.java
  28. 15 17
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java
  29. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreePrivateController.java
  30. 4 4
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java
  31. 1 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.java
  32. 5 21
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml
  33. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/TableFileMapper.java
  34. 5 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsFormElementMapper.xml
  35. 8 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsParamMapper.xml
  36. 0 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.java
  37. 3 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml
  38. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.java
  39. 4 3
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreePrivateMapper.xml
  40. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IArchiveTreeContractService.java
  41. 2 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IContractInfoService.java
  42. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaOptionService.java
  43. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaService.java
  44. 18 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java
  45. 29 8
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java
  46. 70 17
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  47. 193 146
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  48. 13 13
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaOptionServiceImpl.java
  49. 108 33
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  50. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/TableFileServiceImpl.java
  51. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsParamServiceImpl.java
  52. 24 17
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java
  53. 322 303
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  54. 107 65
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java
  55. 51 30
      blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

+ 1 - 9
blade-ops/blade-resource/src/main/java/org/springblade/resource/endpoint/OssEndpoint.java

@@ -16,17 +16,10 @@
  */
 package org.springblade.resource.endpoint;
 
-import com.aspose.cells.SaveFormat;
-import com.aspose.words.DocumentBuilder;
-import com.itextpdf.text.Image;
-import com.itextpdf.text.Rectangle;
-import com.itextpdf.text.pdf.PdfWriter;
 import io.swagger.annotations.Api;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
 import org.apache.pdfbox.pdmodel.PDDocument;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.WorkbookFactory;
 import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.oss.model.OssFile;
 import org.springblade.core.secure.annotation.PreAuth;
@@ -40,11 +33,10 @@ import org.springblade.resource.entity.Attach;
 import org.springblade.resource.feign.CommonFileClient;
 import org.springblade.resource.service.IAttachService;
 import org.springblade.resource.vo.NewBladeFile;
-import org.springblade.resource.vo.ToPdfVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
-import java.io.*;
+
 import java.util.Objects;
 
 /**

+ 9 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/InformationQueryClient.java

@@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
+import java.util.Map;
 
 @FeignClient(value =
         BusinessConstant.APPLICATION_WEATHER_NAME
@@ -25,6 +26,14 @@ public interface InformationQueryClient {
     @PostMapping(API_PREFIX + "/queryFirstBusinessDataByFirstId")
     JSONObject queryFirstBusinessDataByFirstId(@RequestParam String firstId);
 
+    /**
+     * 获取当前合同树和所有已填报表信息
+     * @param contractId
+     * @return
+     */
+    @PostMapping(API_PREFIX + "/getTreeAllTable")
+    Map<String,Long> getTreeAllTable(@RequestParam String contractId);
+
     /**
      * 保存填报时新增或修改填报资料记录表数据
      *

+ 2 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/MileageClient.java

@@ -14,7 +14,8 @@ import java.util.Map;
  * @author yangyj
  */
 @FeignClient(value = BusinessConstant.APPLICATION_WEATHER_NAME)
-public interface MileageClient {
+public interface
+MileageClient {
     /**
      * 接口前缀
      */

+ 11 - 2
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOptionVo.java

@@ -2,6 +2,7 @@ package org.springblade.manager.dto;
 
 import lombok.Data;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.entity.FormulaOption;
 
 /**
@@ -16,10 +17,11 @@ public class FormulaOptionVo {
     private String key;
     private Long contractId;
     private String value;
-    private Long pKeyId;
+    private Long pkeyId;
     private Integer scope;
+    private String name;
     public boolean saveChecked(){
-        if( Func.isNotBlank(value)&&contractId!=null&&parentId!=null&&pKeyId!=null&&key!=null&&scope!=null){
+        if( Func.isNotBlank(value)&&contractId!=null&&parentId!=null&&pkeyId!=null&&key!=null&&scope!=null){
             if(scope==0){
                 /*scope==0是元素范围,1是单元格范围*/
                 this.key=key.replaceAll("__[\\d_]+","");
@@ -40,4 +42,11 @@ public class FormulaOptionVo {
     public boolean isCellScope(){
         return this.scope==1;
     }
+    public String createKey(){
+        if(isElementScope()){
+          return key;
+        }else{
+            return pkeyId+ StringPool.AT +key;
+        }
+    }
 }

+ 1 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/FormulaOption.java

@@ -13,7 +13,7 @@ import lombok.EqualsAndHashCode;
  * @description TODO
  */
 @Data
-@TableName("m_formula")
+@TableName("m_formula_option")
 public class FormulaOption {
     @ApiModelProperty("主键id")
     @TableId(

+ 15 - 8
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/WbsParam.java

@@ -13,15 +13,22 @@ import org.springblade.core.mp.base.BaseEntity;
 @EqualsAndHashCode(callSuper = true)
 @Data
 @TableName("m_wbs_param")
-public class WbsParam  extends BaseEntity {
+public class WbsParam extends BaseEntity {
     private static final long serialVersionUID = 1L;
-    private  String name;
-    private  String k;
-    private  String v;
-    private  String remark;
-    private  Integer type;
+    private String name;
+    private String k;
+    private String v;
+    private String remark;
+    private Integer type;
+
     /**
      * WBS树节点Id
-     * */
-    private  Long nodeId;
+     */
+    private Long nodeId;
+
+    /**
+     * 项目id,同步节点参数使用
+     */
+    private Long projectId;
+
 }

+ 19 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ArchiveTreeContractVO2.java

@@ -24,6 +24,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springblade.core.tool.node.INode;
 import org.springblade.manager.entity.ArchiveTreeContract;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.BeansException;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -194,4 +196,21 @@ public class ArchiveTreeContractVO2 implements INode<ArchiveTreeContractVO2> {
 				+ ")";
 	}
 
+	public ArchiveTreeContractVO2() {
+	}
+
+	public ArchiveTreeContractVO2(ArchiveTreeContract archiveTree) {
+		if (archiveTree == null) {
+			return;
+		}
+
+		try {
+			BeanUtils.copyProperties(archiveTree,this);
+			this.setTitle(archiveTree.getNodeName());
+
+		} catch (BeansException e) {
+			e.printStackTrace();
+		}
+	}
+
 }

+ 53 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeContractTreeAllVO.java

@@ -0,0 +1,53 @@
+package org.springblade.manager.vo;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.tool.node.INode;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class WbsTreeContractTreeAllVO implements INode<WbsTreeContractTreeAllVO> {
+
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    private Long primaryKeyId;
+
+    private String title;
+
+    private Integer nodeType;
+
+    private String partitionCode;
+
+    private Long parentId;
+
+    private Integer sort;
+
+    private Long submitCounts;
+
+    @ApiModelProperty("未填报1 、已填报-未上报2 、已填报-待审批3 、已审批4")
+    private Integer colorStatus;
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private List<WbsTreeContractTreeAllVO> children;
+
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    private Boolean hasChildren;
+
+    @Override
+    public List<WbsTreeContractTreeAllVO> getChildren() {
+        if (this.children == null) {
+            this.children = new ArrayList<>();
+        }
+        return this.children;
+    }
+
+    @Override
+    public Boolean getHasChildren() {
+        return hasChildren;
+    }
+}

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

@@ -62,6 +62,8 @@ public class WbsTreeContractVO extends WbsTreeContract implements INode<WbsTreeC
     @JsonInclude(JsonInclude.Include.NON_EMPTY)
     private Boolean hasChildren;
 
+    private Long submitCounts;
+
     public WbsTreeContractVO() {
     }
 

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/ImageClassificationFileController.java

@@ -210,10 +210,10 @@ public class ImageClassificationFileController extends BladeController {
                                                 float reduceMultiple = 0.5f;
                                                 bytes = FileUtils.resizeImage(bytes, reduceMultiple);
                                             }*/
-                                            bytes = FileUtils.resizeImage(bytes, 0f);
+                                            byte[] bytesNew = FileUtils.resizeImage(bytes, 0f);
 
                                             //创建图片
-                                            drawing.createPicture(anchor, workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG));
+                                            drawing.createPicture(anchor, workbook.addPicture(bytesNew, Workbook.PICTURE_TYPE_JPEG));
                                             //图片定位
                                             FileUtils.imageOrientation(sheet, anchor, i == 1 ? new DataVO(1, 28) : new DataVO(0, 0));
 

+ 144 - 15
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -36,6 +36,7 @@ import org.springblade.core.oss.model.BladeFile;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.node.ForestNodeMerger;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.StringUtil;
@@ -428,7 +429,7 @@ public class InformationWriteQueryController extends BladeController {
                     List<InformationQuery> query = jdbcTemplate.query(sqlSb, new BeanPropertyRowMapper<>(InformationQuery.class));
                     if (query.size() > 0) {
                         for (InformationQuery informationQuery : query) {
-                            taskStatusMap.put((new Integer(1)).equals(informationQuery.getClassify()) ? "施工" : "监理", selectNode.getNodeName());
+                            taskStatusMap.put((new Integer(1)).equals(informationQuery.getClassify()) ? "施工" : "监理", selectNode.getFullName());
                         }
                         continue;
                     }
@@ -1244,6 +1245,118 @@ public class InformationWriteQueryController extends BladeController {
         return R.status(wbsTreeContractClient.diySort(sortLists));
     }
 
+    /**
+     * 复制节点
+     */
+    @PostMapping("/copyContractTreeNode11")
+    @ApiOperationSupport(order = 15)
+    @ApiOperation(value = "复制节点")
+    public R<Boolean> copyContractTreeNode11(@RequestBody CopyContractTreeNodeVO vo) {
+        //首先查询需要复制的节点及其下级所有子节点的信息
+        WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
+        // 获取当前节点的所有子节点
+       String vocational = SnowFlakeUtil.getId()+"";
+        // 插入数据库
+        // informationQueryService.copeNodeData(needCopyNode.getId()+"",vocational);
+        // 修改
+        //
+        //
+        //新增施工台账
+        System.out.println("1="+DateUtil.formatDateTime(DateUtil.now()));
+        List<WbsTreeContract>   saveList = new ArrayList<>();
+        List<ConstructionLedger> saveLedger = new ArrayList<>();
+        System.out.println("2="+DateUtil.formatDateTime(DateUtil.now()));
+        List<WbsTreeContract> nodeChildAll = informationQueryService.getNodeChildAllByNodeId(needCopyNode.getId() + "", needCopyNode.getContractId(),vo.getNeedCopyPrimaryKeyId());
+        System.out.println("3="+DateUtil.formatDateTime(DateUtil.now()));
+        if (StringUtils.isNotEmpty(vo.getNeedCopyPrimaryKeyId())) {
+            WbsTreeContract parent = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getParentPrimaryKeyId());
+
+            //重塑关键信息
+            Map<Long, Long> oldToNewIdMap = new HashMap<>();
+            //节点信息
+            Map<String, WbsTreeContract> nodeMap = new HashMap<>();
+            nodeChildAll.forEach(node -> {
+                oldToNewIdMap.put(node.getId(), SnowFlakeUtil.getId());
+                nodeMap.put(node.getId().toString(), node);
+            });
+
+            System.out.println("4="+DateUtil.formatDateTime(DateUtil.now()));
+            //todo 单份复制
+            nodeChildAll.forEach(node -> {
+                WbsTreeContract newData = new WbsTreeContract();
+                BeanUtils.copyProperties(node, newData);
+
+                //重塑关键信息
+                //重塑primaryKeyId
+                newData.setPKeyId(SnowFlakeUtil.getId());
+                //设置旧ID
+                if (StringUtils.isNotEmpty(node.getOldId())) {
+                    newData.setOldId(node.getOldId());
+                } else {
+                    newData.setOldId(node.getId().toString());
+                }
+
+                //设置新ID
+                if (new Integer("1").equals(node.getType())) {
+                    //如果是节点类型才重塑ID
+                    newData.setId(oldToNewIdMap.containsKey(node.getId()) ? oldToNewIdMap.get(node.getId()) : SnowFlakeUtil.getId());
+
+                    //划分编号
+                    newData.setPartitionCode(StringUtils.isNotEmpty(vo.getPartitionCode()) ? vo.getPartitionCode() : null);
+                }
+                //设置父节点ID
+                if (vo.getNeedCopyPrimaryKeyId().equals(node.getPKeyId().toString())) {
+                    //找到复制的节点,将parentId更改为 parent.getId()
+                    newData.setParentId(parent.getId());
+                    //设置新名称
+                    newData.setNodeName(vo.getNeedCopyNodeName());
+                    newData.setFullName(vo.getNeedCopyNodeName());
+                } else {
+                    newData.setParentId(oldToNewIdMap.containsKey(node.getParentId()) ? oldToNewIdMap.get(node.getParentId()) : SnowFlakeUtil.getId());
+                }
+                newData.setCreateTime(new Date());
+                newData.setUpdateTime(new Date());
+                //初始化是否显示表格,默认显示
+                newData.setIsBussShow(1);
+                //初始化表格是否上传附件,默认未上传
+                newData.setTabFileType(1);
+                //初始化单表是否可以预览,默认不能
+                newData.setIsTabPdf(1);
+                //初始化PDF路径
+                newData.setPdfUrl(null);
+                newData.setCreateUser(AuthUtil.getUserId());
+
+                //获取当前所有复制的节点的最大sort
+              //  String sql = "select sort from m_wbs_tree_contract where contract_id = '" + node.getContractId() + "' and (id = '" + node.getId() + "' or old_id = '" + node.getId() + "')";
+             //   List<WbsTreeContract> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreeContract.class));
+            //    List<Integer> collect = query.stream().filter(f -> ObjectUtils.isNotEmpty(f.getSort())).collect(Collectors.toList()).stream().map(WbsTreeContract::getSort).collect(Collectors.toList());
+                Integer max = 1;
+             //   if (collect.size() > 0) {
+            //        max = collect.stream().reduce(collect.get(0), Integer::max);
+             //   } else {
+              //      max = 1;
+             //   }
+                //设置sort
+                newData.setSort(max);
+                //重塑父节点关联关系
+                this.restoreParent(newData, oldToNewIdMap);
+
+                //保存到集合中
+                saveList.add(newData);
+
+                if (new Integer("6").equals(node.getNodeType())) {
+                    //生成施工日志
+                    this.createLedger(newData, saveLedger, nodeMap, null);
+                }
+            });
+            System.out.println("7="+DateUtil.formatDateTime(DateUtil.now()));
+        }
+
+        return this.saveOrCopyNodeTree(saveList, saveLedger, 32, needCopyNode);
+    }
+
+
+
     /**
      * 复制节点
      */
@@ -1251,10 +1364,8 @@ public class InformationWriteQueryController extends BladeController {
     @ApiOperationSupport(order = 15)
     @ApiOperation(value = "复制节点")
     public R<Boolean> copyContractTreeNode(@RequestBody CopyContractTreeNodeVO vo) {
-
         //首先查询需要复制的节点及其下级所有子节点的信息
         WbsTreeContract needCopyNode = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getNeedCopyPrimaryKeyId());
-
         //获取当前合同段所有节点
         List<WbsTreeContract> allContractNodeList = this.wbsTreeContractClient.searchContractTree(needCopyNode.getContractId());
 
@@ -1277,17 +1388,20 @@ public class InformationWriteQueryController extends BladeController {
             });
         }
 
+        System.out.println("1="+DateUtil.formatDateTime(DateUtil.now()));
         List<WbsTreeContract> parentList = new ArrayList<>(), childList = new ArrayList<>(), allList = new ArrayList<>(), saveList = new ArrayList<>();
         //新增施工台账
         List<ConstructionLedger> saveLedger = new ArrayList<>();
 
         parentList.add(needCopyNode);
-
-        //查询所有有效子节点
+        System.out.println("2="+DateUtil.formatDateTime(DateUtil.now()));
+        //查询所有有效子节点(慢 10分钟)
         this.foreachQueryChildContract(parentList, childList, contractAllNodeMap);
+
+        System.out.println("3="+DateUtil.formatDateTime(DateUtil.now()));
         allList.addAll(parentList);
         allList.addAll(childList);
-
+        System.out.println("4="+DateUtil.formatDateTime(DateUtil.now()));
         if ("1".equals(vo.getCopyType())) {
             if (StringUtils.isNotEmpty(vo.getNeedCopyPrimaryKeyId())) {
                 WbsTreeContract parent = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getParentPrimaryKeyId());
@@ -1300,6 +1414,9 @@ public class InformationWriteQueryController extends BladeController {
                     oldToNewIdMap.put(node.getId(), SnowFlakeUtil.getId());
                     nodeMap.put(node.getId().toString(), node);
                 });
+
+
+                System.out.println("5="+DateUtil.formatDateTime(DateUtil.now()));
                 //todo 单份复制
                 allList.forEach(node -> {
                     WbsTreeContract newData = new WbsTreeContract();
@@ -1370,7 +1487,7 @@ public class InformationWriteQueryController extends BladeController {
                     }
                 });
             }
-
+            System.out.println("6="+DateUtil.formatDateTime(DateUtil.now()));
         } else {
             //todo 多份复制
             //获取需要复制到的位置集合
@@ -1727,6 +1844,7 @@ public class InformationWriteQueryController extends BladeController {
         if (queryProcess != null && queryProcess.size() > 0) {
             //检查这些填报节点是否存在已经审批或已经上报的节点,如果存在则不允许删除
             List<QueryProcessDataVO> approvalList = queryProcess.stream().filter(vo -> new Integer("2").equals(vo.getStatus())).collect(Collectors.toList());
+            //
             List<QueryProcessDataVO> runTaskList = queryProcess.stream().filter(vo -> new Integer("1").equals(vo.getStatus())).collect(Collectors.toList());
             if (approvalList.size() > 0 || runTaskList.size() > 0) {
                 //说明存在已经审批或已经上报的节点,不允许删除
@@ -1815,7 +1933,6 @@ public class InformationWriteQueryController extends BladeController {
                 //处理完重复数据后,设置进集合中
                 selectedNodeList.addAll(childList);
             }
-
             //处理半选
             this.disposeHalfSelectList(treeContract, halfSelectedNodeList, selectedNodeList);
 
@@ -1837,7 +1954,6 @@ public class InformationWriteQueryController extends BladeController {
             }
             //处理半选
             this.disposeHalfSelectList(treeContract, halfSelectedNodeList, selectedNodeList);
-
         }
 
         //保存集合
@@ -1888,7 +2004,6 @@ public class InformationWriteQueryController extends BladeController {
                 }
                 //设置sort
                 newData.setSort(max);
-
                 //设置节点名称
                 for (AddContractTreeNodeVO.Node addVO : selectList) {
                     if (half.getPKeyId().toString().equals(addVO.getPrimaryKeyId())) {
@@ -1928,7 +2043,6 @@ public class InformationWriteQueryController extends BladeController {
                         break;
                     }
                 }
-
                 //设置到保存集合中
                 saveList.add(newData);
 
@@ -1936,7 +2050,6 @@ public class InformationWriteQueryController extends BladeController {
                     //生成施工日志
                     this.createLedger(newData, saveLedger, null, nodeMap);
                 }
-
             });
         }
 
@@ -1956,10 +2069,18 @@ public class InformationWriteQueryController extends BladeController {
 
     @NotNull
     private R<Boolean> saveOrCopyNodeTree(List<WbsTreeContract> saveList, List<ConstructionLedger> saveLedger, Integer operationType, WbsTreeContract currentNode) {
+
         if (saveList.size() > 0) {
+            StringBuilder str = new StringBuilder();
             //保存施工日志
             if (saveLedger.size() > 0) {
                 this.constructionLedgerService.saveBatch(saveLedger, 1000);
+                str.append("-[");
+                for (ConstructionLedger ledger : saveLedger) {
+                    str.append(ledger.getSite()+",");
+                }
+                str.deleteCharAt(str.length()-1);
+                str.append("]");
             }
 
             try {
@@ -1972,7 +2093,7 @@ public class InformationWriteQueryController extends BladeController {
                     WbsTreeContract node = result.get(result.size() - i);
                     pathName.append("-").append(StringUtils.isNotEmpty(node.getFullName()) ? node.getFullName() : node.getNodeName());
                 }
-
+                pathName.append(str);
                 JSONObject json = new JSONObject();
                 json.put("operationObjIds", JSONArray.parseArray(JSONObject.toJSONString(saveList.stream().map(WbsTreeContract::getPKeyId).distinct().collect(Collectors.toList())), String.class));
                 json.put("operationObjName", pathName.substring(1));
@@ -1982,8 +2103,9 @@ public class InformationWriteQueryController extends BladeController {
             } catch (Exception e) {
                 e.printStackTrace();
             }
-            //保存节点
-            return R.data(this.wbsTreeContractClient.saveBatch(saveList));
+            //保存节点(10s)
+            Boolean aBoolean = this.wbsTreeContractClient.saveBatch(saveList);
+            return R.data(aBoolean);
         }
 
         return R.data(false);
@@ -2325,6 +2447,7 @@ public class InformationWriteQueryController extends BladeController {
 
         //获取合同段,检查是否是监理合同段
         ContractInfo contractInfo = this.contractClient.getContractById(Long.parseLong(contractId));
+
         if (new Integer("2").equals(contractInfo.getContractType()) || new Integer("3").equals(contractInfo.getContractType())) {
             //监理/业主合同段,需要获取关联的施工方合同段根节点数据
             List<String> contractIds = new ArrayList<>();
@@ -2334,6 +2457,12 @@ public class InformationWriteQueryController extends BladeController {
                 contractIds.add(contractIdRelation);
             }
             if (contractIds.size() > 0) {
+
+                //监理复制加载树问题
+                if (StringUtils.isEmpty(classifyType)){
+                    classifyType = "2";
+                }
+
                 if (StringUtils.isNotEmpty(parentId)) {
                     //子节点
                     rootTreeNode = this.informationQueryService.queryContractTreeSupervision(contractIds, parentId, Integer.parseInt(classifyType));

+ 7 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -578,12 +578,19 @@ public class TaskController extends BladeController {
 			taskBatch.setCreateTime(new Date());
 			this.taskBatchService.save(taskBatch);
 
+			//修改试验填报状态 TODO 暂时不清楚该接口是否需要
+			this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatus(taskApprovalVOS);
+
 			return R.data(true, "当前等待电签的批次较多,请等待几分钟后刷新页面查看........");
 		} else {
 			//生成等待批次,任务完成后删除
 			List<TaskApprovalVO> taskApprovalVOS = new ArrayList<>();
 			taskApprovalVOS.add(taskApprovalVO);
 			this.taskService.batchCompleteApprovalTask(taskApprovalVOS,AuthUtil.getUserId());
+
+			//修改试验填报状态 TODO 暂时不清楚该接口是否需要
+			this.iTrialSelfInspectionRecordService.updateTrialSelfInspectionRecordStatus(taskApprovalVOS);
+
 			return R.data(true, "提交成功");
 		}
 	}

+ 6 - 0
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/InformationQueryClientImpl.java

@@ -13,6 +13,7 @@ import org.springblade.common.utils.SnowFlakeUtil;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
+import java.util.Map;
 
 @RestController
 @AllArgsConstructor
@@ -36,6 +37,11 @@ public class InformationQueryClientImpl implements InformationQueryClient {
 
         return null;
     }
+    //获取当前合同树和所有已填报表信息
+    @Override
+    public Map<String, Long> getTreeAllTable(String contractId) {
+        return iInformationQueryService.getTreeAllTable(contractId);
+    }
 
     @Override
     public String saveOrUpdateInformationQueryData(String wbsId, String tableId,

+ 5 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.java

@@ -101,4 +101,9 @@ public interface InformationQueryMapper extends BaseMapper<InformationQuery> {
 
     void updateBatchByPKeyId(@Param("list")List<WbsTreeContract> result);
 
+	// 节点复制数据
+	boolean copeNodeData(String nodeId, String vocationalId);
+
+
+	List<WbsTreeContract> getNodeChildAllByNodeId(String nodeId,String contractId,String pKeyId);
 }

+ 17 - 2
blade-service/blade-business/src/main/java/org/springblade/business/mapper/InformationQueryMapper.xml

@@ -397,7 +397,8 @@
                 iq.id,
                 (case iq.STATUS when 0 THEN null else t.batch end) as report_number,
                 date_format(iq.create_time,'%Y-%m-%d') as createTimes
-                from u_information_query iq left join (select  * from u_task k where k.status!=3 and k.contract_id = #{query.contractId}) t on iq.id = t.form_data_id  and t.is_deleted = 0
+                from u_information_query iq left join (select  * from u_task k where k.status!=3 and k.contract_id = #{query.contractId} group by
+        form_data_id) t on iq.id = t.form_data_id  and t.is_deleted = 0
                 where
                 iq.is_deleted = 0
                 and iq.classify = #{query.classify}
@@ -511,7 +512,8 @@
         iq.e_visa_pdf_url,
         iq.wbs_id,
         iq.sj_record_ids
-        from u_information_query iq left join (select  * from u_task k where k.status!=3 and k.contract_id = #{query.contractId}) t on iq.id = t.form_data_id  and t.is_deleted = 0
+        from u_information_query iq left join (select  * from u_task k where k.status!=3 and k.contract_id = #{query.contractId} group by
+        form_data_id) t on iq.id = t.form_data_id  and t.is_deleted = 0
         where
         iq.is_deleted = 0
         and iq.classify = #{query.classify}
@@ -593,4 +595,17 @@
           AND wtc.is_deleted = 0
     </select>
 
+    <insert id="copeNodeData" >
+
+    </insert>
+
+    <!--获取当前节点Ids-->
+    <select id="getNodeChildAllByNodeId" resultType="org.springblade.manager.entity.WbsTreeContract">
+        select * from m_wbs_tree_contract wtc where
+           wtc.ancestors like concat('%',#{nodeId},'%')
+            AND wtc.contract_id = #{contractId}
+            AND wtc.is_deleted = 0
+            or wtc.p_key_id=#{pKeyId}
+
+    </select>
 </mapper>

+ 9 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/IInformationQueryService.java

@@ -27,6 +27,7 @@ import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  *  服务类
@@ -109,4 +110,12 @@ public interface IInformationQueryService extends BaseService<InformationQuery>
 
     void updateBatchByPKeyId(List<WbsTreeContract> result);
 
+    //获取当前合同所有填报表
+	public Map<String, Long> getTreeAllTable(String contractId);
+
+	// 复制节点数据
+	boolean copeNodeData(String nodeId,String vocationalId);
+
+	// 获取当前节点下所有子节点
+	List<WbsTreeContract> getNodeChildAllByNodeId(String nodeId,String contractId,String pKeyId);
 }

+ 1 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/ITrialSelfInspectionRecordService.java

@@ -34,7 +34,7 @@ public interface ITrialSelfInspectionRecordService extends BaseService<TrialSelf
     String selfPrintNullPdf(String ids) throws Exception;
 
     @Async
-    void updateTrialSelfInspectionRecordStatus(List<TaskApprovalVO> obj) throws FileNotFoundException;
+    void updateTrialSelfInspectionRecordStatus(List<TaskApprovalVO> obj);
 
     String addBussFile(MultipartFile file, Long pkeyId, String nodeId, String contractId, String projectId, String classify, String id, String tableType) throws Exception;
 

+ 11 - 2
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/ImageClassificationFileServiceImpl.java

@@ -19,6 +19,7 @@ package org.springblade.business.service.impl;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.DateFormatUtils;
+import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.business.entity.ArchiveFile;
 import org.springblade.business.entity.ImageClassificationFile;
@@ -29,10 +30,13 @@ import org.springblade.business.service.IImageClassificationFileService;
 import org.springblade.business.vo.TreeVo;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  *  服务实现类
@@ -41,8 +45,9 @@ import java.util.*;
  * @since 2022-05-24
  */
 @Service
+@AllArgsConstructor
 public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageClassificationFileMapper, ImageClassificationFile> implements IImageClassificationFileService {
-
+	private final WbsTreeContractClient wbsTreeContractClient;
 	@Override
 	public List<Integer> queryCurrentContractImageFileType(String contractId) {
 		return this.baseMapper.queryCurrentContractImageFileType(contractId);
@@ -69,7 +74,11 @@ public class ImageClassificationFileServiceImpl extends BaseServiceImpl<ImageCla
 		long current = (page.getCurrent() - 1L) * page.getSize();
 		if(StringUtils.isNotEmpty(imageClassificationFile.getWbsIdsStr())){
 			//查询下级节点信息
-			imageClassificationFile.setWbsIds(JSONArray.parseArray(JSONObject.toJSONString(imageClassificationFile.getWbsIdsStr().split(",")), String.class));
+//			imageClassificationFile.setWbsIds(JSONArray.parseArray(JSONObject.toJSONString(imageClassificationFile.getWbsIdsStr().split(",")), String.class));
+			WbsTreeContract node = wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.valueOf(imageClassificationFile.getWbsIdsStr()));
+			List<WbsTreeContract> wbsTreeContracts = wbsTreeContractClient.queryCurrentNodeAllChild(imageClassificationFile.getContractId(), node.getId());
+			wbsTreeContracts.add(node);
+			imageClassificationFile.setWbsIds(wbsTreeContracts.stream().map(wtc->wtc.getPKeyId()+"").collect(Collectors.toList()));
 		}
 		//获取数据
 		List<ImageClassificationFile> fileVOS = this.baseMapper.selectImageClassificationFilePage(current, page.getSize(), imageClassificationFile);

+ 83 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/InformationQueryServiceImpl.java

@@ -22,7 +22,9 @@ import org.springblade.core.secure.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.feign.ContractClient;
 import org.springblade.manager.feign.WbsTreeContractClient;
 import org.springblade.manager.vo.WbsTreeContractTreeVOS;
 import org.springblade.resource.feign.NewIOSSClient;
@@ -61,6 +63,8 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
 
     private final IContractLogService contractLogService;
 
+    private final ContractClient contractClient;
+
     @Override
     public List<String> queryBusinessTableData(String formDataId) {
         //获取具体业务数据
@@ -547,4 +551,83 @@ public class InformationQueryServiceImpl extends BaseServiceImpl<InformationQuer
         linkList.forEach(link -> vo.setWaitingUserList(link.getTaskUserName(), new Integer("999").equals(link.getEVisaStatus()) ? 999 : new Integer("2").equals(link.getStatus()) ? 2 : new Integer("3").equals(link.getStatus()) && new Integer("1").equals(link.getInitiative()) ? 3 : 1));
     }
 
+    /**
+     * 获取当前合同所有填报表
+     */
+    public Map<String, Long> getTreeAllTable(String contractId){
+        //总数据
+        List<WbsTreeContractTreeVOS> list = new ArrayList<>();
+        this.getAllTable("",contractId,list);
+        Map<String,Long> map = new HashMap<>();
+        list.stream().forEach(li->map.put(li.getId()+"",li.getSubmitCounts()));
+        return map;
+    }
+
+    @Override
+    public boolean copeNodeData(String nodeId, String vocationalId) {
+        return baseMapper.copeNodeData(nodeId,vocationalId);
+    }
+
+    /**
+     * 递归调用获取合同所有填报表
+     */
+    public void getAllTable(String parentId,String contractId, List<WbsTreeContractTreeVOS> list){
+        List<WbsTreeContractTreeVOS> vos = this.queryContractTree(parentId, contractId, "", "1");
+        if (vos != null && vos.size() > 0){
+            vos = vos.stream().filter(vo->vo.getSubmitCounts()!=0).collect(Collectors.toList());
+            list.addAll(vos);
+            for (WbsTreeContractTreeVOS vo : vos) {
+                this.getAllTable(vo.getId()+"",contractId,list);
+            }
+        }
+    }
+    /**
+     * 查询合同段划分树公共代码
+     */
+    private List<WbsTreeContractTreeVOS> queryContractTree(String parentId, String contractId, String contractIdRelation, String classifyType) {
+        List<WbsTreeContractTreeVOS> rootTreeNode;
+
+        //获取合同段,检查是否是监理合同段
+        ContractInfo contractInfo = this.contractClient.getContractById(Long.parseLong(contractId));
+        if (new Integer("2").equals(contractInfo.getContractType()) || new Integer("3").equals(contractInfo.getContractType())) {
+            //监理/业主合同段,需要获取关联的施工方合同段根节点数据
+            List<String> contractIds = new ArrayList<>();
+            if (StringUtils.isEmpty(parentId)) {
+                contractIds = this.contractClient.getProcessContractByJLContractId(contractId);
+            } else {
+                contractIds.add(contractIdRelation);
+            }
+            if (contractIds.size() > 0) {
+                if (StringUtils.isNotEmpty(parentId)) {
+                    //子节点
+                    rootTreeNode = this.queryContractTreeSupervision(contractIds, parentId, Integer.parseInt(classifyType));
+                } else {
+                    //根节点
+                    rootTreeNode = this.queryContractTreeSupervision(contractIds, "0", Integer.parseInt(classifyType));
+
+                    //设置根节点数量统计
+                    for (WbsTreeContractTreeVOS root : rootTreeNode) {
+                        List<WbsTreeContractTreeVOS> rootZi = this.queryContractTreeSupervision(Func.toStrList(root.getContractIdRelation()), root.getId().toString(), Integer.parseInt(classifyType));
+                        List<Long> collect = rootZi.stream().map(WbsTreeContractTreeVOS::getSubmitCounts).collect(Collectors.toList());
+                        Long reduce = collect.stream().reduce(0L, Long::sum);
+                        root.setSubmitCounts(reduce);
+                    }
+                }
+
+            } else {
+                rootTreeNode = new ArrayList<>();
+            }
+
+        } else {
+            //施工合同段
+            rootTreeNode = this.queryContractTree(contractId, StringUtils.isNotEmpty(parentId) ? parentId : "0", 1);
+        }
+
+        return rootTreeNode;
+    }
+
+    @Override
+    public List<WbsTreeContract> getNodeChildAllByNodeId(String nodeId,String contractId,String pKeyId) {
+        return baseMapper.getNodeChildAllByNodeId(nodeId,contractId,pKeyId);
+    }
 }

+ 1 - 44
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TrialSelfInspectionRecordServiceImpl.java

@@ -454,7 +454,7 @@ public class TrialSelfInspectionRecordServiceImpl
     }
 
     @Override
-    public void updateTrialSelfInspectionRecordStatus(List<TaskApprovalVO> obj) throws FileNotFoundException {
+    public void updateTrialSelfInspectionRecordStatus(List<TaskApprovalVO> obj){
         for (TaskApprovalVO taskApprovalVO : obj) {
             if (ObjectUtil.isNotEmpty(taskApprovalVO.getParallelProcessInstanceId())) {
                 String sql = "select process_instance_id from u_task_parallel where parallel_process_instance_id = '" + taskApprovalVO.getParallelProcessInstanceId() + "'";
@@ -467,49 +467,6 @@ public class TrialSelfInspectionRecordServiceImpl
                                 .set(TrialSelfInspectionRecord::getTaskStatus, "OK".equals(taskApprovalVO.getFlag()) ? "已审批" : "已废除")
                                 .eq(TrialSelfInspectionRecord::getId, trialSelfInspectionRecordId)
                         );
-
-                        /*TrialSelfInspectionRecord entity = this.baseMapper.selectById(trialSelfInspectionRecordId);
-                        //把当前试验的PDF合并关联到质检树节点下
-                        if (ObjectUtil.isNotEmpty(entity) && ("已审批").equals(entity.getTaskStatus())) {
-                            List<String> contractNodePKeyIds = baseMapper.selectQualityNodeId(trialSelfInspectionRecordId);
-
-                            for (String id : contractNodePKeyIds) {
-                                if (StringUtils.isEmpty(entity.getPdfUrl())) {
-                                    continue;
-                                }
-
-                                WbsTreeContract wbsTreeContract = wbsTreeContractClient.getContractNodeByPrimaryKeyId(id);
-                                if (wbsTreeContract != null) {
-                                    List<String> pdfUrlList = new ArrayList<>();
-                                    String classify;
-                                    if (wbsTreeContract.getTableOwner().contains("1") || wbsTreeContract.getTableOwner().contains("2") || wbsTreeContract.getTableOwner().contains("3")) {
-                                        classify = "1";
-                                    } else {
-                                        classify = "2";
-                                    }
-                                    String pdfUrlAll = baseMapper.selectInformationQuery(id, wbsTreeContract.getContractId(), classify);
-                                    //质检节点合并pdfUrl
-                                    pdfUrlList.add(pdfUrlAll);
-                                    //试验pdfUrl
-                                    pdfUrlList.add(entity.getPdfUrl());
-
-                                    //合并PDF
-                                    String filePath = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-                                    String listPdf = filePath + "/pdf/" + id + ".pdf";
-                                    File tabPDF = ResourceUtil.getFile(listPdf);
-                                    if (tabPDF.exists()) {
-                                        tabPDF.delete();
-                                    }
-                                    FileUtils.mergePdfPublicMethods(pdfUrlList, listPdf);
-                                    BladeFile bladeFile = this.newIOSSClient.uploadFile(id + ".pdf", listPdf);
-                                    if (bladeFile != null) {
-                                        //修改质检合并pdfURL
-                                        baseMapper.updateInformationQuery(trialSelfInspectionRecordId, wbsTreeContract.getContractId(), classify, bladeFile.getLink());
-                                    }
-                                }
-                            }
-                        }*/
-
                     }
                 }
             }

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/utils/FileUtils.java

@@ -106,8 +106,8 @@ public class FileUtils {
         BufferedImage bi = ImageIO.read(new ByteArrayInputStream(srcImgData));
         /*int width = (int) (bi.getWidth() * reduceMultiple);
         int height = (int) (bi.getHeight() * reduceMultiple);*/
-        int width = 768;
-        int height = 1024;
+        int width = 600;
+        int height = 800;
         Image image = bi.getScaledInstance(width, height, Image.SCALE_SMOOTH);
         BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
         Graphics g = tag.getGraphics();

+ 6 - 17
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -3,29 +3,23 @@ package com.mixsmart.utils;
 
 import cn.hutool.core.date.*;
 import cn.hutool.core.util.ArrayUtil;
-import cn.hutool.core.util.HashUtil;
+
 import cn.hutool.core.util.NumberUtil;
-import cn.hutool.core.util.RadixUtil;
-import cn.hutool.dfa.SensitiveUtil;
-import com.alibaba.fastjson.JSON;
+
 import com.jfireel.expression.Expression;
 import com.jfireel.expression.node.CalculateNode;
-import com.jfireel.expression.node.impl.CompileObjectMethodNode;
 import com.jfireel.expression.node.impl.OperatorResultNode;
 import com.jfireel.expression.node.impl.StaticObjectMethodNode;
 import com.jfireel.expression.node.impl.VariableNode;
 import com.jfireel.expression.token.Token;
-import com.jfireel.expression.token.TokenType;
 import org.apache.commons.collections4.MapUtils;
-import org.apache.poi.ss.formula.functions.T;
-import org.checkerframework.checker.units.qual.A;
+
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
 import org.jsoup.select.Elements;
 import org.springblade.core.tool.utils.*;
-import org.springblade.manager.dto.ElementData;
-import org.springblade.manager.vo.AppWbsTreeContractVO;
+
 
 import java.io.File;
 import java.io.FileInputStream;
@@ -33,16 +27,11 @@ import java.io.FileNotFoundException;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.ZoneId;
 import java.util.*;
-import java.util.function.BinaryOperator;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
+
 
 import static java.math.BigDecimal.ROUND_CEILING;
 import static java.math.BigDecimal.ROUND_HALF_UP;
@@ -1535,7 +1524,7 @@ public class CustomFunction {
 			List<String>nodes=new ArrayList<>(treeNodes);
 			//Collections.reverse(nodes);
 			List<String> result = new ArrayList<>();
-			param=param.replaceAll("(?i:c)","");
+			param=param.trim().replaceAll("(?i:c)","");
 			List<String> list = Arrays.asList(param.split("[^.\\d]"));
 			List<Integer> index =list.stream().map(Integer::parseInt).collect(Collectors.toList());
 			for(Integer i:index){

+ 8 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ArchiveTreeContractController.java

@@ -175,13 +175,14 @@ public class ArchiveTreeContractController extends BladeController {
 	@ApiOperation(value = "懒加载树形结构", notes = "传入父级id")
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "parentId", value = "父级id", required = true),
-			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "contractId", value = "合同段id", required = true)
 	})
-	public R<List<ArchiveTreeContractVO2>> lazyTree(Long parentId,Long projectId) {
+	public R<List<ArchiveTreeContractVO2>> lazyTree(Long parentId,Long projectId,Long contractId) {
 //		if (projectId == null) {
 //			projectId = 1578599210897772545L;
 //		}
-		List<ArchiveTreeContractVO2> tree = archiveTreeContractService.lazyTree2(AuthUtil.getTenantId(), parentId,projectId);
+		List<ArchiveTreeContractVO2> tree = archiveTreeContractService.lazyTree2(AuthUtil.getTenantId(), parentId,projectId,contractId);
 		if (tree != null && tree.size() > 0) {
 			return R.data(tree);
 		}
@@ -198,12 +199,13 @@ public class ArchiveTreeContractController extends BladeController {
 	@ApiImplicitParams(value = {
 			@ApiImplicitParam(name = "disPlayTree", value = "是否加载显示树 'null'=不加载 '1'=加载"),
 			@ApiImplicitParam(name = "nodeType", value = "'null'=全加载 '1'=关联电子原生文件类型树 '2'=文件上传类型树"),
-			@ApiImplicitParam(name = "projectId", value = "项目id", required = true)
+			@ApiImplicitParam(name = "projectId", value = "项目id", required = true),
+			@ApiImplicitParam(name = "contractId", value = "合同段id", required = true)
 	})
-	public R<List<ArchiveTreeContractVO2>> tree(Integer disPlayTree, Integer nodeType,Long projectId){
+	public R<List<ArchiveTreeContractVO2>> tree(Integer disPlayTree, Integer nodeType,Long projectId,Long contractId){
 
 
-		List<ArchiveTreeContractVO2> tree = archiveTreeContractService.tree2(AuthUtil.getTenantId(), disPlayTree, nodeType,projectId);
+		List<ArchiveTreeContractVO2> tree = archiveTreeContractService.tree2(AuthUtil.getTenantId(), disPlayTree, nodeType,projectId,contractId);
 		if (tree != null && tree.size() > 0) {
 			return R.data(tree);
 		}

+ 34 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ContractInfoController.java

@@ -542,21 +542,20 @@ public class ContractInfoController extends BladeController {
     }
 
     /**
-     * 查询合同段树-全加载
+     * 查询合同段树-全加载-施工合同段
      */
     @GetMapping("/tree-all")
     @ApiOperationSupport(order = 19)
-    @ApiOperation(value = "查询合同段私有Wbs节点树形结构", notes = "传入wbsId,项目id,合同段id")
+    @ApiOperation(value = "查询合同段私有Wbs节点树形结构-施工合同段", notes = "合同段id,type=1")
     @ApiImplicitParams(value = {
-            @ApiImplicitParam(name = "wbsId", value = "wbsId", required = true),
-            @ApiImplicitParam(name = "项目id", value = "projectId", required = true),
-            @ApiImplicitParam(name = "合同段id", value = "contractId", required = true)
+            @ApiImplicitParam(name = "合同段id", value = "contractId", required = true),
+            @ApiImplicitParam(name = "type", value = "1=资料查询,资料查询过慢,导致资料填报也过慢,后续优化", required = true)
     })
-    public R treeAll(String wbsId, String projectId, String contractId) {
-        List<WbsTreeContractVO> tree = contractInfoService.tree3(wbsId, projectId, contractId);
+    public R treeAll(String contractId, Integer type) {
+        List<WbsTreeContractTreeAllVO> tree = contractInfoService.tree3(contractId, type);
         if (tree != null && tree.size() > 0) {
             ContractInfo contractInfo = contractInfoService.getBaseMapper().selectById(contractId);
-            for (WbsTreeContractVO wbsTreeContractVO : tree) {
+            for (WbsTreeContractTreeAllVO wbsTreeContractVO : tree) {
                 if (ObjectUtil.isNotEmpty(wbsTreeContractVO.getParentId()) && 0L == wbsTreeContractVO.getParentId()) {
                     wbsTreeContractVO.setTitle(contractInfo.getContractName());
                     break;
@@ -567,6 +566,33 @@ public class ContractInfoController extends BladeController {
         return R.fail(200, "未查询到信息");
     }
 
+    /**
+     * 查询合同段树-全加载-监理合同段
+     */
+    @GetMapping("/tree-all-jl")
+    @ApiOperationSupport(order = 19)
+    @ApiOperation(value = "查询合同段私有Wbs节点树形结构-监理合同段", notes = "合同段id,type=1")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "合同段id", value = "contractId", required = true),
+            @ApiImplicitParam(name = "type", value = "1=资料查询,资料查询过慢,导致资料填报也过慢,后续优化", required = true)
+    })
+    public R treeAllJL(String contractId, Integer type) {
+        Map<Long, List<WbsTreeContractTreeAllVO>> treeAllJL = contractInfoService.treeAllJL(contractId, type);
+        if (treeAllJL != null && treeAllJL.size() > 0) {
+            for (Map.Entry<Long, List<WbsTreeContractTreeAllVO>> map : treeAllJL.entrySet()) {
+                ContractInfo contractInfo = contractInfoService.getBaseMapper().selectById(map.getKey());
+                for (WbsTreeContractTreeAllVO wbsTreeContractVO : map.getValue()) {
+                    if (ObjectUtil.isNotEmpty(wbsTreeContractVO.getParentId()) && 0L == wbsTreeContractVO.getParentId()) {
+                        wbsTreeContractVO.setTitle(contractInfo.getContractName());
+                        break;
+                    }
+                }
+            }
+            return R.data(treeAllJL);
+        }
+        return R.fail(200, "未查询到信息");
+    }
+
     /**
      * 查询合同段私有Wbs节点树形结构 --- 试验关联工程节点树
      */

+ 173 - 76
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -763,7 +763,7 @@ public class ExcelTabController extends BladeController {
         }
 
         File file1 = ResourceUtil.getFile(wbsTreePrivate.getHtmlUrl());
-//        File file1 = ResourceUtil.getFile("D:\\develop\\1613737889349238784.html");
+//        File file1 = ResourceUtil.getFile("D:\\develop\\1633344465559093248.html");
         FileInputStream fileInputStream = new FileInputStream(file1);
         String htmlString = IoUtil.readToString(fileInputStream);
         // 解析 style
@@ -1076,7 +1076,7 @@ public class ExcelTabController extends BladeController {
                         ExctabCell exctabCell = new ExctabCell();
                         if ((textInfo.indexOf("年") >= 0 && textInfo.indexOf("月") >= 0 && textInfo.indexOf("日") >= 0) || inputText.indexOf("日期") >= 0) {
                             if (inputText.indexOf("日期") >= 0) {
-                                data.empty().append("<el-date-picker type='date' format='YYYY年MM月DD日'  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='" + inputText + "'> </el-date-picker>");
+                                data.empty().append("<el-date-picker type='date' popper-class='hc-table-form-date-picker'  @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='" + inputText + "'> </el-date-picker>");
                             } else if (textInfo.indexOf("年") >= 0 && textInfo.indexOf("月") >= 0 && textInfo.indexOf("日") >= 0) {
                                 if (inputText.indexOf("专业监理工程师") >= 0) {
                                     inputText = "专业监理工程师_年月日";
@@ -1086,7 +1086,7 @@ public class ExcelTabController extends BladeController {
                                     inputText = "年月日";
                                 }
                             }
-                            data.empty().append("<el-date-picker type='date' format='YYYY年MM月DD日'  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='年月日'> </el-date-picker>");
+                            data.empty().append("<el-date-picker  popper-class='hc-table-form-date-picker'  @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder='年月日'> </el-date-picker>");
                             exctabCell.setTextInfo(inputText);
                             exctabCell.setExctabId(excelId);
                             exctabCell.setIsDeleted(0);
@@ -1123,32 +1123,32 @@ public class ExcelTabController extends BladeController {
                                 objs.add(jsonObject);
                             }
 
-                            String checkbox = "<hc-form-checkbox-group :objs='" + objs + "'  @change='checkboxGroupChange' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " placeholder=''> </hc-form-checkbox-group>";
+                            String checkbox = "<hc-form-checkbox-group @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight' :objs='" + objs + "'  @change='checkboxGroupChange' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " placeholder=''> </hc-form-checkbox-group>";
                             data.empty().append(checkbox);
 
                         } else {
                             if (index_state) { // 区域内
                                 if (rowspan >= 1) {
-                                    data.empty().append("<el-input type='textarea'  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;'   :rows=" + rowspan * 2 + " placeholder=''> </el-input>");
+                                    data.empty().append("<el-input type='textarea' @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft'  @keyup.shift.right='keyupShiftRight'  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;'   :rows=" + rowspan * 2 + " placeholder=''> </el-input>");
                                 } else {
-                                    data.empty().append("<el-input type='text'  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder=''> </el-input>");
+                                    data.empty().append("<el-input type='text' @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft'  @keyup.shift.right='keyupShiftRight'  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder=''> </el-input>");
                                 }
                             } else { // 区域外
                                 if (j == 0) {
                                     if (colspan == maxCol && i >= 1) {
                                         if (rowspan >= 1) {
-                                            data.empty().append("<el-input type='textarea'  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;'   :rows=" + rowspan * 2 + " placeholder=''> </el-input>");
+                                            data.empty().append("<el-input @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight' type='textarea'  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;'   :rows=" + rowspan * 2 + " placeholder=''> </el-input>");
                                         } else {
-                                            data.empty().append("<el-input type='text' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder=''> </el-input>");
+                                            data.empty().append("<el-input @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight' type='text' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder=''> </el-input>");
                                         }
                                     }
                                 } else {
                                     Element bforData = tds.get(j - 1);
                                     if (!bforData.text().isEmpty() || bforData.html().indexOf("hc-form-checkbox-group")>=0) {
                                         if (rowspan >= 1) {
-                                            data.empty().append("<el-input type='textarea' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;'   :rows=" + rowspan * 2 + " placeholder=''> </el-input>");
+                                            data.empty().append("<el-input @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight' type='textarea' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;'   :rows=" + rowspan * 2 + " placeholder=''> </el-input>");
                                         } else {
-                                            data.empty().append("<el-input  type='text' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder=''> </el-input>");
+                                            data.empty().append("<el-input @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft'  @keyup.shift.right='keyupShiftRight' type='text' @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + i + " tdIndex=" + j + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%;' placeholder=''> </el-input>");
                                         }
                                     }
                                 }
@@ -1326,8 +1326,6 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "id", value = "id", required = true)
     })
     public R getExcelHtmlByCol(Long id) throws IOException, InterruptedException {
-
-        Thread.sleep(200);
         ExcelTab detail = excelTabService.getById(id);
         if (detail == null) {
             return R.fail("该数据下无此节点!");
@@ -1699,7 +1697,7 @@ public class ExcelTabController extends BladeController {
                 // 数据不为空 &&
                 if (StringUtils.isNotEmpty(tableNode.getHtmlUrl())) {
                     File htmlFile = ResourceUtil.getFile(tableNode.getHtmlUrl());
-//                    File htmlFile = ResourceUtil.getFile("D:\\develop\\1613737889349238784.html");
+//                    File htmlFile = ResourceUtil.getFile("D:\\develop\\1633344465559093248.html");
                     if (htmlFile.exists()) {
                         String htmlString = IoUtil.readToString(new FileInputStream(htmlFile));
                         Document doc = Jsoup.parse(htmlString);
@@ -1722,61 +1720,67 @@ public class ExcelTabController extends BladeController {
                                 if (val.indexOf("__") >= 0) {
                                     String[] DataVal = val.split("__");
                                     String[] xy = DataVal[1].split("_");
-                                    Element data = trs.get(Integer.parseInt(xy[0])).select("td").get(Integer.parseInt(xy[1]));
-
-                                    if (data.html().indexOf("x1") >= 0 && data.html().indexOf("y1") >= 0) {
-                                        int x1, y1;
-
-                                        if (data.html().indexOf("el-tooltip") >= 0) {
-                                            x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
-                                            y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
-                                        } else {
-                                            x1 = Integer.parseInt(data.children().get(0).attr("x1"));
-                                            y1 = Integer.parseInt(data.children().get(0).attr("y1"));
-                                        }
-                                        if (x1 == 0) {
-                                            x1 = 1;
-                                        }
-                                        String myData = dataMap.get(val) + "";
-                                        if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
-                                            if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
-                                                myData = myData.replace("[", "").replace("]", "");
-                                                String[] dataVal = myData.split(",");
-                                                String[] Start_dataStr = dataVal[0].split("T")[0].split("-");
-                                                String StartDate = StringUtil.format("{}年{}月{}日", Start_dataStr[0], Start_dataStr[1], Integer.parseInt(Start_dataStr[2]) + 1);
-
-                                                String[] end_dataStr = dataVal[1].split("T")[0].split("-");
-                                                String endDate = StringUtil.format("{}年{}月{}日", end_dataStr[0], end_dataStr[1], Integer.parseInt(end_dataStr[2]) + 1);
-
-                                                if (StartDate.equals(endDate)) {
-                                                    myData = StartDate;
+                                    if (trs.size() > Integer.parseInt(xy[0])) {
+                                        Element trData = trs.get(Integer.parseInt(xy[0]));
+                                        Elements tdDatas = trData.select("td");
+                                        if (tdDatas.size() > Integer.parseInt(xy[1])) {
+                                            Element data = tdDatas.get(Integer.parseInt(xy[1]));
+
+                                            if (data.html().indexOf("x1") >= 0 && data.html().indexOf("y1") >= 0) {
+                                                int x1, y1;
+
+                                                if (data.html().indexOf("el-tooltip") >= 0) {
+                                                    x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
+                                                    y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
                                                 } else {
-                                                    myData = StartDate + "-" + endDate;
+                                                    x1 = Integer.parseInt(data.children().get(0).attr("x1"));
+                                                    y1 = Integer.parseInt(data.children().get(0).attr("y1"));
                                                 }
-                                            } else {
-                                                String[] dataStr = myData.split("T")[0].split("-");
-                                                myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
-                                            }
-                                        }
-
-                                        if (myData.indexOf("https") >= 0 && myData.indexOf("aliyuncs") >= 0) {
-                                            Element element = trs.get(y1).select("td").get(x1);
-                                            String[] styles = element.attr("style").split(";");
-                                            int Height = 0;
-                                            for (String sty : styles) {
-                                                if (sty.indexOf("height:") >= 0) {
-                                                    Height = Integer.parseInt(sty.replace("height:", "").replace("px", ""));
+                                                if (x1 == 0) {
+                                                    x1 = 1;
+                                                }
+                                                String myData = dataMap.get(val) + "";
+                                                if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
+                                                    if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
+                                                        myData = myData.replace("[", "").replace("]", "");
+                                                        String[] dataVal = myData.split(",");
+                                                        String[] Start_dataStr = dataVal[0].split("T")[0].split("-");
+                                                        String StartDate = StringUtil.format("{}年{}月{}日", Start_dataStr[0], Start_dataStr[1], Integer.parseInt(Start_dataStr[2]) + 1);
+
+                                                        String[] end_dataStr = dataVal[1].split("T")[0].split("-");
+                                                        String endDate = StringUtil.format("{}年{}月{}日", end_dataStr[0], end_dataStr[1], Integer.parseInt(end_dataStr[2]) + 1);
+
+                                                        if (StartDate.equals(endDate)) {
+                                                            myData = StartDate;
+                                                        } else {
+                                                            myData = StartDate + "-" + endDate;
+                                                        }
+                                                    } else {
+                                                        String[] dataStr = myData.split("T")[0].split("-");
+                                                        myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
+                                                    }
                                                 }
-                                            }
 
-                                            BufferedImage image = ImageIO.read(CommonUtil.getOSSInputStream(myData));
-                                            ExcelPicture pic = sheet.getPictures().add(y1, x1, image);
-                                            pic.setHeight(Height);
-                                            sheet.getCellRange(y1, x1).getStyle().setShrinkToFit(true);
+                                                if (myData.indexOf("https") >= 0 && myData.indexOf("aliyuncs") >= 0) {
+                                                    Element element = trs.get(y1).select("td").get(x1);
+                                                    String[] styles = element.attr("style").split(";");
+                                                    int Height = 0;
+                                                    for (String sty : styles) {
+                                                        if (sty.indexOf("height:") >= 0) {
+                                                            Height = Integer.parseInt(sty.replace("height:", "").replace("px", ""));
+                                                        }
+                                                    }
 
-                                        } else {
-                                            final CellRange cellRange = sheet.getCellRange(y1, x1);
-                                            cellRange.setText(myData);
+                                                    BufferedImage image = ImageIO.read(CommonUtil.getOSSInputStream(myData));
+                                                    ExcelPicture pic = sheet.getPictures().add(y1, x1, image);
+                                                    pic.setHeight(Height);
+                                                    sheet.getCellRange(y1, x1).getStyle().setShrinkToFit(true);
+
+                                                } else {
+                                                    final CellRange cellRange = sheet.getCellRange(y1, x1);
+                                                    cellRange.setText(myData);
+                                                }
+                                            }
                                         }
                                     }
                                 }
@@ -1793,26 +1797,33 @@ public class ExcelTabController extends BladeController {
                                 String key = e.getColKey();
                                 String[] keys = key.split("__");
                                 String[] trtd = keys[1].split("_");
-                                Element data = trs.get(Integer.parseInt(trtd[0])).select("td").get(Integer.parseInt(trtd[1]));
-                                int x1 = Integer.parseInt(data.children().get(0).attr("x1"));
-                                if (x1 == 0) {
-                                    x1 = 1;
-                                }
-                                int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
+                                if ( trs.size() > (Integer.parseInt(trtd[0]))) {
+                                    Element trData = trs.get(Integer.parseInt(trtd[0]));
+                                    Elements tdDatas = trData.select("td");
+                                    if (tdDatas.size() > Integer.parseInt(trtd[1])) {
+                                        Element data = tdDatas.get(Integer.parseInt(trtd[1]));
+//                                Element data = trs.get(Integer.parseInt(trtd[0])).select("td").get(Integer.parseInt(trtd[1]));
+
+                                        int x1 = Integer.parseInt(data.children().get(0).attr("x1"));
+                                        if (x1 == 0) {
+                                            x1 = 1;
+                                        }
+                                        int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
 
-                                final CellRange cellRange = sheet.getCellRange(y1, x1);
+                                        final CellRange cellRange = sheet.getCellRange(y1, x1);
 
-                                cellRange.setText(e.getId() + "");
-                                cellRange.getCellStyle().getFont().setColor(Color.white);
+                                        cellRange.setText(e.getId() + "");
+                                        cellRange.getCellStyle().getFont().setColor(Color.white);
+                                    }
 
-                            });
+                            }});
                         }
                     }
                 }
 
                 Long fileName = SnowFlakeUtil.getId();
                 String onePdfPath = file_path + "/pdf//" + fileName + ".pdf";
-//                wb.saveToFile("d://123123.xls", ExcelVersion.Version2010);
+//                wb.saveToFile("d://777.xls", ExcelVersion.Version2010);
                 sheet.saveToPdf(onePdfPath);
 
                 BladeFile bladeFile = this.newIOSSClient.uploadFile(fileName + ".pdf", onePdfPath);
@@ -1941,6 +1952,21 @@ public class ExcelTabController extends BladeController {
                         }
                     }
 
+                    // 获取默认值
+                    QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
+                    queryWrapper.eq("type", 4);
+                    queryWrapper.eq("tab_id", tableNode.getPKeyId());
+                    final List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
+                    if (!textdictInfos.isEmpty()) {
+                        for (TextdictInfo textdictInfo : textdictInfos) {
+                            if (reData.containsKey(textdictInfo.getColKey())) {
+                                String keyVal = reData.get(textdictInfo.getColKey()) + "";
+                            } else {
+                                reData.put(textdictInfo.getColKey() + "", textdictInfo.getSigRoleName());
+                            }
+                        }
+                    }
+
                     // 移除Id 和 p_key_id
                     reData.remove("p_key_id");
                     reData.remove("classify");
@@ -1950,6 +1976,22 @@ public class ExcelTabController extends BladeController {
                     resultMapList.add(reData);
                 }
             }
+        }else {
+            WbsTreePrivate node = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, nodePrimaryKeyId));
+            WbsTreePrivate tableNode = this.wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery()
+                    .eq(WbsTreePrivate::getParentId, node.getId()).eq(WbsTreePrivate::getProjectId,node.getProjectId()));
+            Map<String, Object> reData = new HashMap<>();
+            // 获取默认值
+            QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("type", 4);
+            queryWrapper.eq("tab_id", tableNode.getPKeyId());
+            final List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
+            if (!textdictInfos.isEmpty()) {
+                for (TextdictInfo textdictInfo : textdictInfos) {
+                    reData.put(textdictInfo.getColKey() + "", textdictInfo.getSigRoleName());
+                }
+                resultMapList.add(reData);
+            }
         }
 
 
@@ -2365,9 +2407,11 @@ public class ExcelTabController extends BladeController {
         } else { // 单个保存
             dataArray.add(dataInfo);
         }
+        JSONObject tableInfo1 = dataArray.getJSONObject(0);
+        String nodeid = tableInfo1.getString("nodeId");
         List<TableInfo> tableInfoList = this.excelTabService.getTableInfoList(dataArray);
         try {
-            this.excelTabService.formulaFillData(tableInfoList, null);
+            this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeid));
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -2695,7 +2739,6 @@ public class ExcelTabController extends BladeController {
         return R.data(bussDataInfoTrial);
     }
 
-
     /**
      * 在线excel 修改回调
      * @throws IOException
@@ -2708,4 +2751,58 @@ public class ExcelTabController extends BladeController {
         return excelTabService.callbackSave(callback);
     }
 
+    /**
+     * 质检 获取坐标位置
+     */
+    @GetMapping("/get-html-buss-cols")
+    @ApiOperationSupport(order = 36)
+    @ApiOperation(value = "获取坐标位置", notes = "获取坐标位置")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pkeyId", value = "pkeyId", required = true)
+    })
+    public R getHtmlBussCols(Long pkeyId) throws FileNotFoundException {
+
+        WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                .eq(WbsTreeContract::getPKeyId, pkeyId));
+        if (wbsTreeContract == null) {
+            return R.fail("该数据下无此节点!");
+        }
+        if (wbsTreeContract.getHtmlUrl() == null) {
+            return R.fail("暂无表单!");
+        }
+
+        File file1 = ResourceUtil.getFile(wbsTreeContract.getHtmlUrl());
+        FileInputStream fileInputStream = new FileInputStream(file1);
+        String htmlString = IoUtil.readToString(fileInputStream);
+        // 解析 style
+        Document doc = Jsoup.parse(htmlString);
+        Element table = doc.select("table").first();
+        Elements trs = table.select("tr");
+
+        List<List<String>> redata = new ArrayList<>();
+        for (int i = 0; i < trs.size(); i++) {
+            Element tr = trs.get(i);
+            Elements tds = tr.select("td");
+            List<String> tdList = new ArrayList<>();
+            for (int j = 0; j < tds.size(); j++) {
+                Element element = tds.get(j);
+                if (element.html().indexOf("el-tooltip") >= 0) {
+                    element = element.children().get(0);
+                }
+                if (element.children().size() >= 1) {
+                    String keyname = element.children().get(0).attr("keyname");
+                    if (StringUtils.isNotEmpty(keyname)) {
+                        tdList.add(keyname);
+                    }
+                }
+            }
+            redata.add(tdList) ;
+        }
+
+        String[][] res = new String[redata.size()][]; // 存放转换结果的 二维数组
+        for(int i=0; i<res.length; i++){ // 转换方法
+            res[i] = redata.get(i).toArray(new String[redata.get(i).size()]);
+        }
+        return R.data(res);
+    }
 }

+ 24 - 14
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -173,17 +173,18 @@ public class FormulaController {
                 Map<String,Object> map =listMap.get(0);
                 String rely = StringUtils.handleNull(map.get("rely"));
                 FormulaBean fb=BeanUtil.toBean(map,FormulaBean.class);
-                if(StringUtils.isNotEmpty(rely)){
-                    String[] relyArr = rely.split(StringPool.COMMA);
-                   List<Map<String,Object>> mapList =this.jdbcTemplate.queryForList("select CONCAT(a.tab_en_name,':',b.e_key) ekey,a.tab_ch_name tableName,b.e_name ename  ,b.e_length elength,c.dict_value type f" +
-                           "rom m_table_info a JOIN m_wbs_form_element b on a.id=b.f_id  " +
-                           "LEFT JOIN (select dict_key, dict_value from blade_dict where code ='data_type' and parent_id > 0 and is_sealed = 0 and is_deleted = 0 )c on b.e_type=c.dict_key" +
-                           " where  a.tab_en_name in( "+ Arrays.stream(relyArr).map(e->e.split(StringPool.COLON)[0]).distinct().collect(Collectors.joining(StringPool.COMMA,"'","'"))+")");
-                   if(ListUtils.isNotEmpty(mapList)){
-                       fb.setDict(mapList.stream().filter(e-> Arrays.stream(relyArr).anyMatch(c->StringUtils.isEquals(e.get("ekey"),c))).collect(Collectors.toMap(e->StringUtils.handleNull(e.get("ekey")), e->e)));
-                   }
-
-                }
+//                if(StringUtils.isNotEmpty(rely)){
+//                    String[] relyArr = rely.split(StringPool.COMMA);
+//                   List<Map<String,Object>> mapList =this.jdbcTemplate.queryForList("select CONCAT(a.tab_en_name,':',b.e_key) ekey,a.tab_ch_name tableName,b.e_name ename  ,b.e_length elength,c.dict_value type f" +
+//                           "rom m_table_info a JOIN m_wbs_form_element b on a.id=b.f_id  " +
+//                           "LEFT JOIN (select dict_key, dict_value from blade_dict where code ='data_type' and parent_id > 0 and is_sealed = 0 and is_deleted = 0 )c on b.e_type=c.dict_key" +
+//                           " where  a.tab_en_name in( "+ Arrays.stream(relyArr).map(e->e.split(StringPool.COLON)[0]).distinct().collect(Collectors.joining(StringPool.COMMA,"'","'"))+")");
+//                   if(ListUtils.isNotEmpty(mapList)){
+//                       fb.setDict(mapList.stream().filter(e-> Arrays.stream(relyArr).anyMatch(c->StringUtils.isEquals(e.get("ekey"),c))).collect(Collectors.toMap(e->StringUtils.handleNull(e.get("ekey")), e->e)));
+//                   }
+//
+//                }
+                fb.setDict(this.service.getElementInfoByCodes(rely));
                 return R.data(fb);
             }
 
@@ -347,7 +348,7 @@ public class FormulaController {
              Map<String,Object> result = new LinkedHashMap<>();
              String  key=fo.getKey().replaceAll("__[\\d_]+","");
               ContractInfo contract = this.contractInfoService.getById(fo.getContractId());
-              List<KeyMapper> kms =  this.service.getKeyMapperList(Collections.singletonList(fo.getPKeyId()),contract.getPId());
+              List<KeyMapper> kms =  this.service.getKeyMapperList(Collections.singletonList(fo.getPkeyId()),contract.getPId());
               KeyMapper keyMapper=null;
               if(Func.isNotEmpty(kms)){
                 Optional<KeyMapper> optionalKeyMapper=  kms.stream().filter(e->StringUtils.isEquals(e.getField(),key)).findFirst();
@@ -357,7 +358,7 @@ public class FormulaController {
               }
               if(keyMapper!=null&&Func.isNotEmpty(keyMapper.getFormulaId())){
                    Formula formula = this.service.getById(keyMapper.getFormulaId());
-                  String data = this.formulaOptionService.queryOption(fo.getContractId(),fo.getParentId(),fo.getPKeyId(),fo.getKey());
+                  String data = this.formulaOptionService.queryOption(fo.getContractId(),fo.getParentId(),fo.getPkeyId(),fo.getKey());
                   /*临时处理,等确定数据结构在优化*/
                    if(formula.getFormula().contains(".option")){
                        return R.data(createRadioPanel(0,"是否引用公式数据",data));
@@ -387,8 +388,17 @@ public class FormulaController {
     @ApiOperationSupport(order = 10)
     @ApiOperation(value = "公式交互面板参数保存", notes = "公式交互面板参数保存")
     public R<Object> panelSave( @RequestBody FormulaOptionVo fo){
+           return  R.data(this.formulaOptionService.saveOrUpdateOption(fo));
+    }
 
-           return    R.success("保存成功");
+    @GetMapping("/log")
+    public R<Object> log(Long pkeyId){
+        Map<String,Object> result = new HashMap<>();
+        result.put("版本信息","202303101210");
+        if(Func.isNotEmpty(pkeyId)){
+            result.put("执行情况",this.jdbcTemplate.queryForList("select * from m_formula_log where id="+pkeyId));
+        }
+        return    R.data(result);
     }
 
 

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

@@ -1,12 +1,14 @@
 package org.springblade.manager.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.common.collect.Lists;
 import io.swagger.annotations.*;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
 
 import javax.validation.Valid;
 
+import org.apache.commons.lang.StringUtils;
 import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
@@ -19,6 +21,7 @@ import org.springblade.manager.entity.ContractInfo;
 import org.springblade.manager.entity.WbsTreePrivate;
 import org.springblade.manager.service.*;
 import org.springblade.manager.vo.*;
+import org.springframework.context.annotation.Bean;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
@@ -30,6 +33,7 @@ import org.springblade.core.boot.ctrl.BladeController;
 import java.rmi.ServerException;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @RestController
 @AllArgsConstructor
@@ -139,7 +143,7 @@ public class ProjectInfoController extends BladeController {
 
 
     /**
-     * 删除 客户级项目
+     * 删除 客户级项目
      */
     @PostMapping("/remove")
     @ApiOperationSupport(order = 8)
@@ -158,7 +162,16 @@ public class ProjectInfoController extends BladeController {
         if (count2 > 0) {
             return R.fail("当前项目被用户关联中,删除失败");
         }
-        return R.status(projectInfoService.deleteLogic(Func.toLongList(ids)));
+
+        //删除当前项目的节点参数
+        String sqlDel = "delete from m_wbs_param where project_id = " + ids;
+        jdbcTemplate.execute(sqlDel);
+
+        //删除项目
+        String sqlDel2 = "delete from m_project_info where id = " + ids;
+        jdbcTemplate.execute(sqlDel2);
+
+        return R.status(true);
     }
 
     /**

+ 15 - 17
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/TextdictInfoController.java

@@ -257,12 +257,12 @@ public class TextdictInfoController extends BladeController {
 
         String vmode = "formData." + keyname;
         if (textdictInfo.getTextId().equals("input")) { // 文本框
-            element.empty().append("<el-input type='text' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </el-input>");
+            element.empty().append("<el-input type='text' @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </el-input>");
         } else if (textdictInfo.getTextId().equals("textarea")) { // 文本域
             int rowspan = element.attr("ROWSPAN").equals("") ? 0 : Integer.parseInt(element.attr("ROWSPAN"));
-            element.empty().append("<el-input :rows=" + rowspan * 2 + "  type='textarea' placeholder=" + placeholder + " v-model=" + vmode + "    keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'  > </el-input>");
+            element.empty().append("<el-input :rows=" + rowspan * 2 + "  @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight'  type='textarea' placeholder=" + placeholder + " v-model=" + vmode + "    keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'  > </el-input>");
         } else if (textdictInfo.getTextId().equals("select")) { // 下拉框
-            String selectText = " <el-select v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">"; //v-model="+keyname+"
+            String selectText = " <el-select v-model=" + vmode + " @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight' keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">"; //v-model="+keyname+"
             List<TextdictInfo_vo> optionList = textdictInfo.getTextInfo();
             if (optionList != null && optionList.size() >= 1) {
                 for (int i = 0; i < optionList.size(); i++)
@@ -272,7 +272,7 @@ public class TextdictInfoController extends BladeController {
             element.empty().append(selectText);
         } else if (textdictInfo.getTextId().equals("radio")) { // 单选按钮
 
-            String radioText = "<el-radio-group  v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">";
+            String radioText = "<el-radio-group @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight'  v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">";
             List<TextdictInfo_vo> optionList = textdictInfo.getTextInfo();
             if (optionList != null && optionList.size() >= 1) {
                 for (int i = 0; i < optionList.size(); i++)
@@ -290,32 +290,32 @@ public class TextdictInfoController extends BladeController {
                     jsonObject.put("name", optionList.get(i).getDictValue());
                     objs.add(jsonObject);
                 }
-                String checkbox = "<hc-form-checkbox-group :objs='" + objs + "'  @change='checkboxGroupChange' :val=" + vmode + " v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "> </hc-form-checkbox-group>";
+                String checkbox = "<hc-form-checkbox-group  @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight' :objs='" + objs + "'  @change='checkboxGroupChange' :val=" + vmode + " v-model=" + vmode + " keyname=" + keyname + " weighing=" + weighing + " placeholder=" + placeholder + " trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "> </hc-form-checkbox-group>";
                 element.empty().append(checkbox);
             }
         } else if (textdictInfo.getTextId().equals("date")) { // 日期--年月日时分秒
-            element.empty().append("<el-date-picker v-model=" + vmode + " type='datetime' format='YYYY年MM月DD日 HH:mm:ss' value-format='YYYY年MM月DD日 hh:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
+            element.empty().append("<el-date-picker popper-class='hc-table-form-date-picker hc-form-id-"+keyname+"' @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' v-model=" + vmode + " type='datetime' format='YYYY年MM月DD日 HH:mm:ss' value-format='YYYY年MM月DD日 hh:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
         } else if (textdictInfo.getTextId().equals("dateYMD")) { // 日期--年月日
-            element.empty().append("<el-date-picker v-model=" + vmode + " type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
+            element.empty().append("<el-date-picker popper-class='hc-table-form-date-picker hc-form-id-"+keyname+"' @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' v-model=" + vmode + " type='date' format='YYYY年MM月DD日' value-format='YYYY年MM月DD日' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-date-picker>");
         } else if (textdictInfo.getTextId().equals("dateHMS")) { // 日期--时分秒
-            element.empty().append("<el-time-picker v-model=" + vmode + " type='date' format='HH:mm:ss' value-format='HH:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-time-picker popper-class='hc-table-form-date-picker hc-form-id-"+keyname+"' @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' v-model=" + vmode + " type='date' format='HH:mm:ss' value-format='HH:mm:ss' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateSM")) { // 日期--时分
-            element.empty().append("<el-time-picker v-model=" + vmode + " type='date' format='HH:mm' value-format='HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-time-picker popper-class='hc-table-form-date-picker hc-form-id-"+keyname+"' @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' v-model=" + vmode + " type='date' format='HH:mm' value-format='HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateMDHM")) { // 日期--月日时分
-            element.empty().append("<el-date-picker v-model=" + vmode + " type='datetime' format='MM月DD日 HH:mm' value-format='MM月DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-date-picker popper-class='hc-table-form-date-picker hc-form-id-"+keyname+"' @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' v-model=" + vmode + " type='datetime' format='MM月DD日 HH:mm' value-format='MM月DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("dateDHM")) { // 日期--日时分
-            element.empty().append("<el-date-picker v-model=" + vmode + " type='datetime' format='DD日 HH:mm' value-format='DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
+            element.empty().append("<el-date-picker popper-class='hc-table-form-date-picker hc-form-id-"+keyname+"' @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' v-model=" + vmode + " type='datetime' format='DD日 HH:mm' value-format='DD日 HH:mm' placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%'   placeholder='" + placeholder + "'> </el-time-picker>");
         } else if (textdictInfo.getTextId().equals("daterange")) { // 时间段
-            element.empty().append("<el-date-picker  v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
+            element.empty().append("<el-date-picker popper-class='hc-table-form-date-picker hc-form-id-"+keyname+"' @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' v-model=" + vmode + " type='datetimerange' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
             element.children().get(0).attr("@change", "datePickerChange($event,'" + keyname + "')");
         } else if (textdictInfo.getTextId().equals("daterangeYMD")) { // 时间段 /
-            element.empty().append("<el-date-picker  v-model=" + vmode + " type='datetimerange' range-separator='/' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
+            element.empty().append("<el-date-picker popper-class='hc-table-form-date-picker hc-form-id-"+keyname+"' @keydown.shift.up='keyupShiftUp' @keydown.shift.down='keyupShiftDown' @keydown.shift.left='keyupShiftLeft' @keydown.shift.right='keyupShiftRight' v-model=" + vmode + " type='datetimerange' range-separator='/' placeholder=" + placeholder + "  start-placeholder='开始日期'  end-placeholder='结束日期' format='YYYY年MM月DD日' trIndex=" + trindex + " keyname=" + keyname + " weighing=" + weighing + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + ">");
             element.children().get(0).attr("@change", "datePickerChange($event,'" + keyname + "')");
 
         } else if (textdictInfo.getTextId().equals("img")) {
-            element.empty().append("<hc-table-form-upload :src='" + vmode + "' placeholder=" + placeholder + " v-model=" + vmode + "  keyName=" + keyname + " weighing=" + weighing + "  @success='formUploadSuccess' @del='delTableFormFile' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "></hc-table-form-upload> ");
+            element.empty().append("<hc-table-form-upload @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight'  :src='" + vmode + "' placeholder=" + placeholder + " v-model=" + vmode + "  keyName=" + keyname + " weighing=" + weighing + "  @success='formUploadSuccess' @del='delTableFormFile' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + "></hc-table-form-upload> ");
         } else if (textdictInfo.getTextId().equals("searchSelect")) { //搜索框
-            element.empty().append("<hc-form-select-search type='dap_site_data' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </hc-form-select-search>");
+            element.empty().append("<hc-form-select-search @keyup.shift.up='keyupShiftUp' @keyup.shift.down='keyupShiftDown' @keyup.shift.left='keyupShiftLeft' @keyup.shift.right='keyupShiftRight' type='dap_site_data' :val=" + vmode + " contractId=''  pkeyId='' @change='formRemoteChange' v-model=" + vmode + " placeholder=" + placeholder + " keyname=" + keyname + " weighing=" + weighing + "  @contextmenu.prevent.native='RightClick(" + parm + ")' trIndex=" + trindex + " tdIndex=" + tdindex + "  x1=" + x1 + " x2=" + x2 + " y1=" + y1 + " y2=" + y2 + " style='width:100%;height:100%' > </hc-form-select-search>");
         }
         element.attr("@click", "getInformation(" + oncklickText + ")");
         File writefile = new File(wbsTreePrivate.getHtmlUrl());
@@ -330,8 +330,6 @@ public class TextdictInfoController extends BladeController {
             String clarSql = "update  " + tabName + " set " + keyname.split("__")[0] + "=null where p_key_id in(SELECT p_key_id FROM m_wbs_tree_contract WHERE id ='" + wbsTreePrivate.getId() + "' and project_id='" + wbsTreePrivate.getProjectId() + "' )";
             jdbcTemplate.execute(clarSql);
         }
-
-        //
         return R.success("操作成功");
     }
 

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

@@ -594,7 +594,7 @@ public class WbsTreePrivateController extends BladeController {
      */
     @GetMapping("/search-node-tables")
     @ApiOperationSupport(order = 22)
-    @ApiOperation(value = "试验-根据所属方查询当前节点表信息", notes = "传入节点primaryKeyId、所属方type=1施工,=2监理 ;表单类型tableType=1记录表,=2报告单; 合同段id、项目id、isAdd=是否新增、记录id")
+    @ApiOperation(value = "试验-根据所属方查询当前节点表信息", notes = "传入节点primaryKeyId;所属方type=1施工,=2监理 ;表单类型tableType=1记录表、=2报告单; 合同段id;项目id;isAdd=是否新增;记录id")
     public R<List<WbsTreePrivate>> searchNodeAllTable(String primaryKeyId, String type, String tableType, String contractId, String projectId, Integer isAdd, Long id) {
         return R.data(wbsTreePrivateService.searchNodeAllTable(primaryKeyId, type, tableType, contractId, projectId, isAdd, id));
     }

+ 4 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -73,7 +73,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
                 excelTabService.getBussPDFTrial(Long.valueOf(tableInfo.getPkeyId()), contractId, id);
 
                 //重新合并pdf
-                String sql = "select * from u_trial_self_data_record where record_id = " + id;
+                String sql = "select pdf_url from u_trial_self_data_record where record_id = " + id;
                 List<TrialSelfDataRecord> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class));
                 List<String> pdfList = query.stream().map(TrialSelfDataRecord::getPdfUrl).collect(Collectors.toList());
 
@@ -94,7 +94,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
                 TrialSelfInspectionRecord obj = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(TrialSelfInspectionRecord.class)).stream().findAny().orElse(null);
                 assert obj != null;
                 //重新合并pdf集合(解决单表保存后上报找不到题名问题)
-                String querySql = "select * from u_information_query where classify ='" + type + "' and wbs_id ='" + id + "' and contract_id ='" + contractId + "'";
+                String querySql = "select id from u_information_query where classify ='" + type + "' and wbs_id ='" + id + "' and contract_id ='" + contractId + "'";
                 List<InformationQuery> query2 = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<>(InformationQuery.class));
                 if (query2.size() > 0) {
                     String updateSql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + obj.getTrialProjectName() + "'  where classify='" + type + "' and  wbs_id='" + id + "' and contract_id ='" + contractId + "'";
@@ -104,7 +104,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
                 }
 
                 //修改原材料检测报告原始pdfUrl
-                String sql3 = "select * from u_trial_raw_material_self_record where self_record_id =" + id;
+                String sql3 = "select id from u_trial_raw_material_self_record where self_record_id =" + id;
                 TrialRawMaterialSelfRecord record = jdbcTemplate.query(sql3, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class)).stream().findAny().orElse(null);
                 if (ObjectUtil.isNotEmpty(record)) {
                     String sqlUpdate2 = "update u_trial_raw_material_self_record set old_pdf_url = '" + bladeFile.getLink() + "' where self_record_id =" + id;
@@ -124,7 +124,7 @@ public class ExcelTabClientImpl implements ExcelTabClient {
             );
 
             //修改原材料检测报告原始pdfUrl
-            String sql = "select * from u_trial_raw_material_self_record where self_record_id =" + id;
+            String sql = "select id from u_trial_raw_material_self_record where self_record_id =" + id;
             TrialRawMaterialSelfRecord record = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TrialRawMaterialSelfRecord.class)).stream().findAny().orElse(null);
             if (ObjectUtil.isNotEmpty(record)) {
                 String sqlUpdate = "update u_trial_raw_material_self_record set old_pdf_url = '" + pdfUrl + "' where self_record_id =" + id;

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

@@ -84,9 +84,7 @@ public interface ContractInfoMapper extends BaseMapper<ContractInfo> {
     @Select("select quality_node_id from u_trial_self_quality_project where self_id = #{selfId}")
     List<String> queryList(@Param("selfId") String selfId);
 
-    List<WbsTreeContractVO> tree5(@Param("wbsId") Long wbsId,
-                                  @Param("projectId") Long projectId,
-                                  @Param("contractId") Long contractId);
+    List<WbsTreeContractTreeAllVO> tree5(@Param("contractId") Long contractId);
 
     List<WbsTreeContractVO6> tree6(@Param("wbsId") Long wbsId,
                                   @Param("projectId") Long projectId,

+ 5 - 21
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ContractInfoMapper.xml

@@ -418,37 +418,21 @@
         </foreach>
     </select>
 
-    <select id="tree5" resultMap="treeNodeResultMap2">
+    <select id="tree5" resultType="org.springblade.manager.vo.WbsTreeContractTreeAllVO">
         SELECT
         d.p_key_id AS "primaryKeyId",
-        d.wbs_type AS "wbsType",
         d.id,
         d.parent_id AS "parentId",
         IFNULL(if(length(trim(full_name)) > 0, full_name, node_name),node_name) AS title,
-        d.node_name AS "nodeName",
-        d.full_name AS "fullName",
-        d.import_matching_info AS "importMatchingInfo",
-        d.type AS "type",
-        d.node_type AS "nodeType",
-        d.id AS "value",
-        d.id AS "key",
         partition_code,
-        old_id,
+        node_type,
         sort
         FROM m_wbs_tree_contract d
         WHERE
-        d.is_deleted = 0
-        AND d.status = 1
+         contract_id = #{contractId}
         AND d.type = 1
-        <if test="wbsId!=null and wbsId!=''">
-            and wbs_id = #{wbsId}
-        </if>
-        <if test="projectId !=null and projectId!=''">
-            and project_id = #{projectId}
-        </if>
-        <if test="contractId!=null and contractId!=''">
-            and contract_id = #{contractId}
-        </if>
+        AND d.status = 1
+        AND d.is_deleted = 0
         ORDER BY d.sort
     </select>
 

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

@@ -40,7 +40,7 @@ public interface TableFileMapper extends BaseMapper<TableFile> {
 	 */
 	List<TableFileVO> selectTableFilePage(IPage page, TableFileVO tableFile);
 
-	List<TableFileVO> selectTableFileList(Long pKid);
+	List<TableFileVO> selectTableFileList(String pKid);
 
 	void delDataById(String id, Long recordId);
 

+ 5 - 5
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsFormElementMapper.xml

@@ -125,12 +125,12 @@
     </select>
 
     <select id="selectDetailById" resultType="org.springblade.manager.vo.WbsFormElementVO">
-        SELECT *,
-               (SELECT concat(init_table_name, "_", t.e_key) FROM m_wbs_tree WHERE id = t.f_id) AS "tableElementKey"
-        FROM m_wbs_form_element t
+        SELECT t.*,
+               concat(c.tab_en_name, "_", t.e_key)  AS "tableElementKey",c.tab_ch_name as "initTableName"
+        FROM m_wbs_form_element t LEFT JOIN m_table_info c on t.f_id=c.id
         WHERE t.id = #{id}
-          AND status = 1
-          AND is_deleted = 0
+          AND t.status = 1
+          AND t.is_deleted = 0
     </select>
 
     <select id="selectElementInTableByFid" resultType="org.springblade.manager.entity.WbsTree">

+ 8 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsParamMapper.xml

@@ -3,19 +3,20 @@
 <mapper namespace="org.springblade.manager.mapper.WbsParamMapper">
     <resultMap id="ResultMap" type="org.springblade.manager.entity.WbsParam">
         <result column="id" property="id"/>
-        <result column="createUser" property="create_user"/>
-        <result column="createDept" property="create_dept"/>
-        <result column="createTime" property="create_time"/>
-        <result column="updateUser" property="update_user"/>
-        <result column="updateTime" property="update_time"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
         <result column="status" property="status"/>
-        <result column="isDeleted" property="is_deleted"/>
+        <result column="is_deleted" property="isDeleted"/>
         <result column="name" property="name"/>
         <result column="k" property="k"/>
         <result column="v" property="v"/>
-        <result column="nodeId" property="node_id"/>
+        <result column="node_id" property="nodeId"/>
         <result column="remark" property="remark"/>
         <result column="type" property="type"/>
+        <result column="project_id" property="projectId"/>
     </resultMap>
 
 </mapper>

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

@@ -28,8 +28,6 @@ public interface WbsTreeContractMapper extends EasyBaseMapper<WbsTreeContract> {
 
     WbsTreeContract selectByCondition(@Param("id") String id, @Param("projectId") String projectId, @Param("contractId") String contractId, @Param("wbsId") String wbsId);
 
-    List<WbsTreeContract> findAllNodeList2(@Param("projectId") String projectId, @Param("contractId") String contractId, @Param("wbsId") String wbsId);
-
     void updateByCondition(@Param("id") String id, @Param("projectId") String projectId, @Param("contractId") String contractId, @Param("wbsId") String wbsId);
 
     WbsTreeContract selectByCondition2(@Param("id") String id, @Param("projectId") String projectId, @Param("contractId") String contractId, @Param("wbsId") String wbsId);

+ 3 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/WbsTreeContractMapper.xml

@@ -237,17 +237,6 @@
           AND STATUS = 1
     </select>
 
-    <select id="findAllNodeList2" resultType="org.springblade.manager.entity.WbsTreeContract">
-        SELECT *
-        FROM m_wbs_tree_contract
-        WHERE project_id = #{projectId}
-          AND contract_id = #{contractId}
-          AND wbs_id = #{wbsId}
-          AND STATUS = 1
-          AND is_deleted = 0
-          AND old_id is null
-    </select>
-
     <select id="selectParent" resultType="org.springblade.manager.entity.WbsTreePrivate">
         SELECT p_key_id, node_name, full_name
         FROM m_wbs_tree_private
@@ -585,7 +574,8 @@
                 node_type = #{item.nodeType},
                 major_data_type = #{item.majorDataType},
                 table_type = #{item.tableType},
-                table_owner = #{item.tableOwner}
+                table_owner = #{item.tableOwner},
+                html_url = #{item.htmlUrl}
             </set>
             WHERE id = #{item.id}
             AND project_id = #{item.projectId}
@@ -627,7 +617,7 @@
     </select>
 
     <select id="selectContractList" resultType="org.springblade.manager.entity.WbsTreeContract">
-        SELECT * FROM m_wbs_tree_contract WHERE id in
+        SELECT contract_id FROM m_wbs_tree_contract WHERE id in
         <foreach item="ids" collection="ids" open="(" close=")" separator=",">
             #{ids}
         </foreach>

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

@@ -86,7 +86,7 @@ public interface WbsTreePrivateMapper extends EasyBaseMapper<WbsTreePrivate> {
 
     void delTabProjectById(String pKeyId,String projectId);
 
-    List<WbsTreePrivate> selectWbsTreeContractList(List<String> tableOwnerNumbers,String tableType, String projectId, String wbsId, Long parentId, List<String> tableOwnerList);
+    List<WbsTreePrivate> selectWbsTreeContractList(List<String> roleAndTabOwners,String tableType, String projectId, String wbsId, Long parentId, List<String> tableOwnerList);
 
     //删除表单信息
     void delTableById(String pKeyId);

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

@@ -302,7 +302,8 @@
                 import_matching_info = #{item.importMatchingInfo},
                 mix_ratio_test_ids = #{item.mixRatioTestIds},
                 init_table_name = #{item.initTableName},
-                init_table_id = #{item.initTableId}
+                init_table_id = #{item.initTableId},
+                html_url = #{item.htmlUrl}
             </set>
             WHERE id = #{item.id}
             AND project_id = #{item.projectId}
@@ -692,8 +693,8 @@
         AND parent_id = #{parentId}
         AND table_type = #{tableType}
         AND table_owner in
-        <foreach item="tableOwnerNumbers" collection="tableOwnerNumbers" open="(" close=")" separator=",">
-            #{tableOwnerNumbers}
+        <foreach item="roleAndTabOwners" collection="roleAndTabOwners" open="(" close=")" separator=",">
+            #{roleAndTabOwners}
         </foreach>
         AND type = 2
         AND status = 1

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

@@ -63,9 +63,9 @@ public interface IArchiveTreeContractService extends BaseService<ArchiveTreeCont
 
 	List<ArchiveTreeContractVO> tree(String tenantI,Integer disPlayTree,Integer nodeType,Long projectId);
 
-	List<ArchiveTreeContractVO2> lazyTree2(String tenantId, Long parentId, Long projectId);
+	List<ArchiveTreeContractVO2> lazyTree2(String tenantId, Long parentId, Long projectId, Long contractId);
 
-	List<ArchiveTreeContractVO2> tree2(String tenantI,Integer disPlayTree,Integer nodeType,Long projectId);
+	List<ArchiveTreeContractVO2> tree2(String tenantI,Integer disPlayTree,Integer nodeType,Long projectId, Long contractId);
 
 
 

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

@@ -44,7 +44,7 @@ public interface IContractInfoService extends BaseService<ContractInfo> {
 
     List<WbsTreeContractVO> tree2(String wbsId, String projectId, String contractId);
 
-    List<WbsTreeContractVO> tree3(String wbsId, String projectId, String contractId);
+    List<WbsTreeContractTreeAllVO> tree3(String contractId, Integer type);
 
     List<WbsTreeContractVO6> tree6List(String wbsId, String projectId, String contractId);
 
@@ -68,6 +68,6 @@ public interface IContractInfoService extends BaseService<ContractInfo> {
 
     Map<String, Object> trialRelationTree(String wbsId, String projectId, String contractId, String selfId);
 
-
+    Map<Long, List<WbsTreeContractTreeAllVO>> treeAllJL(String contractId, Integer type);
 
 }

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

@@ -9,6 +9,6 @@ import org.springblade.manager.entity.FormulaOption;
  */
 public interface IFormulaOptionService extends IService<FormulaOption> {
     String queryOption(Long contractId,Long parentId,Long pkeyId,String key);
-    void saveOrUpdateOption(FormulaOptionVo fo);
+    Object saveOrUpdateOption(FormulaOptionVo fo);
 
 }

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaService.java

@@ -7,6 +7,7 @@ import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.impl.TableElementConverter;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author yangyj
@@ -34,4 +35,5 @@ public interface IFormulaService extends BaseService<Formula> {
 
     List<Formula> getFormulaList(List<KeyMapper> keyMapperList);
     List<KeyMapper> getKeyMapperList(List<Long> ids,String projectId);
+    Map<String,Object> getElementInfoByCodes(String codes);
 }

+ 18 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArTreeContractInitServiceImpl.java

@@ -264,6 +264,24 @@ public class ArTreeContractInitServiceImpl {
         }
     }
 
+
+    public ArchiveTreeContractVO2 getTree(List<ArchiveTreeContract> archiveTreeContracts) {
+        List<ArchiveTreeContractVO2> archiveTreeContractVO2List = new ArrayList<>();
+
+        for (ArchiveTreeContract archiveTreeContract:archiveTreeContracts) {
+            ArchiveTreeContractVO2 treeContractVO2 = new ArchiveTreeContractVO2(archiveTreeContract);
+            archiveTreeContractVO2List.add(treeContractVO2);
+        }
+
+        List<ArchiveTreeContractVO2> trees = ForestNodeMerger.merge(archiveTreeContractVO2List);
+
+        if (trees != null && trees.size() > 0) {
+           return trees.get(0);
+        }else {
+            return null;
+        }
+    }
+
     /**
      *
      * @param tenantId

+ 29 - 8
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ArchiveTreeContractServiceImpl.java

@@ -105,7 +105,10 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 			}
 		}
 
+		ArchiveTreeContractVO2 newTree = arTreeContractInitService.getTree(archiveTreeContracts);
 
+		List<ArchiveTreeContract> addNodes = arTreeContractInitService.getContractProcExtNodes(tenantId,projectId,wbsId,newTree);
+		archiveTreeContracts.addAll(addNodes);
 		//todo 同步质检资料动态节点,处理文件提名
 
 		//todo 同步立卷规则
@@ -131,17 +134,17 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	}
 
 	@Override
-	public List<ArchiveTreeContractVO2> lazyTree2(String tenantId, Long parentId, Long projectId) {
+	public List<ArchiveTreeContractVO2> lazyTree2(String tenantId, Long parentId, Long projectId, Long contractId) {
 		if (AuthUtil.isAdministrator()) {
 			tenantId = StringPool.EMPTY;
 		}
-		return ForestNodeMerger.merge(baseMapper.lazyTree2(tenantId, parentId,projectId,getAuthCode(),getAuthContractId()));
+		return ForestNodeMerger.merge(baseMapper.lazyTree2(tenantId, parentId,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
 	}
 
 	@Override
-	public List<ArchiveTreeContractVO2> tree2(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId) {
+	public List<ArchiveTreeContractVO2> tree2(String tenantId, Integer disPlayTree, Integer nodeType, Long projectId, Long contractId) {
 
-		return ForestNodeMerger.merge(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId,getAuthCode(),getAuthContractId()));
+		return ForestNodeMerger.merge(baseMapper.tree2(tenantId, disPlayTree, nodeType,projectId,getAuthCode(contractId),getAuthContractId(contractId)));
 	}
 
 
@@ -252,20 +255,38 @@ public class ArchiveTreeContractServiceImpl extends BaseServiceImpl<ArchiveTreeC
 	 * 返回所属的合同段,没有则范围“”
 	 * @return
 	 */
-	public String getAuthContractId() {
-		String contractId ="";
+	public String getAuthContractId(Long contractId) {
+
 		BladeUser bladeUser = AuthUtil.getUser();
 
-		return contractId;
+		return contractId == null?"":contractId.toString();
 	}
 
 	/**
 	 * 施工则返回“C”,监理则返回“S”,其他返回“”
 	 * @return
 	 */
-	public String getAuthCode() {
+	public String getAuthCode(Long contractId) {
 		String code ="";
 		BladeUser bladeUser = AuthUtil.getUser();
+		if (AuthUtil.isAdministrator() || contractId == null) {
+			return code;
+		}
+
+		//查询合同段信息
+		ContractInfo contractInfo = contractInfoService.getById(contractId);
+		switch (contractInfo.getContractType()){
+			case 2:
+				code = "S";
+				break;
+			case 3:
+				code = "";
+				break;
+			default:
+				code = "C";
+				break;
+		}
+
 		return code;
 	}
 

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

@@ -3,9 +3,11 @@ package org.springblade.manager.service.impl;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.AllArgsConstructor;
+import org.springblade.business.feign.InformationQueryClient;
 import org.springblade.common.utils.BaiduApiUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.log.exception.ServiceException;
@@ -38,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.io.IOException;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Service
@@ -51,6 +54,7 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     private final WbsTreeContractMapper wbsTreeContractMapper;
     private final JdbcTemplate jdbcTemplate;
     private final IUserClient iUserClient;
+    private final InformationQueryClient informationQueryClient;
 
     @Override
     public List<String> getProcessContractByJLContractId(String contractId) {
@@ -129,17 +133,67 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     }
 
     @Override
-    public List<WbsTreeContractVO> tree3(String wbsId, String projectId, String contractId) {
-        List<WbsTreeContractVO> wbsTreeContractVOS = baseMapper.tree5(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId));
-        return buildWbsTreeByStream(wbsTreeContractVOS);
+    public List<WbsTreeContractTreeAllVO> tree3(String contractId, Integer type) {
+        List<WbsTreeContractTreeAllVO> wbsTreeContractVOS = baseMapper.tree5(Long.parseLong(contractId));
+//        if (ObjectUtils.isNotEmpty(type) && type == 1) {
+            //获取所有已填报信息
+            Map<String, Long> allTable = informationQueryClient.getTreeAllTable(contractId);
+            Set<String> keySet = allTable.keySet();
+            for (String key : keySet) {
+                for (WbsTreeContractTreeAllVO vo : wbsTreeContractVOS) {
+                    if (key.equals(vo.getId() + "")) {
+                        vo.setSubmitCounts(allTable.get(key));
+                        vo.setColorStatus(2);
+                    }
+                }
+            }
+            wbsTreeContractVOS.stream().forEach(wtc -> {
+                if (wtc.getSubmitCounts() == null) {
+                    wtc.setSubmitCounts(0L);
+                }
+            });
+//        }
+        return buildWbsTreeByStreamByTreeAll(wbsTreeContractVOS);
     }
 
     @Override
-    public List<WbsTreeContractVO6> tree6List(String wbsId, String projectId, String contractId) {
-        List<WbsTreeContractVO6> wbsTreeContractVOS = baseMapper.tree6(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId));
-        return wbsTreeContractVOS;
+    public Map<Long, List<WbsTreeContractTreeAllVO>> treeAllJL(String contractId, Integer type) {
+        //获取当前监理、指挥部合同段对应的施工权限
+        String sql = "select contract_id_sg from m_contract_relation_jlyz where contract_id_jlyz = " + contractId;
+        List<ContractRelationJlyz> query = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(ContractRelationJlyz.class));
+
+        Map<Long, List<WbsTreeContractTreeAllVO>> result = new HashMap<>();
+
+        //查询施工树
+        for (ContractRelationJlyz sg : query) {
+            List<WbsTreeContractTreeAllVO> wbsTreeContractVOS = baseMapper.tree5(sg.getContractIdSg());
+            if (ObjectUtils.isNotEmpty(type) && type == 1) {
+                //获取所有已填报信息
+                Map<String, Long> allTable = informationQueryClient.getTreeAllTable(contractId);
+                Set<String> keySet = allTable.keySet();
+                for (String key : keySet) {
+                    for (WbsTreeContractTreeAllVO vo : wbsTreeContractVOS) {
+                        if (key.equals(vo.getId() + "")) {
+                            vo.setSubmitCounts(allTable.get(key));
+                        }
+                    }
+                }
+                wbsTreeContractVOS.stream().forEach(wtc -> {
+                    if (wtc.getSubmitCounts() == null) {
+                        wtc.setSubmitCounts(0L);
+                    }
+                });
+            }
+            List<WbsTreeContractTreeAllVO> resultTreeSG = buildWbsTreeByStreamByTreeAll(wbsTreeContractVOS);
+            result.put(sg.getContractIdSg(), resultTreeSG);
+        }
+        return result;
     }
 
+    @Override
+    public List<WbsTreeContractVO6> tree6List(String wbsId, String projectId, String contractId) {
+        return baseMapper.tree6(Long.parseLong(wbsId), Long.parseLong(projectId), Long.parseLong(contractId));
+    }
 
     @Override
     public List<WbsTreeContractVO> tree(String wbsId, String projectId, String contractId) {
@@ -154,10 +208,10 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         return list;
     }
 
-    public List<WbsTreeContractVO6> buildWbsTreeByStream6(List<WbsTreeContractVO6> wbsTreeVO2s) {
-        List<WbsTreeContractVO6> list = wbsTreeVO2s.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
-        Map<Long, List<WbsTreeContractVO6>> map = wbsTreeVO2s.stream().collect(Collectors.groupingBy(WbsTreeContractVO6::getParentId));
-        this.recursionFnTree6(list, map);
+    public List<WbsTreeContractTreeAllVO> buildWbsTreeByStreamByTreeAll(List<WbsTreeContractTreeAllVO> wbsTreeVO2s) {
+        List<WbsTreeContractTreeAllVO> list = wbsTreeVO2s.stream().filter(f -> f.getParentId() == 0L).collect(Collectors.toList());
+        Map<Long, List<WbsTreeContractTreeAllVO>> map = wbsTreeVO2s.stream().collect(Collectors.groupingBy(WbsTreeContractTreeAllVO::getParentId));
+        this.recursionFnTreeAll(list, map);
         return list;
     }
 
@@ -172,18 +226,17 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
         }
     }
 
-    public void recursionFnTree6(List<WbsTreeContractVO6> list, Map<Long, List<WbsTreeContractVO6>> map) {
-        for (WbsTreeContractVO6 wbsTreeContractVO6 : list) {
-            List<WbsTreeContractVO6> childrenList = map.get(wbsTreeContractVO6.getId());
-            wbsTreeContractVO6.setChildren(childrenList);
+    public void recursionFnTreeAll(List<WbsTreeContractTreeAllVO> list, Map<Long, List<WbsTreeContractTreeAllVO>> map) {
+        for (WbsTreeContractTreeAllVO wbsTreeContractVO : list) {
+            List<WbsTreeContractTreeAllVO> childrenList = map.get(wbsTreeContractVO.getId());
+            wbsTreeContractVO.setChildren(childrenList);
             if (childrenList != null && childrenList.size() > 0) {
-                wbsTreeContractVO6.setHasChildren(true);
-                recursionFnTree6(childrenList, map);
+                wbsTreeContractVO.setHasChildren(true);
+                recursionFnTreeAll(childrenList, map);
             }
         }
     }
 
-
     @Override
     public List<WbsTreeContractVO2> treeTwo(String projectId) {
         return wbsTreeContractMapper.selectListByCondition(projectId);

+ 193 - 146
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -552,6 +552,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 excelTab.setStatus(3);
                 baseMapper.updateById(excelTab);
                 connection.disconnect();
+                System.out.println("123456");
             } catch (Exception e) {
                 editCallback.setError(1);
                 e.printStackTrace();
@@ -921,7 +922,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 for (Element element : htdtitle) {
                     int trindex = Integer.parseInt(element.attr("trindex"));
                     if (trindex <= 8) {
-                        reData.put(element.attr("keyName"), contractInfo.getContractName());
+                        reData.put(element.attr("keyName"), contractInfo.getContractNumber());
                     }
                 }
             }
@@ -935,12 +936,16 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     }
                 }
             }
+            //获取父节点划分编号
+            WbsTreeContract node = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                    .eq(WbsTreeContract::getId, wbsTreeContract.getParentId())
+                    .eq(WbsTreeContract::getContractId, wbsTreeContract.getContractId()));
             // 编号
             if (bhtitle.size() >= 1 && contractInfo.getIsReferenceNumber() == 1) {
                 for (Element element : bhtitle) {
                     int trindex = Integer.parseInt(element.attr("trindex"));
                     if (trindex <= 10) {
-                        reData.put(element.attr("keyName"), contractInfo.getContractNumber());
+                        reData.put(element.attr("keyName"), node.getPartitionCode()==null?"":node.getPartitionCode());
                     }
                 }
             }
@@ -1048,7 +1053,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     @Override
     public R getBussPdfInfo(Long pkeyId) throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        //String file_path = "C:\\Users\\泓创开发\\Desktop";
+       // String file_path = "/Users/hongchuangyanfa/Desktop/";
 
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
@@ -1089,50 +1094,40 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
         int all = sheet.getRow(0).getLastCellNum();
         int mergedCellCnt = sheet.getNumMergedRegions();
-        List<Map<String, Integer>> titleList = new ArrayList<>();
         for (int i = 0; i < mergedCellCnt - 1; i++) {
             CellRangeAddress mergedCell = sheet.getMergedRegion(i);
             int xx = mergedCell.getNumberOfCells();
             if (xx == all) {
                 int fisRow = mergedCell.getFirstRow();
                 int firsrCol = mergedCell.getFirstColumn();
+
                 Cell cell = sheet.getRow(fisRow).getCell(firsrCol);
                 short fontIndex = cell.getCellStyle().getFontIndex();
-                Font fontAt = workbook.getFontAt(fontIndex);
-                short fontHeightInPoints = fontAt.getFontHeightInPoints();
-                if (fontHeightInPoints >= 14) {
-                    Map<String, Integer> titleMap = new HashMap<>();
-                    titleMap.put("index", i);
-                    titleMap.put("x", firsrCol);
-                    titleMap.put("y", fisRow);
-                    String data = cell.getStringCellValue();
-                    if (StringUtils.isNotEmpty(data)) {
-                        titleMap.put("val", 2);
-                    } else {
-                        titleMap.put("val", 1);
-                    }
-                    titleList.add(titleMap);
-                }
-            }
-        }
 
-        //添加标题
-        System.out.println(titleList.size());
-        if (titleList != null) {
-            if (titleList.size() == 1) {
-                Map<String, Integer> titData = titleList.get(0);
-                if (titData.get("val") == 1) {
-                    Cell cell = sheet.getRow(titData.get("y")).getCell(titData.get("x"));
-                    cell.setCellValue(projectInfo.getProjectName());
-                }
-            } else if (titleList.size() >= 2) {
-                for (int i = 0; i < titleList.size(); i++) {
-                    Map<String, Integer> titData = titleList.get(i);
-                    if (titData.get("val") == 2) {
-                        Map<String, Integer> titData2 = titleList.get(i - 1);
-                        Cell cell = sheet.getRow(titData2.get("y")).getCell(titData2.get("x"));
-                        cell.setCellValue(projectInfo.getProjectName());
+                Font oldfontAt = workbook.getFontAt(fontIndex);
+
+                Font redFont = workbook.createFont();
+                redFont.setFontHeightInPoints(oldfontAt.getFontHeightInPoints());//设置字体大小
+                redFont.setFontName(oldfontAt.getFontName());//设置字体
+
+                CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
+                newStyle.cloneStyleFrom(cell.getCellStyle());
+
+
+
+                short fontHeightInPoints = redFont.getFontHeightInPoints();
+                if (fontHeightInPoints >= 14 && StringUtils.isEmpty(cell.getStringCellValue()) && fisRow<=8) {
+
+                    String title=projectInfo.getProjectName();
+                    if(title.length()>=30){
+                        sheet.getRow(fisRow).setHeight((short)900);
+                        newStyle.setWrapText(true);
                     }
+                    redFont.setBold(true);
+                    newStyle.setFont(redFont);
+                    cell.setCellStyle(newStyle);
+                    cell.setCellValue(title);
+                    break;
                 }
             }
         }
@@ -1152,85 +1147,101 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         if (val.indexOf("__") >= 0) {
                             String[] DataVal = val.split("__");
                             String[] xy = DataVal[1].split("_");
-
-                            Element data = trs.get(Integer.parseInt(xy[0])).select("td").get(Integer.parseInt(xy[1]));
-
-                            if (data.html().indexOf("x1") >= 0 && data.html().indexOf("y1") >= 0) {
-                                int x1 = 0;
-                                int x2 = 0;
-                                int y1 = 0;
-                                int y2 = 0;
-
-                                if (data.html().indexOf("el-tooltip") >= 0) {
-                                    x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
-                                    x2 = Integer.parseInt(data.children().get(0).children().get(0).attr("x2"));
-                                    y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
-                                } else {
-                                    x1 = Integer.parseInt(data.children().get(0).attr("x1"));
-                                    y1 = Integer.parseInt(data.children().get(0).attr("y1"));
-                                }
-                                if (x1 == 0) {
-                                    x1 = 1;
-                                }
-                                String myData = DataInfo.get(val) + "";
-                                if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
-                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
-                                    sdf.setTimeZone(TimeZone.getTimeZone("GTM+8"));
-                                    SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM月dd日");
-                                    if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
-
-                                        myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
-                                        String[] dataVal = myData.split(",");
-
-                                        Date Start_dataStr = sdf.parse(dataVal[0]);
-                                        Date end_dataStr = sdf.parse(dataVal[1]);
-                                        String StartDate = formatStr.format(Start_dataStr);
-                                        String endDate = formatStr.format(end_dataStr);
-                                        if (StartDate.equals(endDate)) {
-                                            myData = StartDate;
-                                        } else {
-                                            myData = StartDate + "-" + endDate;
+                            if (Integer.parseInt(xy[0])<trs.size()) {
+                                Element ytzData = trs.get(Integer.parseInt(xy[0]));
+                                if (ytzData != null) {
+                                    Elements tdsx = ytzData.select("td");
+                                    if (Integer.parseInt(xy[1]) < tdsx.size()) {
+                                        Element data = ytzData.select("td").get(Integer.parseInt(xy[1]));
+                                        if (data != null) {
+                                            if (data.html().indexOf("x1") >= 0 && data.html().indexOf("y1") >= 0) {
+                                                int x1 = 0;
+                                                int x2 = 0;
+                                                int y1 = 0;
+                                                int y2 = 0;
+
+                                                if (data.html().indexOf("el-tooltip") >= 0) {
+                                                    x1 = Integer.parseInt(data.children().get(0).children().get(0).attr("x1"));
+                                                    x2 = Integer.parseInt(data.children().get(0).children().get(0).attr("x2"));
+                                                    y1 = Integer.parseInt(data.children().get(0).children().get(0).attr("y1"));
+                                                } else {
+                                                    x1 = Integer.parseInt(data.children().get(0).attr("x1"));
+                                                    y1 = Integer.parseInt(data.children().get(0).attr("y1"));
+                                                }
+                                                if (x1 == 0) {
+                                                    x1 = 1;
+                                                }
+                                                String myData = DataInfo.get(val) + "";
+                                                if (myData.indexOf("T") >= 0 && myData.indexOf("-") >= 0) {
+                                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
+                                                    sdf.setTimeZone(TimeZone.getTimeZone("GTM+8"));
+                                                    SimpleDateFormat formatStr = new SimpleDateFormat("yyyy年MM月dd日");
+                                                    if (myData.indexOf(",") >= 0 && myData.indexOf("]") >= 0) {
+
+                                                        myData = myData.replace("[", "").replace("]", "").replaceAll("'", "");
+                                                        String[] dataVal = myData.split(",");
+
+                                                        Date Start_dataStr = sdf.parse(dataVal[0]);
+                                                        Date end_dataStr = sdf.parse(dataVal[1]);
+                                                        String StartDate = formatStr.format(Start_dataStr);
+                                                        String endDate = formatStr.format(end_dataStr);
+                                                        if (StartDate.equals(endDate)) {
+                                                            myData = StartDate;
+                                                        } else {
+                                                            myData = StartDate + "-" + endDate;
+                                                        }
+                                                    } else {
+                                                        String[] dataStr = myData.split("T")[0].split("-");
+                                                        myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
+                                                    }
+                                                }
+                                                //https:bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220819/b53cb6700db369381e3b03d7737bcdec.jpg__16_1
+                                                if (myData.indexOf("https") >= 0 && myData.indexOf("aliyuncs") >= 0) {
+
+                                                    InputStream imageIn = CommonUtil.getOSSInputStream(myData);
+                                                    byte[] bytes = IOUtils.toByteArray(imageIn);
+                                                    // 这里根据实际需求选择图片类型
+                                                    int pictureIdx = workbook.addPicture(bytes, 6);
+
+                                                    CreationHelper helper = workbook.getCreationHelper();
+                                                    ClientAnchor anchor = helper.createClientAnchor();
+                                                    anchor.setCol1(x1); // param1是列号
+                                                    anchor.setCol2(x2);
+                                                    anchor.setRow1(y1); // param2是行号
+                                                    anchor.setRow2(y2); // param2是行号
+                                                    //
+                                                    Drawing drawing = sheet.createDrawingPatriarch();
+                                                    anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
+                                                    // 插入图片
+                                                    Picture pict = drawing.createPicture(anchor, pictureIdx); // 调整图片占单元格百分比的大小,1.0就是100%
+                                                    pict.resize(1, 1);
+                                                    FileUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
+
+                                                } else if (myData.equals("1") && data.html().indexOf("hc-form-checkbox-group") >= 0) {
+                                                    Row row = sheet.getRow(y1 - 1);
+                                                    if (row != null) {
+                                                        Cell cell = row.getCell(x1 - 1);
+                                                        if (cell != null || ObjectUtils.isNotEmpty(cell)) {
+                                                            String exceVal = cell.getStringCellValue().replaceAll(" ", "");
+                                                            short fontIndex = cell.getCellStyle().getFontIndex();
+                                                            Font fontAt = workbook.getFontAt(fontIndex);
+                                                            fontAt.setFontName("EUDC");
+                                                            cell.setCellValue(exceVal.replace("□", "\u2611"));
+                                                        }
+                                                    }
+                                                } else {
+                                                    Row row = sheet.getRow(y1 - 1);
+                                                    if (row != null) {
+                                                        Cell cell = row.getCell(x1 - 1);
+                                                        if (cell != null || ObjectUtils.isNotEmpty(cell)) {
+                                                            cell.setCellValue(myData);
+                                                        }
+                                                    }
+                                                }
+                                            }
                                         }
-                                    } else {
-                                        String[] dataStr = myData.split("T")[0].split("-");
-                                        myData = StringUtil.format("{}年{}月{}日", dataStr[0], dataStr[1], Integer.parseInt(dataStr[2]) + 1);
                                     }
                                 }
-                                //https:bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20220819/b53cb6700db369381e3b03d7737bcdec.jpg__16_1
-                                if (myData.indexOf("https") >= 0 && myData.indexOf("aliyuncs") >= 0) {
-
-                                    InputStream imageIn = CommonUtil.getOSSInputStream(myData);
-                                    byte[] bytes = IOUtils.toByteArray(imageIn);
-                                    // 这里根据实际需求选择图片类型
-                                    int pictureIdx = workbook.addPicture(bytes, 6);
-
-                                    CreationHelper helper = workbook.getCreationHelper();
-                                    ClientAnchor anchor = helper.createClientAnchor();
-                                    anchor.setCol1(x1); // param1是列号
-                                    anchor.setCol2(x2);
-                                    anchor.setRow1(y1); // param2是行号
-                                    anchor.setRow2(y2); // param2是行号
-                                    //
-                                    Drawing drawing = sheet.createDrawingPatriarch();
-                                    anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
-                                    // 插入图片
-                                    Picture pict = drawing.createPicture(anchor, pictureIdx); // 调整图片占单元格百分比的大小,1.0就是100%
-                                    pict.resize(1, 1);
-                                    FileUtils.imageOrientation(sheet, anchor, new DataVO(x1 - 1, y1 - 1));
-
-                                } else if (myData.equals("1") && data.html().indexOf("hc-form-checkbox-group") >= 0) {
-                                    Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
-                                    String exceVal = cell.getStringCellValue().replaceAll(" ", "");
-                                    short fontIndex = cell.getCellStyle().getFontIndex();
-                                    Font fontAt = workbook.getFontAt(fontIndex);
-                                    fontAt.setFontName("EUDC");
-                                    cell.setCellValue(exceVal.replace("□", "\u2611"));
-                                } else {
-                                    Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
-                                    cell.setCellValue(myData);
-
-
-                                }
                             }
                         }
                     }
@@ -1247,25 +1258,40 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         String key = e.getColKey();
                         String[] keys = key.split("__");
                         String[] trtd = keys[1].split("_");
-                        Element data = trs.get(Integer.parseInt(trtd[0])).select("td").get(Integer.parseInt(trtd[1]));
-                        int x1 = Integer.parseInt(data.children().get(0).attr("x1"));
-                        if (x1 == 0) {
-                            x1 = 1;
+                        if (Integer.parseInt(trtd[0])<trs.size()) {
+                            Element ytzData = trs.get(Integer.parseInt(trtd[0]));
+                            if (ytzData != null) {
+                                Elements tdsx = ytzData.select("td");
+                                if (Integer.parseInt(trtd[1])<tdsx.size()) {
+                                    Element data = ytzData.select("td").get(Integer.parseInt(trtd[1]));
+                                    int x1 = Integer.parseInt(data.children().get(0).attr("x1"));
+                                    if (x1 == 0) {
+                                        x1 = 1;
+                                    }
+                                    int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
+
+                                    Row row = sheet.getRow(y1 - 1);
+                                    if (row != null) {
+                                        Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
+                                        if (cell != null || ObjectUtils.isNotEmpty(cell)) {
+                                            short fontIndex = cell.getCellStyle().getFontIndex();
+                                            Font oldfontAt = workbook.getFontAt(fontIndex);
+
+                                            Font redFont = workbook.createFont();
+                                            redFont.setColor(IndexedColors.WHITE.getIndex()); //设置字体颜色
+                                            redFont.setFontHeightInPoints(oldfontAt.getFontHeightInPoints());//设置字体大小
+                                            redFont.setFontName(oldfontAt.getFontName());//设置字体
+
+                                            CellStyle newStyle = workbook.createCellStyle(); //创建单元格样式
+                                            newStyle.cloneStyleFrom(cell.getCellStyle());
+                                            newStyle.setFont(redFont);
+                                            cell.setCellStyle(newStyle);
+                                            cell.setCellValue(e.getId() + "");
+                                        }
+                                    }
+                                }
+                            }
                         }
-                        int y1 = Integer.parseInt(data.children().get(0).attr("y1"));
-
-                        Cell cell = sheet.getRow(y1 - 1).getCell(x1 - 1);
-                        cell.setCellValue(e.getId() + "");
-                        short fontIndex = cell.getCellStyle().getFontIndex();
-                        Font oldfontAt = workbook.getFontAt(fontIndex);
-
-                        Font redFont = workbook.createFont();
-                        redFont.setColor(IndexedColors.WHITE.getIndex());
-                        redFont.setFontHeightInPoints(oldfontAt.getFontHeightInPoints());
-                        redFont.setFontName(oldfontAt.getFontName());
-                        CellStyle cellStyle = workbook.createCellStyle();
-                        cellStyle.setFont(redFont);
-                        cell.setCellStyle(cellStyle);
                     }
                 }
             }
@@ -1361,8 +1387,14 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         //获取当前填报节点sort
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
 
-        // 合并pdf集合
-        String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' ,sort = " + (ObjectUtil.isNotEmpty(wbsTreeContract) ? wbsTreeContract.getSort() : 0) + " where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
+        // 获取顺序
+        int sort =0;
+        if(ObjectUtil.isNotEmpty(wbsTreeContract)){
+            if(wbsTreeContract.getSort()!=null){
+                sort = wbsTreeContract.getSort();
+            }
+        }
+        String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' ,sort = "+ sort +" where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
         jdbcTemplate.execute(sql);
     }
 
@@ -1709,7 +1741,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             BladeFile bladeFile2 = newIOSSClient.uploadFile(pkeyId + "2.pdf", pdfPath2);
 
             //查询是否存在关系
-            String sqlQuery = "select * from u_trial_self_data_record where record_id = " + id + " and tab_id = " + pkeyId;
+            String sqlQuery = "select id from u_trial_self_data_record where record_id = " + id + " and tab_id = " + pkeyId;
             List<TrialSelfDataRecord> query = jdbcTemplate.query(sqlQuery, new BeanPropertyRowMapper<>(TrialSelfDataRecord.class));
             String sql;
             if (query.size() == 0) {
@@ -1736,24 +1768,39 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     public String getBussPDFSTrial(String nodeId, String tableType, String classify, String contractId, String projectId, Long id, String tabIds) throws Exception {
         String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
         //获取有权限的节点信息
-        String sql = "select * from m_wbs_tree_private where is_deleted = 0 and p_key_id in (" + tabIds + ")";
+        String sql = "select p_key_id,html_url,table_type from m_wbs_tree_private where is_deleted = 0 and p_key_id in (" + tabIds + ")";
         List<WbsTreePrivate> queryList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-
+        //合并pdfUrlsList,报告单在前记录表在后
         List<String> dataPdfUrls = new ArrayList<>();
+        //报告单
+        List<WbsTreePrivate> reportTable = queryList.stream().filter(f -> f.getTableType() == 2).collect(Collectors.toList());
+        //记录表
+        List<WbsTreePrivate> recordTable = queryList.stream().filter(f -> f.getTableType() == 1).collect(Collectors.toList());
         if (queryList.size() > 0) {
-            for (WbsTreePrivate record : queryList) {
-                //生成pdf
-                String bussPdfInfo = this.getBussPDFTrial(record.getPKeyId(), contractId, id);
-                if (StringUtils.isNotEmpty(bussPdfInfo)) {
-                    dataPdfUrls.add(bussPdfInfo);
+            for (WbsTreePrivate report : reportTable) {
+                if (StringUtils.isNotEmpty(report.getHtmlUrl())) { //没有excel表单的不生成pdf
+                    //生成报告单pdf
+                    String bussPdfInfo = this.getBussPDFTrial(report.getPKeyId(), contractId, id);
+                    if (StringUtils.isNotEmpty(bussPdfInfo)) {
+                        dataPdfUrls.add(bussPdfInfo);
+                    }
+                }
+            }
+            for (WbsTreePrivate record : recordTable) {
+                if (StringUtils.isNotEmpty(record.getHtmlUrl())) { //没有excel表单的不生成pdf
+                    //生成记录表pdf
+                    String bussPdfInfo = this.getBussPDFTrial(record.getPKeyId(), contractId, id);
+                    if (StringUtils.isNotEmpty(bussPdfInfo)) {
+                        dataPdfUrls.add(bussPdfInfo);
+                    }
                 }
             }
         }
 
         String listPdf = file_path + "/pdf/" + nodeId + ".pdf";
-        File tabPdf2 = ResourceUtil.getFile(listPdf);
-        if (tabPdf2.exists()) {
-            tabPdf2.delete();
+        File tabPdf = ResourceUtil.getFile(listPdf);
+        if (tabPdf.exists()) {
+            tabPdf.delete();
         }
         FileUtils.mergePdfPublicMethods(dataPdfUrls, listPdf);
         BladeFile bladeFile = this.newIOSSClient.uploadFile(nodeId + ".pdf", listPdf);
@@ -1761,8 +1808,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         //获取试验记录id的试验项目名称
         String trialProjectName = baseMapper.selectTrialRecordOne(id);
 
-        //合并PDF集合
-        String querySql = "select * from u_information_query where classify ='" + classify + "' and wbs_id ='" + id + "' and contract_id ='" + contractId + "'";
+        //修改合并后的pdf路径
+        String querySql = "select id from u_information_query where classify ='" + classify + "' and wbs_id ='" + id + "' and contract_id ='" + contractId + "'";
         List<InformationQuery> query = jdbcTemplate.query(querySql, new BeanPropertyRowMapper<>(InformationQuery.class));
         if (query.size() > 0) {
             String updateSql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "', name ='" + trialProjectName + "'  where classify='" + classify + "' and  wbs_id='" + id + "' and contract_id ='" + contractId + "'";

+ 13 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaOptionServiceImpl.java

@@ -6,7 +6,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.mixsmart.utils.StringUtils;
 import lombok.RequiredArgsConstructor;
-import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.dto.FormulaOptionVo;
 import org.springblade.manager.entity.FormulaOption;
 import org.springblade.manager.entity.WbsTreeContract;
@@ -51,23 +50,24 @@ public class FormulaOptionServiceImpl extends ServiceImpl<FormulaOptionMapper, F
     }
 
     @Override
-    public void saveOrUpdateOption(FormulaOptionVo fo) {
+    public Object saveOrUpdateOption(FormulaOptionVo fo) {
         if(fo.saveChecked()){
-            WbsTreeContract wbc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,fo.getPKeyId()));
+            WbsTreeContract wbc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId,fo.getPkeyId()));
             FormulaOption formulaOption = this.getOne(Wrappers.<FormulaOption>lambdaQuery().eq(FormulaOption::getParentId,fo.getParentId()).eq(FormulaOption::getContractId,fo.getContractId()));
+            JSONObject root;
             if(formulaOption==null){
                 formulaOption=fo.toFo();
-                JSONObject jo = new JSONObject();
-                JSONObject table = (JSONObject) jo.computeIfAbsent(wbc.getInitTableName(),(k)->new JSONObject());
-                if(fo.isElementScope()){
-                    table.put(fo.getKey(),fo.getValue());
-                }else if(fo.isCellScope()){
-                    table.put(fo.getPKeyId()+ StringPool.AT +fo.getPKeyId(),fo.getValue());
-                }
-                formulaOption.setVal(jo.toJSONString());
-                this.saveOrUpdate(formulaOption);
+                root = new JSONObject();
+            }else{
+                root=JSON.parseObject(formulaOption.getVal());
             }
+            JSONObject table = (JSONObject) root.computeIfAbsent(wbc.getInitTableName(),(k)->new JSONObject());
+            JSONObject data = (JSONObject) table.computeIfAbsent(fo.createKey(),(k)->new JSONObject());
+            data.put(fo.getName(),fo.getValue());
+            formulaOption.setVal(root.toJSONString());
+            this.saveOrUpdate(formulaOption);
+            return data;
         }
-
+        return null;
     }
 }

+ 108 - 33
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -17,10 +17,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.*;
-import org.springblade.manager.entity.ContractInfo;
-import org.springblade.manager.entity.Formula;
-import org.springblade.manager.entity.WbsParam;
-import org.springblade.manager.entity.WbsTreeContract;
+import org.springblade.manager.entity.*;
 import org.springblade.manager.formula.FormulaStrategyFactory;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.formula.impl.CompositeDataAccess;
@@ -40,6 +37,7 @@ import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @author yangyj
@@ -57,6 +55,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     private final IProjectInfoService projectInfoService;
     private final IWbsTreeContractService wbsTreeContractService;
     private final JdbcTemplate jdbcTemplate;
+    private final IFormulaOptionService formulaOptionService;
     /**  private final Container env;*/
     private   TableElementConverter tec;
     private   Map<String,Object> constantMap;
@@ -71,12 +70,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     public final static String FC="FC.";
     public final static String TABLE_LIST="TBL";
     public final static String CHECK_ITEMS="CKI";
-
     public static final Pattern AP=Pattern.compile("(E|WP)\\[([^]']+)]");
-
     public static final String IF_REG= "(?<=T\\(com.mixsmart.utils.CustomFunction\\).ifelse\\()[^,]+(?=,)";
     public static final Pattern IF = Pattern.compile(IF_REG);
-
     public static final String ELE_CODE_REG= "(?<=E\\[)[^]]+(?=])";
     public static final Pattern P = Pattern.compile(ELE_CODE_REG);
     public static final Pattern P2= Pattern.compile("(?<=E\\[)[^];]+:[^];]+:[^];]+(?=])");
@@ -135,10 +131,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*检查是否有跨节点数据*/
         /*获取type=1的检验单或者type=4的监表*/
         List<Map<String,Object>>  inspectionElementMaps = new ArrayList<>();
-        Optional<AppWbsTreeContractVO> wop=tableList.stream().filter(e->e.getTableType()==1).findAny();
+        Optional<AppWbsTreeContractVO> wop=tableList.stream().filter(e->e.getFullName().contains("检验单")).findAny();
         if(wop.isPresent()){
             /*检验单或者监表的*/
-            inspectionElementMaps=  this.jdbcTemplate.queryForList("select c.e_name name ,c.init_table_name tableName,c.e_key ekey from m_wbs_tree_contract a INNER JOIN m_wbs_tree b on (a.id=b.id or a.old_id=b.id) INNER join m_wbs_form_element c on b.init_table_id=c.f_id where a.id=" + wop.get().getPKeyId());
+            inspectionElementMaps=  this.jdbcTemplate.queryForList(" select c.e_name name ,b.tab_en_name tableName,c.e_key ekey from m_wbs_tree_contract a join m_table_info b on a.init_table_name=b.tab_en_name join m_wbs_form_element c on c.f_id= b.id where a.p_key_id=" + wop.get().getPKeyId());
         }
         List<String> missingList = new ArrayList<>();
         List<Map<String, Object>> finalInspectionElementMaps = inspectionElementMaps;
@@ -161,8 +157,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         String name = StringUtils.handleNull(m.get("name"));
                         if(name.contains("实测值")&&name.contains("偏差值")){
                             String ekey = StringUtils.handleNull(m.get("tableName"))+":"+StringUtils.handleNull(m.get("ekey"));
+                            cki.add(ekey);
                             if(this.formDataMap.values().stream().map(FormData::getCode).noneMatch(k->StringUtils.isEquals(k,ekey))){
-                                cki.add(ekey);
                                 missingList.add(ekey);
                             }
                         }
@@ -173,8 +169,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         String name = StringUtils.handleNull(m.get("name"));
                         if(name.contains("检验日期")){
                             String ekey = StringUtils.handleNull(m.get("tableName"))+":"+StringUtils.handleNull(m.get("ekey"));
+                            ckd.set(ekey);
                             if(!this.formDataMap.containsKey(ekey)&&this.formDataMap.values().stream().map(FormData::getCode).noneMatch(k->StringUtils.isEquals(k,ekey))){
-                                ckd.set(ekey);
                                 missingList.add(ekey);
                             }
                         }
@@ -194,11 +190,12 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             StringBuilder sb = new StringBuilder();
             for(String s:cki){
                 FormData fdTmp=this.formDataMap.get(s);
-                if(fdTmp!=null&&fdTmp.getValues().stream().anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isEquals("/",e))){
-                    sb.append(fdTmp.getEName().split("\\(.+\\)")[0]).append(",");
+                if(fdTmp!=null&&fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))){
+                    sb.append(fdTmp.getEName().split("[((].+[))]")[0]).append(",");
                 }
             }
             if(sb.length()>1){
+                sb.deleteCharAt(sb.length()-1);
                 this.constantMap.put(CHECK_ITEMS,sb.toString());
             }
         }
@@ -217,7 +214,11 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             Map<String,List<Map<String,Object>>> tmap = textInfoMap.stream().collect(Collectors.groupingBy(m->m.get("code").toString()));
             this.constantMap.put(TEXT_INFO_MAP,tmap);
         }
-        /*检查项目*/
+        /*公式参数*/
+        FormulaOption formulaOption = this.formulaOptionService.getOne(Wrappers.<FormulaOption>lambdaQuery().eq(FormulaOption::getParentId,one.getId()).eq(FormulaOption::getContractId,contractId));
+        if(formulaOption!=null){
+           LinkedHashMap linkedHashMap = JSON.parseObject(formulaOption.getVal(),LinkedHashMap.class);
+        }
         return this;
     }
 
@@ -225,6 +226,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*数据池里面没有任何元素匹配和当前依赖匹配*/
         if(Func.isNotEmpty(missingList)){
             StaticLog.info("缺失元素{}", String.join(";", missingList));
+            Map<String, Object> elementInfoMap=this.getElementInfoByCodes(String.join(",",missingList));
             /*1从当前节点其它表格中查找匹配的元素*/
             List<String> removeList=new ArrayList<>();
             for(String r:missingList){
@@ -232,16 +234,17 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 String key =r.substring(r.indexOf(StringPool.COLON)+1);
                 List<AppWbsTreeContractVO> nodeList = this.tec.getTableAll().stream().filter(e->e.getInitTableName().equals(tn)).collect(Collectors.toList());
                 if(Func.isNotEmpty(nodeList)){
+                    Map<String,Object> elementInfo= (Map<String, Object>) elementInfoMap.get(r);
                     String tableName = nodeList.get(0).getInitTableName();
                     try {
                         if(!this.tec.getCoordinateMap().containsKey(tableName)){
-                            this.tec.getCoordinateMap().put(tableName, getTableCols(nodeList.get(0)));
+                            this.tec.getCoordinateMap().put(tableName, getTableCols(nodeList.get(0).getHtmlUrl()));
                         }
                     } catch (FileNotFoundException e) {
                         e.printStackTrace();
                     }
                     List<Map<String,Object>> tableDatas= this.jdbcTemplate.queryForList("select * from "+tableName+" where p_key_id in("+nodeList.stream().map(AppWbsTreeContractVO::getPKeyId).map(StringUtils::handleNull).collect(Collectors.joining(","))+")");
-                    fill(tableDatas,removeList,tn,key);
+                    fill(tableDatas,removeList,tn,key,StringUtils.handleNull(elementInfo.get("ename")));
                 }
             }
             if(Func.isNotEmpty(removeList)){
@@ -251,16 +254,27 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             if(Func.isNotEmpty(missingList)){
                 /*2从当前节点的兄弟节点中查找匹配的元素*/
                 CurrentNode currentNode = this.tec.getCurrentNode();
-                List<Map<String,Object>> tableNamePkIdsMaps= this.jdbcTemplate.queryForList("select c.init_table_name tableName,c.p_key_id pkId from (select b.id from (select * from m_wbs_tree_contract  where p_key_id="+currentNode.getPkId()+") a join  m_wbs_tree_contract b on b.parent_id=a.parent_id where  b.contract_id="+this.tec.getContractId()+" and b.is_deleted=0) k join m_wbs_tree_contract c on c.parent_id = k.id where  c.contract_id="+this.tec.getContractId()+" and c.is_deleted=0 ");
+                List<Map<String,Object>> tableNamePkIdsMaps= this.jdbcTemplate.queryForList("select c.init_table_name tableName,c.p_key_id pkId,c.html_url url from (select b.id from (select * from m_wbs_tree_contract  where p_key_id="+currentNode.getPkId()+") a join  m_wbs_tree_contract b on b.parent_id=a.parent_id where  b.contract_id="+this.tec.getContractId()+" and b.is_deleted=0) k join m_wbs_tree_contract c on c.parent_id = k.id where  c.contract_id="+this.tec.getContractId()+" and c.is_deleted=0 ");
                 if(Func.isNotEmpty(tableNamePkIdsMaps)){
                     removeList.clear();
                     missingList.forEach(miss->{
+                        Map<String,Object> elementInfo= (Map<String, Object>) elementInfoMap.get(miss);
                         String tn = miss.substring(0,miss.indexOf(StringPool.COLON));
                         String key =miss.substring(miss.indexOf(StringPool.COLON)+1);
                         String targetIds=tableNamePkIdsMaps.stream().filter(m->StringUtils.isEquals(m.get("tableName"),tn)).map(m->m.get("pkId")).map(StringUtils::handleNull).collect(Collectors.joining(","));
                         if(Func.isNotEmpty(targetIds)){
+                            if(!this.tec.getCoordinateMap().containsKey(tn)){
+                                tableNamePkIdsMaps.stream().filter(m->StringUtils.isEquals(m.get("tableName"),tn)).findAny().ifPresent(m->{
+                                    try {
+                                        this.tec.getCoordinateMap().put(tn,getTableCols(StringUtils.handleNull(m.get("url"))));
+                                    } catch (FileNotFoundException e) {
+                                        e.printStackTrace();
+                                    }
+                                });
+                            }
                             List<Map<String,Object>> tableDatas= this.jdbcTemplate.queryForList("select * from "+tn+" where p_key_id in ("+targetIds+")");
-                            fill(tableDatas,removeList,tn,key);
+                            String tmp =elementInfo==null?"":StringUtils.handleNull(elementInfo.get("ename"));
+                            fill(tableDatas,removeList,tn,key,tmp);
                         }
                     });
                 }
@@ -272,13 +286,13 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
     }
 
-    public void fill(List<Map<String,Object>> tableDatas,List<String> removeList,String tn,String key){
+    public void fill(List<Map<String,Object>> tableDatas,List<String> removeList,String tn,String key,String name){
         if(Func.isNotEmpty(tableDatas)){
             Map<String,Object> map = new HashMap<>();
             tableDatas.forEach(m->{
                 for(Map.Entry<String,Object> entry:m.entrySet()){
                     if(entry.getValue()!=null){
-                        map.merge(entry.getKey(), entry.getValue(), (v1, v2) -> v1 + ";" + v2);
+                        map.merge(entry.getKey(), entry.getValue(), (v1, v2) -> v1 + ";;" + v2);
                     }
                 }
             });
@@ -286,7 +300,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             String values= StringUtils.handleNull(map.get(key));
             String r= tn+StringPool.COLON+key;
             if(StringUtils.isNotEmpty(values)){
-                FormData tmp=createFormDataFast(r,values);
+                FormData tmp=createFormDataFast(name,r,values);
                 if(tmp!=null){
                     removeList.add(r);
                     this.formDataMap.put(r,tmp);
@@ -294,25 +308,60 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             }
         }
     }
-    public FormData createFormDataFast(String code,String values){
+    public FormData createFormDataFast(String name,String code,String values){
         if(StringUtils.isNotEmpty(code,values)){
-            return    new FormData(code, Arrays.stream(values.split("☆")).map(s->{
-                String[] t = s.split("_\\^_");
-                String[] c =t[1].split("_");
-                return  new ElementData(0,0,t[0],Func.toInt(c[1]),Func.toInt(c[0]));
-            }).collect(Collectors.toList()), null,StringPool.EMPTY);
+            String[] arr=code.split(":");
+            String coords = tec.getCoordinateMap().get(arr[0]).get(arr[1]);
+            List<Coords> coordsList = Stream.of(coords).flatMap(s -> Arrays.stream(s.split(";"))).map(s -> {
+                String[] xy = s.split("_");
+                return new Coords(xy[1], xy[0]);
+            }).collect(Collectors.toList());
+            List<ElementData> eds = new ArrayList<>();
+            if(StringUtils.isNotEmpty(values)){
+                String[] pages=values.split(";;");
+                for(int index=0;index<pages.length;index++){
+                    String pg=pages[index];
+                    if(Func.isNotBlank(pg)){
+                        String[] val = pg.split("☆");
+                        Map<String,Object> tmpMap = new LinkedHashMap<>();
+                        for(String s:val){
+                            String[] t = s.split("_\\^_");
+                            String[] c =t[1].split("_");
+                            tmpMap.put(StringUtils.join(code,0,index,Func.toInt(c[1]),Func.toInt(c[0]),StringPool.AT),t[0]);
+                        }
+                        for(Coords c:coordsList){
+                            Object data = null;
+                            String key =StringUtils.join(code,0,index,c.getX(),c.getY(),StringPool.AT);
+                            if(tmpMap.containsKey(key)){
+                                data =  tmpMap.get(key);
+                            }
+                            eds.add(new ElementData(index,0,data,c.getX(),c.getY()));
+                        }
+                    }
+                }
+
+            }
+            FormData one=   new FormData(code,eds, null,StringPool.EMPTY);
+//            FormData one=   new FormData(code, Arrays.stream(values.split("☆")).map(s->{
+//                String[] t = s.split("_\\^_");
+//                String[] c =t[1].split("_");
+//                return  new ElementData(0,0,t[0],Func.toInt(c[1]),Func.toInt(c[0]));
+//            }).collect(Collectors.toList()), null,StringPool.EMPTY);
+            one.setEName(name);
+            return one;
         }
         return null;
     }
 
-    public Map<String, String> getTableCols(AppWbsTreeContractVO wbsTreeContract) throws FileNotFoundException {
+    public Map<String, String> getTableCols(String  htmlUri) throws FileNotFoundException {
         Map<String, String> dataMap = new HashMap<>();
-        File file1 = ResourceUtil.getFile(wbsTreeContract.getHtmlUrl());
+        File file1 = ResourceUtil.getFile(htmlUri);
         FileInputStream fileInputStream = new FileInputStream(file1);
         String htmlString = IoUtil.readToString(fileInputStream);
         Document doc = Jsoup.parse(htmlString);
         Element table = doc.select("table").first();
         Elements trs = table.select("tr");
+       // trs.stream().flatMap(tr->tr.select("td").stream()).filter(d->!d.children().isEmpty()).reduce()
         for (int i = 0; i <= trs.size() - 1; i++) {
             Element tr = trs.get(i);
             Elements tds = tr.select("td");
@@ -370,7 +419,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             total.stream().filter(p->e.getEName().contains(p.getName().replace("【水】","").trim())&&!this.formDataList.contains(e)).findAny().ifPresent(d->{
                 Formula  formula=new Formula();
                 formula.setOutm(Formula.FULL);
-                if(RegexUtil.match(ParamElements.LEVEL_REG,d.getV())){
+                if(RegexUtil.match(ParamElements.LEVEL_REG,d.getV().trim())){
                     /*取层级*/
                     formula.setFormula("FC.tree(trees,WP["+d.getK()+"])");
                 }else{
@@ -492,6 +541,16 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             }
                             if(fd.getCoordsList().size()>1&&f.split("[/+\\-*]").length>1){
                                 LinkedHashMap<String,FormData> fdMap =new LinkedHashMap<>();
+                               Optional<FormData> tto= ele.stream().max(Comparator.comparingInt(fe->fe.getValues().size()));
+                               Optional<FormData> tts= ele.stream().min(Comparator.comparingInt(fe->fe.getValues().size()));
+                               if(tto.isPresent()&&tts.isPresent()){
+                                   if(tto.get().getValues().size()!=tts.get().getValues().size()){
+                                       int baseLength=tto.get().getValues().size();
+                                       ele.forEach(e->{
+                                           e.setStep(baseLength/e.getValues().size());
+                                       });
+                                   }
+                               }
                                 ele.forEach(e->{
                                     fdMap.put(e.getCode(),e);
                                 });
@@ -556,7 +615,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 if(fd.getCoordsList().size()==1){
                     fd.getValues().get(0).setValue(values.stream().map(StringUtils::handleNull).collect(Collectors.joining("、")));
                 }else{
-                    copy(fd,values);
+                   // copy(fd,values);
                     for(int n=0;n<fd.getValues().size();n++){
                         fd.getValues().get(n).setValue(values.get(n));
                     }
@@ -794,7 +853,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                      Matcher m = RegexUtils.matcher("T\\(com.mixsmart.utils.CustomFunction\\)\\.(converge)\\(([^)]+)\\)",f);
                      while (m.find()){
                          List<FormData> target = getFormDataByCode(m.group(2));
-                         Object data =target.stream().flatMap(e->e.getValues().stream()).map(ElementData::getValue).collect(Collectors.toList());
+                         Object data =target.stream().flatMap(e->e.getValues().stream()).map(ElementData::getValue).filter(StringUtils::isNotEmpty).collect(Collectors.toList());
                          f=f.replace(m.group(),putDataWithKey(data));
                      }
                  }
@@ -843,7 +902,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                  }
                  if(f.contains("quantity")){
                      /*聚合*/
-                     Matcher m = RegexUtils.matcher("T\\(com.mixsmart.utils.CustomFunction\\)\\.(quantity)\\(([^]]+)\\)",f);
+                     Matcher m = RegexUtils.matcher("T\\(com.mixsmart.utils.CustomFunction\\)\\.(quantity)\\(([^)]+)\\)",f);
                      while (m.find()) {
                          Object data=null;
                          List<String> codeList = getCodeList(m.group(2));
@@ -975,6 +1034,22 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
 
 
+    @Override
+    public Map<String,Object> getElementInfoByCodes(String codes){
+        if(StringUtils.isNotEmpty(codes)){
+            String[] relyArr = codes.split(StringPool.COMMA);
+            List<Map<String,Object>> mapList =this.jdbcTemplate.queryForList("select CONCAT(a.tab_en_name,':',b.e_key) ekey,a.tab_ch_name tableName,b.e_name ename  ,b.e_length elength,c.dict_value type f" +
+                    "rom m_table_info a JOIN m_wbs_form_element b on a.id=b.f_id  " +
+                    "LEFT JOIN (select dict_key, dict_value from blade_dict where code ='data_type' and parent_id > 0 and is_sealed = 0 and is_deleted = 0 )c on b.e_type=c.dict_key" +
+                    " where  a.tab_en_name in( "+ Arrays.stream(relyArr).map(e->e.split(StringPool.COLON)[0]).distinct().collect(Collectors.joining("','","'","'"))+")");
+            if(ListUtils.isNotEmpty(mapList)){
+             return   mapList.stream().filter(e-> Arrays.stream(relyArr).anyMatch(c->StringUtils.isEquals(e.get("ekey"),c))).collect(Collectors.toMap(e->StringUtils.handleNull(e.get("ekey")), e->e));
+            }
+
+        }
+        return new HashMap<>();
+    }
+
     public void batch(){
         List<Map<String,Object>> list = this.jdbcTemplate.queryForList("select id,formula from m_formula where (formula like '%reasonable%' or formula like '%proportion%' or formula like '%goodSize%')");
         if(ListUtils.isNotEmpty(list)){

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

@@ -42,7 +42,7 @@ public class TableFileServiceImpl extends ServiceImpl<TableFileMapper, TableFile
 
     @Override
     public List<TableFileVO> selectTableFileList(Long pKid) {
-        return baseMapper.selectTableFileList(pKid);
+        return baseMapper.selectTableFileList(pKid+"");
     }
 
     @Override

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

@@ -73,6 +73,7 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
                 wbsTreeContract = treeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pkId));
             }
             /*去头尾*/
+            Collections.reverse(nodes);
             nodes.remove(nodes.size() - 1);
             nodes.remove(0);
             assert wbsTreeContract != null;
@@ -81,6 +82,7 @@ public class WbsParamServiceImpl extends BaseServiceImpl<WbsParamMapper, WbsPara
             }
             nodes.add(wbsTreeContract);
         }
+
         return nodes;
     }
 

+ 24 - 17
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeContractServiceImpl.java

@@ -79,29 +79,35 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
         List<String> idList = Arrays.asList(ids);
         List<String> idList1 = idList.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
 
-        //获取当前合同段wbs所有节点、表单(不包括客户端新增或者复制节点)
-        List<WbsTreeContract> list = baseMapper.findAllNodeList2(pawDTO.getProjectId(), pawDTO.getContractId(), pawDTO.getWbsId());
+        //获取当前合同段所有节点、表单(不包括客户端新增或者复制节点)
+        List<WbsTreeContract> list = baseMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                .select(WbsTreeContract::getId, WbsTreeContract::getType)
+                .eq(WbsTreeContract::getContractId, pawDTO.getContractId())
+                .eq(WbsTreeContract::getWbsId, pawDTO.getWbsId())
+                .eq(WbsTreeContract::getStatus, 1)
+                .isNull(WbsTreeContract::getOldId));
 
-        //当前合同段所有表单Id
+        //当前合同段所有表单ids
         List<String> collect1 = new ArrayList<>();
-        //当前合同段所有节点Id
+        //当前合同段所有节点ids
         List<String> collect2 = new ArrayList<>();
-
         if (list.size() > 0) {
-            List<WbsTreeContract> collect3 = list.stream().filter(f -> f.getType() == 2).collect(Collectors.toList());
-            collect1 = collect3.stream().map(WbsTreeContract::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
-            List<WbsTreeContract> collect4 = list.stream().filter(f -> f.getType() == 1).collect(Collectors.toList());
-            collect2 = collect4.stream().map(WbsTreeContract::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+            collect1 = list.stream().filter(f -> f.getType() == 2).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
+            collect2 = list.stream().filter(f -> f.getType() == 1).collect(Collectors.toList()).stream().map(WbsTreeContract::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
         }
 
-        List<String> collect5 = collect2;
-        List<String> saveIds = idList1.stream().filter(f -> !collect5.contains(f)).collect(Collectors.toList());
-        List<String> delIds = collect5.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
+        List<String> collect3 = collect2;
+        List<String> saveIds = idList1.stream().filter(f -> !collect3.contains(f)).collect(Collectors.toList());
+        List<String> delIds = collect3.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
 
+        //TODO ---------节点未变只同步元素表---------
         if (saveIds.size() == 0 && delIds.size() == 0) {
-            //节点id未变,只进行节点下的元素表的同步
             List<WbsTreePrivate> wbsTreePrivateList2 = new ArrayList<>();
-            List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, Long.parseLong(pawDTO.getProjectId())).eq(WbsTreePrivate::getWbsId, Long.parseLong(pawDTO.getWbsId())).eq(WbsTreePrivate::getType, 2));
+            List<WbsTreePrivate> wbsTreePrivateList = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                    .eq(WbsTreePrivate::getProjectId, Long.parseLong(pawDTO.getProjectId()))
+                    .eq(WbsTreePrivate::getWbsId, Long.parseLong(pawDTO.getWbsId()))
+                    .eq(WbsTreePrivate::getType, 2)
+            );
 
             wbsTreePrivateList.forEach(wbsTreePrivate -> {
                 idList1.forEach(id -> {
@@ -114,6 +120,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             List<String> collect = wbsTreePrivateList2.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
 
             List<String> diffRent1 = DiffListUtil.getDiffRent(collect, collect1);
+
             if (collect.size() == collect1.size()) {
                 return true;
             }
@@ -141,7 +148,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
             }
 
         } else {
-            //删除
+            //TODO ---------删除---------
             if (delIds.size() > 0) {
                 List<ContractRelationJlyz> contractRelationJLYZList = baseMapper.selectContractRelationInfoByidSG2(pawDTO.getContractId());
                 if (contractRelationJLYZList.size() > 0) {
@@ -169,7 +176,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 baseMapper.deleteBatch(ids1, pawDTO.getWbsId(), pawDTO.getProjectId(), pawDTO.getContractId());
             }
 
-            //新增
+            //TODO ---------新增---------
             if (saveIds.size() > 0) {
                 List<WbsTreePrivate> wbsTreePrivatesList = new ArrayList<>();
                 List<WbsTreeContract> wbsTreeContractList = new ArrayList<>();
@@ -323,7 +330,7 @@ public class WbsTreeContractServiceImpl extends BaseServiceImpl<WbsTreeContractM
                 tableOwners = "1,2,3";
             } else if (tableOwner.equals("2")) {
                 tableOwners = "4,5,6";
-            }else {
+            } else {
                 tableOwners = "7,8,9";
             }
             tableOwnerList = Func.toStrList(tableOwners);

+ 322 - 303
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -457,7 +457,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         List<WbsTreePrivate> listPrivate = new ArrayList<>();
         List<WbsTreeContract> listContract = new ArrayList<>();
         //获取当前项目下所有合同段信息
-        List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getPId, projectId));
+        List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().select(ContractInfo::getId).eq(ContractInfo::getPId, projectId));
 
         for (WbsTreePrivate wbsTreePrivate : wbsTreePrivates) {
             for (WbsTreePrivate treePrivateNow : wbsTreePrivatesAllNow) {
@@ -471,8 +471,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                                 || (ObjectUtils.isNotEmpty(wbsTreePrivate.getImportMatchingInfo()) && !wbsTreePrivate.getImportMatchingInfo().equals(treePrivateNow.getImportMatchingInfo()))
                                 || (ObjectUtils.isNotEmpty(wbsTreePrivate.getMixRatioTestIds()) && !wbsTreePrivate.getMixRatioTestIds().equals(treePrivateNow.getMixRatioTestIds()))
                                 || (ObjectUtils.isNotEmpty(wbsTreePrivate.getInitTableId()) && !wbsTreePrivate.getInitTableId().equals(treePrivateNow.getInitTableId()))
-                                || (ObjectUtils.isNotEmpty(wbsTreePrivate.getInitTableName()) && !wbsTreePrivate.getInitTableName().equals(treePrivateNow.getInitTableName()))
-                        )) {
+                                || (ObjectUtils.isNotEmpty(wbsTreePrivate.getInitTableName()) && !wbsTreePrivate.getInitTableName().equals(treePrivateNow.getInitTableName())
+                                || (ObjectUtils.isNotEmpty(wbsTreePrivate.getHtmlUrl()) && !wbsTreePrivate.getHtmlUrl().equals(treePrivateNow.getHtmlUrl()))))) {
                     //修改项目wbs信息
                     WbsTreePrivate wbsPrivate = BeanUtil.copyProperties(wbsTreePrivate, WbsTreePrivate.class);
                     if (wbsPrivate != null) {
@@ -493,14 +493,18 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             }
         }
 
+        //修改到项目
         if (listPrivate.size() > 0) {
             baseMapper.updateBatchWbsPrivate(listPrivate);
         }
+
+        //修改到合同段
         if (listContract.size() > 0) {
             //获取合同段下的复制、新增节点
             List<WbsTreeContract> wbsTreeContractsCopyOrAddAll = new ArrayList<>();
             for (ContractInfo contractInfo : contractInfos) {
                 List<WbsTreeContract> wbsTreeContractsCopyOrAdd = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                        .select(WbsTreeContract::getId, WbsTreeContract::getOldId, WbsTreeContract::getProjectId, WbsTreeContract::getContractId)
                         .eq(WbsTreeContract::getProjectId, projectId)
                         .eq(WbsTreeContract::getContractId, contractInfo.getId())
                         .eq(WbsTreeContract::getWbsType, wbsType)
@@ -520,6 +524,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                         obj2.setMajorDataType(obj1.getMajorDataType());
                         obj2.setTableType(obj1.getTableType());
                         obj2.setTableOwner(obj1.getTableOwner());
+                        obj2.setHtmlUrl(obj1.getHtmlUrl());
                         listContractAdd.add(obj2);
                     }
                 }
@@ -574,57 +579,110 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
     public boolean syncNodeParam(String projectId) {
         if (StringUtils.isNotEmpty(projectId)) {
             //获取项目节点树
-            List<WbsTreePrivate> wbsTreePrivateAllNow = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
+            List<WbsTreePrivate> wbsTreePrivateAllNow = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                    .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getId, WbsTreePrivate::getWbsId)
+                    .eq(WbsTreePrivate::getProjectId, projectId).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
             String wbsId = wbsTreePrivateAllNow.stream().map(WbsTreePrivate::getWbsId).findAny().orElse(null);
             if (StringUtils.isNotEmpty(wbsId)) {
-
                 List<WbsParamVO> paramListData = new ArrayList<>();
                 //获取公有树
-                List<WbsTree> treePublicNodeAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, wbsId).eq(WbsTree::getStatus, 1).eq(WbsTree::getType, 1));
+                Map<Long, WbsTree> treePublicNodeAll = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                        .select(WbsTree::getId)
+                        .eq(WbsTree::getWbsId, wbsId).eq(WbsTree::getStatus, 1)
+                        .eq(WbsTree::getType, 1))
+                        .stream().collect(Collectors.toMap(WbsTree::getId, Function.identity()));
 
                 if (treePublicNodeAll.size() > 0) {
-                    //公有引用
+                    //TODO ---------公有引用同步---------
+                    Map<String, Long> map = new HashMap<>();
                     for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
-                        for (WbsTree wbsTree : treePublicNodeAll) {
-                            if (wbsTree.getId().equals(wbsTreePrivate.getId())) {
-                                String sql = "select * from m_wbs_param where node_id = " + wbsTree.getId();
-                                List<WbsParam> wbsParamList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
-                                //获取公有节点参数
-                                if (wbsParamList.size() > 0) {
-                                    for (WbsParam wbsParam : wbsParamList) {
-                                        WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
-                                        if (param != null) {
-                                            param.setOldId(wbsParam.getId());
-                                            param.setNodeId(wbsTreePrivate.getPKeyId());
-                                            param.setId(SnowFlakeUtil.getId());
-                                            paramListData.add(param);
-                                        }
-                                    }
+                        WbsTree wbsTree = treePublicNodeAll.get(wbsTreePrivate.getId());
+                        if (wbsTree != null) {
+                            map.put(wbsTreePrivate.getPKeyId() + "," + wbsTree.getId(), wbsTree.getId());
+                        }
+                    }
+
+                    Set<String> keyIds = map.keySet();
+                    List<Long> wbsTreeIds = new ArrayList<>(map.values());
+                    List<WbsParam> wbsParamList = new ArrayList<>();
+                    //分组查询
+                    List<List<Long>> partition = Lists.partition(wbsTreeIds, 1000);
+                    for (List<Long> ids : partition) {
+                        String sql = "select id,name,k,v,node_id,remark from m_wbs_param where node_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                        List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
+                        wbsParamList.addAll(wbsParams);
+                    }
+
+                    for (String ids : keyIds) {
+                        String nodePKeyIdNow = ids.split(",")[0];
+                        String nodeIdOld = ids.split(",")[1];
+                        List<WbsParam> wbsParams = wbsParamList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().toString().equals(nodeIdOld)).collect(Collectors.toList());
+                        //获取引用的节点参数
+                        if (wbsParams.size() > 0) {
+                            for (WbsParam wbsParam : wbsParams) {
+                                WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
+                                if (param != null) {
+                                    param.setProjectId(Long.parseLong(projectId));
+                                    param.setId(SnowFlakeUtil.getId());
+                                    param.setNodeId(Long.parseLong(nodePKeyIdNow));
+                                    param.setOldId(wbsParam.getId());
+                                    param.setType(1);
+                                    param.setStatus(1);
+                                    param.setIsDeleted(0);
+                                    paramListData.add(param);
                                 }
                             }
                         }
                     }
 
+
                 } else {
-                    //私有引用 - 获取原始引用私有树
-                    WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, wbsId).eq(WbsTreePrivate::getParentId, 0L).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
-                    List<WbsTreePrivate> treePrivateNodeAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getWbsId, treePrivateRootNode.getWbsId()).eq(WbsTreePrivate::getProjectId, treePrivateRootNode.getProjectId()).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
+                    //TODO ---------私有引用同步---------
+                    Map<String, Long> map = new HashMap<>();
+                    WbsTreePrivate treePrivateRootNode = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                            .select(WbsTreePrivate::getWbsId, WbsTreePrivate::getProjectId)
+                            .eq(WbsTreePrivate::getPKeyId, wbsId).eq(WbsTreePrivate::getParentId, 0L).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1));
+
+                    Map<Long, WbsTreePrivate> treePrivateNodeAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                            .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getId)
+                            .eq(WbsTreePrivate::getWbsId, treePrivateRootNode.getWbsId()).eq(WbsTreePrivate::getProjectId, treePrivateRootNode.getProjectId())
+                            .eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getType, 1)).stream().collect(Collectors.toMap(WbsTreePrivate::getId, Function.identity()));
 
                     for (WbsTreePrivate wbsTreePrivate : wbsTreePrivateAllNow) {
-                        for (WbsTreePrivate wbsTreePrivateYS : treePrivateNodeAll) {
-                            if (wbsTreePrivateYS.getId().equals(wbsTreePrivate.getId())) {
-                                String sql = "select * from m_wbs_param where node_id = " + wbsTreePrivateYS.getPKeyId();
-                                List<WbsParam> wbsParamList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
-                                if (wbsParamList.size() > 0) {
-                                    for (WbsParam wbsParam : wbsParamList) {
-                                        WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
-                                        if (param != null) {
-                                            param.setOldId(wbsParam.getId());
-                                            param.setNodeId(wbsTreePrivate.getPKeyId());
-                                            param.setId(SnowFlakeUtil.getId());
-                                            paramListData.add(param);
-                                        }
-                                    }
+                        WbsTreePrivate wbsTreePrivateYS = treePrivateNodeAll.get(wbsTreePrivate.getId());
+                        if (wbsTreePrivateYS != null) {
+                            map.put(wbsTreePrivate.getPKeyId() + "," + wbsTreePrivateYS.getPKeyId(), wbsTreePrivateYS.getPKeyId());
+                        }
+                    }
+
+                    Set<String> keyIds = map.keySet();
+                    List<Long> wbsTreeIds = new ArrayList<>(map.values());
+                    List<WbsParam> wbsParamList = new ArrayList<>();
+                    //分组查询
+                    List<List<Long>> partition = Lists.partition(wbsTreeIds, 1000);
+                    for (List<Long> ids : partition) {
+                        String sql = "select id,name,k,v,node_id,remark from m_wbs_param where node_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                        List<WbsParam> wbsParams = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(WbsParam.class));
+                        wbsParamList.addAll(wbsParams);
+                    }
+
+                    for (String ids : keyIds) {
+                        String nodePKeyIdNow = ids.split(",")[0];
+                        String nodePKeyIdYs = ids.split(",")[1];
+                        List<WbsParam> wbsParams = wbsParamList.stream().filter(f -> ObjectUtils.isNotEmpty(f.getNodeId()) && f.getNodeId().toString().equals(nodePKeyIdYs)).collect(Collectors.toList());
+                        //获取引用的节点参数
+                        if (wbsParams.size() > 0) {
+                            for (WbsParam wbsParam : wbsParams) {
+                                WbsParamVO param = BeanUtil.copyProperties(wbsParam, WbsParamVO.class);
+                                if (param != null) {
+                                    param.setProjectId(Long.parseLong(projectId));
+                                    param.setId(SnowFlakeUtil.getId());
+                                    param.setNodeId(Long.parseLong(nodePKeyIdNow));
+                                    param.setOldId(wbsParam.getId());
+                                    param.setType(1);
+                                    param.setStatus(1);
+                                    param.setIsDeleted(0);
+                                    paramListData.add(param);
                                 }
                             }
                         }
@@ -633,18 +691,39 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                 List<WbsParam> updateList = new ArrayList<>();
                 List<WbsParam> insertList = new ArrayList<>();
+                List<WbsParam> paramListOldAll = new ArrayList<>();
+
+                List<Long> oldIds = paramListData.stream().map(WbsParamVO::getOldId).distinct().collect(Collectors.toList());
+                //分组查询
+                List<List<Long>> partition = Lists.partition(oldIds, 1000);
+                for (List<Long> ids : partition) {
+                    String sql1 = "select id,name,k,v,node_id,remark from m_wbs_param where id in( " + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                    List<WbsParam> query = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(WbsParam.class));
+                    paramListOldAll.addAll(query);
+                }
+
+                //转换为map
+                Map<Long, WbsParam> mapOld = paramListOldAll.stream().collect(Collectors.toMap(WbsParam::getId, Function.identity()));
+
+                //获取当前项目的节点参数
+                List<WbsParam> paramListNow = wbsParamMapper.selectList(Wrappers.<WbsParam>lambdaQuery()
+                        .select(WbsParam::getK, WbsParam::getV, WbsParam::getName, WbsParam::getId, WbsParam::getRemark, WbsParam::getNodeId)
+                        .eq(WbsParam::getProjectId, Long.parseLong(projectId)));
+
                 //判断是否存在
                 Iterator<WbsParamVO> iterator = paramListData.iterator();
                 while (iterator.hasNext()) {
                     WbsParamVO next = iterator.next();
 
                     //获取引用的节点上的源参数信息
-                    String sql1 = "select * from m_wbs_param where id = " + next.getOldId();
-                    WbsParam oldObj = jdbcTemplate.query(sql1, new BeanPropertyRowMapper<>(WbsParam.class)).stream().findAny().orElse(null);
-
+                    WbsParam oldObj = mapOld.get(next.getOldId());
                     //获取被引用的节点上的现参数信息
-                    String sql2 = "select * from m_wbs_param where name = '" + next.getName() + "' and k = '" + next.getK() + "' and v = '" + next.getV() + "' and node_id = " + next.getNodeId() + " and remark = '" + next.getRemark() + "' and is_deleted = 0 and status = 1";
-                    WbsParam newObj = jdbcTemplate.query(sql2, new BeanPropertyRowMapper<>(WbsParam.class)).stream().findAny().orElse(null);
+                    WbsParam newObj = paramListNow.stream().filter(f -> f.getK().equals(next.getK())
+                            && f.getV().equals(next.getV())
+                            && f.getName().equals(next.getName())
+                            && f.getRemark().equals(next.getRemark())
+                            && f.getNodeId().equals(next.getNodeId())
+                    ).findAny().orElse(null);
 
                     if (oldObj != null && newObj != null) {
                         //如果源节点参数与现节点参数名称、K、V、备注一致,那么就跳过
@@ -653,10 +732,14 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                             //如果源节点参数与现节点参数名称、K一致,V、备注不一致,那么就修改当前名称下的节点参数
                         } else if (oldObj.getName().equals(newObj.getName()) && oldObj.getK().equals(newObj.getK()) && (!oldObj.getV().equals(newObj.getV()) || !oldObj.getRemark().equals(newObj.getRemark()))) {
+                            newObj.setProjectId(Long.parseLong(projectId));
                             newObj.setName(oldObj.getName());
                             newObj.setK(oldObj.getK());
                             newObj.setV(oldObj.getV());
                             newObj.setRemark(oldObj.getRemark());
+                            newObj.setType(1);
+                            newObj.setStatus(1);
+                            newObj.setIsDeleted(0);
                             updateList.add(newObj);
 
                             //如果源节点参数与现节点参数名称不一致,那么新增
@@ -666,16 +749,22 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                     } else if (oldObj != null) {
                         //二次过滤,节点名称、节点id相同,修改
-                        String sql3 = "select * from m_wbs_param where name = '" + next.getName() + "' and node_id = " + next.getNodeId() + " and is_deleted = 0 and status = 1";
-                        List<WbsParam> query = jdbcTemplate.query(sql3, new BeanPropertyRowMapper<>(WbsParam.class));
+                        List<WbsParam> query = paramListNow.stream().filter(f -> f.getName().equals(next.getName())
+                                && f.getNodeId().equals(next.getNodeId())
+                        ).collect(Collectors.toList());
+
                         if (query.size() > 0) {
                             for (WbsParam wbsParam : query) {
                                 if (oldObj.getName().equals(wbsParam.getName())) {
                                     //修改
+                                    wbsParam.setProjectId(Long.parseLong(projectId));
                                     wbsParam.setName(next.getName());
                                     wbsParam.setK(next.getK());
                                     wbsParam.setV(next.getV());
                                     wbsParam.setRemark(next.getRemark());
+                                    wbsParam.setType(1);
+                                    wbsParam.setStatus(1);
+                                    wbsParam.setIsDeleted(0);
                                     updateList.add(wbsParam);
                                 }
                             }
@@ -691,7 +780,13 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     this.wbsParamServiceImpl.updateBatchById(updateList, 1000);
                 }
                 if (insertList.size() > 0) {
-                    this.wbsParamServiceImpl.saveBatch(insertList, 1000);
+                    //异步新增
+                    List<List<WbsParam>> partition1 = Lists.partition(insertList, 1000);
+                    CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
+                            CompletableFuture.runAsync(() -> {
+                                wbsParamServiceImpl.insertBatch(addList, 1000);
+                            }, executor)).toArray(CompletableFuture[]::new));
+                    handle.join();
                 }
                 return true;
             }
@@ -712,34 +807,19 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
             if (("1").equals(wbsTreePrivate.getWbsType())) {
                 if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
-                    /*TODO-------------------------------------公有引用同步--------------------------------------------*/
+                    /*TODO-------------------------------------质检公有引用同步--------------------------------------------*/
                     //获取当前节点对应的公有引用树下的元素表
-                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>query().lambda()
-                            .eq(WbsTree::getId, wbsTreePrivate.getId())
-                    );
+                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getId, wbsTreePrivate.getId()));
                     List<WbsTree> wbsTreesPublicTables;
                     if (wbsTree.getAncestors().equals("0")) {
                         //根节点
-                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                                .eq(WbsTree::getWbsId, wbsTree.getWbsId())
-                                .eq(WbsTree::getType, 2)
-                                .eq(WbsTree::getStatus, 1)
-                        );
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2).eq(WbsTree::getStatus, 1));
                     } else {
-                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                                .eq(WbsTree::getWbsId, wbsTree.getWbsId())
-                                .eq(WbsTree::getType, 2)
-                                .eq(WbsTree::getStatus, 1)
-                                .like(WbsTree::getAncestors, wbsTree.getId())
-                        );
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2).eq(WbsTree::getStatus, 1).like(WbsTree::getAncestors, wbsTree.getId()));
                     }
 
                     //获取当前项目树下的元素表 节点
-                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                            .eq(WbsTreePrivate::getStatus, 1)
-                    );
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTreePrivate::getStatus, 1));
                     List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
 
                     List<WbsTreePrivate> wbsTreePrivatesProjectTables;
@@ -752,22 +832,17 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                     //获取新增的公有元素表addPublicTable
                     List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
-                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
-                            .collect(Collectors.toList());
+                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
 
                     //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
                     List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
-                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
-                    ).collect(Collectors.toList());
+                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //获取当前项目下所有施工合同段id
                     List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getPId, wbsTreePrivate.getProjectId()));
 
                     //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
-                            .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
-                            .eq(WbsTreeContract::getStatus, 1)
-                    );
+                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
                     List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
                     List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
 
@@ -856,35 +931,20 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
 
                 } else if (("private").equals(projectInfo.getReferenceWbsTemplateType())) {
-                    /*TODO-------------------------------------私有引用同步--------------------------------------------*/
+                    /*TODO-------------------------------------质检私有引用同步--------------------------------------------*/
                     //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
                     WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
                     //获取当前私有引用树的元素表信息
                     List<WbsTreePrivate> wbsTreePrivateRootTables;
                     if (wbsTreePrivate.getAncestors().equals("0")) {
                         //根节点
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
-                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
-                                .eq(WbsTreePrivate::getType, 2)
-                                .eq(WbsTreePrivate::getStatus, 1)
-                        );
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2).eq(WbsTreePrivate::getStatus, 1));
                     } else {
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
-                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
-                                .eq(WbsTreePrivate::getType, 2)
-                                .eq(WbsTreePrivate::getStatus, 1)
-                                .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId())
-                        );
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2).eq(WbsTreePrivate::getStatus, 1).like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId()));
                     }
 
                     //获取当前项目选择的节点下的所有元素表 节点
-                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                            .eq(WbsTreePrivate::getStatus, 1)
-                    );
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTreePrivate::getStatus, 1));
 
                     List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
                     List<WbsTreePrivate> wbsTreePrivatesProjectTables;
@@ -897,22 +957,17 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                     //获取新增的私有元素表addPrivateTable
                     List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
-                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
-                            .collect(Collectors.toList());
+                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
 
                     //获取当前项目下所有施工合同段id
                     List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
 
                     //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
                     List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
-                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
-                    ).collect(Collectors.toList());
+                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
-                            .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
-                            .eq(WbsTreeContract::getStatus, 1)
-                    );
+                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
                     List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
                     List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
 
@@ -999,34 +1054,19 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             }
             if (("2").equals(wbsTreePrivate.getWbsType())) {
                 if (("public").equals(projectInfo.getReferenceWbsTemplateTypeTrial())) {
-                    /*TODO-------------------------------------公有引用同步--------------------------------------------*/
+                    /*TODO-------------------------------------试验公有引用同步--------------------------------------------*/
                     //获取当前节点对应的公有引用树下的元素表
-                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>query().lambda()
-                            .eq(WbsTree::getId, wbsTreePrivate.getId())
-                    );
+                    WbsTree wbsTree = wbsTreeMapper.selectOne(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getId, wbsTreePrivate.getId()));
                     List<WbsTree> wbsTreesPublicTables;
                     if (wbsTree.getAncestors().equals("0")) {
                         //根节点
-                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                                .eq(WbsTree::getWbsId, wbsTree.getWbsId())
-                                .eq(WbsTree::getType, 2)
-                                .eq(WbsTree::getStatus, 1)
-                        );
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2).eq(WbsTree::getStatus, 1));
                     } else {
-                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
-                                .eq(WbsTree::getWbsId, wbsTree.getWbsId())
-                                .eq(WbsTree::getType, 2)
-                                .eq(WbsTree::getStatus, 1)
-                                .like(WbsTree::getAncestors, wbsTree.getId())
-                        );
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2).eq(WbsTree::getStatus, 1).like(WbsTree::getAncestors, wbsTree.getId()));
                     }
 
                     //获取当前项目树下的元素表 节点
-                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                            .eq(WbsTreePrivate::getStatus, 1)
-                    );
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTreePrivate::getStatus, 1));
                     List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
 
                     List<WbsTreePrivate> wbsTreePrivatesProjectTables;
@@ -1039,22 +1079,17 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                     //获取新增的公有元素表addPublicTable
                     List<WbsTree> addPublicTable = wbsTreesPublicTables.stream().filter(f ->
-                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
-                            .collect(Collectors.toList());
+                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
 
                     //判断当前新增的表在项目的wbs树中是否存在上级节点,存在表示可以新增,不存在表示不新增
                     List<WbsTree> addPublicTables = addPublicTable.stream().filter(node ->
-                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
-                    ).collect(Collectors.toList());
+                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //获取当前项目下所有施工合同段id
                     List<ContractInfo> contractInfos = contractInfoMapper.selectList(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getPId, wbsTreePrivate.getProjectId()));
 
                     //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
-                            .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
-                            .eq(WbsTreeContract::getStatus, 1)
-                    );
+                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
                     List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
                     List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
 
@@ -1143,35 +1178,20 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     }
 
                 } else if (("private").equals(projectInfo.getReferenceWbsTemplateTypeTrial())) {
-                    /*TODO-------------------------------------私有引用同步--------------------------------------------*/
+                    /*TODO-------------------------------------试验私有引用同步--------------------------------------------*/
                     //根据wbsTreePrivate的wbsId=私有引用的pKeyId来获取引用树根节点
                     WbsTreePrivate wbsTreePrivateRoot = baseMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, wbsTreePrivate.getWbsId()));
                     //获取当前私有引用树的元素表信息
                     List<WbsTreePrivate> wbsTreePrivateRootTables;
                     if (wbsTreePrivate.getAncestors().equals("0")) {
                         //根节点
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
-                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
-                                .eq(WbsTreePrivate::getType, 2)
-                                .eq(WbsTreePrivate::getStatus, 1)
-                        );
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2).eq(WbsTreePrivate::getStatus, 1));
                     } else {
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                                .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
-                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId())
-                                .eq(WbsTreePrivate::getType, 2)
-                                .eq(WbsTreePrivate::getStatus, 1)
-                                .like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId())
-                        );
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2).eq(WbsTreePrivate::getStatus, 1).like(WbsTreePrivate::getAncestors, wbsTreePrivate.getId()));
                     }
 
                     //获取当前项目选择的节点下的所有元素表 节点
-                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
-                            .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
-                            .eq(WbsTreePrivate::getStatus, 1)
-                    );
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId()).eq(WbsTreePrivate::getStatus, 1));
 
                     List<WbsTreePrivate> wbsTreePrivatesProjectNodes = wbsTreePrivatesProjectAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
                     List<WbsTreePrivate> wbsTreePrivatesProjectTables;
@@ -1184,22 +1204,17 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                     //获取新增的私有元素表addPrivateTable
                     List<WbsTreePrivate> addPrivateTable = wbsTreePrivateRootTables.stream().filter(f ->
-                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId()))
-                            .collect(Collectors.toList());
+                            !wbsTreePrivatesProjectTables.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(f.getId())).collect(Collectors.toList());
 
                     //获取当前项目下所有施工合同段id
                     List<ContractInfo> contractInfos = contractInfoMapper.selectContractIdByProjectId(wbsTreePrivate.getProjectId());
 
                     //判断当前新增的表在私有wbs中是否存在上级节点,存在表示可以新增,不存在表示不新增
                     List<WbsTreePrivate> addPrivateTables = addPrivateTable.stream().filter(node ->
-                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())
-                    ).collect(Collectors.toList());
+                            wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //获取当前项目下所有合同段树
-                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda()
-                            .eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId())
-                            .eq(WbsTreeContract::getStatus, 1)
-                    );
+                    List<WbsTreeContract> treeContractListAll = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>query().lambda().eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreeContract::getStatus, 1));
                     List<WbsTreeContract> treeContractListAllNodes = treeContractListAll.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList());
                     List<WbsTreeContract> treeContractListAllTables = treeContractListAll.stream().filter(f -> f.getType().equals(2)).collect(Collectors.toList());
 
@@ -1297,6 +1312,152 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return false;
     }
 
+    @Override
+    public boolean syncProjectEVisa(String projectId) {
+        if (StringUtils.isNotEmpty(projectId)) {
+            ProjectInfo projectInfo = projectInfoMapper.selectById(projectId);
+            if (projectInfo != null && ("private").equals(projectInfo.getReferenceWbsTemplateType()) && ObjectUtils.isNotEmpty(projectInfo.getReferenceWbsTemplateId())) {
+                //构造参数集合
+                List<TextdictInfo> insertData = new ArrayList<>();
+                Map<Long, List<TextdictInfo>> textDictInfoData = new HashMap<>();
+
+                //获取当前引用的项目节点树的根节点信息
+                WbsTreePrivate oneRecordRoot = this.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().select(WbsTreePrivate::getProjectId, WbsTreePrivate::getWbsId).eq(WbsTreePrivate::getPKeyId, projectInfo.getReferenceWbsTemplateId()));
+
+                //获取当前项目下节点树所有节点、表、独立表
+                String sqlNodeTreeAllNow = "SELECT p_key_id,id,type,parent_id,html_url FROM m_wbs_tree_private WHERE project_id = " + projectId + " AND STATUS = 1 AND is_deleted = 0 AND (((type = 1 OR type = 2) AND wbs_type = 1) OR (type= 10 AND parent_id = -10 ))";
+                List<WbsTreePrivate> wbsTreePrivatesNodeAndTabNow = jdbcTemplate.query(sqlNodeTreeAllNow, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+                Map<Long, WbsTreePrivate> wbsTreePrivatesTableDL = wbsTreePrivatesNodeAndTabNow.stream().filter(f -> f.getType().equals(10) && f.getParentId().equals(-10L)).collect(Collectors.toMap(WbsTreePrivate::getId, Function.identity()));
+
+                //获取当前项目节点树
+                Map<Long, WbsTreePrivate> nowNodeTreeAll = wbsTreePrivatesNodeAndTabNow.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList()).stream()
+                        .collect(Collectors.toMap(WbsTreePrivate::getId, Function.identity()));
+
+                //获取当前引用的节点树下所有节点、表、独立表
+                String sqlNodeTreeAllOld = "SELECT p_key_id,id,type,parent_id FROM m_wbs_tree_private WHERE project_id = " + oneRecordRoot.getProjectId() + " AND STATUS = 1 AND is_deleted = 0 AND (((type = 1 OR type = 2) AND wbs_id = " + oneRecordRoot.getWbsId() + ") OR ((type= 10 OR parent_id = -10 ) AND wbs_id IS NULL))";
+                List<WbsTreePrivate> wbsTreePrivatesNodeAndTab = jdbcTemplate.query(sqlNodeTreeAllOld, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+
+                //获取当前对应电签位置配置信息
+                List<WbsTreePrivate> collect1 = wbsTreePrivatesNodeAndTab.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList());
+                List<Long> pKeyIds = collect1.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+
+                //分组查询
+                List<TextdictInfo> textDictInfosAll = new ArrayList<>();
+                List<List<Long>> partition = Lists.partition(pKeyIds, 1000);
+                for (List<Long> ids : partition) {
+                    String sql = "select id,name,type,tab_id,col_key,sig_role_id,is_deleted,sig_role_name,col_name,pyzbx,pyzby from m_textdict_info where tab_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                    List<TextdictInfo> textDictInfos = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
+                    textDictInfosAll.addAll(textDictInfos);
+                }
+
+                //转换map
+                Map<String, List<TextdictInfo>> collect3 = textDictInfosAll.stream().collect(Collectors.groupingBy(TextdictInfo::getTabId));
+
+                //构造原始电签信息
+                for (WbsTreePrivate wbsTreePrivate : collect1) {
+                    if (wbsTreePrivate.getType() == 2) {
+                        WbsTreePrivate obj = nowNodeTreeAll.get(wbsTreePrivate.getParentId());
+                        assert obj != null;
+                        List<TextdictInfo> textDictInfos = collect3.get(String.valueOf(wbsTreePrivate.getPKeyId()));
+                        if (textDictInfos != null && textDictInfos.size() > 0) {
+                            textDictInfoData.put(wbsTreePrivate.getId(), textDictInfos);
+                        }
+                    }
+
+                    if (wbsTreePrivate.getType() == 10 && wbsTreePrivate.getParentId() == -10) { //type=10,parentId=-10 独立库
+                        //判断是否存在独立表单,存在则不新增
+                        WbsTreePrivate wbsTreePrivate1 = wbsTreePrivatesTableDL.get(wbsTreePrivate.getId());
+                        if (ObjectUtils.isEmpty(wbsTreePrivate1)) {
+                            //根据元素表pKeyId,获取电签位置匹配信息、编辑默认信息
+                            List<TextdictInfo> textDictInfos = collect3.get(String.valueOf(wbsTreePrivate.getPKeyId()));
+                            if (textDictInfos != null && textDictInfos.size() > 0) {
+                                textDictInfoData.put(wbsTreePrivate.getId(), textDictInfos);
+                            }
+                        }
+                    }
+                }
+
+                //只同步独立库中有关联过清表的元素表type=10,以及原始方式的元素表type=2
+                List<WbsTreePrivate> collect = wbsTreePrivatesNodeAndTabNow.stream().filter(f -> f.getType().equals(2) || (f.getHtmlUrl() != null && f.getType().equals(10))).collect(Collectors.toList());
+
+                collect.forEach(tree -> {
+                    List<TextdictInfo> textDictInfos = textDictInfoData.get(tree.getId());
+                    if (textDictInfos != null) {
+                        for (TextdictInfo textdictInfo : textDictInfos) {
+                            TextdictInfo obj = BeanUtil.copyProperties(textdictInfo, TextdictInfo.class);
+                            assert obj != null;
+                            obj.setId(SnowFlakeUtil.getId());
+                            obj.setTabId(tree.getPKeyId().toString()); //重新赋值绑定到对应的表上
+                            insertData.add(obj);
+                        }
+                    }
+                });
+
+                //去重,删除当前表的电签信息
+                List<String> collect2 = insertData.stream().map(TextdictInfo::getTabId).collect(Collectors.toList());
+                List<List<String>> partitionDel = Lists.partition(collect2, 1000);
+                for (List<String> ids : partitionDel) {
+                    String delSql = "delete from m_textdict_info where tab_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+                    jdbcTemplate.execute(delSql);
+                }
+
+                //异步新增
+                List<List<TextdictInfo>> partition1 = Lists.partition(insertData, 1000);
+                CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
+                        CompletableFuture.runAsync(() -> {
+                            textDictInfoService.insertBatch(addList, 1000);
+                        }, executor)).toArray(CompletableFuture[]::new));
+                handle.join();
+
+                return true;
+            } else {
+                throw new ServiceException("当前项目关联的wbs树不是私有关联");
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void eVisInfoRepeatDel(String pid) {
+        //获取当前项目下节点树所有节点、表、独立表
+        String sqlNodeTreeAllNow = "SELECT p_key_id,id,type,parent_id,html_url FROM m_wbs_tree_private WHERE project_id = " + pid + " AND STATUS = 1 AND is_deleted = 0 AND (((type = 1 OR type = 2) AND wbs_type = 1) OR (type= 10 AND parent_id = -10 ))";
+        List<WbsTreePrivate> wbsTreePrivatesNodeAndTabNow = jdbcTemplate.query(sqlNodeTreeAllNow, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
+
+        //获取当前对应电签位置配置信息
+        List<WbsTreePrivate> collect1 = wbsTreePrivatesNodeAndTabNow.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList());
+        List<Long> pKeyIds = collect1.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+
+        //分组查询电签信息
+        List<TextdictInfo> textDictInfosAll = new ArrayList<>();
+        List<List<Long>> partition = Lists.partition(pKeyIds, 1000);
+        for (List<Long> ids : partition) {
+            String sql = "select id,tab_id,col_key,col_name,sig_role_id,sig_role_name from m_textdict_info where tab_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+            List<TextdictInfo> textDictInfos = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
+            textDictInfosAll.addAll(textDictInfos);
+        }
+
+        //去重,解决之前由于删除接口重复保存,导致数据重复问题
+        List<TextdictInfo> list = textDictInfosAll.stream().collect(
+                Collectors.collectingAndThen(
+                        Collectors.toCollection(() -> new TreeSet<>(
+                                Comparator.comparing(o -> o.getTabId() + ";" + o.getSigRoleId() + ";" + o.getColKey() + ";" + o.getSigRoleName() + ";" + o.getColName()
+                                )
+                        )), ArrayList::new));
+
+        List<Long> idsAll = textDictInfosAll.stream().map(TextdictInfo::getId).collect(Collectors.toList());
+
+        List<Long> saveIds = list.stream().map(TextdictInfo::getId).collect(Collectors.toList());
+
+        List<Long> delIds = idsAll.stream().filter(f -> !saveIds.contains(f)).collect(Collectors.toList());
+
+        List<List<Long>> partition1 = Lists.partition(delIds, 1000);
+        for (List<Long> ids : partition1) {
+            String delSql = "delete from m_textdict_info where id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
+            jdbcTemplate.execute(delSql);
+        }
+
+    }
+
     @Override
     public R addWbsTreeContractInfo(String nodeId, String primaryKeyIds, long contractId) {
         if (com.alibaba.cloud.commons.lang.StringUtils.isEmpty(nodeId)) {
@@ -1503,13 +1664,13 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         if (wbsTableOwnerRoleList.size() == 0) {
             throw new ServiceException("当前用户角色未授权,请先分配角色查看元素表相对应的权限");
         }
+        //角色权限
+        List<String> roleAndTabOwners = wbsTableOwnerRoleList.stream().map(WbsTableOwnerRole::getTableOwnerNumber).collect(Collectors.toList());
 
-        List<String> tableOwnerNumbers = wbsTableOwnerRoleList.stream().map(WbsTableOwnerRole::getTableOwnerNumber).collect(Collectors.toList());
-
+        //表单权限
         List<String> tableOwnerList = null;
         if (org.apache.commons.lang.StringUtils.isNotEmpty(tableOwner)) {
             String tableOwners = "";
-            //此处加载字典owner_type
             if (tableOwner.equals("1")) {
                 tableOwners = "1,2,3";
             } else if (tableOwner.equals("2")) {
@@ -1518,7 +1679,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             tableOwnerList = Func.toStrList(tableOwners);
         }
 
-        List<WbsTreePrivate> wbsTreePrivates = baseMapper.selectWbsTreeContractList(tableOwnerNumbers, tableType, wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getId(), tableOwnerList);
+        List<WbsTreePrivate> wbsTreePrivates = baseMapper.selectWbsTreeContractList(roleAndTabOwners, tableType, wbsTreePrivate.getProjectId(), wbsTreePrivate.getWbsId(), wbsTreePrivate.getId(), tableOwnerList);
 
         if (ObjectUtil.isNotEmpty(id)) { //编辑
             //获取当前试验记录信息中的表状态
@@ -1625,148 +1786,6 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
         return R.data(table + "");
     }
 
-    @Override
-    public boolean syncProjectEVisa(String projectId) {
-        if (StringUtils.isNotEmpty(projectId)) {
-            ProjectInfo projectInfo = projectInfoMapper.selectById(projectId);
-            if (projectInfo != null && ("private").equals(projectInfo.getReferenceWbsTemplateType()) && ObjectUtils.isNotEmpty(projectInfo.getReferenceWbsTemplateId())) {
-                //构造参数集合
-                List<TextdictInfo> insertData = new ArrayList<>();
-                Map<String, List<TextdictInfo>> textDictInfoData = new HashMap<>();
-
-                //获取当前引用的项目节点树的根节点信息
-                WbsTreePrivate oneRecordRoot = this.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getPKeyId, projectInfo.getReferenceWbsTemplateId()));
-
-                //获取当前项目下节点树所有节点、表、独立表
-                String sqlNodeTreeAllNow = "SELECT p_key_id,id,type,parent_id,html_url FROM m_wbs_tree_private WHERE project_id = " + projectId + " AND STATUS = 1 AND is_deleted = 0 AND (((type = 1 OR type = 2) AND wbs_type = 1) OR (type= 10 AND parent_id = -10 ))";
-                List<WbsTreePrivate> wbsTreePrivatesNodeAndTabNow = jdbcTemplate.query(sqlNodeTreeAllNow, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-                List<WbsTreePrivate> wbsTreePrivatesTableDL = wbsTreePrivatesNodeAndTabNow.stream().filter(f -> f.getType().equals(10) && f.getParentId().equals(-10L)).collect(Collectors.toList());
-
-                //获取当前项目节点树
-                Map<Long, WbsTreePrivate> nowNodeTreeAll = wbsTreePrivatesNodeAndTabNow.stream().filter(f -> f.getType().equals(1)).collect(Collectors.toList()).stream()
-                        .collect(Collectors.toMap(WbsTreePrivate::getId, Function.identity()));
-
-                //获取当前引用的节点树下所有节点、表、独立表
-                String sqlNodeTreeAllOld = "SELECT p_key_id,id,type,parent_id FROM m_wbs_tree_private WHERE project_id = " + oneRecordRoot.getProjectId() + " AND STATUS = 1 AND is_deleted = 0 AND (((type = 1 OR type = 2) AND wbs_id = " + oneRecordRoot.getWbsId() + ") OR ((type= 10 OR parent_id = -10 ) AND wbs_id IS NULL))";
-                List<WbsTreePrivate> wbsTreePrivatesNodeAndTab = jdbcTemplate.query(sqlNodeTreeAllOld, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-
-                //获取当前对应电签位置配置信息
-                List<WbsTreePrivate> collect1 = wbsTreePrivatesNodeAndTab.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList());
-                List<Long> pKeyIds = collect1.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
-
-                //分组查询
-                List<TextdictInfo> textDictInfosAll = new ArrayList<>();
-                List<List<Long>> partition = Lists.partition(pKeyIds, 1000);
-                for (List<Long> ids : partition) {
-                    String sql = "select id,name,type,tab_id,col_key,sig_role_id,is_deleted,sig_role_name,col_name,pyzbx,pyzby from m_textdict_info where tab_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
-                    List<TextdictInfo> textDictInfos = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
-                    textDictInfosAll.addAll(textDictInfos);
-                }
-
-                Map<String, List<TextdictInfo>> collect3 = textDictInfosAll.stream().collect(Collectors.groupingBy(TextdictInfo::getTabId));
-
-                //构造原始电签信息
-                for (WbsTreePrivate wbsTreePrivate : collect1) {
-                    if (wbsTreePrivate.getType() == 2) {
-                        WbsTreePrivate obj = nowNodeTreeAll.get(wbsTreePrivate.getParentId());
-                        assert obj != null;
-                        List<TextdictInfo> textDictInfos = collect3.get(String.valueOf(wbsTreePrivate.getPKeyId()));
-                        if (textDictInfos != null && textDictInfos.size() > 0) {
-                            textDictInfoData.put(wbsTreePrivate.getPKeyId() + "," + wbsTreePrivate.getId(), textDictInfos);
-                        }
-                    }
-
-                    if (wbsTreePrivate.getType() == 10 && wbsTreePrivate.getParentId() == -10) { //type=10,parentId=-10 独立库
-                        //判断是否存在独立表单,存在则不新增
-                        List<WbsTreePrivate> collect = wbsTreePrivatesTableDL.stream().filter(f -> f.getId().equals(wbsTreePrivate.getId())).collect(Collectors.toList());
-                        if (collect.size() == 0) {
-                            //根据元素表pKeyId,获取电签位置匹配信息、编辑默认信息
-                            List<TextdictInfo> textDictInfos = collect3.get(String.valueOf(wbsTreePrivate.getPKeyId()));
-                            if (textDictInfos != null && textDictInfos.size() > 0) {
-                                textDictInfoData.put(wbsTreePrivate.getPKeyId() + "," + wbsTreePrivate.getId(), textDictInfos);
-                            }
-                        }
-                    }
-                }
-
-                //只同步独立库中有关联过清表的元素表type=10,以及原始方式的元素表type=2
-                List<WbsTreePrivate> collect = wbsTreePrivatesNodeAndTabNow.stream().filter(f -> f.getType().equals(2) || (f.getHtmlUrl() != null && f.getType().equals(10))).collect(Collectors.toList());
-
-                collect.forEach(tree -> {
-                    textDictInfoData.forEach((k, v) -> {
-                        String nodeId = k.split(",")[1];
-                        if (tree.getId().equals(Long.parseLong(nodeId))) {
-                            for (TextdictInfo textdictInfo : v) {
-                                TextdictInfo obj = BeanUtil.copyProperties(textdictInfo, TextdictInfo.class);
-                                assert obj != null;
-                                obj.setTabId(String.valueOf(tree.getPKeyId())); //重新赋值绑定到对应的表上
-                                obj.setId(SnowFlakeUtil.getId());
-                                insertData.add(obj);
-                            }
-                        }
-                    });
-                });
-
-                //去重,删除当前表的电签信息
-                List<String> collect2 = insertData.stream().map(TextdictInfo::getTabId).collect(Collectors.toList());
-                List<List<String>> partitionDel = Lists.partition(collect2, 1000);
-                for (List<String> ids : partitionDel) {
-                    String delSql = "delete from m_textdict_info where tab_id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
-                    jdbcTemplate.execute(delSql);
-                }
-
-                //新增
-                textDictInfoService.insertBatch(insertData, 1000);
-
-                return true;
-            } else {
-                throw new ServiceException("当前项目关联的wbs树不是私有关联");
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public void eVisInfoRepeatDel(String pid) {
-        //获取当前项目下节点树所有节点、表、独立表
-        String sqlNodeTreeAllNow = "SELECT p_key_id,id,type,parent_id,html_url FROM m_wbs_tree_private WHERE project_id = " + pid + " AND STATUS = 1 AND is_deleted = 0 AND (((type = 1 OR type = 2) AND wbs_type = 1) OR (type= 10 AND parent_id = -10 ))";
-        List<WbsTreePrivate> wbsTreePrivatesNodeAndTabNow = jdbcTemplate.query(sqlNodeTreeAllNow, new BeanPropertyRowMapper<>(WbsTreePrivate.class));
-
-        //获取当前对应电签位置配置信息
-        List<WbsTreePrivate> collect1 = wbsTreePrivatesNodeAndTabNow.stream().filter(f -> f.getType().equals(10) || f.getType().equals(2)).collect(Collectors.toList());
-        List<Long> pKeyIds = collect1.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
-
-        //分组查询电签信息
-        List<TextdictInfo> textDictInfosAll = new ArrayList<>();
-        List<List<Long>> partition = Lists.partition(pKeyIds, 1000);
-        for (List<Long> ids : partition) {
-            String sql = "select id,tab_id,col_key,col_name,sig_role_id,sig_role_name from m_textdict_info where tab_id in(" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
-            List<TextdictInfo> textDictInfos = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(TextdictInfo.class));
-            textDictInfosAll.addAll(textDictInfos);
-        }
-
-        //去重,解决之前由于删除接口重复保存,导致数据重复问题
-        List<TextdictInfo> list = textDictInfosAll.stream().collect(
-                Collectors.collectingAndThen(
-                        Collectors.toCollection(() -> new TreeSet<>(
-                                Comparator.comparing(o -> o.getTabId() + ";" + o.getSigRoleId() + ";" + o.getColKey() + ";" + o.getSigRoleName() + ";" + o.getColName()
-                                )
-                        )), ArrayList::new));
-
-        List<Long> idsAll = textDictInfosAll.stream().map(TextdictInfo::getId).collect(Collectors.toList());
-
-        List<Long> saveIds = list.stream().map(TextdictInfo::getId).collect(Collectors.toList());
-
-        List<Long> delIds = idsAll.stream().filter(f -> !saveIds.contains(f)).collect(Collectors.toList());
-
-        List<List<Long>> partition1 = Lists.partition(delIds, 1000);
-        for (List<Long> ids : partition1) {
-            String delSql = "delete from m_textdict_info where id in (" + org.apache.commons.lang.StringUtils.join(ids, ",") + ")";
-            jdbcTemplate.execute(delSql);
-        }
-
-    }
-
     @Transactional(rollbackFor = Exception.class)
     public boolean insertBatch(Collection<WbsTreePrivate> entityList, int batchSize) {
         try {

+ 107 - 65
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

@@ -3,6 +3,7 @@ package org.springblade.manager.service.impl;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.Lists;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang.StringUtils;
 import org.springblade.common.utils.FileUtils;
@@ -33,9 +34,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
 import java.io.File;
 import java.io.IOException;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ThreadPoolExecutor;
 import java.util.stream.Collectors;
 
 @Service
@@ -59,6 +63,9 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     private final JdbcTemplate jdbcTemplate;
     private final ITableInfoService tableInfoService;
 
+    @Resource(name = "taskExecutor1")
+    private ThreadPoolExecutor executor;
+
     @Override
     public IPage<WbsTreeVO> selectWbsTreePage(IPage<WbsTreeVO> page, WbsTreeVO wbsTree) {
         return page.setRecords(baseMapper.selectWbsTreePage(page, wbsTree));
@@ -333,16 +340,21 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                 //质检私有
             } else if (ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateId()) && ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateType()) && ("private").equals(projectInfo.getReferenceWbsTemplateType())) {
                 //获取私有引用根节点
-                WbsTreePrivate wbsTreePrivateRecord = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, projectInfo.getReferenceWbsTemplateId()));
+                WbsTreePrivate wbsTreePrivateRecord = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                        .select(WbsTreePrivate::getProjectId, WbsTreePrivate::getWbsId)
+                        .eq(WbsTreePrivate::getPKeyId, projectInfo.getReferenceWbsTemplateId()));
                 //获取私有引用项目树
                 List<WbsTreePrivate> wbsTreePrivateAllOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRecord.getProjectId())
+                        .select(WbsTreePrivate::getId, WbsTreePrivate::getNodeName, WbsTreePrivate::getNodeType, WbsTreePrivate::getMajorDataType, WbsTreePrivate::getTableType, WbsTreePrivate::getTableOwner, WbsTreePrivate::getImportMatchingInfo, WbsTreePrivate::getMixRatioTestIds, WbsTreePrivate::getInitTableId, WbsTreePrivate::getInitTableName, WbsTreePrivate::getHtmlUrl)
                         .eq(WbsTreePrivate::getStatus, 1)
-                        .and(obj -> obj.eq(WbsTreePrivate::getWbsId, wbsTreePrivateRecord.getWbsId()).or().isNull(WbsTreePrivate::getWbsId))
+                        .eq(WbsTreePrivate::getProjectId, Long.parseLong(wbsTreePrivateRecord.getProjectId()))
+                        .and(obj -> obj.eq(WbsTreePrivate::getWbsId, Long.parseLong(wbsTreePrivateRecord.getWbsId())).or().isNull(WbsTreePrivate::getWbsId))
                 );
                 //获取当前项目私有树、元素表
                 List<WbsTreePrivate> wbsTreePrivatesAllNow = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                        .select(WbsTreePrivate::getId, WbsTreePrivate::getNodeName, WbsTreePrivate::getNodeType, WbsTreePrivate::getMajorDataType, WbsTreePrivate::getTableType, WbsTreePrivate::getTableOwner, WbsTreePrivate::getImportMatchingInfo, WbsTreePrivate::getMixRatioTestIds, WbsTreePrivate::getInitTableId, WbsTreePrivate::getInitTableName, WbsTreePrivate::getHtmlUrl)
+                        .eq(WbsTreePrivate::getStatus, 1)
+                        .eq(WbsTreePrivate::getProjectId, Long.parseLong(wbsTreePrivate.getProjectId()))
                         .and(obj -> obj.eq(WbsTreePrivate::getWbsId, projectInfo.getReferenceWbsTemplateId()).or().isNull(WbsTreePrivate::getWbsId))
                 );
                 //同步修改
@@ -362,16 +374,21 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                 //试验私有
             } else if (ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateIdTrial()) && (ObjectUtil.isNotEmpty(projectInfo.getReferenceWbsTemplateTypeTrial()) && ("private").equals(projectInfo.getReferenceWbsTemplateTypeTrial()))) {
 
-                WbsTreePrivate wbsTreePrivateRecord = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, projectInfo.getReferenceWbsTemplateIdTrial()));
+                WbsTreePrivate wbsTreePrivateRecord = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda()
+                        .select(WbsTreePrivate::getProjectId, WbsTreePrivate::getWbsId)
+                        .eq(WbsTreePrivate::getPKeyId, projectInfo.getReferenceWbsTemplateIdTrial()));
 
                 List<WbsTreePrivate> wbsTreePrivateAllOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                        .select(WbsTreePrivate::getId, WbsTreePrivate::getNodeName, WbsTreePrivate::getNodeType, WbsTreePrivate::getMajorDataType, WbsTreePrivate::getTableType, WbsTreePrivate::getTableOwner, WbsTreePrivate::getImportMatchingInfo, WbsTreePrivate::getMixRatioTestIds, WbsTreePrivate::getInitTableId, WbsTreePrivate::getInitTableName, WbsTreePrivate::getHtmlUrl)
                         .eq(WbsTreePrivate::getStatus, 1)
-                        .and(obj -> obj.eq(WbsTreePrivate::getWbsId, wbsTreePrivateRecord.getWbsId()).or().isNull(WbsTreePrivate::getWbsId))
+                        .eq(WbsTreePrivate::getProjectId, Long.parseLong(wbsTreePrivate.getProjectId()))
+                        .and(obj -> obj.eq(WbsTreePrivate::getWbsId, Long.parseLong(wbsTreePrivateRecord.getWbsId())).or().isNull(WbsTreePrivate::getWbsId))
                 );
 
                 List<WbsTreePrivate> wbsTreePrivatesAllNow = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
+                        .select(WbsTreePrivate::getId, WbsTreePrivate::getNodeName, WbsTreePrivate::getNodeType, WbsTreePrivate::getMajorDataType, WbsTreePrivate::getTableType, WbsTreePrivate::getTableOwner, WbsTreePrivate::getImportMatchingInfo, WbsTreePrivate::getMixRatioTestIds, WbsTreePrivate::getInitTableId, WbsTreePrivate::getInitTableName, WbsTreePrivate::getHtmlUrl)
+                        .eq(WbsTreePrivate::getStatus, 1)
+                        .eq(WbsTreePrivate::getProjectId, Long.parseLong(wbsTreePrivate.getProjectId()))
                         .and(obj -> obj.eq(WbsTreePrivate::getWbsId, projectInfo.getReferenceWbsTemplateIdTrial()).or().isNull(WbsTreePrivate::getWbsId))
                 );
 
@@ -551,12 +568,12 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
             if (pawDTO.getReferenceType().equals("public")) {
                 //当前公有引用
-                List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId()).eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 1));
+                List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().select(WbsTreePrivate::getId).eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId()).eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 1));
                 List<String> collect = wbsTreePrivates.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
                 idList2.addAll(collect);
             } else if (pawDTO.getReferenceType().equals("private")) {
                 //当前私有引用
-                List<WbsTreePrivate> wbsTreePrivates2 = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId()).eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 1));
+                List<WbsTreePrivate> wbsTreePrivates2 = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda().select(WbsTreePrivate::getId).eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId()).eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 1));
                 List<String> collect = wbsTreePrivates2.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
                 idList2.addAll(collect);
             }
@@ -564,30 +581,11 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
             List<String> saveIds = idList1.stream().filter(f -> !idList2.contains(f)).collect(Collectors.toList());
             List<String> delIds = idList2.stream().filter(f -> !idList1.contains(f)).collect(Collectors.toList());
 
-            //TODO -------同步私有电签默认信息--------
+            //TODO -------同步新增独立表单--------
             if (saveIds.size() == 0 && delIds.size() == 0) {
                 if (pawDTO.getReferenceType().equals("private")) {
                     //新增独立表单
                     this.insertDLTabAsync(pawDTO);
-
-                    /*//获取私有引用项目的wbs树的所有节点、元素表、独立表(type=10)
-                    WbsTreePrivate wbsTreePrivate = wbsTreePrivateMapper.selectOne(Wrappers.<WbsTreePrivate>query().lambda().eq(WbsTreePrivate::getPKeyId, pawDTO.getPrimaryKeyId()));
-                    List<WbsTreePrivate> wbsTreePrivateAllOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .eq(WbsTreePrivate::getProjectId, Long.parseLong(wbsTreePrivate.getProjectId()))
-                            .eq(WbsTreePrivate::getStatus, 1)
-                            .and(obj -> obj.eq(WbsTreePrivate::getWbsId, Long.parseLong(wbsTreePrivate.getWbsId())).or().isNull(WbsTreePrivate::getWbsId))
-                    );
-                    List<WbsTreePrivate> WbsTreePrivateTables = wbsTreePrivateAllOld.stream().filter(f -> f.getType() == 2 || f.getType() == 10).collect(Collectors.toList());
-
-                    //获取当前项目私有wbs树下当前所有节点、元素表、独立表(type=10)
-                    List<WbsTreePrivate> wbsTreePrivatesAllNow = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
-                            .eq(WbsTreePrivate::getProjectId, Long.parseLong(pawDTO.getProjectId()))
-                            .and(obj -> obj.eq(WbsTreePrivate::getWbsId, Long.parseLong(pawDTO.getPrimaryKeyId())).or().isNull(WbsTreePrivate::getWbsId))
-                    );
-                    List<WbsTreePrivate> wbsTreePrivateNowTables = wbsTreePrivatesAllNow.stream().filter(f -> f.getType() == 2 || f.getType() == 10).collect(Collectors.toList());
-
-                    //同步私有-电签匹配数据、默认信息数据
-                    this.insertTextDictInfoAsync(WbsTreePrivateTables, wbsTreePrivateNowTables);*/
                 }
 
             } else {
@@ -600,7 +598,9 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         if (wbsTreeContractList.size() > 0) {
                             List<ContractInfo> contractInfoArrayList = new ArrayList<>();
                             wbsTreeContractList.forEach(list -> {
-                                ContractInfo contractInfos = contractInfoMapper.selectOne(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getId, list.getContractId()));
+                                ContractInfo contractInfos = contractInfoMapper.selectOne(Wrappers.<ContractInfo>query().lambda()
+                                        .select(ContractInfo::getContractName)
+                                        .eq(ContractInfo::getId, list.getContractId()));
                                 contractInfoArrayList.add(contractInfos);
                             });
                             List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
@@ -609,8 +609,20 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                                 throw new ServiceException(StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
                             }
                         }
+
+                        //删除对应节点下表的电签默认信息,获取当前项目所有表的pKeyId
+                        String sqlTabPkeyId = "select p_key_id from m_wbs_tree_private where wbs_id = " + pawDTO.getWbsId() + " and project_id = " + pawDTO.getProjectId() + " and parent_id in (" + StringUtils.join(ids1, ",") + ")";
+                        List<Long> pKeyIds = jdbcTemplate.query(sqlTabPkeyId, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+                        List<List<Long>> partition = Lists.partition(pKeyIds, 1000);
+                        for (List<Long> pKIds : partition) {
+                            String sqlDelTextDict = "delete from m_textdict_info where tab_id in (" + StringUtils.join(pKIds, ",") + ")";
+                            jdbcTemplate.execute(sqlDelTextDict);
+                        }
+
+                        //删除节点、表
                         baseMapper.deleteBatch(ids1, pawDTO.getWbsId(), pawDTO.getProjectId());
                         baseMapper.deleteBatch2(ids1, pawDTO.getWbsId(), pawDTO.getProjectId());
+
                         //全部删除时,需要删除该项目独立库表,且只能是删除质检的wbsType=1,质量的无法删除
                         Long rows = wbsTreePrivateMapper.selectCount(Wrappers.<WbsTreePrivate>query().lambda()
                                 .eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId())
@@ -628,7 +640,9 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         if (wbsTreeContractList.size() > 0) {
                             List<ContractInfo> contractInfoArrayList = new ArrayList<>();
                             wbsTreeContractList.forEach(list -> {
-                                ContractInfo contractInfos = contractInfoMapper.selectOne(Wrappers.<ContractInfo>query().lambda().eq(ContractInfo::getId, list.getContractId()));
+                                ContractInfo contractInfos = contractInfoMapper.selectOne(Wrappers.<ContractInfo>query().lambda()
+                                        .select(ContractInfo::getContractName)
+                                        .eq(ContractInfo::getId, list.getContractId()));
                                 contractInfoArrayList.add(contractInfos);
                             });
                             List<String> names = contractInfoArrayList.stream().distinct().map(ContractInfo::getContractName).collect(Collectors.toList());
@@ -637,8 +651,20 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                                 throw new ServiceException(StringUtil.format("当前项目wbs树的节点已被 {} 引用中,删除失败", join));
                             }
                         }
+
+                        //删除对应节点下表的电签默认信息,获取当前项目所有表的pKeyId
+                        String sqlTabPkeyId = "select p_key_id from m_wbs_tree_private where wbs_id = " + pawDTO.getPrimaryKeyId() + " and project_id = " + pawDTO.getProjectId() + " and parent_id in (" + StringUtils.join(ids2, ",") + ")";
+                        List<Long> pKeyIds = jdbcTemplate.query(sqlTabPkeyId, new BeanPropertyRowMapper<>(WbsTreePrivate.class)).stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList());
+                        List<List<Long>> partition = Lists.partition(pKeyIds, 1000);
+                        for (List<Long> pKIds : partition) {
+                            String sqlDelTextDict = "delete from m_textdict_info where tab_id in (" + StringUtils.join(pKIds, ",") + ")";
+                            jdbcTemplate.execute(sqlDelTextDict);
+                        }
+
+                        //删除节点、表
                         baseMapper.deleteBatch(ids2, pawDTO.getPrimaryKeyId(), pawDTO.getProjectId());
                         baseMapper.deleteBatch2(ids2, pawDTO.getPrimaryKeyId(), pawDTO.getProjectId());
+
                         //全部删除时,需要删除该项目独立库表,且只能是删除质检的wbsType=1,质量的无法删除
                         Long rows = wbsTreePrivateMapper.selectCount(Wrappers.<WbsTreePrivate>query().lambda()
                                 .eq(WbsTreePrivate::getWbsId, pawDTO.getPrimaryKeyId())
@@ -698,13 +724,15 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                                 .eq(WbsTreePrivate::getStatus, 1)
                                 .eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId())
                                 .eq(WbsTreePrivate::getWbsId, pawDTO.getWbsId())
-                                .and(obj -> obj.eq(WbsTreePrivate::getType, 1).or().eq(WbsTreePrivate::getType,2))
+                                .and(obj -> obj.eq(WbsTreePrivate::getType, 1).or().eq(WbsTreePrivate::getType, 2))
                         );
                         List<WbsTreePrivate> wbsTreePrivatesTableDLOld = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId()).eq(WbsTreePrivate::getType, 10).eq(WbsTreePrivate::getStatus, 1).eq(WbsTreePrivate::getParentId, -10).isNull(WbsTreePrivate::getWbsId));
                         wbsTreePrivatesNodeAndTab.addAll(wbsTreePrivatesTableDLOld);
 
                         //获取当前项目下的所有独立表
-                        List<WbsTreePrivate> wbsTreePrivatesTableDL = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 10).eq(WbsTreePrivate::getParentId, -10).eq(WbsTreePrivate::getStatus, 1));
+                        List<WbsTreePrivate> wbsTreePrivatesTableDL = wbsTreePrivateMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                .select(WbsTreePrivate::getId)
+                                .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId()).eq(WbsTreePrivate::getType, 10).eq(WbsTreePrivate::getParentId, -10).eq(WbsTreePrivate::getStatus, 1));
 
                         for (WbsTreePrivate wbsTreePrivate : wbsTreePrivatesNodeAndTab) {
                             if (wbsTreePrivate.getType() == 1 || wbsTreePrivate.getType() == 2) {
@@ -753,9 +781,15 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                     }
 
                     if (pawDTO.getReferenceType().equals("public")) {
-
-                        this.insertBatch(insertData1, 1000);
-
+                        //异步新增
+                        List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData1, 1000);
+                        CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
+                                CompletableFuture.runAsync(() -> {
+                                    wbsTreePrivateService.insertBatch(addList, 1000);
+                                }, executor)).toArray(CompletableFuture[]::new));
+                        handle.join();
+
+                        //修改状态
                         if (pawDTO.getWbsType() == 1) {
                             projectInfoMapper.updateTemplateInfoQuality(pawDTO.getProjectId(), pawDTO.getWbsId(), "public");
                         }
@@ -764,9 +798,15 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
                         }
 
                     } else if (pawDTO.getReferenceType().equals("private")) {
-
-                        this.insertBatch(insertData2, 1000);
-
+                        //异步新增
+                        List<List<WbsTreePrivate>> partition1 = Lists.partition(insertData2, 1000);
+                        CompletableFuture<Void> handle = CompletableFuture.allOf(partition1.stream().map(addList ->
+                                CompletableFuture.runAsync(() -> {
+                                    wbsTreePrivateService.insertBatch(addList, 1000);
+                                }, executor)).toArray(CompletableFuture[]::new));
+                        handle.join();
+
+                        //修改状态
                         if (pawDTO.getWbsType() == 1) {
                             projectInfoMapper.updateTemplateInfoQuality(pawDTO.getProjectId(), pawDTO.getPrimaryKeyId(), "private");
                         }
@@ -787,31 +827,6 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return false;
     }
 
-    @Transactional(rollbackFor = Exception.class)
-    public boolean insertBatch(Collection<WbsTreePrivate> entityList, int batchSize) {
-        try {
-            int size = entityList.size();
-            int idxLimit = Math.min(batchSize, size);
-            int i = 1;
-            //保存单批提交的数据集合
-            List<WbsTreePrivate> oneBatchList = new ArrayList<>();
-            for (Iterator<WbsTreePrivate> var1 = entityList.iterator(); var1.hasNext(); ++i) {
-                WbsTreePrivate element = var1.next();
-                oneBatchList.add(element);
-                if (i == idxLimit) {
-                    wbsTreePrivateMapper.insertBatchSomeColumn(oneBatchList);
-                    //每次提交后清空集合数据
-                    oneBatchList.clear();
-                    idxLimit = Math.min(idxLimit + batchSize, size);
-                }
-            }
-        } catch (Exception e) {
-            log.error("保存失败", e);
-            return false;
-        }
-        return true;
-    }
-
     @Async
     public boolean updateWbsInfoPrivateAsync(List<WbsTree> wbsTreeListAll, List<WbsTreePrivate> wbsTreePrivatesAll, String projectId, Integer wbsType) {
         return wbsTreePrivateService.updateBatchByIds(wbsTreeListAll, wbsTreePrivatesAll, projectId, wbsType);
@@ -827,6 +842,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     private void insertDLTabAsync(WbsTreeContractDTO pawDTO) {
         //获取当前引用项目的独立表
         List<WbsTreePrivate> wbsTreePrivates = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                //.select(WbsTreePrivate::getId, WbsTreePrivate::getHtmlUrl, WbsTreePrivate::getNodeName, WbsTreePrivate::getTableType)
                 .eq(WbsTreePrivate::getProjectId, pawDTO.getReferencePrivateWbsProjectId())
                 .eq(WbsTreePrivate::getType, 10)
                 .isNotNull(WbsTreePrivate::getHtmlUrl)
@@ -834,6 +850,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
 
         //获取当前项目独立表
         List<WbsTreePrivate> wbsTreePrivatesNew = wbsTreePrivateService.getBaseMapper().selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                .select(WbsTreePrivate::getPKeyId, WbsTreePrivate::getId, WbsTreePrivate::getNodeName, WbsTreePrivate::getTableType, WbsTreePrivate::getHtmlUrl)
                 .eq(WbsTreePrivate::getProjectId, pawDTO.getProjectId())
                 .eq(WbsTreePrivate::getType, 10)
         );
@@ -1224,4 +1241,29 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         return false;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    public boolean insertBatch(Collection<WbsTreePrivate> entityList, int batchSize) {
+        try {
+            int size = entityList.size();
+            int idxLimit = Math.min(batchSize, size);
+            int i = 1;
+            //保存单批提交的数据集合
+            List<WbsTreePrivate> oneBatchList = new ArrayList<>();
+            for (Iterator<WbsTreePrivate> var1 = entityList.iterator(); var1.hasNext(); ++i) {
+                WbsTreePrivate element = var1.next();
+                oneBatchList.add(element);
+                if (i == idxLimit) {
+                    wbsTreePrivateMapper.insertBatchSomeColumn(oneBatchList);
+                    //每次提交后清空集合数据
+                    oneBatchList.clear();
+                    idxLimit = Math.min(idxLimit + batchSize, size);
+                }
+            }
+        } catch (Exception e) {
+            log.error("保存失败", e);
+            return false;
+        }
+        return true;
+    }
+
 }

+ 51 - 30
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/FileUtils.java

@@ -16,6 +16,9 @@ import org.apache.poi.ss.usermodel.CellStyle;
 import org.apache.poi.ss.util.CellRangeAddress;
 import org.apache.poi.util.IOUtils;
 import org.apache.poi.util.Units;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.common.vo.DataVO;
@@ -300,42 +303,22 @@ public class FileUtils {
 
 
 
-    public static void main11(String[] args) throws Exception {
-            String data = "";
-        for(int i=1;i<=100;i++){
-            data +="name"+i+"  VARCHAR(500),";
-        }
-        System.out.println(data);
-  /*      String excelPath="/Users/hongchuangyanfa/Desktop/pdf/1625671101419880450.xlsx";
-        File file_out = ResourceUtil.getFile("/Users/hongchuangyanfa/Desktop/pdf/123.xlsx");
-        InputStream exceInp = new FileInputStream(file_out);//CommonUtil.getOSSInputStream("https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20230130/2d98b5a4d6270d5d4f98847216c17888.xlsx");
+    public static void main123(String[] args) throws Exception {
+
+
+        String excelPath="/Users/hongchuangyanfa/Desktop/pdf/1625671101419880450.xlsx";
+        File file_out = ResourceUtil.getFile("/Users/hongchuangyanfa/Desktop/pdf/12345.xlsx");
+        InputStream exceInp = new FileInputStream(file_out);//CommonUtil.getOSSInputStream("https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20230308/aede5ee70ecc095c8e1dd76aa2f49d1a.xlsx");
         final org.apache.poi.ss.usermodel.Workbook workbook = WorkbookFactory.create(exceInp);
         Sheet sheet = workbook.getSheetAt(0);
         sheet.setForceFormulaRecalculation(true);
         // fileName为图片完整路径,例:C:\images\EDG.jpg
-        InputStream ossInputStream = CommonUtil.getOSSInputStream("https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20230215/78c0938ed110230f3907461228e6fb45.jpg");
-        byte[] bytes = IOUtils.toByteArray(ossInputStream);
-
-        // 这里根据实际需求选择图片类型
-        int pictureIdx = workbook.addPicture(bytes,6);
-
-        CreationHelper helper = workbook.getCreationHelper();
-        ClientAnchor anchor = helper.createClientAnchor();
-        anchor.setCol1(0); // param1是列号
-        anchor.setCol2(7);
-        anchor.setRow1(9); // param2是行号
-        anchor.setRow2(30); // param2是行号
-
-        Drawing drawing = sheet.createDrawingPatriarch();
-        anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);
-        // 插入图片
-        Picture pict = drawing.createPicture(anchor, pictureIdx); // 调整图片占单元格百分比的大小,1.0就是100%
-        pict.resize(1,1);
-        FileUtils.imageOrientation(sheet, anchor, new DataVO(0, 9) );
+
+
         FileOutputStream outputStream = new FileOutputStream(excelPath);
         //生成一份新的excel
 
-        Cell cell = sheet.getRow(6).getCell(10);
+        Cell cell = sheet.getRow(10).getCell(10);
         cell.setCellValue("2023年02-08-2023年02-09");
 
 
@@ -349,7 +332,45 @@ public class FileUtils {
         }
         if (workbook != null) {
             IoUtil.closeQuietly(workbook);
-        }*/
+        }
+
+    }
+
+
+    public static void main23(String[] args) throws FileNotFoundException {
+        File file1 = ResourceUtil.getFile("/Users/hongchuangyanfa/fsdownload/1633774811681390592.html");
+        FileInputStream fileInputStream = new FileInputStream(file1);
+        String htmlString = IoUtil.readToString(fileInputStream);
+        // 解析 style
+        org.jsoup.nodes.Document doc = Jsoup.parse(htmlString);
+        Element table = doc.select("table").first();
+        Elements trs = table.select("tr");
+
+
+        List<List<String>> redata = new ArrayList<>();
+        for (int i = 0; i < trs.size(); i++) {
+            Element tr = trs.get(i);
+            Elements tds = tr.select("td");
+            List<String> tdList = new ArrayList<>();
+            for (int j = 0; j < tds.size(); j++) {
+                Element element = tds.get(j);
+                if (element.html().indexOf("el-tooltip") >= 0) {
+                    element = element.children().get(0);
+                }
+                if (element.children().size() >= 1) {
+                    String keyname = element.children().get(0).attr("keyname");
+                    if (StringUtils.isNotEmpty(keyname)) {
+                        tdList.add(keyname);
+                    }
+                }
+            }
+            redata.add(tdList) ;
+        }
+
+        String[][] res = new String[redata.size()][]; // 存放转换结果的 二维数组
+        for(int i=0; i<res.length; i++){ // 转换方法
+            res[i] = redata.get(i).toArray(new String[redata.get(i).size()]);
+        }
 
     }
 }