Browse Source

公式相关:评定汇总

yangyj 2 years ago
parent
commit
c2861da2ad
19 changed files with 619 additions and 112 deletions
  1. 7 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormData.java
  2. 9 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaDataBlockVo.java
  3. 0 5
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeInfo.java
  4. 28 0
      blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/FormulaDataBlock.java
  5. 6 0
      blade-service/blade-manager/pom.xml
  6. 30 0
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java
  7. 40 5
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java
  8. 4 94
      blade-service/blade-manager/src/main/java/com/mixsmart/utils/StringUtils.java
  9. 25 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ElementBlock.java
  10. 52 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ItemBlock.java
  11. 18 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/NodeTable.java
  12. 32 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TableEleKey.java
  13. 10 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/AssessmentForm.java
  14. 52 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/Measurement.java
  15. 1 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/TableElementConverter.java
  16. 11 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/FormulaDataBlockMapper.java
  17. 14 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaDataBlockService.java
  18. 32 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDataBlockServiceImpl.java
  19. 248 7
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

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

@@ -133,6 +133,13 @@ public class FormData {
             return msg;
         }
     }
+    public Integer getMaxRow(){
+        return coordsList.stream().mapToInt(Coords::getY).max().orElse(0);
+    }
+    public Integer getMaxCol(){
+        return coordsList.stream().mapToInt(Coords::getX).max().orElse(0);
+    }
+
 
     /**是否还需要执行公式*/
     public Boolean verify(){

+ 9 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaDataBlockVo.java

@@ -0,0 +1,9 @@
+package org.springblade.manager.dto;
+
+/**
+ * @author yangyj
+ * @Date 2023/4/13 15:57
+ * @description TODO
+ */
+public class FormulaDataBlockVo {
+}

+ 0 - 5
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/RangeInfo.java

@@ -2,15 +2,10 @@ package org.springblade.manager.dto;
 
 import com.alibaba.fastjson.annotation.JSONField;
 import io.swagger.annotations.ApiModelProperty;
-import lombok.Data;
 import org.springblade.common.utils.BaseUtils;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.StringUtil;
-
 import java.util.Arrays;
 import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**

+ 28 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/FormulaDataBlock.java

@@ -0,0 +1,28 @@
+package org.springblade.manager.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author yangyj
+ * @Date 2023/4/13 15:40
+ * @description TODO
+ */
+@Data
+@TableName("m_formula_data_block")
+public class FormulaDataBlock {
+    @ApiModelProperty("主键id")
+    @TableId(
+            value = "id",
+            type = IdType.ASSIGN_ID
+    )
+    private Long id;
+    private Integer type;
+    /**sub work*/
+    private Long swId;
+    private Long contractId;
+    private String val;
+}

+ 6 - 0
blade-service/blade-manager/pom.xml

@@ -155,6 +155,12 @@
             <version>2.9.1.RELEASE</version>
             <scope>compile</scope>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-text -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+            <version>1.10.0</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 30 - 0
blade-service/blade-manager/src/main/java/com/mixsmart/utils/CustomFunction.java

@@ -4,6 +4,7 @@ package com.mixsmart.utils;
 import cn.hutool.core.date.*;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.NumberUtil;
+import com.alibaba.fastjson.JSON;
 import com.jfireel.expression.node.CalculateNode;
 import com.jfireel.expression.node.impl.OperatorResultNode;
 import com.jfireel.expression.node.impl.StaticObjectMethodNode;
@@ -12,6 +13,9 @@ import com.jfireel.expression.token.Token;
 import org.apache.commons.collections4.MapUtils;
 import org.jsoup.Jsoup;
 import org.springblade.core.tool.utils.*;
+import org.springblade.manager.formula.ElementBlock;
+import org.springblade.manager.formula.ItemBlock;
+
 import java.io.FileInputStream;
 import java.math.BigDecimal;
 import java.text.ParseException;
@@ -2570,5 +2574,31 @@ public class CustomFunction {
 		return "";
 	}
 
+//	public static void main(String[] args) {
+//		ElementBlock eb =new ElementBlock();
+//		eb.setCode("m_xxxx_:key_x");
+//		eb.setPass(5);
+//		eb.setTotal(5);
+//		eb.setSort(16);
+//		List<ItemBlock> list = new ArrayList<>();
+//		eb.setList(list);
+//		ItemBlock ib = new ItemBlock();
+//		ib.setDev("±5");
+//		ib.setPkeyId(123456789L);
+//		ib.setS("12/25/36");
+//		ib.setD("12,12/25,23/36,35");
+//		list.add(ib);
+//		ItemBlock ib2 = new ItemBlock();
+//		ib2.setDev("±5");
+//		ib2.setPkeyId(123456789L);
+//		ib2.setS("12");
+//		ib2.setD("12,12");
+//		list.add(ib2);
+//		String json=JSON.toJSONString(eb);
+//		System.out.println(json);
+//		ElementBlock ebj= JSON.parseObject(json,ElementBlock.class);
+//		System.out.println();
+//	}
+
 
 }

+ 40 - 5
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -3,6 +3,8 @@ package com.mixsmart.utils;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.text.similarity.JaccardSimilarity;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.Coords;
@@ -41,6 +43,40 @@ public class FormulaUtils {
         return map;
     }
 
+    /**
+     * @Description  字符串相似度
+     * @Param [s1, s2]
+     * @return double
+     * @Author yangyj
+     * @Date 2023.04.12 18:01
+     **/
+    public static double getJaccardSimilarity(String s1, String s2) {
+
+        Set<Character> set1 = new HashSet<>();
+        Set<Character> set2 = new HashSet<>();
+
+        for (char c : s1.toCharArray()) {
+            set1.add(c);
+        }
+
+        for (char c : s2.toCharArray()) {
+            set2.add(c);
+        }
+
+        Set<Character> intersection = new HashSet<>(set1);
+        intersection.retainAll(set2);
+
+        Set<Character> union = new HashSet<>(set1);
+        union.addAll(set2);
+
+        return (double) intersection.size() / union.size();
+    }
+
+    public static  Double similarity(String s1,String s2){
+        return getJaccardSimilarity(parseItemName(s1),parseItemName(s2));
+    }
+
+
 
     /**
      * result[0]^2+result[1]^2=result[2]^2  result[] 元素均为正整数
@@ -278,16 +314,15 @@ public class FormulaUtils {
         //huangjn 每份填报数据的id,目前日志专用
     }
 
-    /*从元素名称中解析项目名称*/
+    /**从元素名称中解析项目名称*/
     public static  String parseItemName(String eName){
         String[] candidate= StringUtils.handleNull(eName).replaceAll("^[^\\u4e00-\\u9fa5]+","").replaceAll("\\s+","").split("[((].+[))]|_");
         if(candidate.length>0){
-           return Arrays.stream(candidate).filter(e->!e.contains("实测项目")&&!e.contains("△")).findFirst().orElse(eName);
+           return Arrays.stream(candidate).filter(e->!e.contains("实测项目")&&!e.contains("△")).findFirst().orElse(eName).replaceAll("实测值?|偏差值?|设计值?","");
         }
         return eName;
     }
 
-//    public static void main(String[] args) {
-//        System.out.println(parseItemName("实 测 项 目_3△_内轮廓高度(mm)_不小于设计值_实测值或实测偏差值"));
-//    }
+
+
 }

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

@@ -326,20 +326,7 @@ public class StringUtils {
 		return serialNum;
 	}
 	
-	
-	/**
-	 * 生成序列号;
-	 * TODO 改为采用UUID生成序列号
-	 * 生成的序列号;如:U+时间+5位随机序列号
-	 * 如:U141264925197606685
-	 * @return 返回系统自动生成的序列号
-	 */
-	public static String createSerialNum() {
-		/*long time = System.currentTimeMillis();
-		return "U"+time+randomNum(5);*/
-	    return uuid();
-	}
-	
+
 	/**
 	 * 生成UUID序列号
 	 * @return 返回UUID
@@ -378,86 +365,9 @@ public class StringUtils {
 	public static String trimFileSuffix(String fileName) {
 		return fileName.substring(0,fileName.lastIndexOf("."));
 	}
+
 	
-	
-	/**
-	 * 大写字母直接用下划线分割,并把大写转换为小写 <br />
-	 * 如:HelloWorld转换为hello_world
-	 * @param value
-	 * @return 返回处理结果
-	 */
-	public static String upperSeparateUnderline(String value) {
-		StringBuilder strBuilder = null;
-		if(isNotEmpty(value)) {
-		    strBuilder = new StringBuilder();
-			byte[] values = value.getBytes();
-			for (int i = 0; i < values.length; i++) {
-				if(values[i]>=65 && values[i]<=90) {
-					if(i>0 && i<(values.length-1)) {
-					    strBuilder.append("_"+(char)((int)values[i]+32));
-					} else {
-					    strBuilder.append(String.valueOf((char)((int)values[i]+32)));
-					}
-				} else {
-				    strBuilder.append(String.valueOf((char)values[i]));
-				}
-			}
-			values = null;
-		}
-		return strBuilder != null ? strBuilder.toString() : null;
-	}
-	
-	/**
-	 * 首字母转为大写
-	 * @param value
-	 * @return 返回处理后的结果
-	 */
-	public static String firstToUppercase(String value) {
-		if(isNotEmpty(value)) {
-			String firstChar = value.substring(0, 1);
-			String otherChar = value.substring(1);
-			firstChar = firstChar.toUpperCase();
-			value = firstChar+otherChar;
-		}
-		return value;
-	}
-	
-	
-	/**
-	 * 过滤HTML标签.
-	 * @param htmlContent
-	 * @return 返回过滤后的结果
-	 */
-	public static String html2Text(String htmlContent) {
-		if(isEmpty(htmlContent))
-			return htmlContent;
-		Pattern pScript, pStyle, pHtml; //定义规则
-	    Matcher mScript, mStyle, mHtml; //匹配规则
-	    
-	    //定义script的正则表达式{或<script[^>]*?>[\\s\\S]*?<\\/script>
-        String regExScript = "<[\\s]*?script[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?script[\\s]*?>"; 
-        //定义style的正则表达式{或<style[^>]*?>[\\s\\S]*?<\\/style>
-        String regExStyle = "<[\\s]*?style[^>]*?>[\\s\\S]*?<[\\s]*?\\/[\\s]*?style[\\s]*?>";
-         //定义HTML标签的正则表达式
-        String regExHtml = "<[^>]+>";
-        
-        //过滤script标签
-        pScript = Pattern.compile(regExScript, Pattern.CASE_INSENSITIVE);
-        mScript = pScript.matcher(htmlContent);
-        htmlContent = mScript.replaceAll(""); 
-
-        //过滤style标签
-        pStyle = Pattern.compile(regExStyle, Pattern.CASE_INSENSITIVE);
-        mStyle = pStyle.matcher(htmlContent);
-        htmlContent = mStyle.replaceAll(""); 
-
-        //过滤html标签
-        pHtml = Pattern.compile(regExHtml, Pattern.CASE_INSENSITIVE);
-        mHtml = pHtml.matcher(htmlContent);
-        htmlContent = mHtml.replaceAll("");
-	    
-		return htmlContent;
-	}
+
 	
 	
 	/**
@@ -667,7 +577,7 @@ public class StringUtils {
 	public static boolean isContains(String value,String contain) {
 		boolean is = false;
 		if(!isEmpty(value) && null != contain) {
-			is = value.indexOf(contain)>-1?true:false;
+			is = value.contains(contain) ?true:false;
 		}
 		return is;
 	}

+ 25 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ElementBlock.java

@@ -0,0 +1,25 @@
+package org.springblade.manager.formula;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author yangyj
+ * @Date 2023/4/14 14:57
+ * @description TODO
+ */
+
+@Data
+public class ElementBlock {
+
+    @JSONField(name="c")
+    private String code;
+    @JSONField(name="m")
+    private String eName;
+    @JSONField(name="v")
+    private List<ItemBlock>  list;
+
+}

+ 52 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ItemBlock.java

@@ -0,0 +1,52 @@
+package org.springblade.manager.formula;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.mixsmart.utils.StringUtils;
+import lombok.Data;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author yangyj
+ * @Date 2023/4/14 14:45
+ * @description TODO
+ */
+@Data
+public class ItemBlock {
+    @JSONField(serialize = false)
+    private String code;
+    /**对应工序流水号*/
+    @JSONField(name="p")
+    private Long pkeyId;
+    /**实测值*/
+    @JSONField(name="d")
+    private List<List<Double>> data;
+    /**设计值*/
+    @JSONField(name="s")
+    private List<Double> designs;
+    /**合格率*/
+    @JSONField(name="a")
+    private Integer subPass;
+    /**小计*/
+    @JSONField(name="t")
+    private Integer subTotal;
+    /**偏差范围*/
+    @JSONField(name="x")
+    private String dev;
+    public void setD(String d){
+        if(StringUtils.isNotEmpty(d)){
+           this.data= Arrays.stream(d.split("/")).map(e-> Arrays.stream(e.split(",")).map(Double::parseDouble).collect(Collectors.toList())).collect(Collectors.toList());
+        }
+    }
+    public void setS(String s){
+        if(StringUtils.isNotEmpty(s)){
+            this.designs= Arrays.stream(s.split("/")).map(Double::parseDouble).collect(Collectors.toList());
+        }
+    }
+
+    public String getKey(){
+        return code+":"+pkeyId;
+    }
+
+}

+ 18 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/NodeTable.java

@@ -0,0 +1,18 @@
+package org.springblade.manager.formula;
+
+import lombok.Data;
+
+/**
+ * @author yangyj
+ * @Date 2023/4/11 17:20
+ * @description 分项节点表信息映射
+ */
+@Data
+public class NodeTable {
+    private String nodeName;
+    private Long nodeId;
+    private String tabName;
+    private String initTableName;
+    private Long tabId;
+    private String url;
+}

+ 32 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/TableEleKey.java

@@ -0,0 +1,32 @@
+package org.springblade.manager.formula;
+
+import com.mixsmart.utils.FormulaUtils;
+import lombok.Data;
+import org.springblade.core.tool.utils.Func;
+
+/**
+ * @author yangyj
+ * @Date 2023/4/11 17:29
+ * @description TODO
+ */
+@Data
+public class TableEleKey {
+    private String tabName;
+    private String initTableName;
+    private String eName;
+    private Long elementId;
+    private String eKey;
+    private String cpStr;
+    public String getCode(){
+        if(initTableName!=null&&eKey!=null){
+            return initTableName+":"+eKey;
+        }
+        return "";
+    }
+    public Double getDegree(){
+        if(Func.isNotBlank(cpStr)&&Func.isNotEmpty(eName)){
+        return     FormulaUtils.getJaccardSimilarity(cpStr,FormulaUtils.parseItemName(eName));
+        }
+        return 0d;
+    }
+}

+ 10 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/AssessmentForm.java

@@ -0,0 +1,10 @@
+package org.springblade.manager.formula.impl;
+
+/**
+ * @author yangyj
+ * @Date 2023/4/11 14:52
+ * @description 评定记录表
+ */
+public class AssessmentForm {
+
+}

+ 52 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/Measurement.java

@@ -0,0 +1,52 @@
+package org.springblade.manager.formula.impl;
+
+import com.mixsmart.utils.FormulaUtils;
+import lombok.Data;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.FormData;
+
+import java.util.List;
+
+/**
+ * @author yangyj
+ * @Date 2023/4/11 15:11
+ * @description 检查内容
+ */
+@Data
+public class Measurement {
+    /**实测值*/
+    private FormData value;
+    /**合格率*/
+    private FormData pass;
+    /**合格判断*/
+    private FormData judge;
+    private String design;
+    private String dev;
+    private List<String> list;
+    private String point;
+    private String valueCode;
+    private String designCode;
+    private String valueName;
+    private String designName;
+    public Measurement(String point) {
+        this.point = point;
+    }
+    public Measurement() {
+    }
+    /**是否匹配成功*/
+    public Boolean isMatching(){
+           return value!=null&&pass!=null&&judge!=null;
+    }
+    public void flush(){
+        this.value.setFinished(true);
+        this.value.setUpdate(1);
+        this.value.setFormula(null);
+        this.pass.setFinished(true);
+        this.pass.setUpdate(1);
+        this.pass.setFormula(null);
+        this.judge.setFinished(true);
+        this.judge.setUpdate(1);
+        this.judge.setFormula(null);
+    }
+
+}

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

@@ -188,7 +188,7 @@ public class TableElementConverter implements ITableElementConverter {
     public void after() {
         /*这个方法的核心就是把fds的数据按照既定格式(key_xxx_val_y_x)回写到tableInfo,对fds进行tableName分组,非空循环写人*/
         LinkedHashMap<String,List<KeyMapper>> tabs = keyMappers.stream().collect(Collectors.groupingBy(KeyMapper::getCode,LinkedHashMap::new,Collectors.toList()));
-        List<FormData> updateList = this.formDataMap.values().stream().filter(e->e.getUpdate()==1).collect(Collectors.toList());
+        List<FormData> updateList = this.formDataMap.values().stream().filter(e->e.getUpdate()==1&&e.isCurrentNodeElement).collect(Collectors.toList());
         if(Func.isNotEmpty(updateList)){
             for (FormData fd : updateList) {
                 if(fd.getUpdate().equals(1)){

+ 11 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/mapper/FormulaDataBlockMapper.java

@@ -0,0 +1,11 @@
+package org.springblade.manager.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springblade.manager.entity.FormulaDataBlock;
+
+
+/**
+ * @author yangyj
+ */
+public interface FormulaDataBlockMapper extends BaseMapper<FormulaDataBlock> {
+}

+ 14 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IFormulaDataBlockService.java

@@ -0,0 +1,14 @@
+package org.springblade.manager.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springblade.manager.entity.FormulaDataBlock;
+import org.springblade.manager.formula.ElementBlock;
+
+import java.util.List;
+
+/**
+ * @author yangyj
+ */
+public interface IFormulaDataBlockService extends IService<FormulaDataBlock> {
+    FormulaDataBlock queryOption(Long contractId, Long swId , Integer type);
+}

+ 32 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaDataBlockServiceImpl.java

@@ -0,0 +1,32 @@
+package org.springblade.manager.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.entity.FormulaDataBlock;
+import org.springblade.manager.mapper.FormulaDataBlockMapper;
+import org.springblade.manager.service.IFormulaDataBlockService;
+import org.springframework.stereotype.Service;
+import java.util.List;
+
+/**
+ * @author yangyj
+ * @Date 2023/4/13 15:46
+ * @description TODO
+ */
+@Service
+@RequiredArgsConstructor
+public class FormulaDataBlockServiceImpl extends ServiceImpl<FormulaDataBlockMapper, FormulaDataBlock> implements IFormulaDataBlockService {
+
+    @Override
+    public FormulaDataBlock queryOption(Long contractId, Long swId, Integer type) {
+        List<FormulaDataBlock> dataBlockList = this.list(Wrappers.<FormulaDataBlock>lambdaQuery().eq(FormulaDataBlock::getContractId,contractId).eq(FormulaDataBlock::getSwId,swId).eq(FormulaDataBlock::getType,type));
+         if(Func.isNotEmpty(dataBlockList)){
+             return dataBlockList.get(0);
+         }
+        return null;
+    }
+
+
+}

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

@@ -22,9 +22,9 @@ import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.*;
 import org.springblade.manager.entity.*;
-import org.springblade.manager.formula.FormulaStrategyFactory;
-import org.springblade.manager.formula.KeyMapper;
+import org.springblade.manager.formula.*;
 import org.springblade.manager.formula.impl.CompositeDataAccess;
+import org.springblade.manager.formula.impl.Measurement;
 import org.springblade.manager.formula.impl.SubTable;
 import org.springblade.manager.formula.impl.TableElementConverter;
 import org.springblade.manager.mapper.FormulaMapper;
@@ -41,6 +41,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -68,7 +69,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     private final IWbsTreeService wbsTreeService;
     private final JdbcTemplate jdbcTemplate;
     private final IFormulaOptionService formulaOptionService;
-    private final ITextdictInfoService textdictInfoService;
+    private final ITextdictInfoService textDictInfoService;
+    private final IFormulaDataBlockService formulaDataBlockService;
 
     /**  private final Container env;*/
     private   TableElementConverter tec;
@@ -190,9 +192,147 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
            /*数据格式 {tablename:{keyxxx:{option:[1|0]}}}*/
            this.constantMap.put(FMOT,JSON.parseObject(formulaOption.getVal(),LinkedHashMap.class));
         }
+        /*评定表*/
+        assessmentForm();
         return this;
     }
 
+    public void assessmentForm(){
+        if(tec.getTableAll().stream().anyMatch(e->StringUtils.isEquals(e.getTableType(),5))){
+            /*评定节点*/
+            AppWbsTreeContractVO one =tec.getTableAll().get(0);
+            List<String> ancestor=new ArrayList<>(Arrays.asList(one.getAncestors().split(",")));
+            Collections.reverse(ancestor);
+            FormulaDataBlock fdb = this.formulaDataBlockService.queryOption(Long.parseLong(one.getContractId()),Long.parseLong(ancestor.get(1)),0);
+            if(fdb!=null&&Func.isNotBlank(fdb.getVal())){
+                List<ElementBlock> elementBlockList =JSON.parseArray(fdb.getVal(),ElementBlock.class);
+                Map<String, Measurement> itemsMap = new HashMap<>();
+                this.formDataMap.values().forEach(e->{
+                    String eName=e.getEName();
+                    if(eName.contains("实测")&&!eName.contains("平均")){
+                        String point  =FormulaUtils.parseItemName(eName);
+                        Measurement measurement = itemsMap.computeIfAbsent(point,k->new Measurement(point));
+                        if(eName.contains("偏差")){
+                            measurement.setValue(e);
+                        }else if(eName.contains("率")){
+                            measurement.setPass(e);
+                        }else if(eName.contains("判")){
+                            measurement.setJudge(e);
+                        }
+                    }
+                });
+                if(itemsMap.size()>0){
+                    AtomicBoolean update= new AtomicBoolean(false);
+                    itemsMap.values().stream().filter(Measurement::isMatching).forEach(t->{
+                        elementBlockList.stream().filter(w->FormulaUtils.similarity(w.getEName(),t.getPoint())>0.6).reduce((a, b) -> Comparator.<Double>reverseOrder().compare(FormulaUtils.similarity(a.getEName(),t.getPoint()), FormulaUtils.similarity(b.getEName(),t.getPoint())) <= 0 ? a : b).ifPresent(g->{
+                              List<ItemBlock> itemBlockList =g.getList();
+                               int originSize=itemBlockList.size();
+                               List<Long> ids = this.jdbcTemplate.queryForList("select b.p_key_id from m_wbs_tree_contract a join m_wbs_tree_contract b on (a.parent_id=b.parent_id and a.contract_id=b.contract_id) where a.p_key_id="+tec.getCurrentNode().getPkId()+" and b.is_deleted=0 and b.node_type=6",Long.class);
+                               itemBlockList.removeIf(ik->!ids.contains(ik.getPkeyId()));
+                               if(itemBlockList.size()>0){
+                                   int total=itemBlockList.stream().mapToInt(ItemBlock::getSubTotal).sum();
+                                   int passNum=itemBlockList.stream().mapToInt(ItemBlock::getSubPass).sum();
+                                   double passRate=100*(double)passNum/(double) total;
+                                   FormulaUtils.write(t.getPass(),StringUtils.number2String(passRate,1),null);
+                                   if(passRate>=60){
+                                       FormulaUtils.write(t.getJudge(),"合格",null);
+                                   }
+                                   itemBlockList.sort(Comparator.comparingInt(a->ids.indexOf(a.getPkeyId())));
+                                   FormulaUtils.write(t.getValue(),itemBlockList.stream().map(ItemBlock::getData).flatMap(v->v.stream().flatMap(Collection::stream)).collect(Collectors.toList()),true);
+
+//                                   if(t.getValue().getEName().contains("±")){
+//                                       /*存在偏差范围则获取的是偏差值:实测-设计*/
+//                                       FormulaUtils.write(t.getValue(),itemBlockList.stream().flatMap(b->{
+//                                           List<Double> result=new ArrayList<>();
+//                                           List<List<Double>> datas=b.getData();
+//                                           List<Double> designs=b.getDesigns();
+//                                           for(int i=0;i<datas.size();i++){
+//                                               int j=Math.min(designs.size()-1,i);
+//                                               double des=designs.get(j);
+//                                               datas.get(i).forEach(d->result.add(d-des));
+//                                           }
+//                                           return  result.stream();
+//                                       }).collect(Collectors.toList()),true);
+//                                   }else{
+//                                      FormulaUtils.write(t.getValue(),itemBlockList.stream().map(ItemBlock::getData).flatMap(v->v.stream().flatMap(Collection::stream)).collect(Collectors.toList()),true);
+//                                   }
+                               }
+                               t.flush();
+                               if(originSize>0&&originSize!=itemBlockList.size()){
+                                   g.setList(itemBlockList);
+                                   update.set(true);
+                               }
+                        });
+                    });
+                    if(update.get()){
+                        this.formulaDataBlockService.saveOrUpdate(fdb);
+                    }
+                }
+
+            }
+        }
+    }
+
+
+    /**评定表自动匹配*/
+//    public  void  doForAssessmentForm(){
+//        try {
+//            List<String> tableNames = tec.getTableAll().stream().filter(e->StringUtils.isEquals(e.getTableType(),5)).map(AppWbsTreeContractVO::getInitTableName).collect(Collectors.toList());
+//            if(Func.isNotEmpty(tableNames)){
+//                   List<Map<String,Object>> mapList=this.jdbcTemplate.queryForList("select  k.node_name nodeName,k.p_key_id nodeId ,c.node_name tabName,c.sort,c.init_table_name initTableName,c.p_key_id tabId,c.html_url url   from (select b.id,b.node_name,b.sort ,b.p_key_id from (select * from m_wbs_tree_contract  where p_key_id="+tec.getCurrentNode().getPkId()+") a join  m_wbs_tree_contract b on b.parent_id=a.parent_id where  b.contract_id="+tec.getContractId()+" and b.is_deleted=0 and b.node_type=6 ) k join m_wbs_tree_contract c on c.parent_id = k.id  where  c.contract_id="+tec.getContractId()+" and c.is_deleted=0 and c.table_owner in(1,2,3) ORDER BY k.sort ,c.sort,c.p_key_id");
+//                   if(Func.isNotEmpty(mapList)){
+//                       List<NodeTable> nodeTables =mapList.stream().map(e->BeanUtil.toBean(e,NodeTable.class)).collect(Collectors.toList());
+//                       List<String> exclude=tec.getTableAll().stream().map(AppWbsTreeContractVO::getInitTableName).collect(Collectors.toList());
+//                       List<Map<String,Object>> keyMapList= this.jdbcTemplate.queryForList("select a.tab_ch_name tabName,a.tab_en_name initTableName,b.e_name eName,b.id elementId,b.e_key  eKey from m_table_info a join m_wbs_form_element b on b.f_id=a.id where a.tab_en_name in ('"+nodeTables.stream().map(NodeTable::getInitTableName).distinct().filter(e->!exclude.contains(e)).collect(Collectors.joining("','"))+"') and b.is_deleted=0");
+//                       List<TableEleKey> tableEleKeys=keyMapList.stream().map(e->BeanUtil.toBean(e,TableEleKey.class)).collect(Collectors.toList());
+//                       Map<String, Measurement> itemsMap = new HashMap<>();
+//                       this.formDataMap.values().forEach(e->{
+//                           String eName=e.getEName();
+//                           if(eName.contains("实测")&&!eName.contains("平均")){
+//                               String point  =FormulaUtils.parseItemName(eName);
+//                               Measurement measurement = itemsMap.computeIfAbsent(point,k->new Measurement(point));
+//                               if(eName.contains("偏差")){
+//                                   measurement.setValue(e);
+//                               }else if(eName.contains("率")){
+//                                   measurement.setPass(e);
+//                               }else if(eName.contains("判")){
+//                                   measurement.setJudge(e);
+//                               }
+//                           }
+//                       });
+//
+//                      Map<Boolean,List<TableEleKey>> tmpMap=   tableEleKeys.stream().collect(Collectors.partitioningBy(t->t.getTabName().contains("质量检验")));
+//                       List<TableEleKey> tableEleKeysA= tmpMap.get(false);
+//                       List<TableEleKey> tableEleKeysB=tmpMap.get(true);
+//                       itemsMap.values().forEach(e->{
+//                           //tableEleKeys.stream().filter(tk -> !tk.getTabName().contains("质量检验")).reduce((a, b) -> FormulaUtils.getJaccardSimilarity(e.getValue().getEName(), a.getEName()) - FormulaUtils.getJaccardSimilarity(e.getValue().getEName(), b.getEName()) >= 0 ? a : b).ifPresent(source -> e.setValueCode(source.getCode()));
+//                           List<TableEleKey> target=tableEleKeysA.stream().sorted(Comparator.comparingDouble(tk->FormulaUtils.getJaccardSimilarity(e.getPoint(),FormulaUtils.parseItemName(tk.getEName())))).collect(Collectors.toList());
+//                           //List<TableEleKey> target1=tableEleKeysA.stream().sorted(Comparator.comparingDouble(TableEleKey::getDegree).reversed()).collect(Collectors.toList());
+//                           Collections.reverse(target);
+//                           target=target.stream().limit(3).collect(Collectors.toList());
+//                           target.forEach(g->{
+//                               String eName=g.getEName();
+//                               String code =g.getCode();
+//                               if(eName.contains("实测")&&!eName.contains("设计")&&!eName.contains("偏")){
+//                                   e.setValueCode(code);
+//                                   e.setValueName(eName);
+//                               }else if(eName.contains("设计")&&!eName.contains("偏")){
+//                                   e.setDesignCode(code);
+//                                   e.setDesignName(eName);
+//                               }else if(eName.contains("偏")){
+//
+//                               }
+//                           });
+//                       });
+//                       tec.getLog().append("【评定表实测项目匹配度】");
+//                       System.out.println();
+//                   }
+//            }
+//        }catch (Exception e){
+//            e.printStackTrace();
+//        }
+//    }
+
     public void missingFill(List<String> missingList){
         /*数据池里面没有任何元素匹配和当前依赖匹配*/
         if(Func.isNotEmpty(missingList)){
@@ -200,7 +340,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             Map<String, Object> elementInfoMap=this.getElementInfoByCodes(String.join(",",missingList));
             /*1从当前节点其它表格中查找匹配的元素*/
             List<String> removeList=new ArrayList<>();
-            if(false) {//全加载后,关闭当前节的搜索,假如后期改成依赖加载可以再次利用
+            if(false) {/*全加载后,关闭当前节的搜索,假如后期改成依赖加载可以再次利用*/
                 for (String r : missingList) {
                     String tn = r.substring(0, r.indexOf(StringPool.COLON));
                     String key = r.substring(r.indexOf(StringPool.COLON) + 1);
@@ -396,7 +536,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     /*汇总阶段执行的公式*/
     public void summaryPre(){
-        this.formDataList.stream().filter(e->StringUtils.isEquals("CKI",e.getFormula().getNumber())||StringUtils.isEquals("CKD",e.getFormula().getNumber())).forEach(t->this.summary.add(t));
+        this.formDataList.stream().filter(FormData::executable).filter(e->StringUtils.isEquals("CKI",e.getFormula().getNumber())||StringUtils.isEquals("CKD",e.getFormula().getNumber())).forEach(t->this.summary.add(t));
         this.formDataList.removeAll(this.summary);
         /*监表的处理*/
         Optional<AppWbsTreeContractVO> aop=tec.getTableAll().stream().filter(e->e.getNodeName().contains("A15")).findAny();
@@ -586,6 +726,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         try {
             /*检验单附表处理*/
             List<FormData> inspectionList = new ArrayList<>();
+            /*0检验表1评定表*/
             this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("检验单") || e.getNodeName().contains("评定表")).forEach(e -> {
                 /*获取所有挂在表里的元素映射关系*/
                 this.tec.getKeyMappers().stream().filter(p -> p.getPkId().equals(e.getPKeyId())).forEach(k -> {
@@ -654,6 +795,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             String values=subTableInfo.stream().map(TableInfo::getDataMap).map(m->m.get(StringUtils.handleNull(e.get("ekey")))).filter(StringUtils::isNotEmpty).collect(Collectors.joining(";;"));
                             FormData tmp=  createFormDataFast(StringUtils.handleNull(e.get("ename")),StringUtils.handleNull(e.get("code")),values);
                             if(tmp!=null){
+                                tmp.setIsCurrentNodeElement(true);
                                 this.formDataMap.put(tmp.getCode(),tmp);
                                 this.formDataList.add(tmp);
                             }
@@ -697,11 +839,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     sta.flush();
                 }
             }
+
         } catch (Exception e) {
             this.tec.getLog().append("【").append("附表异常").append("】");
             e.printStackTrace();
         }
     }
+
+
+
     /**汇总处理*/
     public void summaryCalc(){
         if(this.summary.size()>0){
@@ -720,6 +866,101 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                    e.setUpdate(1);
                 }
             });
+            /*分项汇总*/
+            doForDataBlock();
+        }
+    }
+
+
+    /**分项汇总数据*/
+    public void   doForDataBlock(){
+        try {
+            AppWbsTreeContractVO one =tec.getTableAll().get(0);
+            List<String> ancestor=new ArrayList<>(Arrays.asList(one.getAncestors().split(",")));
+            Collections.reverse(ancestor);
+            FormulaDataBlock fdb = this.formulaDataBlockService.queryOption(Long.parseLong(one.getContractId()),Long.parseLong(ancestor.get(1)),0);
+            List<ElementBlock> elementBlockList=new ArrayList<>();
+            Map<String,ElementBlock> elementBlockMap =new HashMap<>();
+            Map<String,ItemBlock>itemBlockMap =new HashMap<>();
+            if(fdb==null){
+                fdb=new FormulaDataBlock();
+                fdb.setContractId(tec.getContractId());
+                fdb.setSwId(Long.parseLong(ancestor.get(1)));
+                fdb.setType(0);
+                fdb.setVal("[]");
+            }
+            if(Func.isNotBlank(fdb.getVal())) {
+                elementBlockList = JSON.parseArray(fdb.getVal(), ElementBlock.class);
+                elementBlockList.forEach(eb->{
+                    elementBlockMap.put(eb.getCode(),eb);
+                    List<ItemBlock> itemBlockList =eb.getList();
+                    if(itemBlockList.size()>0){
+                        itemBlockList.forEach(ib->{
+                            ib.setCode(eb.getCode());
+                            itemBlockMap.put(ib.getKey(),ib);
+                        });
+                    }
+                });
+            }
+            List<ElementBlock> finalElementBlockList = elementBlockList;
+            this.checkItems.stream().filter(e->!e.empty()).forEach(c->{
+                     ElementBlock eb =elementBlockMap.get(c.getCode());
+                     ItemBlock targetItem=itemBlockMap.get(c.getCode()+":"+tec.getCurrentNode().getPkId());
+                     List<Object> list = c.getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).collect(Collectors.toList());
+                     /*1.无任何记录,当前页无数据,则不需要处理 2.存在记录当前无数据,则要消除 3.没有记录当前有数据,则需要增加 4.有记录有当前记录,则需更新*/
+                     if(Func.isNotEmpty(list)||targetItem!=null){
+                         FormData designList=tec.getFormDataMap().values().stream().filter(t->StringUtils.isEquals(FormulaUtils.parseItemName(t.getEName()),FormulaUtils.parseItemName(c.getEName()))&&t.getEName().contains("设计")&&StringUtils.isEquals(t.getTableName(),c.getTableName())).collect(Collectors.toList()).get(0);
+                         FormData pass=tec.getFormDataMap().values().stream().filter(t->StringUtils.isEquals(FormulaUtils.parseItemName(t.getEName()),FormulaUtils.parseItemName(c.getEName()))&&t.getEName().contains("合格")&&StringUtils.isEquals(t.getTableName(),c.getTableName())).collect(Collectors.toList()).get(0);
+                         if(targetItem==null){
+                             if(eb==null){
+                                 eb=new ElementBlock();
+                                 eb.setCode(c.getCode());
+                                 eb.setEName(c.getEName());
+                                 eb.setList(new ArrayList<>());
+                                 finalElementBlockList.add(eb);
+                                 elementBlockMap.put(eb.getCode(),eb);
+                             }
+                             targetItem = new ItemBlock();
+                             targetItem.setCode(c.getCode());
+                             targetItem.setPkeyId(tec.getCurrentNode().getPkId());
+                             eb.getList().add(targetItem);
+                             itemBlockMap.put(targetItem.getKey(),targetItem);
+                         }
+                         if(Func.isNotEmpty(list)){
+                             targetItem.setSubTotal(list.size());
+                             targetItem.setDesigns(designList.getValues().stream().map(ElementData::getValue).flatMap(e->CustomFunction.obj2ListNe(e).stream()).filter(StringUtils::isNumber).map(StringUtils::obj2Double).collect(Collectors.toList()));
+                             AtomicInteger index= new AtomicInteger();
+                             int len=targetItem.getDesigns().size();
+                             if(len>0){
+                                 targetItem.setData(new ArrayList<>(list.stream().map(StringUtils::obj2Double).collect(Collectors.groupingBy(k -> index.getAndIncrement() / len,LinkedHashMap::new,Collectors.toList())).values()));
+                             }else{
+                                 targetItem.setData(Collections.singletonList(list.stream().map(StringUtils::obj2Double).collect(Collectors.toList())));
+                             }
+                             if(pass!=null&&!pass.empty()){
+                                 targetItem.setSubPass((int)Math.round(list.size()*StringUtils.obj2Double(pass.getValues().get(0).getValue())/100));
+                             }else{
+                                 targetItem.setSubPass(list.size());
+                             }
+                         }else{
+                             eb.getList().remove(targetItem);
+                         }
+                     }
+//                if(c.executable()){
+//                    /*主要是获取实测值,合格率,合格数量*/
+//                    List<String> relyCode = c.getFormula().getRelyList();
+//                    if(Func.isNotEmpty(relyCode)){
+//                        List<FormData> designList=  tec.getFormDataMap().values().stream().filter(t->relyCode.contains(t.getCode())&&t.getEName().contains("设计")).collect(Collectors.toList());
+//                        if(designList.size()>0){
+//                            FormData design =designList.get(0);
+//
+//                        }
+//                    }
+//                }
+            });
+            fdb.setVal(JSON.toJSONString(elementBlockList));
+            this.formulaDataBlockService.saveOrUpdate(fdb);
+        }catch (Exception e){
+            e.printStackTrace();
         }
     }
 
@@ -824,7 +1065,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
             }
         }
         /*检查超页情况*/
-        this.formDataMap.values().stream().filter(e->e.getUpdate()==1&&e.getAddPages()>0).sorted(Comparator.comparing(FormData::getAddPages).reversed())
+        this.formDataMap.values().stream().filter(e->e.getIsCurrentNodeElement()&&e.getUpdate()==1&&e.getAddPages()>0).sorted(Comparator.comparing(FormData::getAddPages).reversed())
                         .collect(Collectors.groupingBy(FormData::getTableName,LinkedHashMap::new,Collectors.toList())).values()
                         .forEach(l->copy(l.get(0)));
     }
@@ -1409,7 +1650,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
         QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("type", 4);
         queryWrapper.eq("tab_id", wbsTreeContract.getIsTypePrivatePid());
-        final List<TextdictInfo> textdictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
+        final List<TextdictInfo> textdictInfos = textDictInfoService.getBaseMapper().selectList(queryWrapper);
         if (!textdictInfos.isEmpty()) {
             for (TextdictInfo textdictInfo : textdictInfos) {
                 if (reData.containsKey(textdictInfo.getColKey())) {