Browse Source

表单相关:重置和擦除元素数据

yangyj 2 years ago
parent
commit
fc840c8d6a

+ 150 - 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,151 @@ 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) {
+        return !isEmpty(value);
+    }
+
+    public static boolean isEmpty(Object value) {
+        if (null == value) {
+            return true;
+        } else {
+            return isEmpty(handleNull(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();
+    }
+}

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

+ 33 - 2
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,parent,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")) {
                                         //如果值中包含换行符,则将换行符替换
@@ -1876,6 +1886,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,6 +1912,8 @@ public class InformationWriteQueryController extends BladeController {
                                 //delete SQL (先删除旧数据,再新增)
                                 String delSql = "delete from " + tableName + " where p_key_id = " + toCopyNodeTab.getPKeyId() + " ; ";
                                 //insert into SQL
+                                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(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
                                 resultTablesData.add(copyDataSql.toString());
                             }
@@ -1942,6 +1959,8 @@ public class InformationWriteQueryController extends BladeController {
                                     //delete SQL (先删除旧数据,再新增)
                                     String delSql = "delete from " + tableName + " where p_key_id = " + objTab.getPKeyId() + " ; ";
                                     //insert into SQL
+                                    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(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
                                     resultTablesData.add(copyDataSql.toString());
                                 }
@@ -1968,7 +1987,8 @@ public class InformationWriteQueryController extends BladeController {
                 var = 1;
             }
         }
-
+        /*重置内容step1*/
+        Map<String,Map<String,String>> ekvMap = new HashMap<>();
         //最下层级节点复制
         if (var == 1) {
             //构造节点
@@ -2025,8 +2045,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,6 +2059,8 @@ public class InformationWriteQueryController extends BladeController {
                             //delete SQL (先删除旧数据,再新增)
                             String delSql = "delete from " + tableName + " where p_key_id = " + obj.getPKeyId() + " ; ";
                             //insert into SQL
+                            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(colVal).append(" from ").append(tableName).append(" where p_key_id='").append(oldPKeyId).append("' LIMIT 1;");
                             resultTablesData.add(copyDataSql.toString());
                         }
@@ -2125,6 +2151,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,6 +2161,8 @@ public class InformationWriteQueryController extends BladeController {
                                         //delete SQL (先删除旧数据,再新增)
                                         String delSql = "delete from " + tableName + " where p_key_id = " + needTab.getPKeyId() + " ; ";
                                         //insert into SQL
+                                        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(colVal).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);
+        });
 
+    }*/
 
 
 }

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

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

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

@@ -1,19 +1,31 @@
 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.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 +36,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 +84,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 +103,56 @@ public class FormulaOptionServiceImpl extends ServiceImpl<FormulaOptionMapper, F
         }
         return null;
     }
+
+    @Override
+    public Object saveOrUpdateOption(RangeInfo rg,String[] dw,int start ) {
+        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::getParentId, 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;
+    }
+
+    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);