ソースを参照

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

huangtf 2 年 前
コミット
8cc4dfa5e4
39 ファイル変更868 行追加181 行削除
  1. 157 0
      blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java
  2. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ControlProjectInfo.java
  3. 3 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudgetStats.java
  4. 7 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/UserpayInfo.java
  5. 2 0
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ControlProjectInfoVO.java
  6. 1 1
      blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/UserpayInfoVO.java
  7. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOptionVo.java
  8. 4 65
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeInfo.java
  9. 35 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeJson.java
  10. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExcelTab.java
  11. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/FormulaOption.java
  12. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/FormulaClient.java
  13. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExcelTabVO.java
  14. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreePrivateQueryValueVO.java
  15. 2 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/WbsTreeQueryValueVO.java
  16. 118 2
      blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java
  17. 157 6
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  18. 3 1
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java
  19. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/controller/CorporationInfoController.java
  20. 3 0
      blade-service/blade-control/src/main/java/org/springblade/control/controller/UserpayInfoController.java
  21. 10 11
      blade-service/blade-control/src/main/java/org/springblade/control/excel/UserpayExcel.java
  22. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml
  23. 1 0
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml
  24. 2 1
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/UserpayInfoMapper.java
  25. 11 6
      blade-service/blade-control/src/main/java/org/springblade/control/mapper/UserpayInfoMapper.xml
  26. 1 1
      blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java
  27. 59 1
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  28. 1 1
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/StringUtils.java
  29. 24 2
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  30. 10 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  31. 9 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/FormulaClientImpl.java
  32. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.java
  33. 15 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml
  34. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaOptionService.java
  35. 20 21
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  36. 82 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaOptionServiceImpl.java
  37. 15 14
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
  38. 81 27
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java
  39. 3 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreeServiceImpl.java

+ 157 - 0
blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java

@@ -8,6 +8,7 @@ import java.io.File;
 import java.io.FileFilter;
 import java.io.IOException;
 import java.lang.annotation.Annotation;
+import java.math.BigDecimal;
 import java.net.JarURLConnection;
 import java.net.URL;
 import java.util.*;
@@ -18,6 +19,9 @@ import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
+import static java.math.BigDecimal.ROUND_CEILING;
+import static java.math.BigDecimal.ROUND_HALF_UP;
+
 /**
  * @author yangyj
  * @Date 2022/7/8 11:08
@@ -110,5 +114,158 @@ public class BaseUtils {
                 .collect(Collectors.toList());
     }
 
+    public static String handleNull(Object obj) {
+        if (null == obj) {
+            return "";
+        } else {
+            return obj.toString().trim();
+        }
+    }
+    public static boolean isNotEmpty(Object value) {
+             if(value!=null){
+                 if(value instanceof List&&((List<?>) value).size()>0 ){
+                    return true;
+                 }else if(value instanceof Map&&((Map<?, ?>) value).size()>0){
+                     return true;
+                 }else if(value.toString().trim().length()>0){
+                     return true;
+                 }
+             }
+             return false;
+    }
+
+    public static boolean isEmpty(Object value){
+        return !isNotEmpty(value);
+    }
+
+
+    public static Double[] scopeParse(Object dev, Object design, Object xN) {
+        if (isNotEmpty(dev)) {
+            Double[] result = new Double[2];
+            double designD = Double.parseDouble(design.toString());
+            double xND = Double.parseDouble(xN.toString());
+            String devStr = dev.toString();
+            devStr = devStr.replaceAll("[\\[\\]]+", "");
+            double min = 0;
+            double max = 0;
+            devStr = devStr.replaceAll("\\s+", "");
+            if (devStr.contains("≤") || devStr.contains("<=") || devStr.contains("<")||devStr.contains("≦")) {
+                devStr = devStr.replace("≤", "").replace("<=", "").replace("≦","");
+                max = designD + Double.parseDouble(devStr) * xND;
+            } else if (devStr.contains("≥") || devStr.contains(">=") || devStr.contains(">")) {
+                devStr = devStr.replace("≥", "").replace(">=", "");
+                min = designD + Double.parseDouble(devStr) * xND;
+                max = Double.MAX_VALUE;
+            } else if (devStr.contains(",") || devStr.contains(",")) {
+                String[] arr = devStr.split("[,,]");
+                min = designD + Double.parseDouble(arr[0]) * xND;
+                max = designD + Double.parseDouble(arr[1]) * xND;
+            } else if (devStr.contains("%")) {
+                devStr = devStr.replace("%", "");
+                double devD = Math.abs(Double.parseDouble(devStr) * designD / 100);
+                min = designD - devD;
+                max = designD + devD;
+            } else if (devStr.contains("±")) {
+                devStr = devStr.replace("±", "");
+                double devD = Math.abs(Double.parseDouble(devStr) * xND);
+                min = designD - devD;
+                max = designD + devD;
+            }
+            if(min>max){
+                double tmp=max;
+                max=min;
+                min=tmp;
+            }
+            result[0] = min;
+            result[1] = max;
+            return result;
+        }
+        return null;
+    }
+
+    public static Integer handleObj2Integer(Object obj) {
+        if (null == obj) {
+            return 0;
+        } else {
+            double value = 0;
+            try {
+                value = Double.parseDouble(obj.toString());
+            } catch (Exception ex) {
+                value = 0;
+            }
+            return (int) value;
+        }
+    }
+
+    /**
+     * @return java.util.List<java.lang.Object> 不能包含0
+     * @Description specifiedRangeList
+     * @Param [hz:频率, design:设计值, dev:偏差范围, xN 偏差范围单位和设计值单位的比值,例如毫米:厘米=0.1, scale:保存小数位, passRate:合格率[0,1]]
+     * @Author yangyj
+     * @Date 2022.03.31 09:16
+     **/
+    public static List<Object> rangeList(Object hz, Object design, Object dev, Object xN, Object scale, Object passRate) {
+        List<Object> result = new ArrayList<>();
+        if (isNotNull(design, dev, hz)) {
+            if (isEmpty(scale)) {
+                scale = 0;
+            }
+            if (isEmpty(passRate)) {
+                passRate = 1;
+            }
+            if (isEmpty(xN)) {
+                xN = 1;
+            }
+            Double[] range = scopeParse(dev, design, xN);
+            int scaleI = Integer.parseInt(scale.toString());
+            int min = 0, max = 0;
+            assert range != null;
+            if (range.length > 0) {
+                min = (int) (range[0] * Math.pow(10, scaleI));
+                max = (int) (range[1] * Math.pow(10, scaleI));
+            }
+            Random rd = new Random();
+            int hzi = new BigDecimal(hz.toString()).multiply(new BigDecimal(passRate.toString())).setScale(0, ROUND_CEILING).intValue();
+            for (int i = 0; i < hzi; i++) {
+                BigDecimal tb = new BigDecimal(rd.nextInt(max - min + 1) + min).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
+                if(tb.equals(BigDecimal.ZERO)){
+                    i--;
+                }else{
+                    if (scaleI > 0) {
+                        result.add(tb.doubleValue());
+                    } else {
+                        result.add(tb.intValue());
+                    }
+                }
+            }
+            int total = handleObj2Integer(hz);
+            if (total - hzi > 0) {
+                for (int k = 0; k < total - hzi; k++) {
+                    BigDecimal tb;
+                    if (rd.nextBoolean()) {
+                        tb = new BigDecimal(rd.nextInt(((max - min) / 2)) + max + 1).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
+                    } else {
+                        tb = new BigDecimal(min - 1 - rd.nextInt(((max - min) / 2))).divide(BigDecimal.valueOf(Math.pow(10, scaleI)), scaleI, ROUND_HALF_UP);
+                    }
+                    if(tb.equals(BigDecimal.ZERO)){
+                        k--;
+                    }else {
+                        if (scaleI > 0) {
+                            result.add(tb.doubleValue());
+                        } else {
+                            result.add(tb.intValue());
+                        }
+                    }
+                }
+                if (result.size()>0) {
+                    Collections.shuffle(result);
+                }
+            }
+        }
+        return result;
+    }
+
+
+
 
 }

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ControlProjectInfo.java

@@ -54,6 +54,9 @@ public class ControlProjectInfo extends BaseEntity {
     @ApiModelProperty(value = "项目类型")
     private Integer projectType;
 
+    @ApiModelProperty(value = "项目归属公司")
+    private Integer projectCompany;
+
     @ApiModelProperty(value = "项目类别")
     private Integer projectClass;
 

+ 3 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/ProjectCostBudgetStats.java

@@ -43,6 +43,9 @@ public class ProjectCostBudgetStats extends BaseEntity {
     @ApiModelProperty(value = "管理总金额")
     private BigDecimal manageCostTotal;
 
+    @ApiModelProperty(value = "税金")
+    private BigDecimal taxMoney;
+
     @ApiModelProperty(value = "之前是否审批通过,1通过")
     private Integer approve;
 

+ 7 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/entity/UserpayInfo.java

@@ -46,6 +46,12 @@ public class UserpayInfo extends BaseEntity {
     @ApiModelProperty(value = "用户id主键")
     private Long userId;
 
+    /**
+     * 租户ID
+     */
+    @ApiModelProperty(value = "租户ID")
+    private String tenantId;
+
     /**
      * 用户id主键
      */
@@ -161,6 +167,6 @@ public class UserpayInfo extends BaseEntity {
      * 描述
      */
     @ApiModelProperty(value = "描述")
-    private String desc;
+    private String remark;
 
 }

+ 2 - 0
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/ControlProjectInfoVO.java

@@ -20,6 +20,8 @@ public class ControlProjectInfoVO extends ControlProjectInfo {
     private String projectTypeValue;
     @ApiModelProperty(value = "项目服务类型值")
     private String projectServerTypeValue;
+    @ApiModelProperty(value = "项目归属公司值")
+    private String projectCompanyName;
     @ApiModelProperty(value = "项目类别值")
     private String projectClassValue;
     @ApiModelProperty(value = "合同金额")

+ 1 - 1
blade-service-api/blade-control-api/src/main/java/org/springblade/control/vo/UserpayInfoVO.java

@@ -33,5 +33,5 @@ public class UserpayInfoVO extends UserpayInfo {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty(value = "用户姓名")
-    private String name;
+    private String month;
 }

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOptionVo.java

@@ -13,12 +13,19 @@ import org.springblade.manager.entity.FormulaOption;
 @Data
 public class FormulaOptionVo {
     private Long id;
+    /**工序id,不是流水号*/
     private Long parentId;
+    /**元素码*/
     private String key;
+    /**合同段id*/
     private Long contractId;
+    /**参数值*/
     private String value;
+    /**表单流水号*/
     private Long pkeyId;
+    /**0元素 1单元格*/
     private Integer scope;
+    /**参数码例如TF*/
     private String code;
 
     public boolean saveChecked() {

+ 4 - 65
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeInfo.java

@@ -13,10 +13,12 @@ import java.util.stream.Collectors;
 /**
  * @author yangyj
  * @Date 2022/9/22 17:52
- * @description TODO
+ * @description 序列化用rangeJson
  */
+@Data
 public class RangeInfo {
-
+    /**参数码*/
+    public static final String RG="RG";
     @ApiModelProperty( value = "方向",required = true)
     private String direction;
 
@@ -31,11 +33,9 @@ public class RangeInfo {
             required = true
     )
     private String size;
-    @JSONField(serialize = false)
     private List<Integer> gSize;
     @ApiModelProperty("偏差范围")
     private String dev;
-    @JSONField(serialize = false)
     private List<String> gDev;
     @ApiModelProperty(
             value = "表单key",
@@ -46,43 +46,20 @@ public class RangeInfo {
     private Long pkId;
     @ApiModelProperty("命名有误此字段应为:合格数量,也可以用百分比表示如2%")
     private String pass;
-    @JSONField(serialize = false)
     private List<Integer> gPass;
     @ApiModelProperty("容量")
     private String capacity;
-    @JSONField(serialize = false)
     private List<Integer> gCapacity;
 
     public Boolean verify() {
         return Func.isNotBlank(design) && ((Func.isNotBlank(size)) || (Func.isNotBlank(capacity))) && Func.isNotBlank(key) && (Func.isNotEmpty(pkId) || Func.isNotBlank(dev));
     }
 
-    public String getDirection() {
-        return direction;
-    }
-
-    public void setDirection(String direction) {
-        this.direction = direction;
-    }
-
-    public String getDesign() {
-        return design;
-    }
-
-
-    public void setDesign(String design) {
-        this.design = design;
-    }
 
     public List<String> getDesigns() {
         return gDesign;
     }
 
-
-    public String getSize() {
-        return size;
-    }
-
     public Integer getSizeAt(int i) {
         return gSize.size() > i ? gSize.get(i) : gSize.get(gSize.size() - 1);
     }
@@ -105,17 +82,14 @@ public class RangeInfo {
         }
     }
 
-
     public void setSize(String size) {
         this.size = size;
     }
 
-    @JSONField(serialize = false)
     public List<Integer> getSizeList() {
         return gSize;
     }
 
-
     public String getDev() {
         return dev;
     }
@@ -132,55 +106,20 @@ public class RangeInfo {
         this.dev = dev;
     }
 
-    @JSONField(serialize = false)
     public List<String> getDevList() {
         return gDev;
     }
 
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public Long getPkId() {
-        return pkId;
-    }
-
-    public void setPkId(Long pkId) {
-        this.pkId = pkId;
-    }
-
-    public String getPass() {
-        return pass;
-    }
-
-    public void setPass(String pass) {
-
-        this.pass = pass;
-    }
-
     public Integer getPassAt(int i) {
         return gPass.size() > i ? gPass.get(i) : gPass.get(gPass.size() - 1);
     }
 
-    @JSONField(serialize = false)
     public List<Integer> getPassList() {
         return gPass;
     }
 
 
-    public String getCapacity() {
-        return capacity;
-    }
-
-    public void setCapacity(String capacity) {
 
-        this.capacity = capacity;
-    }
 
 
 }

+ 35 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeJson.java

@@ -0,0 +1,35 @@
+package org.springblade.manager.dto;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * @author yangyj
+ * @Date 2023/8/11 15:33
+ * @description TODO
+ */
+@Data
+public class RangeJson {
+    @JSONField(name = "d")
+    private String design;
+    @JSONField(name = "s",ordinal = 1)
+    private String size;
+    @JSONField(name = "v",ordinal = 2)
+    private String dev;
+    @JSONField(name = "p",ordinal = 3)
+    private String pass;
+    @JSONField(name = "k",ordinal = 4)
+    private Long pkeyId;
+    @JSONField(name = "t",ordinal = 5)
+    private Integer start;
+
+    public RangeJson() {
+    }
+    public RangeJson(RangeInfo rg){
+        this.design=rg.getDesign();
+        this.size=rg.getSize();
+        this.dev=rg.getDev();
+        this.pass=rg.getPass();
+        this.pkeyId=rg.getPkId();
+    }
+}

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExcelTab.java

@@ -125,4 +125,7 @@ public class ExcelTab extends BaseEntity {
     @ApiModelProperty(value = "实体表ID")
     private String tabId;
 
+    @ApiModelProperty(value = "清表模板类型")
+    private Integer tableTemplateType;
+
 }

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

@@ -15,7 +15,7 @@ import lombok.EqualsAndHashCode;
 @Data
 @TableName("m_formula_option")
 public class FormulaOption {
-    @ApiModelProperty("主键id")
+    @ApiModelProperty("主键id,使用树节点pkeyId")
     @TableId(
             value = "id",
             type = IdType.ASSIGN_ID

+ 7 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/FormulaClient.java

@@ -1,10 +1,13 @@
 package org.springblade.manager.feign;
 
 import org.springblade.manager.dto.FormData;
+import org.springblade.manager.entity.FormulaOption;
 import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import javax.validation.constraints.NotNull;
 import java.io.FileNotFoundException;
 import java.util.List;
 
@@ -26,4 +29,8 @@ public interface FormulaClient {
     @PostMapping(API_PREFIX + "d-point")
     String dPoint(@RequestParam Long pkId, @RequestParam String key) throws FileNotFoundException;
 
+    @GetMapping(API_PREFIX + "option")
+    FormulaOption option(@RequestParam @NotNull Long pkeyId);
+
+
 }

+ 4 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExcelTabVO.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.manager.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import org.springblade.manager.entity.ExcelTab;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -31,4 +32,7 @@ import lombok.EqualsAndHashCode;
 public class ExcelTabVO extends ExcelTab {
     private static final long serialVersionUID = 1L;
 
+    @ApiModelProperty(value = "清表模板类型名称")
+    private String tableTemplateTypeName;
+
 }

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

@@ -8,6 +8,8 @@ import java.util.List;
 @Data
 public class WbsTreePrivateQueryValueVO extends WbsTreePrivate {
 
+    private String title;
+
     private List<WbsTreePrivateQueryValueVO> children;
 
     private Boolean hasChildren;

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

@@ -9,6 +9,8 @@ import java.util.List;
 @Data
 public class WbsTreeQueryValueVO extends WbsTree {
 
+    private String title;
+
     private List<WbsTreeQueryValueVO> children;
 
     private Boolean hasChildren;

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

@@ -29,6 +29,7 @@ import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.*;
 
+import javax.management.MalformedObjectNameException;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -60,6 +61,7 @@ public class EVisaTaskCheckController {
 
     private final JdbcTemplate jdbcTemplate;
 
+
     /**
      * 检查所选的流程环节处理人是否具有审批权限(三大填报页、日志列表的批量上报、首件列表的批量上报)
      */
@@ -80,7 +82,16 @@ public class EVisaTaskCheckController {
             //获取这些审批人在当前合同段的权限
             List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, json.getString("contractId"));
             if (userRoleList == null || userRoleList.size() <= 0) {
-                return R.data(300, false, "所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
+                //查看当前项目下是否有监理合同段关联此合同段
+                Long contractId = jdbcTemplate.queryForObject("SELECT id from m_contract_info mci WHERE contract_type = 2 \n" +
+                        "and id in (SELECT contract_id_jlyz  FROM m_contract_relation_jlyz WHERE contract_id_sg = " + json.getString("contractId")+")",Long.class);
+                if (contractId == null) {
+                    return R.data(300, false, "所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
+                }
+                userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, contractId+"");
+                if (userRoleList == null || userRoleList.size() <= 0){
+                    return R.data(300, false, "所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
+                }
             }
 
             //获取电签配置
@@ -134,7 +145,16 @@ public class EVisaTaskCheckController {
             //获取这些审批人在当前合同段的权限
             List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, json.getString("contractId"));
             if (userRoleList == null || userRoleList.size() <= 0) {
-                return R.data(300, false, "所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
+                //查看当前项目下是否有监理合同段关联此合同段
+                Long contractId = jdbcTemplate.queryForObject("SELECT id from m_contract_info mci WHERE contract_type = 2 \n" +
+                        "and id in (SELECT contract_id_jlyz  FROM m_contract_relation_jlyz WHERE contract_id_sg = " + json.getString("contractId")+")",Long.class);
+                if (contractId == null) {
+                    return R.data(300, false, "所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
+                }
+                userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, contractId+"");
+                if (userRoleList == null || userRoleList.size() <= 0){
+                    return R.data(300, false, "所选审批人均未找到当前表格所需要的签字岗位,请联系服务人员处理");
+                }
             }
 
             //获取电签配置
@@ -229,6 +249,7 @@ public class EVisaTaskCheckController {
             return R.fail(300, "未找到符合电签配置的相关流程,请联系服务人员处理");
         }
 
+
         //汇总电签配置的审批角色
         List<String> eVisaRoleList = jsonList.stream().map(jsonObject -> jsonObject.getString("sigRoleId")).distinct().collect(Collectors.toList());
 
@@ -275,6 +296,101 @@ public class EVisaTaskCheckController {
         return R.data(flowPage);
     }
 
+    /**
+     * 获取符合条件的预设流程(三大填报页、日志列表的批量上报、首件列表的批量上报)
+     */
+    @PostMapping("/queryFixedFlow2")
+    @ApiOperationSupport(order = 5)
+    @ApiOperation(value = "获取符合条件的预设流程(三大填报页、日志列表的批量上报、首件列表的批量上报)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "contractId", value = "合同段ID", required = true),
+            @ApiImplicitParam(name = "privatePKeyId", value = "表单列表中的isTypePrivatePid字段,集合形式"),
+            @ApiImplicitParam(name = "theLogPrimaryKeyId", value = "日志左侧所选的填报类型ID"),
+            @ApiImplicitParam(name = "firstId", value = "首件记录ID,列表批量上报时传任意一个即可")
+    })
+    public R<IPage<FixedFlowVO>> queryFixedFlow2(@RequestBody JSONObject json) {
+        //获取所有流程
+        FixedFlowVO vo = new FixedFlowVO();
+        vo.setCurrent(1);
+        vo.setSize(100);
+        vo.setContractId(json.getLong("contractId"));
+        vo.setProjectId(json.getLong("projectId"));
+
+        IPage<FixedFlowVO> flowPage = this.fixedFlowService.selectFixedFlowPage(vo);
+        //每个自定义流程
+        List<FixedFlowVO> flowList = flowPage.getRecords();
+
+        //获取电签配置
+        List<String> list = json.getJSONArray("privatePKeyId").toJavaList(String.class);
+        Map<String,List<String>> map = new HashMap<>();
+        for (String nodeId : list) {
+            //获取节点信息
+            WbsTreeContract contract = wbsTreeContractClient.getContractWbsTreeByPrimaryKeyId(Long.valueOf(nodeId));
+            //获取节点下每个填报表
+            List<WbsTreeContract> node = wbsTreeContractClient.queryChildByParentId(contract, "", "");
+            List<Long> ids = new ArrayList<>();
+            //获取每个填报表对应的wbs_tree_private的id
+            for (WbsTreeContract treeContract : node) {
+                WbsTreePrivate wbsTreePrivate = wbsTreePrivateClient.queryPeersNodeByProjectIdAndId(treeContract.getProjectId(), treeContract.getId());
+                ids.add(wbsTreePrivate.getPKeyId());
+            }
+            JSONObject object = new JSONObject();
+            object.put("privatePKeyId", ids);
+            List<JSONObject> jsonList = this.queryTableEVisaConfig(object);
+            if (jsonList == null || jsonList.size() <= 0) {
+                return R.data(300, null, contract.getNodeName() + ":有节点下所有表单都没配置电签,请联系服务人员处理");
+            }
+
+            //汇总电签配置的审批角色
+            List<String> eVisaRoleList = jsonList.stream().map(jsonObject -> jsonObject.getString("sigRoleId")).distinct().collect(Collectors.toList());
+            map.put(nodeId,eVisaRoleList);
+        }
+
+
+        //校验这些预设流程哪些是符合条件的
+        for (FixedFlowVO next : flowList) {
+            //先将流程设置为可选
+            next.setDisabled(false);
+
+            //首先找到对应流程下的审批人组
+            List<FixedFlowLink> flowLink = this.fixedFlowLinkService.selectFixedFlowLink(next.getId().toString());
+            List<Long> ids = flowLink.stream().map(l -> l.getFixedFlowLinkUser()).collect(Collectors.toList());
+
+
+            //获取这些人当前合同段下的权限
+            List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(flowLink.stream().map(FixedFlowLink::getFixedFlowLinkUser).distinct().collect(Collectors.toList()), json.getString("contractId"));
+            if (userRoleList == null || userRoleList.size() <= 0) {
+                //查看当前项目下是否有监理合同段关联此合同段
+                Long contractId = jdbcTemplate.queryForObject("SELECT id from m_contract_info mci WHERE contract_type = 2 \n" +
+                        "and id in (SELECT contract_id_jlyz  FROM m_contract_relation_jlyz WHERE contract_id_sg = " + json.getString("contractId")+")",Long.class);
+                if (contractId != null) {
+                    userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(ids, contractId+"");
+                }
+            }
+            if (userRoleList == null) {
+                next.setDisabled(true);
+            } else {
+                //校验流程
+                //循环审批人的角色集合,并判断电签配置中是否含有这个角色
+                label:
+                for (JSONObject userRole : userRoleList) {
+                    for (String s : map.keySet()) {
+                        if (!map.get(s).contains(userRole.getString("roleId"))) {
+                            //但凡有个不符合条件,禁选
+                            next.setDisabled(true);
+                            break label;
+                        }
+                    }
+                }
+            }
+        }
+
+        //设置流程
+        flowPage.setRecords(flowList);
+
+        return R.data(flowPage);
+    }
+
     /**
      * 检查当前审批人是否存在证书
      */

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

@@ -1,5 +1,6 @@
 package org.springblade.business.controller;
 
+import cn.hutool.log.StaticLog;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
@@ -24,6 +25,7 @@ import org.springblade.business.socket.WebSocket;
 import org.springblade.business.utils.FileUtils;
 import org.springblade.business.vo.*;
 import org.springblade.common.constant.CommonConstant;
+import org.springblade.common.utils.BaseUtils;
 import org.springblade.common.utils.CommonUtil;
 import org.springblade.common.utils.SnowFlakeUtil;
 import org.springblade.core.boot.ctrl.BladeController;
@@ -37,6 +39,8 @@ import org.springblade.core.tool.node.ForestNodeMerger;
 import org.springblade.core.tool.utils.*;
 import org.springblade.evisa.feign.EVisaClient;
 import org.springblade.evisa.vo.CertBeanVO;
+import org.springblade.manager.dto.RangeInfo;
+import org.springblade.manager.dto.RangeJson;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.feign.*;
 import org.springblade.manager.vo.WbsTreeContractLazyVO;
@@ -119,6 +123,8 @@ public class InformationWriteQueryController extends BladeController {
 
     private final ITreeContractFirstService treeContractFirstService;
 
+    private final FormulaClient formulaClient;
+
     @Autowired
     StringRedisTemplate RedisTemplate;
 
@@ -1403,6 +1409,8 @@ public class InformationWriteQueryController extends BladeController {
             //转化为map
             Map<String, String> nodeTabColsMap = nodeTabCols.stream().collect(Collectors.toMap(QueryProcessDataVO::getQueryType, QueryProcessDataVO::getAncestors, (key1, key2) -> key2));
             StringBuilder copySql = new StringBuilder();
+            /*重置内容*/
+            Map<String,Map<String,String>> ekvMap = new HashMap<>();
 
             if (StringUtils.isNotEmpty(vo.getNeedCopyPrimaryKeyId())) {
                 WbsTreeContract parent = this.wbsTreeContractClient.getContractNodeByPrimaryKeyId(vo.getParentPrimaryKeyId());
@@ -1474,6 +1482,8 @@ public class InformationWriteQueryController extends BladeController {
                                 .collect(Collectors.toList());
                         String keys = StringUtils.join(filteredList, ",");
 
+                        /*重置*/
+                        Map<String,String> eMap=reviseValue(nodeOld,null,ekvMap);
                         //构造入参
                         String dataSql = "SELECT " + keys + " FROM " + tableName + " WHERE p_key_id= " + nodeOld.getPKeyId() + " LIMIT 1;";
                         List<LinkedHashMap<String, Object>> resultList = jdbcTemplate.query(dataSql, new RowMapper<LinkedHashMap<String, Object>>() {
@@ -1494,7 +1504,7 @@ public class InformationWriteQueryController extends BladeController {
                         if (!resultList.isEmpty()) {
                             LinkedHashMap<String, Object> resultMap = resultList.get(0);
                             for (Map.Entry<String, Object> entry : resultMap.entrySet()) {
-                                Object value = entry.getValue();
+                                Object value =reviseValue(eMap,entry.getKey(),entry.getValue());
                                 if (value != null) {
                                     if (value.toString().contains("\n")) {
                                         //如果值中包含换行符,则将换行符替换
@@ -1775,6 +1785,126 @@ public class InformationWriteQueryController extends BladeController {
         }
         return R.fail("操作失败");
     }
+    static String[] G8_TBN= new String[]{"m_20220922161954_1572863246099021824","m_20220928134702_1574999102784012288"};
+    private boolean checkG8(String tableName){
+        for (String s:G8_TBN){
+            if(s.equals(tableName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+    private Map<String,String> reviseValue(WbsTreeContract wtc,WbsTreeContract parent,Map<String,Map<String,String>> ekvMap){
+        /*复制数据筛查
+        * 1.G8G10过滤  2.右键数据重新生成 3.*/
+        if(wtc!=null){
+            try {
+                String tableName=wtc.getInitTableName();
+                if(parent==null){
+                    parent  = this.wbsTreeContractClient.getContractWbsTreeByContractIdAndId(wtc.getParentId(),Long.parseLong(wtc.getContractId()));
+                }
+                if(checkG8(tableName)&&!ekvMap.containsKey(tableName)){
+                    List<Map<String,Object>> listMaps  =  this.jdbcTemplate.queryForList("select rely from m_formula where number ='TURN_POINT' limit 1");
+                    if(listMaps.size()>0){
+                        String rely = listMaps.get(0).get("rely").toString();
+                        ekvMap.put(tableName,Arrays.stream(rely.split("[,]")).skip(1).map(e->e.split(":")[1]).collect(Collectors.toMap(e->e,e->"null")));
+                    }
+                }else {
+                    FormulaOption formulaOption = this.formulaClient.option(parent.getPKeyId());
+                    if(formulaOption!=null){
+                        JSONObject root = JSON.parseObject(formulaOption.getVal());
+                        JSONObject table = (JSONObject) root.computeIfAbsent(wtc.getInitTableName(), (k) -> new JSONObject());
+                        Map<String,String> map = ekvMap.computeIfAbsent(wtc.getInitTableName(),K->new HashMap<>());
+                        table.forEach((k,v)->{
+                            if(!k.contains("@")){
+                                /*元素级别*/
+                                JSONObject elementJson = (JSONObject) v;
+                                JSONArray rgJson = elementJson.getJSONArray(RangeInfo.RG);
+                                if(rgJson!=null) {
+                                    map.put(k,rgJson.toJSONString());
+                                }
+                            }
+                        });
+                    }
+                }
+                return ekvMap.getOrDefault(tableName,new HashMap<>());
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        }
+        return new HashMap<>();
+    }
+
+
+    private Object reviseValue(Map<String,String> p2 ,String key,Object value){
+        try {
+            if(p2.containsKey(key)){
+                String setting= p2.get(key);
+                if(StringPool.NULL.equals(setting)){
+                    /*擦除原来的内容*/
+                   return setting;
+                }else {
+                    /*重做随机值*/
+                    List<RangeJson> rjs = JSON.parseArray(setting, RangeJson.class);
+                    if (value != null && value.toString().length() > 0 && Func.isNotEmpty(rjs)) {
+                        List<String[]> la = Arrays.stream(value.toString().split("☆")).map(s -> s.split("_\\^_")).collect(Collectors.toList());
+                        /*全部为一个数的时候不用修改*/
+                        if (la.stream().map(a -> a[0]).collect(Collectors.toSet()).size() > 1||la.size()==1) {
+/*                            return la.stream().map(a -> {
+                                String v = a[0];
+                                RangeJson best = rjs.stream().min(Comparator.comparingDouble(j -> Double.parseDouble(v) - Double.parseDouble(j.getDesign()))).orElse(rjs.get(0));
+                                int scale = Math.max(new StringBuilder(v).reverse().indexOf("."), 0);
+                                String sv = BaseUtils.rangeList(1, best.getDesign(), best.getDev(), 1, scale, 1).get(0).toString();
+                                return sv + "_^_" + a[1];
+                            }).collect(Collectors.joining());*/
+                            List<String> result = new ArrayList<>();
+                            for(String[] a:la){
+                                String v = a[0];
+                                RangeJson best = rjs.stream().min(Comparator.comparingDouble(j -> Double.parseDouble(v) - Double.parseDouble(j.getDesign()))).orElse(rjs.get(0));
+                                int scale = Math.max(new StringBuilder(v).reverse().indexOf("."), 0);
+                                String sv = BaseUtils.rangeList(1, best.getDesign(), best.getDev(), 1, scale, 1).get(0).toString();
+                                result.add(sv + "_^_" + a[1]);
+                            }
+                            return String.join("☆",result);
+                        }
+                    }
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return value;
+    }
+    /*元素情况,表字段,表单流水号,数据库表名*/
+    private String reviseCols(Map<String,String> p2 ,String cols ,Long pkeyId,String tableName ){
+        try {
+            if(p2.size()>0) {
+                String dataSql = "SELECT * FROM " + tableName + " WHERE p_key_id= " + pkeyId + " LIMIT 1";
+                List<Map<String, Object>> listMaps = this.jdbcTemplate.queryForList(dataSql);
+                if (listMaps.size() > 0) {
+                    Map<String, Object> origin = listMaps.get(0);
+                    List<String> target = Arrays.stream(cols.split(",")).collect(Collectors.toList());
+                    List<String> colsList = target.stream().filter(k -> k.startsWith("key")).collect(Collectors.toList());
+                    for (String k : colsList) {
+                        if (p2.containsKey(k)) {
+                            Object value = reviseValue(p2, k, origin.get(k));
+                            if (value != null && value.toString().contains("_^_")) {
+                                value = "'" + value + "'";
+                                target.set(target.indexOf(k), value.toString());
+                            }
+                        }
+                    }
+                    cols = String.join(",", target);
+                }
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        return cols;
+    }
+
+
+
 
     /**
      * 重构祖级id
@@ -1876,6 +2006,11 @@ public class InformationWriteQueryController extends BladeController {
                     String pKey = needTab.getNodeName() + "-" + needTab.getHtmlUrl();
                     //获取目标表对象
                     WbsTreeContract toCopyNodeTab = toCopyNodeTabsMaps.get(pKey);
+
+                    /*重置内容step1*/
+                    Map<String,Map<String,String>> ekvMap = new HashMap<>();
+                    /*重置内容step2*/
+                    Map<String,String> eMap=reviseValue(needTab,null,ekvMap);
                     //如果存在,只复制数据
                     if (toCopyNodeTab != null) {
                         Long oldPKeyId = needTab.getPKeyId();
@@ -1897,7 +2032,9 @@ public class InformationWriteQueryController extends BladeController {
                                 //delete SQL (先删除旧数据,再新增)
                                 String delSql = "delete from " + tableName + " where p_key_id = " + toCopyNodeTab.getPKeyId() + " ; ";
                                 //insert into SQL
-                                copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
+                                String testColVal=reviseCols(eMap,colVal,oldPKeyId,tableName);
+                                StaticLog.info("KT3356:"+testColVal);
+                                copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(testColVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
                                 resultTablesData.add(copyDataSql.toString());
                             }
                         }
@@ -1942,7 +2079,9 @@ public class InformationWriteQueryController extends BladeController {
                                     //delete SQL (先删除旧数据,再新增)
                                     String delSql = "delete from " + tableName + " where p_key_id = " + objTab.getPKeyId() + " ; ";
                                     //insert into SQL
-                                    copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
+                                    String testColVal=reviseCols(eMap,colVal,oldPKeyId,tableName);
+                                    StaticLog.info("KT3356:"+testColVal);
+                                    copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(testColVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
                                     resultTablesData.add(copyDataSql.toString());
                                 }
                             }
@@ -1968,7 +2107,8 @@ public class InformationWriteQueryController extends BladeController {
                 var = 1;
             }
         }
-
+        /*重置内容step1*/
+        Map<String,Map<String,String>> ekvMap = new HashMap<>();
         //最下层级节点复制
         if (var == 1) {
             //构造节点
@@ -2025,8 +2165,12 @@ public class InformationWriteQueryController extends BladeController {
                         List<QueryProcessDataVO> nodeTabColOneTab = informationQueryService.getNodeChildTabColsAllByTabName(obj.getInitTableName());
                         //转化为map
                         Map<String, String> nodeTabColsMap = nodeTabColOneTab.stream().collect(Collectors.toMap(QueryProcessDataVO::getQueryType, QueryProcessDataVO::getAncestors, (key1, key2) -> key2));
+
                         //组织复制表的数据的sql
                         if (nodeTabColsMap.size() > 0) {
+                            /*重置内容step2*/
+                            Map<String,String> eMap=reviseValue(needTab,null,ekvMap);
+
                             StringBuilder copyDataSql = new StringBuilder();
                             String tableName = obj.getInitTableName();
                             String col = nodeTabColsMap.get(tableName);
@@ -2035,7 +2179,9 @@ public class InformationWriteQueryController extends BladeController {
                             //delete SQL (先删除旧数据,再新增)
                             String delSql = "delete from " + tableName + " where p_key_id = " + obj.getPKeyId() + " ; ";
                             //insert into SQL
-                            copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
+                            String testColVal=reviseCols(eMap,colVal,oldPKeyId,tableName);
+                            StaticLog.info("KT3356:"+testColVal);
+                            copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(testColVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
                             resultTablesData.add(copyDataSql.toString());
                         }
                     }
@@ -2125,6 +2271,9 @@ public class InformationWriteQueryController extends BladeController {
                                     QueryProcessDataVO queryProcessDataVO = tabColsAllByTabNameMaps.get(tableName);
                                     //组织复制表的数据的sql
                                     if (queryProcessDataVO != null) {
+                                        /*重置内容step2*/
+                                        Map<String,String> eMap=reviseValue(needTab,null,ekvMap);
+
                                         StringBuilder copyDataSql = new StringBuilder();
                                         String col = queryProcessDataVO.getAncestors();
                                         String colVal = queryProcessDataVO.getAncestors();
@@ -2132,7 +2281,9 @@ public class InformationWriteQueryController extends BladeController {
                                         //delete SQL (先删除旧数据,再新增)
                                         String delSql = "delete from " + tableName + " where p_key_id = " + needTab.getPKeyId() + " ; ";
                                         //insert into SQL
-                                        copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
+                                        String testColVal=reviseCols(eMap,colVal,oldPKeyId,tableName);
+                                        StaticLog.info("KT3356:"+testColVal);
+                                        copyDataSql.append(delSql).append("insert into ").append(tableName).append("  (").append(col).append(") select ").append(testColVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
                                         resultTablesData.add(copyDataSql.toString());
                                     }
                                 }

+ 3 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -180,7 +180,9 @@ public class TaskController extends BladeController {
         R<SmsResponse> result = this.newSmsClient.sendMessage("test_code", JsonUtil.toJson(params), phone);
         if (result.getData().isSuccess()) {
             //记录当前验证码
-            DefaultConfig config = this.defaultConfigService.getOne(Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId()));
+            DefaultConfig config = this.defaultConfigService.getOne(
+                    Wrappers.<DefaultConfig>lambdaQuery().eq(DefaultConfig::getCreateUser, AuthUtil.getUserId())
+                                             .isNotNull(DefaultConfig::getSmsCode));
             if (config != null) {
                 //修改
                 config.setSmsCode(code);

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/controller/CorporationInfoController.java

@@ -164,7 +164,7 @@ public class CorporationInfoController extends BladeController {
 
         } else if (file.getOriginalFilename().contains("pdf")) {
             //获取PDF文件
-            BladeFile bladeFile = this.newIOSSClient.updateFile(file.getBytes(), file.getOriginalFilename());
+            BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(file);
             BeanUtils.copyProperties(bladeFile, newBladeFile);
             newBladeFile.setPdfUrl(bladeFile.getLink());
         }

+ 3 - 0
blade-service/blade-control/src/main/java/org/springblade/control/controller/UserpayInfoController.java

@@ -28,6 +28,7 @@ import org.springblade.control.excel.UserpayExcel;
 import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.DateUtil;
@@ -150,11 +151,13 @@ public class UserpayInfoController extends BladeController {
         ZoneId zoneId = ZoneId.systemDefault();
         ZonedDateTime zonedDateTime = date.toInstant().atZone(zoneId);
         LocalDate localDate = zonedDateTime.toLocalDate();
+        String tenantId = AuthUtil.getTenantId();
         if(list!=null && list.size()>=1){
             List<UserpayInfo> vos = list.stream().map(f -> {
                 UserpayInfo tag = new UserpayInfo();
                 BeanUtil.copy(f,tag);
                 tag.setCostTime(localDate);
+                tag.setTenantId(tenantId);
                 return tag;
             }).collect(Collectors.toList());
             userpayInfoService.saveBatch(vos);

+ 10 - 11
blade-service/blade-control/src/main/java/org/springblade/control/excel/UserpayExcel.java

@@ -41,11 +41,6 @@ public class UserpayExcel{
     @ExcelProperty("姓名")
     private String name;
 
-/*    @ColumnWidth(15)
-    @ExcelProperty("薪酬时间")
-    private String costTime;*/
-
-/*
     @ColumnWidth(15)
     @ExcelProperty(value = "应出勤天数")
     private Integer yaAllDays;
@@ -98,6 +93,10 @@ public class UserpayExcel{
     @ExcelProperty(value = "考勤扣款")
     private BigDecimal attendDuction;
 
+    @ColumnWidth(15)
+    @ExcelProperty(value = "事假扣款")
+    private BigDecimal absDuction;
+
     @ColumnWidth(15)
     @ExcelProperty(value = "其他扣款")
     private BigDecimal otherDuction;
@@ -106,20 +105,20 @@ public class UserpayExcel{
     @ExcelProperty(value = "应发工资")
     private BigDecimal grossPay;
 
-    @ColumnWidth(15)
-    @ExcelProperty(value = "代缴个税")
-    private BigDecimal personalTax;
-
     @ColumnWidth(15)
     @ExcelProperty(value = "代缴社保")
     private BigDecimal socialSec;
 
+    @ColumnWidth(15)
+    @ExcelProperty(value = "代缴个税")
+    private BigDecimal personalTax;
+
     @ColumnWidth(15)
     @ExcelProperty(value = "实发工资")
     private BigDecimal netSalary;
 
     @ColumnWidth(15)
-    @ExcelProperty(value = "描述")
-    private String desc;*/
+    @ExcelProperty(value = "备注")
+    private String remark;
 
 }

+ 1 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectCostBudgetMapper.xml

@@ -57,6 +57,7 @@
                 (select IFNULL(SUM(budget_count_money),0) FROM c_project_cost_budget WHERE project_id = #{projectId} and cost_type = 4) as maintainCostTotal,
                 (select IFNULL(SUM(budget_count_money),0) FROM c_project_cost_budget WHERE project_id = #{projectId} and cost_type = 5) as manageCostTotal,
                 (select IFNULL(SUM(budget_count_money),0) FROM c_project_cost_budget WHERE project_id = #{projectId} and cost_type = 6) as outsourceCostTotal,
+                (select IFNULL(SUM(budget_count_money),0) FROM c_project_cost_budget WHERE project_id = #{projectId} and cost_type = 7) as taxMoney,
                 (select IFNULL(SUM(budget_count_money),0) FROM c_project_cost_budget WHERE project_id = #{projectId}) as projectCostTotal
     </select>
     <select id="page" resultType="org.springblade.control.vo.ControlProjectInfoVO">

+ 1 - 0
blade-service/blade-control/src/main/java/org/springblade/control/mapper/ProjectInfoMapper.xml

@@ -9,6 +9,7 @@
         (select dict_name  from c_dict_info WHERE code = 'project_type' AND dict_value = pi.project_type) as projectTypeValue,
         (select dict_name  from c_dict_info WHERE code = 'project_class' AND dict_value = pi.project_class) as projectClassValue,
         (select dict_name  from c_dict_info WHERE code = 'project_server_type' AND dict_value = pi.project_server_type) as projectServerTypeValue,
+        (select dict_name  from c_dict_info WHERE code = 'project_company' AND dict_value = pi.project_company) as projectCompanyName,
         (select contract_money from c_control_contract_info WHERE project_id = pi.id)as contractMoney,
         (select name from blade_user WHERE id = pi.project_principal) as projectPrincipalName,
         (select name from blade_user WHERE id = pi.implement_principal) as implementPrincipalName

+ 2 - 1
blade-service/blade-control/src/main/java/org/springblade/control/mapper/UserpayInfoMapper.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.control.mapper;
 
+import org.apache.ibatis.annotations.Param;
 import org.springblade.control.entity.UserpayInfo;
 import org.springblade.control.vo.UserpayInfoVO;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -38,7 +39,7 @@ public interface UserpayInfoMapper extends BaseMapper<UserpayInfo> {
      * @param userpayInfo
      * @return
      */
-    List<UserpayInfoVO> selectUserpayInfoPage(IPage page, UserpayInfoVO userpayInfo);
+    List<UserpayInfoVO> selectUserpayInfoPage(IPage page,@Param("vo") UserpayInfoVO userpayInfo);
 
     boolean delUserPayInoByDate(String date);
 

+ 11 - 6
blade-service/blade-control/src/main/java/org/springblade/control/mapper/UserpayInfoMapper.xml

@@ -26,7 +26,7 @@
         <result column="personal_tax" property="personalTax"/>
         <result column="social_sec" property="socialSec"/>
         <result column="net_salary" property="netSalary"/>
-        <result column="desc" property="desc"/>
+        <result column="remark" property="remark"/>
         <result column="name" property="name"/>
     </resultMap>
 
@@ -34,10 +34,10 @@
         <result column="id" property="id"/>
         <result column="user_id" property="userId"/>
         <result column="cost_time" property="costTime"/>
-        <result column="y_all_days" property="yaAllDays"/>
-        <result column="s_all_days" property="saAllDays"/>
+        <result column="ya_all_days" property="yaAllDays"/>
+        <result column="sa_all_days" property="saAllDays"/>
         <result column="year_days" property="yearDays"/>
-        <result column="c_leave_days" property="caLeaveDays"/>
+        <result column="ca_leave_days" property="caLeaveDays"/>
         <result column="sick_leave_days" property="sickLeaveDays"/>
         <result column="absence_days" property="absenceDays"/>
         <result column="basic_salary" property="basicSalary"/>
@@ -53,16 +53,21 @@
         <result column="personal_tax" property="personalTax"/>
         <result column="social_sec" property="socialSec"/>
         <result column="net_salary" property="netSalary"/>
-        <result column="desc" property="desc"/>
+        <result column="remark" property="remark"/>
         <result column="name" property="name"/>
     </resultMap>
 
 
     <select id="selectUserpayInfoPage" resultMap="userpayInfoResultVOMap">
         select *
-             /*,(SELECT name from blade_user b where a.user_id = b.id) as name */
         from c_user_pay_info a
         where a.is_deleted = 0
+        <if test="vo.name != null and vo.name != ''">
+            and a.name = #{vo.name}
+        </if>
+        <if test="vo.month != null and vo.month != ''">
+            and DATE_FORMAT(a.cost_time ,'%Y-%m') = #{vo.month}
+        </if>
     </select>
 
 

+ 1 - 1
blade-service/blade-control/src/main/java/org/springblade/control/service/impl/ProjectCostBudgetServiceImpl.java

@@ -484,7 +484,7 @@ public class ProjectCostBudgetServiceImpl extends BaseServiceImpl<ProjectCostBud
             if (vo2ChildrenList != null && vo2ChildrenList.size() > 0){
                 //选出正在进行中的子计划id
                 List<Long> ids = vo2ChildrenList.stream().filter(l -> l.getStatus() != null && l.getStatus() != 1).map(ProjectCostBudgetVO2::getId).collect(Collectors.toList());
-                //清空除进行中之外的子计划的 员工任务信息表
+                //清空除进行中之外的子计划的成本测算 员工任务信息表
                 employeeTaskInfoService.deleteByBudgetParentId(ids,vo2.getId());
                 BigDecimal allTotal = new BigDecimal(0);
                 Boolean isTaskType = false;

+ 59 - 1
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -46,9 +46,11 @@ import java.io.*;
 
 import java.util.*;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 import java.util.stream.Stream;
 
 import static java.util.regex.Pattern.*;
@@ -213,7 +215,7 @@ public class FormulaUtils {
                 fd.getValues().get(0).setValue(data);
             }
         }
-
+     //   fd.setUpdate(1);
     }
     public static  List<TableInfo> getTableInfoList(JSONArray dataArray) {
         if (dataArray != null && !dataArray.isEmpty()) {
@@ -649,6 +651,52 @@ public class FormulaUtils {
            return coords;
      }
 
+    public static String coordsSorted2(String coords){
+        if(StringUtils.isNotEmpty(coords)){
+            List<String> dataList=Arrays.asList(coords.split(";"));
+            if(dataList.size()>2){
+               /*判断分区:根据行列长度*/
+                List<Integer> row =dataList.stream().map(e->e.split("_")[0]).distinct().map(Integer::parseInt).collect(Collectors.toList());
+                List<Integer> column=dataList.stream().map(e->e.split("_")[1]).distinct().map(Integer::parseInt).collect(Collectors.toList());
+                if(row.size()>=column.size()){
+                    /*纵向*/
+                    if(column.size()>1){
+                        List<List<Integer>> consecutiveGroups = IntStream.range(0, column.size())
+                                .boxed()
+                                .collect(Collectors.collectingAndThen(
+                                        Collectors.groupingBy(
+                                                i -> i - column.get(i),
+                                                LinkedHashMap::new,
+                                                Collectors.mapping(column::get, Collectors.toList())
+                                        ),
+                                        map -> new ArrayList<>(map.values())
+                                ));
+                    }
+                }
+              /* 确定区内方向:*/
+            }
+        }
+        return coords;
+    }
+
+/*    public static void main(String[] args) {
+        List<Integer> column = Arrays.asList(1, 2, 3, 5, 6, 7, 9, 11, 17);
+        List<List<Integer>> consecutiveGroups = IntStream.range(0, column.size())
+                .boxed()
+                .collect(Collectors.collectingAndThen(
+                        Collectors.groupingBy(
+                                i -> i - column.get(i),
+                                LinkedHashMap::new,
+                                Collectors.mapping(column::get, Collectors.toList())
+                        ),
+                        map -> new ArrayList<>(map.values())
+                ));
+        AtomicInteger i = new AtomicInteger(column.get(0));
+
+        List<List<Integer>> consecutiveGroups2= new ArrayList<>(column.stream().collect(Collectors.groupingBy(e -> e - i.getAndSet(e) > 1, LinkedHashMap::new, Collectors.toList())).values());
+        System.out.println();
+    }*/
+
     public static List<Object> slice(List<LocalVariable>  local, String formula){
         int min =0;
         List<Object> result = new ArrayList<>();
@@ -801,7 +849,17 @@ public class FormulaUtils {
 
     }
 
+/*    public static void main(String[] args) {
+        JSONObject job = new JSONObject();
+        JSONObject job2 = new JSONObject();
+        job2.put("K","K");
+        job.fluentPut("A",1).fluentPut("B",2).fluentPut("C","bird").fluentPut("job",job2);
+        job.forEach((k,v)->{
+           // System.out.println(k);
+            System.out.println(v);
+        });
 
+    }*/
 
 
 }

+ 1 - 1
blade-service/blade-manager/src/main/java/com/mixsmart/utils/StringUtils.java

@@ -1323,7 +1323,7 @@ public class StringUtils {
             /*0.3999999999999986 检测到超长小数位先转double处理,再还原回String*/
             String tg=e.toString();
             if(tg.length()-tg.indexOf(StringPool.DOT)>6||tg.contains("e")){
-                return BigDecimal.valueOf(Double.parseDouble(tg)).setScale(4, RoundingMode.HALF_UP).toString();
+                return BigDecimal.valueOf(Double.parseDouble(tg)).setScale(2, RoundingMode.HALF_UP).toString();
             }else {
                 return e.toString();
             }

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

@@ -613,8 +613,7 @@ public class ExcelTabController extends BladeController {
             @ApiImplicitParam(name = "pkeyId", value = "pkeyId", required = true)
     })
     public R getExcelHtmlByBuss(Long pkeyId) throws Exception {
-        String file_path = ParamCache.getValue(CommonConstant.SYS_LOCAL_URL);
-        String sys_file_net_url = ParamCache.getValue(CommonConstant.SYS_FILE_NET_URL);
+
         WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
         if (wbsTreeContract == null) {
@@ -3147,4 +3146,27 @@ public class ExcelTabController extends BladeController {
         return R.data("成功");
     }
 
+    @GetMapping("/rm-tabdata-info")
+    @ApiOperationSupport(order = 38)
+    @ApiOperation(value = "清楚表单数据信息", notes = "清楚表单数据信息")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pkeyId", value = "pkeyId", required = true)
+    })
+    public R rmTabDataInfo(Long pkeyId) {
+        WbsTreeContract wbsInfo = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                .eq(WbsTreeContract::getPKeyId, pkeyId));
+
+        if(wbsInfo!=null){
+            String tabName = wbsInfo.getInitTableName();
+            if(StringUtils.isNotEmpty(tabName)){
+                String delSql = "delete from "+tabName+" where p_key_id = " + pkeyId;
+                jdbcTemplate.execute(delSql);
+            }else{
+                return   R.fail("获取InitTableName失败!");
+            }
+        }else{
+            return   R.fail("获取数据失败!");
+        }
+        return R.data("成功!");
+    }
 }

+ 10 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -57,7 +57,6 @@ import java.util.stream.Stream;
 @Api(value = "公式脚本", tags = "公式脚本")
 public class FormulaController {
     private final FormulaServiceImpl service;
-    private final IExcelTabService tabService;
     private final IWbsTreeService wbsTreeService;
     private final IWbsTreePrivateService wbsTreePrivateService;
     private final IElementFormulaMappingService elementFormulaMappingService;
@@ -321,6 +320,7 @@ public class FormulaController {
             String[] dw2 = keymap.get(info.getKey()).split(StringPool.SEMICOLON);
             // 排序
             String dw[] = new String[dw2.length];
+            int start=0;
             List<String> list = Arrays.asList(dw2);
             // 横向排序
             int yindex;
@@ -332,7 +332,11 @@ public class FormulaController {
                 xindex = 1;
                 yindex = 0;
             }
-            Map<Integer, List<String>> collect = list.stream().filter(s -> s.indexOf("_")>=0).collect(Collectors.groupingBy(s -> Integer.parseInt(s.split("_")[yindex])));
+            Map<Integer, List<String>> resu = list.stream().filter(s -> s.indexOf("_")>=0).collect(Collectors.groupingBy(s -> Integer.parseInt(s.split("_")[yindex])));
+
+            Map<Integer, List<String>> collect = new LinkedHashMap<>();
+            resu.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEachOrdered(x -> collect.put(x.getKey(), x.getValue()));
+
             int j=0;
             for(Integer key: collect.keySet()){
                 List<String> datakey = collect.get(key);
@@ -347,7 +351,7 @@ public class FormulaController {
             if (dw.length == 1) {
                 result.put(info.getKey() + "__" + dw[0], data.stream().filter(StringUtils::isNotEmpty).map(Func::toStr).collect(Collectors.joining("、")));
             } else {
-                int start = new ArrayList<>(Arrays.asList(dw)).indexOf(bak);
+                start= new ArrayList<>(Arrays.asList(dw)).indexOf(bak);
                 for (int i = start; i < dw.length; i++) {
                     if (data.size() > i - start) {
                         result.put(info.getKey() + "__" + dw[i], data.get(i - start));
@@ -361,8 +365,7 @@ public class FormulaController {
                     this.wbsTreeContractService.addTabInfoByRan(info, moreData, dw);
                 }
             }
-            /*保存实测值参数*/
-            TextdictInfo ti = this.textdictInfoService.getOne(Wrappers.<TextdictInfo>lambdaQuery().eq(TextdictInfo::getType, 8).eq(TextdictInfo::getTabId, info.getPkId()).eq(TextdictInfo::getColKey, info.getKey()));
+/*            TextdictInfo ti = this.textdictInfoService.getOne(Wrappers.<TextdictInfo>lambdaQuery().eq(TextdictInfo::getType, 8).eq(TextdictInfo::getTabId, info.getPkId()).eq(TextdictInfo::getColKey, info.getKey()));
             if (ti == null) {
                 ti = new TextdictInfo();
             }
@@ -371,7 +374,8 @@ public class FormulaController {
             ti.setName("公式参数");
             ti.setColKey(info.getKey());
             ti.setColName(JSON.toJSONString(info));
-            this.textdictInfoService.saveOrUpdate(ti);
+            this.textdictInfoService.saveOrUpdate(ti);*/
+            this.formulaOptionService.saveOrUpdateOption(info,dw , start);
             return R.data(result);
         }
         return R.fail("无数据");

+ 9 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/FormulaClientImpl.java

@@ -7,14 +7,17 @@ import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.entity.Formula;
+import org.springblade.manager.entity.FormulaOption;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.service.IExcelTabService;
+import org.springblade.manager.service.IFormulaOptionService;
 import org.springblade.manager.service.IFormulaService;
 import org.springblade.manager.service.IWbsTreeContractService;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.validation.constraints.NotNull;
 import java.io.FileNotFoundException;
 import java.util.Map;
 
@@ -28,7 +31,7 @@ import java.util.Map;
 public class FormulaClientImpl implements FormulaClient {
     private final IFormulaService service;
     private final JdbcTemplate jdbcTemplate;
-    private final IExcelTabService excelTabService;
+    private final IFormulaOptionService formulaOptionService;
     private final IWbsTreeContractService  wbsTreeContractService;
 
     @Override
@@ -56,5 +59,10 @@ public class FormulaClientImpl implements FormulaClient {
         return sb.toString();
     }
 
+    @Override
+    public FormulaOption option(  Long pkeyId) {
+       return this.formulaOptionService.getById(pkeyId);
+    }
+
 
 }

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

@@ -74,4 +74,5 @@ public interface ExcelTabMapper extends BaseMapper<ExcelTab> {
     @Select("select self_id from u_trial_self_quality_project where quality_node_id = #{nodeId}")
     List<String> queryTrialRecordId(String nodeId);
 
+    ExcelTab getWaterByTableId(@Param("id") Long excelId);
 }

+ 15 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml

@@ -47,16 +47,7 @@
         <result column="type" property="type"/>
     </resultMap>
 
-    <select id="selectExcelTabPage" resultMap="excelTabResultMap">
-        select x.id,x.create_time,x.name,
-        (SELECT count(1) from m_excel_tab a where FIND_IN_SET(x.id,a.alias) and a.is_deleted = 0 and a.file_type=3) as
-        tab_cout
-        from m_excel_tab x where is_deleted = 0 and parent_id =#{param2.parentId}
-        <if test="excelTab.name!=null and excelTab.name!=''">
-            AND x.name like concat(concat('%', #{excelTab.name}),'%')
-        </if>
 
-    </select>
 
     <select id="tabLazyTree" resultMap="treeNodeResultMap">
         SELECT
@@ -198,6 +189,21 @@
         </if>
         ORDER BY dept.create_time
     </select>
+    <select id="selectExcelTabPage" resultType="org.springblade.manager.vo.ExcelTabVO">
+        select x.id,x.create_time,x.name,x.table_template_type,
+        (SELECT bdb.dict_value from blade_dict_biz bdb WHERE code = 'table_template_type' AND dict_key = x.table_template_type) as tableTemplateTypeName,
+        (SELECT count(1) from m_excel_tab a where FIND_IN_SET(x.id,a.alias) and a.is_deleted = 0 and a.file_type=3) as
+        tab_cout
+        from m_excel_tab x where is_deleted = 0 and parent_id =#{param2.parentId}
+        <if test="excelTab.name!=null and excelTab.name!=''">
+            AND x.name like concat(concat('%', #{excelTab.name}),'%')
+        </if>
+    </select>
+    <select id="getWaterByTableId" resultType="org.springblade.manager.entity.ExcelTab">
+        select * from m_excel_tab met WHERE met.parent_id = 0 AND met.table_template_type = 2 AND met.is_deleted = 0
+                                        AND met.id =
+                                            (SELECT SUBSTRING_INDEX(alias,',',1)  from m_excel_tab WHERE  id = #{id})
+    </select>
 
     <delete id="removeBussTabInfoById">
         delete from m_wbs_tree_contract where p_key_id = #{pkeyid}

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

@@ -2,6 +2,7 @@ package org.springblade.manager.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.manager.dto.FormulaOptionVo;
+import org.springblade.manager.dto.RangeInfo;
 import org.springblade.manager.entity.FormulaOption;
 
 /**
@@ -11,5 +12,6 @@ public interface IFormulaOptionService extends IService<FormulaOption> {
     String queryOption(Long contractId, Long parentId, Long pkeyId, String key);
 
     Object saveOrUpdateOption(FormulaOptionVo fo);
+    Object saveOrUpdateOption(RangeInfo rg ,String[] dw,int start);
 
 }

+ 20 - 21
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -270,8 +270,10 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                         .fluentRemove("businessId")
                         .fluentRemove("sourceUrl")
                         .fluentRemove("pdfUrl")
-                        .fluentRemove("firstFileName")
-                        .fluentRemove("");
+                        .fluentRemove("firstFileName");
+                // 移除空的数据
+                dataInfo2.entrySet().removeIf(entry -> StringUtils.isEmpty(entry.getValue()+"") || (entry.getValue()+"").equals("null"));
+
                 // 计算数据
                 LinkedHashMap<String, List<String>> dataMap = dataInfo2.keySet().stream().filter(e -> e.contains("__")).collect(Collectors.groupingBy(e -> e.split("__")[0], LinkedHashMap<String, List<String>>::new, Collectors.toList()));
                 LinkedHashMap<String, String> dataMap2 = new LinkedHashMap<>();
@@ -1343,8 +1345,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         int mergedCellCnt = sheet.getNumMergedRegions();
         for (int i = 0; i < mergedCellCnt - 1; i++) {
             CellRangeAddress mergedCell = sheet.getMergedRegion(i);
-            int xx = mergedCell.getNumberOfCells();
-            if (xx == all) {
+            int xx = mergedCell.getNumberOfCells()+1;
+            if (xx <= all) {
                 int fisRow = mergedCell.getFirstRow();
                 int firsrCol = mergedCell.getFirstColumn();
 
@@ -1388,14 +1390,13 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             Element table = doc.select("table").first();
             Elements trs = table.select("tr");
             Elements cols = table.select("col");
-
+            if(pkeyId==1644218999703076895L){
+                System.out.println("");
+            }
             if (ObjectUtil.isNotEmpty(DataInfo)) {
                 for (String val : DataInfo.keySet()) {
                     Elements datas = doc.getElementsByAttributeValue("keyname", val);
                     Element data = null;
-                    if(val.equals("key_12__25_0")){
-                        System.out.println("1231");
-                    }
                     if (datas.size() >= 1) {
                         data = datas.get(0);
                     }
@@ -1490,12 +1491,15 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                                             if(StringUtils.isNotEmpty(dataJson)){
                                                 JSONArray jsonArray = JSONArray.parseArray(dataJson);
                                                 List<Integer> idList = Func.toIntList(myData);
-                                                String dataInfo = jsonArray.getJSONObject(idList.get(0)-1).getString("name");
-                                                for(int inx=1 ; inx<idList.size() ; inx++){
-                                                   int valIndex = idList.get(inx)-1;
-                                                    dataInfo = dataInfo+","+jsonArray.getJSONObject(valIndex).getString("name");
+
+                                                if(idList!=null && idList.size()>=0 && idList.get(0)>=1){
+                                                    String dataInfo = jsonArray.getJSONObject(idList.get(0)-1).getString("name");
+                                                    for(int inx=1 ; inx<idList.size() ; inx++){
+                                                        int valIndex = idList.get(inx)-1;
+                                                        dataInfo = dataInfo+","+jsonArray.getJSONObject(valIndex).getString("name");
+                                                    }
+                                                    cell.setCellValue(dataInfo);
                                                 }
-                                                cell.setCellValue(dataInfo);
                                             }
                                         }
                                     }
@@ -1513,9 +1517,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     }
                 }
             }
-            if(pkeyId == 1688448159421825025L){
-                System.out.println("12321");
-            }
             // 组装电签设置
             QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
             queryWrapper.in("type", 2, 6);
@@ -1580,11 +1581,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
 
         //设置转换后的PDF页面高宽适应工作表的内容大小
         workbook2.getConverterSetting().setSheetFitToPage(true);
-        workbook2.getConverterSetting().setSheetFitToWidth(true);
         workbook2.saveToFile(pdfPath, FileFormat.PDF);
-      //  FileUtils.setExcelScaleToPdf(excelPath, pdfPath);
 
-/*        BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
+        BladeFile bladeFile = newIOSSClient.uploadFile(pkeyId + ".pdf", pdfPath);
 
         //附件
         TableFile tableFile1 = tableFileService.getBaseMapper().selectList(Wrappers.<TableFile>query().lambda().eq(TableFile::getTabId, pkeyId + "").eq(TableFile::getType, 1)).stream().findAny().orElse(null);
@@ -1630,8 +1629,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         if (exceInp != null) {
             IoUtil.closeQuietly(exceInp);
         }
-         return R.data(bladeFile2.getLink());*/
-        return R.data("");
+        return R.data(bladeFile2.getLink());
+
     }
 
     @Override

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

@@ -1,19 +1,32 @@
 package org.springblade.manager.service.impl;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.StringUtils;
 import lombok.RequiredArgsConstructor;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.dto.FormulaOptionVo;
+import org.springblade.manager.dto.RangeInfo;
+import org.springblade.manager.dto.RangeJson;
 import org.springblade.manager.entity.FormulaOption;
 import org.springblade.manager.entity.WbsTreeContract;
 import org.springblade.manager.mapper.FormulaOptionMapper;
 import org.springblade.manager.service.IFormulaOptionService;
 import org.springblade.manager.service.IWbsTreeContractService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 
 /**
  * @author yangyj
@@ -24,9 +37,17 @@ import org.springframework.stereotype.Service;
 @RequiredArgsConstructor
 public class FormulaOptionServiceImpl extends ServiceImpl<FormulaOptionMapper, FormulaOption> implements IFormulaOptionService {
     private final IWbsTreeContractService wbsTreeContractService;
+    private final JdbcTemplate jdbcTemplate;
 
     @Override
     public String queryOption(Long contractId, Long parentId, Long pkeyId, String key) {
+        /*每一道工序为一条记录,每条记录包含N个表,每个表下的参数根据表单的流水号、和元素e_key 用@拼接组合成不同意思
+        * 举例1674671863210442772@key_30__12_0表示一个单元格、key_17表示整个元素
+        * 单元格有独立参数,元素又有独立元素 类似于POI 封装Sheet对象的单元格和行
+        *  1)"TF":"1" 表示布尔值为真 "TF":"0"为假
+        *  2)右键随机值融入说明:参数名RG 每个元素可以进行若干次右键,每次右键只要范围不跟已知的冲突就会保留,但这并不一定和表单最后保存的内容100%一样
+        * 如果要计算合格率或者模仿数据需要结合实际内容
+        * */
         if (StringUtils.isNotEmpty(contractId, parentId, pkeyId, key)) {
             WbsTreeContract wbc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, pkeyId));
             FormulaOption fo = this.getOne(Wrappers.<FormulaOption>lambdaQuery().eq(FormulaOption::getParentId, parentId).eq(FormulaOption::getContractId, contractId));
@@ -64,10 +85,12 @@ public class FormulaOptionServiceImpl extends ServiceImpl<FormulaOptionMapper, F
     public Object saveOrUpdateOption(FormulaOptionVo fo) {
         if (fo.saveChecked()) {
             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()));
+            WbsTreeContract parent= this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId, fo.getParentId()).eq(WbsTreeContract::getContractId, fo.getContractId()));
+            FormulaOption formulaOption = this.getById(parent.getPKeyId());
             JSONObject root;
             if (formulaOption == null) {
                 formulaOption = fo.toFo();
+                formulaOption.setId(parent.getPKeyId());
                 root = new JSONObject();
             } else {
                 root = JSON.parseObject(formulaOption.getVal());
@@ -81,4 +104,62 @@ public class FormulaOptionServiceImpl extends ServiceImpl<FormulaOptionMapper, F
         }
         return null;
     }
+
+    @Override
+    public Object saveOrUpdateOption(RangeInfo rg,String[] dw,int start ) {
+        try {
+
+            RangeJson rj = new RangeJson(rg);
+            rj.setStart(start);
+            WbsTreeContract wbc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, rg.getPkId()));
+            WbsTreeContract parent = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getId, wbc.getParentId()).eq(WbsTreeContract::getContractId, wbc.getContractId()));
+            FormulaOption formulaOption = this.getById(parent.getPKeyId());
+            JSONObject root;
+            if (formulaOption == null) {
+                formulaOption = new FormulaOption();
+                formulaOption.setId(parent.getPKeyId());
+                formulaOption.setParentId(wbc.getParentId());
+                formulaOption.setContractId(Func.toLong(wbc.getContractId()));
+                root = new JSONObject();
+            } else {
+                root = JSON.parseObject(formulaOption.getVal());
+            }
+            JSONObject table = (JSONObject) root.computeIfAbsent(wbc.getInitTableName(), (k) -> new JSONObject());
+            JSONObject data = (JSONObject) table.computeIfAbsent(rg.getKey(), (k) -> new JSONObject());
+            /*每个元素可以包含多个右键随机参数,只要范围不重叠都可以,具有重要参考意义但实际计算合格率和模仿数据的时候必须同时依赖实际元素数据*/
+            /**/
+            List<Map<String, Object>> listMaps = this.jdbcTemplate.queryForList("select p_key_id pkeyId from m_wbs_tree_contract where parent_id=" + wbc.getParentId() + " and contract_id =" + wbc.getContractId() + " and is_deleted=0  and init_table_name='" + wbc.getInitTableName() + "' ORDER BY sort");
+            if (listMaps.size() > 0) {
+                List<Long> ids = listMaps.stream().map(m -> Long.parseLong(m.get("pkeyId").toString())).collect(Collectors.toList());
+                JSONArray rangeArr = (JSONArray) data.computeIfAbsent(RangeInfo.RG, (k) -> new JSONArray());
+                if (ids.contains(rj.getPkeyId())) {
+                    List<RangeJson> rjs = JSON.parseArray(rangeArr.toJSONString(), RangeJson.class);
+                    int head = (ids.indexOf(rj.getPkeyId())) * dw.length + start;
+                    int tail = head + Integer.parseInt(rj.getSize());
+                    rjs.removeIf(e -> rangeCompare(ids, dw.length, e, head, tail));
+                    rjs.add(rj);
+                    rjs.sort(Comparator.comparingInt(e -> ids.indexOf(e.getPkeyId())));
+                    rangeArr = JSONArray.parseArray(JSON.toJSONString(rjs));
+                } else {
+                    rangeArr.add(rj);
+                }
+                data.put(RangeInfo.RG, rangeArr);
+            }
+            formulaOption.setVal(root.toJSONString());
+            this.saveOrUpdate(formulaOption);
+            return data;
+        }catch (Exception e){
+            e.printStackTrace();
+            return R.fail("保存失败");
+        }
+    }
+
+    public static Boolean  rangeCompare(List<Long> ids,Integer len,RangeJson rj ,Integer head,Integer tail){
+        /*判断两个range是否有交集*/
+        int h= (ids.indexOf(rj.getPkeyId()))*len+rj.getStart();
+        int t=head+Integer.parseInt(rj.getSize());
+       return  (head<=h&&h<=tail)||(head<=t&&t<=tail);
+    }
+
+
 }

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

@@ -120,8 +120,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         if(ExecuteType.INSPECTION.equals(tec.getExecuteType())) {
             /*依赖加载*/
             checkingMissingList();
-            /*实测值参数*/
-            textInfo();
             /*公式参数*/
             option();
             /*评定表*/
@@ -131,20 +129,21 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
 
     public  void option(){
-            FormulaOption formulaOption = this.formulaOptionService.getOne(Wrappers.<FormulaOption>lambdaQuery().eq(FormulaOption::getParentId, tec.getCurrentNode().getRelateId()).eq(FormulaOption::getContractId, tec.getContractId()));
+            FormulaOption formulaOption = this.formulaOptionService.getById(tec.getCurrentNode().getPkId());
             if (formulaOption != null) {
                 tec.constantMap.put(FMOT, JSON.parseObject(formulaOption.getVal(), LinkedHashMap.class));
             }
     }
 
-    public void textInfo(){
+/*    public void textInfo(){
             List<Map<String,Object>>  textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId,b.col_name val ,CONCAT(a.init_table_name,':',b.col_key)code from m_wbs_tree_contract a inner join m_textdict_info b on a.p_key_id=b.tab_id   " +
                     "where a.p_key_id in("+this.tec.getTableAll().stream().map(NodeTable::getPKeyId).map(Func::toStr).collect(Collectors.joining(","))+") and b.type=8 ");
             if(Func.isNotEmpty(textInfoMap)){
                 Map<String,List<Map<String,Object>>> tmap = textInfoMap.stream().collect(Collectors.groupingBy(m->m.get("code").toString()));
                 tec.constantMap.put(TEXT_INFO_MAP,tmap);
             }
-    }
+    }*/
+
 
     public void baseData(){
         List<FormData> list =this.tec.getFds();
@@ -578,7 +577,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         tec.formDataList.stream().filter(FormData::executable).filter(e->StringUtils.isEquals("CKI",e.getFormula().getNumber())||StringUtils.isEquals("CKD",e.getFormula().getNumber())).forEach(t->tec.summary.add(t));
         tec.formDataList.removeAll(tec.summary);
         /*监表的处理*/
-        Optional<NodeTable> aop=tec.getTableAll().stream().filter(e->e.getNodeName().contains("A15")).findAny();
+        Optional<NodeTable> aop=tec.getTableAll().stream().filter(e->e.getTableType().equals(4)).findAny();
         if(aop.isPresent()){
             /*存在监表,则需要收集检查项目和检查时间等元素*/
             List<String> wop=tec.getTableAll().stream().filter(e->e.getTableType().equals(1)&&!e.getNodeName().contains("附表")).map(NodeTable::getInitTableName).distinct().collect(Collectors.toList());
@@ -710,7 +709,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                }
           });
            if(dateList.size()>0){
-              List<Map<String,Object>> listMap= this.jdbcTemplate.queryForList(" select DATE(b.record_time) ds,b.weather from m_project_contract_area a join u_weather_info b on a.id=contract_area_id where a.contract_id="+tec.getContractId()+" and DATE(b.record_time) in('"+ String.join(",", dateList) +"')");
+              List<Map<String,Object>> listMap= this.jdbcTemplate.queryForList(" select DATE(b.record_time) ds,b.weather from m_project_contract_area a join u_weather_info b on a.id=contract_area_id where a.contract_id="+tec.getContractId()+" and DATE(b.record_time) in('"+ dateList.stream().distinct().collect(Collectors.joining("','")) +"')");
               Map<String,String> map= new HashMap<>();
                listMap.forEach(m->{
                    map.put(Func.toStr(m.get("ds")),Func.toStr(m.get("weather")));
@@ -1572,17 +1571,19 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                      while (m.find()) {
                          Object data=null;
                          List<String> codeList = FormulaUtils.getCodeList(m.group(2));
-                         @SuppressWarnings("unchecked")
-                         Map<String,List<Map<String,Object>>> textInfoMap= (Map<String, List<Map<String, Object>>>) tec.constantMap.getOrDefault(TEXT_INFO_MAP,new HashMap<>());
-                         List<Map<String,Object>> tableColKeyVal= textInfoMap.get(codeList.get(0));
-                         if(Func.isNotEmpty(tableColKeyVal)){
-                             /*TODO 允许多次右键插入之后,就无法满足计算要求*/
-                             Optional<RangeInfo> op=tableColKeyVal.stream().map(map-> BeanUtil.toBean(JSON.parseObject(map.get("val").toString()),RangeInfo.class)).findFirst();
+//                         Map<String,List<Map<String,Object>>> textInfoMap= (Map<String, List<Map<String, Object>>>) tec.constantMap.getOrDefault(TEXT_INFO_MAP,new HashMap<>());
+//                         List<Map<String,Object>> tableColKeyVal= textInfoMap.get(codeList.get(0));
+                         /*表名+合同段+父节点*/
+                         String findStr="OP['"+fd.getTableName()+"']['"+fd.getKey()+"']['RG']";
+                          String rangeStr=StringUtils.handleNull(Expression.parse(findStr).calculate(tec.constantMap));
+                         System.out.println("随机值参数:"+rangeStr);
+                         if(false){
+                          /*   Optional<RangeInfo> op=tableColKeyVal.stream().map(map-> BeanUtil.toBean(JSON.parseObject(map.get("val").toString()),RangeInfo.class)).findFirst();
                              if(op.isPresent()){
                                  RangeInfo d = op.get();
                                  d.build();
                                  data=  d.getPassList().stream().mapToInt(Func::toInt).sum();
-                             }
+                             }*/
                          }else{
                              FormData dataFd=tec.formDataMap.get(codeList.get(0));
                              String designStr=codeList.get(1);

+ 81 - 27
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/WbsTreePrivateServiceImpl.java

@@ -1332,6 +1332,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
             ProjectInfo projectInfo = projectInfoMapper.selectOne(Wrappers.<ProjectInfo>lambdaQuery().select(ProjectInfo::getReferenceWbsTemplateType, ProjectInfo::getReferenceWbsTemplateTypeTrial).eq(ProjectInfo::getId, wbsTreePrivate.getProjectId()));
             //结果集
             List<WbsTreePrivate> insertDataPrivateList = new ArrayList<>();
+            List<WbsTreeContract> insertDataContractList = new ArrayList<>();
 
             if (("1").equals(wbsTreePrivate.getWbsType())) {
                 if (("public").equals(projectInfo.getReferenceWbsTemplateType())) {
@@ -1341,11 +1342,15 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTree> wbsTreesPublicTables;
                     if (wbsTree.getAncestors().equals("0")) {
                         //根节点
-                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda().eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                                        .select(WbsTree::getId, WbsTree::getParentId)
+                                        .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)
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>query().lambda()
+                                .select(WbsTree::getId, WbsTree::getParentId)
+                                .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
                                 /*.eq(WbsTree::getStatus,1)*/
                                 .like(WbsTree::getAncestors, wbsTree.getId())
                         );
@@ -1353,6 +1358,7 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
 
                     //获取当前项目树下的元素表 节点
                     List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
                                     .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId())
                                     .eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
                             /*.eq(WbsTreePrivate::getStatus, 1)*/
@@ -1376,17 +1382,16 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //构造
-                    for (WbsTree tree : addPublicTables) {
+                    List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList())));
+                    for (WbsTree tree : resultDataList) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
                         if (dataPrivate != null) {
-                            Long idPrivate = SnowFlakeUtil.getId();
-                            dataPrivate.setPKeyId(idPrivate);
+                            dataPrivate.setPKeyId(SnowFlakeUtil.getId());
                             dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
                             dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
                             dataPrivate.setFullName(dataPrivate.getNodeName());
                             dataPrivate.setInitTableId(tree.getInitTableId().toString());
-                            //新增
-                            insertDataPrivateList.add(dataPrivate);
+                            insertDataPrivateList.add(dataPrivate);//新增
                         }
                     }
 
@@ -1400,18 +1405,23 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTreePrivate> wbsTreePrivateRootTables;
                     if (wbsTreePrivate.getAncestors().equals("0")) {
                         //根节点
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                        .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
+                                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
                                 /*.eq(WbsTreePrivate::getStatus, 1)*/
                         );
                     } else {
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
-                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
+                                .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>lambdaQuery().eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
+                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
                             /*.eq(WbsTreePrivate::getStatus, 1)*/
                     );
 
@@ -1433,7 +1443,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //构造
-                    for (WbsTreePrivate tree : addPrivateTables) {
+                    List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList())));
+                    for (WbsTreePrivate tree : resultDataList) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
                         if (dataPrivate != null) {
                             dataPrivate.setPKeyId(SnowFlakeUtil.getId());
@@ -1454,18 +1465,24 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTree> wbsTreesPublicTables;
                     if (wbsTree.getAncestors().equals("0")) {
                         //根节点
-                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
+                        wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery()
+                                        .select(WbsTree::getId, WbsTree::getParentId)
+                                        .eq(WbsTree::getWbsId, wbsTree.getWbsId()).eq(WbsTree::getType, 2)
                                 /*.eq(WbsTree::getStatus, 1)*/
                         );
                     } else {
                         wbsTreesPublicTables = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().eq(WbsTree::getWbsId, wbsTree.getWbsId())
+                                .select(WbsTree::getId, WbsTree::getParentId)
                                 .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())
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>query().lambda()
+                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
+                                    .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());
@@ -1487,17 +1504,16 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //构造
-                    for (WbsTree tree : addPublicTables) {
+                    List<WbsTree> resultDataList = wbsTreeMapper.selectList(Wrappers.<WbsTree>lambdaQuery().in(WbsTree::getId, addPublicTables.stream().map(WbsTree::getId).collect(Collectors.toList())));
+                    for (WbsTree tree : resultDataList) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
                         if (dataPrivate != null) {
-                            Long idPrivate = SnowFlakeUtil.getId();
-                            dataPrivate.setPKeyId(idPrivate);
+                            dataPrivate.setPKeyId(SnowFlakeUtil.getId());
                             dataPrivate.setWbsType(wbsTreePrivate.getWbsType());
                             dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
                             dataPrivate.setFullName(dataPrivate.getNodeName());
                             dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId().toString() : null);
-                            //新增
-                            insertDataPrivateList.add(dataPrivate);
+                            insertDataPrivateList.add(dataPrivate);//新增
                         }
                     }
 
@@ -1509,19 +1525,23 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                     List<WbsTreePrivate> wbsTreePrivateRootTables;
                     if (wbsTreePrivate.getAncestors().equals("0")) {
                         //根节点
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
-                                        .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                        .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
+                                        .eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
                                 /*.eq(WbsTreePrivate::getStatus, 1)*/
                         );
                     } else {
-                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().eq(WbsTreePrivate::getProjectId, wbsTreePrivateRoot.getProjectId())
-                                .eq(WbsTreePrivate::getWbsId, wbsTreePrivateRoot.getWbsId()).eq(WbsTreePrivate::getType, 2)
+                        wbsTreePrivateRootTables = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                .select(WbsTreePrivate::getId, WbsTreePrivate::getParentId, WbsTreePrivate::getPKeyId)
+                                .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>lambdaQuery().eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
+                    List<WbsTreePrivate> wbsTreePrivatesProjectAll = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery()
+                                    .select(WbsTreePrivate::getType, WbsTreePrivate::getId, WbsTreePrivate::getAncestors)
+                                    .eq(WbsTreePrivate::getProjectId, wbsTreePrivate.getProjectId()).eq(WbsTreePrivate::getWbsId, wbsTreePrivate.getWbsId())
                             /*.eq(WbsTreePrivate::getStatus, 1)*/
                     );
 
@@ -1543,7 +1563,8 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             wbsTreePrivatesProjectNodes.stream().map(WbsTreePrivate::getId).collect(Collectors.toList()).contains(node.getParentId())).collect(Collectors.toList());
 
                     //构造
-                    for (WbsTreePrivate tree : addPrivateTables) {
+                    List<WbsTreePrivate> resultDataList = baseMapper.selectList(Wrappers.<WbsTreePrivate>lambdaQuery().in(WbsTreePrivate::getPKeyId, addPrivateTables.stream().map(WbsTreePrivate::getPKeyId).collect(Collectors.toList())));
+                    for (WbsTreePrivate tree : resultDataList) {
                         WbsTreePrivate dataPrivate = BeanUtil.copyProperties(tree, WbsTreePrivate.class);
                         if (dataPrivate != null) {
                             dataPrivate.setPKeyId(SnowFlakeUtil.getId());
@@ -1551,20 +1572,53 @@ public class WbsTreePrivateServiceImpl extends BaseServiceImpl<WbsTreePrivateMap
                             dataPrivate.setWbsType(tree.getWbsType());
                             dataPrivate.setProjectId(wbsTreePrivate.getProjectId());
                             dataPrivate.setInitTableId(ObjectUtils.isNotEmpty(tree.getInitTableId()) ? tree.getInitTableId() : null);
-
                             insertDataPrivateList.add(dataPrivate);
                         }
                     }
                 }
             }
 
-            //新增
+            //新增同步到项目
             if (!insertDataPrivateList.isEmpty()) {
                 List<List<WbsTreePrivate>> partition = Lists.partition(insertDataPrivateList, 1000);
                 for (List<WbsTreePrivate> wbsTreePrivates : partition) {
                     this.insertBatch(wbsTreePrivates, 1000);
                 }
             }
+
+            //同步到合同段(合同段中可能不存在原始节点(那么分配wsb处就同步不成功),但合同段存在新增、复制的节点,所以单独处理)
+            if (!insertDataPrivateList.isEmpty()) {
+                Map<Long, List<WbsTreePrivate>> tabParentNodesGroup = insertDataPrivateList.stream().collect(Collectors.groupingBy(WbsTreePrivate::getParentId));
+                Set<Long> longs = tabParentNodesGroup.keySet();
+                //获取当前项目下合同段新增或者复制的节点
+                List<WbsTreeContract> addOrCopyNodes = wbsTreeContractMapper.selectList(Wrappers.<WbsTreeContract>lambdaQuery()
+                        .select(WbsTreeContract::getId, WbsTreeContract::getContractId, WbsTreeContract::getOldId)
+                        .in(WbsTreeContract::getOldId, longs).eq(WbsTreeContract::getProjectId, wbsTreePrivate.getProjectId()));
+                List<WbsTreeContract> newAddOrCopyNodes = addOrCopyNodes.stream().distinct().collect(Collectors.toList());
+                for (WbsTreeContract addOrCopyNode : newAddOrCopyNodes) {
+                    //合同段节点的oldId=当前表的parentId,也就是说当前表的父级节点=合同段复制、新增出来节点
+                    List<WbsTreePrivate> tabs = tabParentNodesGroup.get(Long.parseLong(addOrCopyNode.getOldId()));
+                    if (tabs.size() > 0) {
+                        List<WbsTreeContract> wbsTreeContractList = BeanUtil.copyProperties(tabs, WbsTreeContract.class);
+                        for (WbsTreeContract wbsTreeContract : wbsTreeContractList) {
+                            wbsTreeContract.setIsDeleted(0);
+                            wbsTreeContract.setStatus(1);
+                            wbsTreeContract.setPKeyId(SnowFlakeUtil.getId());
+                            wbsTreeContract.setParentId(addOrCopyNode.getId());
+                            wbsTreeContract.setContractId(addOrCopyNode.getContractId());
+                        }
+                        insertDataContractList.addAll(wbsTreeContractList);
+                    }
+                }
+            }
+
+            //新增同步到合同段
+            if (!insertDataContractList.isEmpty()) {
+                List<List<WbsTreeContract>> partition = Lists.partition(insertDataContractList, 1000);
+                for (List<WbsTreeContract> wbsTreeContracts : partition) {
+                    wbsTreeContractService.insertBatch(wbsTreeContracts, 1000);
+                }
+            }
             return true;
         }
         return false;

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

@@ -483,6 +483,7 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
         for (WbsTreeQueryValueVO wbsTree : listRoot) {
             List<WbsTreeQueryValueVO> childrenList = mapAll.get(wbsTree.getId());
             if (childrenList != null && childrenList.size() > 0) {
+                wbsTree.setTitle(wbsTree.getNodeName());
                 wbsTree.setChildren(childrenList);
                 wbsTree.setHasChildren(true);
                 this.buildWbsTreeByGetQueryValueByType(childrenList, mapAll);
@@ -507,8 +508,9 @@ public class WbsTreeServiceImpl extends BaseServiceImpl<WbsTreeMapper, WbsTree>
     private void buildWbsTreePrivateByGetQueryValueByType(List<WbsTreePrivateQueryValueVO> listRoot, Map<Long, List<WbsTreePrivateQueryValueVO>> mapAll) {
         for (WbsTreePrivateQueryValueVO wbsTree : listRoot) {
             List<WbsTreePrivateQueryValueVO> childrenList = mapAll.get(wbsTree.getId());
-            wbsTree.setChildren(childrenList);
             if (childrenList != null && childrenList.size() > 0) {
+                wbsTree.setTitle(wbsTree.getNodeName());
+                wbsTree.setChildren(childrenList);
                 wbsTree.setHasChildren(true);
                 this.buildWbsTreePrivateByGetQueryValueByType(childrenList, mapAll);
             }