Ver código fonte

Merge remote-tracking branch 'origin/master'

liuyc 2 anos atrás
pai
commit
d1ccb8a754
19 arquivos alterados com 558 adições e 117 exclusões
  1. 157 0
      blade-common/src/main/java/org/springblade/common/utils/BaseUtils.java
  2. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaOptionVo.java
  3. 4 65
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeInfo.java
  4. 35 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeJson.java
  5. 3 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ExcelTab.java
  6. 1 1
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/FormulaOption.java
  7. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/feign/FormulaClient.java
  8. 4 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/vo/ExcelTabVO.java
  9. 157 6
      blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java
  10. 11 1
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  11. 43 6
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  12. 5 5
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java
  13. 9 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/feign/FormulaClientImpl.java
  14. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.java
  15. 15 9
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/ExcelTabMapper.xml
  16. 2 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaOptionService.java
  17. 3 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  18. 82 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaOptionServiceImpl.java
  19. 12 11
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.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;
+    }
+
+
+
 
 }

+ 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;
+
 }

+ 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());
                                     }
                                 }

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

@@ -213,7 +213,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()) {
@@ -801,7 +801,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);
+        });
 
+    }*/
 
 
 }

+ 43 - 6
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -44,6 +44,7 @@ import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.ExecuteType;
+import org.springblade.manager.mapper.ExcelTabMapper;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.utils.FileUtils;
@@ -110,6 +111,8 @@ public class ExcelTabController extends BladeController {
 
     private final JdbcTemplate jdbcTemplate;
 
+    private final ExcelTabMapper excelTabMapper;
+
 
     // 表单附件信息
     private final ITableFileService tableFileService;
@@ -613,8 +616,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) {
@@ -647,8 +649,14 @@ public class ExcelTabController extends BladeController {
 
         // 标题解决
         ProjectInfo projectInfo = projectInfoService.getById(wbsTreeContract.getProjectId());
+        //判断是否是水利水电表,水利水电项目名14,表名12 。   其他表都是18
+        Boolean isWater = false;
+        ExcelTab tab = excelTabMapper.getWaterByTableId(wbsTreeContract.getExcelId());
+        if (tab != null){
+            isWater = true;
+        }
+
         // 添加标题显示
-        // Elements dwtitle = doc.getElementsByAttributeValueMatching("style", "18.0pt");
         Elements trs = table.select("tr");
         for (int i = 1; i < 6; i++) {
             Element tr = trs.get(i);
@@ -659,8 +667,14 @@ public class ExcelTabController extends BladeController {
                 String style = data.attr("style");
                 if (style.indexOf("font-size") >= 0) {
                     int fontsize = Integer.parseInt(style.substring(style.indexOf("font-size:") + 10, style.indexOf(".0pt")));
-                    if (StringUtils.isNotEmpty(data.text()) && fontsize >= 14) {
-                        trs.get(i - 1).select("td").get(0).text(projectInfo.getProjectName());
+                    if (isWater){
+                        if (StringUtils.isNotEmpty(data.text()) && fontsize >= 12) {
+                            trs.get(i - 1).select("td").get(0).text(projectInfo.getProjectName());
+                        }
+                    }else {
+                        if (StringUtils.isNotEmpty(data.text()) && fontsize >= 14) {
+                            trs.get(i - 1).select("td").get(0).text(projectInfo.getProjectName());
+                        }
                     }
                 }
             }
@@ -743,7 +757,7 @@ public class ExcelTabController extends BladeController {
         ProjectInfo projectInfo = projectInfoService.getById(wbsTreePrivate.getProjectId());
         // 添加标题显示
         Elements trs = table.select("tr");
-        for (int i = 1; i < 6; i++) {
+        for (int i = 0; i < 6; i++) {
             Element tr = trs.get(i);
             Elements tds = tr.select("td");
             for (int j = 0; j < tds.size(); j++) {
@@ -3147,4 +3161,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("成功!");
+    }
 }

+ 5 - 5
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;
@@ -347,7 +347,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 +361,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 +370,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);
 
 }

+ 3 - 11
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1393,9 +1393,6 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 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);
                     }
@@ -1513,9 +1510,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 +1574,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 +1622,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::getParentId, 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);
+    }
+
+
 }

+ 12 - 11
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();
             /*评定表*/
@@ -137,14 +135,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             }
     }
 
-    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();
@@ -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);