Selaa lähdekoodia

公式相关:优化识别率

yangyj 2 vuotta sitten
vanhempi
commit
bf9b193b9a

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

@@ -6,8 +6,6 @@ import lombok.Data;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
 import org.springblade.manager.entity.Formula;
-
-
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;

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

@@ -2059,7 +2059,7 @@ public class CustomFunction {
 			/*外观质量,这种中文描述去重*/
 			if(list.stream().filter(CustomFunction::containsZH).anyMatch(e->e.toString().contains("\n"))){
 				AtomicInteger index= new AtomicInteger(1);
-				result=list.stream().flatMap(e-> Arrays.stream(e.toString().split("\\n+"))).map(String::trim).map(e->e.replaceAll("^\\d+[、.]","")).distinct().map(e->(index.getAndIncrement())+"、"+e+"\n").collect(Collectors.toList());
+				result=list.stream().flatMap(e-> Arrays.stream(e.toString().split("\\n+"))).map(String::trim).map(e->e.replaceAll("^\\d+[、.\\s]*","")).distinct().map(e->(index.getAndIncrement())+"、"+e+"\n").collect(Collectors.toList());
 			}else{
 				result=list.stream().distinct().collect(Collectors.toList());
 			}

+ 24 - 2
blade-service/blade-manager/src/main/java/com/mixsmart/utils/FormulaUtils.java

@@ -315,14 +315,36 @@ public class FormulaUtils {
     }
 
     /**从元素名称中解析项目名称*/
+    public static final  Set<String> EX_WORD=new HashSet<String>(){{add("或");}};
     public static  String parseItemName(String eName){
-        String[] candidate= StringUtils.handleNull(eName).replaceAll("^[^\\u4e00-\\u9fa5]+","").replaceAll("\\s+","").split("[((].+[))]|_");
+        String[] candidate= StringUtils.handleNull(eName).replaceAll("[\\t\\n\\s+]","").split("[((].+[))]|_");
         if(candidate.length>0){
-           return Arrays.stream(candidate).filter(e->!e.contains("实测项目")&&!e.contains("△")).findFirst().orElse(eName).replaceAll("实测值?|偏差值?|设计值?","");
+            return Arrays.stream(candidate).map(s->s.replaceAll("[^\\u4e00-\\u9fa5]+","").replaceAll("(总数|抽测|实测|偏差|设计|合格)[率值]?","")).filter(s->!EX_WORD.contains(s)&&StringUtils.isNotEmpty(s)).collect(Collectors.joining());
         }
         return eName;
     }
 
 
+//    public static void main(String[] args) {
+//        List<String> list =Arrays.asList(
+//                "压 实 度 (%)下路床 特重、极重交通荷载等级 设计值"
+//                ,"1△_压 实 度 (%)_下路床_轻、中及重交通 荷载等级_0.3m~0.8m_≧96_≧95_≧94_实测值或实测偏差值"
+//                ,"1△_压 实 度 (%)_下路提_轻、中及重交通 荷载等级_&gt;1.5m_≧93_≧92_≧90_实测值或实测偏差值"
+//                ,"1△_压 实 度 (%)_上路提_轻、中及重交通 荷载等级_0.8m~1.5m_≧94_≧94_≧93_实测值或实测偏差值"
+//                ,"压 实 度 (%)下路提 轻、中及重交通荷载等级 设计值"
+//                ,"压 实 度 (%)下路床 特重、极重交通荷载等级 合格率"
+//                ,"压 实 度 (%)下路提 轻、中及重交通荷载等级\t合格率"
+//                ,"5△_保护层 厚度 (mm)_基础、锚碇、墩台身、墩柱_±10_实测值或实测偏差值"
+//                ,"钢筋骨架尺寸宽、高或直径 (mm)_尺量:按骨架总数30%抽测_±5_实测值或实测偏差值"
+//                ,"钢筋骨架尺寸长 (mm)_±10_尺量:按骨架总数30%抽测_实测值或实测偏差值"
+//               , "受力钢筋间距 (mm)同排 梁、板、拱肋及拱上建筑	设计值"
+//               ,"受力钢筋间距 (mm)同排 梁、板、拱肋及拱上建筑	合格率"
+//               ," 箍筋、构造钢筋、螺旋筋间距(mm)	设计值"
+//               ,"箍筋、构造钢筋、螺旋筋间距(mm)	合格率"
+//
+//        );
+//        list.stream().map(FormulaUtils::parseItemName).forEach(System.out::println);
+//    }
+
 
 }

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

@@ -48,7 +48,7 @@ public class TableElementConverter implements ITableElementConverter {
     /**所有元素数据集*/
     Map<String,FormData> formDataMap = new HashMap<>();
     /**{tableName:{key:val}}*/
-    Map<String,Map<String,String>> coordinateMap;
+    Map<String,Map<String,String>> coordinateMap= new HashMap<>();
     /**{code:List<ElementData>}*/
     Map<String,ElementData> elementDataMap = new HashMap<>();
     /**跨表数据*/
@@ -60,7 +60,13 @@ public class TableElementConverter implements ITableElementConverter {
     /**记录表公式执行的日志*/
     StringBuilder log;
     /**当前执行环境全局变量*/
-    private   Map<String,Object> constantMap = new HashMap<>();
+    public   Map<String,Object> constantMap = new HashMap<>();
+    public   List<FormData> formDataList;
+
+
+    public    List<FormData> checkItems=new ArrayList<>();
+    public   List<FormData> checkDate=new ArrayList<>();
+    public   List<FormData> summary=new ArrayList<>();
 
 
 
@@ -89,20 +95,20 @@ public class TableElementConverter implements ITableElementConverter {
 
 
 
-    public void relyParse(Formula f){
-        if(Func.isNotBlank(f.getFormula())){
-            List<String> l = new ArrayList<>();
-            Matcher m = RP.matcher(f.getFormula());
-            while (m.find()){
-                l.add(m.group());
-            }
-            if(l.size()>0){
-                f.setRely(String.join(",", l));
-            }else{
-                f.setRely("");
-            }
-        }
-    }
+//    public void relyParse(Formula f){
+//        if(Func.isNotBlank(f.getFormula())){
+//            List<String> l = new ArrayList<>();
+//            Matcher m = RP.matcher(f.getFormula());
+//            while (m.find()){
+//                l.add(m.group());
+//            }
+//            if(l.size()>0){
+//                f.setRely(String.join(",", l));
+//            }else{
+//                f.setRely("");
+//            }
+//        }
+//    }
 
     public Boolean isPresent(){
         return BaseUtils.isNotNull(this.keyMappers,this.formulas,this.nodeId,this.contractId);

+ 97 - 82
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -37,12 +37,14 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.web.context.WebApplicationContext;
 
+import javax.validation.constraints.NotNull;
 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.function.Predicate;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -74,16 +76,11 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     /**  private final Container env;*/
     private   TableElementConverter tec;
-    private   Map<String,Object> constantMap;
-    private   List<FormData> formDataList;
+//    private   Map<String,Object> constantMap;
+//    private   List<FormData> formDataList;
     private   Map<String,FormData> formDataMap;
     private   Map<String,Map<String,Object>> tableDataMaps;
 
-    private   List<FormData> checkItems;
-    private   List<FormData> checkDate;
-    private   List<FormData> summary;
-
-
 
     public final static String WP="WP";
     public final static String CHAIN="trees";
@@ -119,9 +116,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService init() {
-        this.checkItems= new ArrayList<>();
-        this.checkDate= new ArrayList<>();
-        this.summary = new ArrayList<>();
         this.tableDataMaps=this.tec.getTableDataMaps();
         this.formDataMap=this.tec.getFormDataMap();
         List<FormData> list =this.tec.getFds();
@@ -129,17 +123,17 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         CurrentNode one=this.tec.getCurrentNode();
         Long id =one.getId();
         Long primaryKeyId=one.getPkId();
-        this.constantMap=tec.getConstantMap();
-        this.formDataList=list;
-        this.constantMap.put("contractId",contractId);
-        keyWord(this.constantMap);
+//        tec.constantMap=tec.getConstantMap();
+        tec.formDataList=list;
+        tec.constantMap.put("contractId",contractId);
+        keyWord(tec.constantMap);
         ContractInfo info =this.contractInfoService.getById(contractId);
         /*合同段信息*/
-        this.constantMap.put(CTI,info);
+        tec.constantMap.put(CTI,info);
         /*项目信息*/
         ProjectInfo pji=this.projectInfoService.getById(info.getPId());
         tec.setProjectId(pji.getId());
-        this.constantMap.put(PJI,pji);
+        tec.constantMap.put(PJI,pji);
         /*wbs节点链*/
         List<WbsTreeContract> nodes = wpService.chain(contractId,id,primaryKeyId,null);
         if(Func.isEmpty(nodes)){
@@ -148,18 +142,18 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         if(Func.isEmpty(nodes)){
             this.tec.getLog().append("【WBS信息缺失】");
         }
-        this.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
+        tec.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
         /*节点参数*/
-        this.constantMap.put(WP,getWpMap(one));
+        tec.constantMap.put(WP,getWpMap(one));
         /*表格名称*/
         List<AppWbsTreeContractVO> tableList =wbsTreeContractService.searchNodeAllTable(primaryKeyId.toString(), "1", contractId.toString(),info.getPId());
-        this.constantMap.put(TABLE_LIST,tableList);
+        tec.constantMap.put(TABLE_LIST,tableList);
         /*通过判断元素名称来确定,加入汇总公式延后执行*/
-      //  this.constantMap.put("tableNames",tableList.stream().filter(e->StringUtils.isEquals(e.getIsBussShow(),1)).map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
-        this.constantMap.put("tableNames",tableList.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
+      //  tec.constantMap.put("tableNames",tableList.stream().filter(e->StringUtils.isEquals(e.getIsBussShow(),1)).map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
+        tec.constantMap.put("tableNames",tableList.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
 
         List<String> missingList = new ArrayList<>();
-        this.formDataList.forEach(fd->{
+        tec.formDataList.forEach(fd->{
             if(fd.executable()){
                 relyParse(fd.getFormula());
                 Formula f= fd.getFormula();
@@ -185,27 +179,42 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 "where a.p_key_id in("+this.tec.getTableAll().stream().map(AppWbsTreeContractVO::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()));
-            this.constantMap.put(TEXT_INFO_MAP,tmap);
+            tec.constantMap.put(TEXT_INFO_MAP,tmap);
         }
         /*公式参数*/
         FormulaOption formulaOption = this.formulaOptionService.getOne(Wrappers.<FormulaOption>lambdaQuery().eq(FormulaOption::getParentId,one.getRelateId()).eq(FormulaOption::getContractId,contractId));
         if(formulaOption!=null){
            /*数据格式 {tablename:{keyxxx:{option:[1|0]}}}*/
-           this.constantMap.put(FMOT,JSON.parseObject(formulaOption.getVal(),LinkedHashMap.class));
+           tec.constantMap.put(FMOT,JSON.parseObject(formulaOption.getVal(),LinkedHashMap.class));
         }
         /*评定表*/
         assessmentForm();
         return this;
     }
 
+    public  FormulaDataBlock findFdb(){
+        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){
+            fdb=new FormulaDataBlock();
+            fdb.setContractId(tec.getContractId());
+            fdb.setSwId(Long.parseLong(ancestor.get(1)));
+            fdb.setType(0);
+            fdb.setVal("[]");
+        }
+        return fdb;
+    }
     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())){
+//            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);
+            FormulaDataBlock fdb = findFdb();
+            if(StringUtils.isEquals("[]",fdb.getVal())){
                 List<ElementBlock> elementBlockList =JSON.parseArray(fdb.getVal(),ElementBlock.class);
                 Map<String, Measurement> itemsMap = new HashMap<>();
                 this.formDataMap.values().forEach(e->{
@@ -298,7 +307,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         this.formulaDataBlockService.saveOrUpdate(fdb);
                     }
                 }
-
             }
         }
     }
@@ -523,7 +531,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*元素动态绑定*/
         this.formDataMap.values().stream().filter(e->e.getIsCurrentNodeElement()&&e.getFormula()==null).forEach(e->{
             /*执行列表里不存在,且元素的名称和节点参数名称匹配成功*/
-            total.stream().filter(p->e.getEName().contains(p.getName().replace("【水】","").trim())&&!this.formDataList.contains(e)).findAny().ifPresent(d->{
+            total.stream().filter(p->e.getEName().contains(p.getName().replace("【水】","").trim())&&!tec.formDataList.contains(e)).findAny().ifPresent(d->{
                 Formula  formula=new Formula();
                 formula.setOutm(Formula.FULL);
                 if(RegexUtil.match(ParamElements.LEVEL_REG,d.getV().trim())){
@@ -535,7 +543,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 }
                 e.setFormula(formula);
                 tec.getLog().append("动态绑定参数:").append(e.getEName()).append(";");
-                this.formDataList.add(e);
+                tec.formDataList.add(e);
             });
         });
         return result;
@@ -543,22 +551,22 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService sort() {
-        Map<Boolean,List<FormData>> map = this.formDataList.stream().collect(Collectors.partitioningBy(e->Func.isNotEmpty(e.getFormula())&&e.getFormula().getFormula().contains("E[")));
-        this.formDataList.clear();
+        Map<Boolean,List<FormData>> map = tec.formDataList.stream().collect(Collectors.partitioningBy(e->Func.isNotEmpty(e.getFormula())&&e.getFormula().getFormula().contains("E[")));
+        tec.formDataList.clear();
         /*没有依赖的*/
         List<FormData> simple=map.get(false);
         if(CollectionUtil.isNotEmpty(simple)){
-            this.formDataList.addAll(simple);
+            tec.formDataList.addAll(simple);
         }
         /*有依赖的*/
         List<FormData> rely= map.get(true);
         if(CollectionUtil.isNotEmpty(rely)){
             sort(rely,((rely.size()+1)/2)*rely.size());
-            this.formDataList.addAll(rely);
+            tec.formDataList.addAll(rely);
         }
         /*初始化排序值,每个点间隔1000,方便插入*/
         AtomicInteger sort= new AtomicInteger();
-        this.formDataList.forEach(e->e.setSort(sort.getAndAdd(1000)));
+        tec.formDataList.forEach(e->e.setSort(sort.getAndAdd(1000)));
         /*汇总阶段执行的公式*/
         summaryPre();
         return this;
@@ -566,8 +574,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     /*汇总阶段执行的公式*/
     public void summaryPre(){
-        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);
+        tec.formDataList.stream().filter(FormData::executable).filter(e->StringUtils.isEquals("CKI",e.getFormula().getNumber())||StringUtils.isEquals("CKD",e.getFormula().getNumber())).forEach(t->tec.summary.add(t));
+        tec.formDataList.removeAll(tec.summary);
         /*监表的处理*/
         Optional<AppWbsTreeContractVO> aop=tec.getTableAll().stream().filter(e->e.getNodeName().contains("A15")).findAny();
         if(aop.isPresent()){
@@ -577,9 +585,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 /*存在检验表*/
                 tec.getKeyMappers().stream().filter(e->wop.contains(e.getTableName())&&this.formDataMap.containsKey(e.getCode())).forEach(k->{
                     if(k.getEName().contains("实测值")&&k.getEName().contains("偏差值")){
-                        this.checkItems.add(this.formDataMap.get(k.getCode()));
+                        tec.checkItems.add(this.formDataMap.get(k.getCode()));
                     }else if(k.getEName().contains("检验日期")){
-                        this.checkDate.add(this.formDataMap.get(k.getCode()));
+                        tec.checkDate.add(this.formDataMap.get(k.getCode()));
                     }
                 });
             }else{
@@ -588,18 +596,18 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 tec.getKeyMappers().stream().filter(k->recordTable.contains(k.getTableName())).map(k->k.getCode()+"@"+k.getEName()).distinct().forEach(k->{
                     String[] ka=k.split("@");
                     if(ka[1].contains("实测值")){
-                        this.checkItems.add(this.formDataMap.get(ka[0]));
+                        tec.checkItems.add(this.formDataMap.get(ka[0]));
                     }else if(ka[1].contains("日期")||ka[1].contains("年月日")){
-                        this.checkDate.add(this.formDataMap.get(ka[0]));
+                        tec.checkDate.add(this.formDataMap.get(ka[0]));
                     }
                 });
 
             }
         }
-        if(this.checkItems.size()>0){
+        if(tec.checkItems.size()>0){
             /**排序*/
             List<String> iniTableNames=tec.getTableAll().stream().map(AppWbsTreeContractVO::getInitTableName).distinct().collect(Collectors.toList());
-            this.checkItems= this.checkItems.stream().sorted(Comparator.comparingInt((FormData i)->iniTableNames.indexOf(i.getTableName())).thenComparingInt(FormData::getMaxRow)).collect(Collectors.toList());
+            tec.checkItems= tec.checkItems.stream().sorted(Comparator.comparingInt((FormData i)->iniTableNames.indexOf(i.getTableName())).thenComparingInt(FormData::getMaxRow)).collect(Collectors.toList());
         }
         System.out.println();
 
@@ -607,8 +615,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService pre() {
-        if(CollectionUtil.isNotEmpty(this.formDataList)){
-            for(FormData fd:this.formDataList){
+        if(CollectionUtil.isNotEmpty(tec.formDataList)){
+            for(FormData fd:tec.formDataList){
                 /*预处理公式脚本,只做文本转换不做计算*/
                 if(!fd.executable()){
                     /*不存公式,则认为执行完成,不会再主动执行*/
@@ -651,7 +659,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService special() {
-        for(FormData fd:this.formDataList) {
+        for(FormData fd:tec.formDataList) {
             try {
                 if(Func.isNotEmpty(fd.getFormula())) {
                     formulaStrategyFactory.get(fd).forEach(e -> e.execute(tec));
@@ -682,7 +690,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         if(op.isPresent()){
             checkTable=op.get().getInitTableName();
         }
-        for(FormData fd:this.formDataList){
+        for(FormData fd:tec.formDataList){
             if(fd.verify()){
                 Formula formula =fd.getFormula();
                 String f=formula.getFormula();
@@ -691,7 +699,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         /*非解析器自定义运算*/
                         preCalc(fd);
                         tmpFc(fd);
-                        Map<String, Object> currentMap = new HashMap<>(this.constantMap);
+                        Map<String, Object> currentMap = new HashMap<>(tec.constantMap);
                         List<String>  relyList = fd.getFormula().getRelyList();
                         if(CollectionUtil.isNotEmpty(relyList)){
                             List<FormData>  ele = new ArrayList<>();
@@ -723,7 +731,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                 List<LocalVariable>  local= new ArrayList<>();
                                 while (cda.hasNext()){
                                     LinkedHashMap<String,ElementData> tip= cda.next();
-                                    Map<String, Object> variable = new HashMap<>(this.constantMap);
+                                    Map<String, Object> variable = new HashMap<>(tec.constantMap);
                                     Map<String,Object> em= (Map<String, Object>) variable.computeIfAbsent(E, k->new HashMap<>());
                                     int index= new ArrayList<>(tip.values()).get(0).getIndex();
                                     for(Map.Entry<String,ElementData> se:tip.entrySet()){
@@ -738,7 +746,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                     local.add(new LocalVariable(index,f,variable));
                                 }
                                 if(local.size()>0){
-                                    List<Object> values = slice(local,this.constantMap,f);
+                                    List<Object> values = slice(local,tec.constantMap,f);
                                     if(fd.getTableName().equals(checkTable)){
                                         FormulaUtils.write(fd,values,false);
                                     }else{
@@ -843,7 +851,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             if(tmp!=null){
                                 tmp.setIsCurrentNodeElement(true);
                                 this.formDataMap.put(tmp.getCode(),tmp);
-                                this.formDataList.add(tmp);
+                                tec.formDataList.add(tmp);
                             }
                         });
                         /*生成元素映射关系*/
@@ -912,29 +920,29 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     /**汇总处理*/
     public void summaryCalc(){
         try{
-            if(this.summary.size()>0){
+            if(tec.summary.size()>0){
                 /**/
-                List<String> result=this.checkItems.stream().filter(fdTmp->fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))).map(FormData::getEName).map(FormulaUtils::parseItemName).distinct().collect(Collectors.toList());
-                Optional<FormData> opk= this.summary.stream().filter(FormData::executable).filter(f->StringUtils.isEquals(f.getFormula().getNumber(),CHECK_ITEMS)).findAny();
+                List<String> result=tec.checkItems.stream().filter(fdTmp->fdTmp.getValues().stream().map(ElementData::getValue).anyMatch(e->StringUtils.isNotEmpty(e)&&StringUtils.isNotEquals("/",e))).map(FormData::getEName).map(FormulaUtils::parseItemName).distinct().collect(Collectors.toList());
+                Optional<FormData> opk= tec.summary.stream().filter(FormData::executable).filter(f->StringUtils.isEquals(f.getFormula().getNumber(),CHECK_ITEMS)).findAny();
                 List<String> history=null;
                 if(opk.isPresent()&&!opk.get().empty()){
                     /*假如已经存在内容,则需要筛选出手填部分*/
                     history=  Arrays.asList(opk.get().getValues().get(0).stringValue().replaceAll("[\\s\\n]+","").split("[,、,]"));
                 }
                 if(history!=null&&history.size()>0){
-                    List<String> itemAll=this.checkItems.stream().map(FormData::getEName).map(FormulaUtils::parseItemName).distinct().collect(Collectors.toList());
+                    List<String> itemAll=tec.checkItems.stream().map(FormData::getEName).map(FormulaUtils::parseItemName).distinct().collect(Collectors.toList());
                     List<String> customize=history.stream().filter(s->!itemAll.contains(s)).collect(Collectors.toList());
                     result.addAll(customize);
                 }
-                this.constantMap.put(CHECK_ITEMS,result);
-                this.constantMap.put("CKD",this.checkDate.stream().flatMap(k->k.getValues().stream()).map(ElementData::stringValue).filter(StringUtils::isNotEmpty).reduce((a, b) -> Comparator.<DateTime>reverseOrder().compare(new DateTime(a), new DateTime(b)) <= 0 ? a : b).orElse(null));
-                this.summary.forEach(e->{
+                tec.constantMap.put(CHECK_ITEMS,result);
+                tec.constantMap.put("CKD",tec.checkDate.stream().flatMap(k->k.getValues().stream()).map(ElementData::stringValue).filter(StringUtils::isNotEmpty).reduce((a, b) -> Comparator.<DateTime>reverseOrder().compare(new DateTime(a), new DateTime(b)) <= 0 ? a : b).orElse(null));
+                tec.summary.forEach(e->{
                     /*处理脚本*/
                     e.getFormula().setFormula(e.getFormula().getNumber());
                 });
-                this.summary.forEach(e->{
+                tec.summary.forEach(e->{
                     /*执行公式*/
-                    Object data = Expression.parse(e.getFormula().getFormula()).calculate(this.constantMap);
+                    Object data = Expression.parse(e.getFormula().getFormula()).calculate(tec.constantMap);
                     if(data!=null){
                         FormulaUtils.write(e,data,false);
                         e.setUpdate(1);
@@ -954,20 +962,10 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     /**分项汇总数据*/
     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);
+            FormulaDataBlock fdb=findFdb();
             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->{
@@ -982,14 +980,14 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 });
             }
             List<ElementBlock> finalElementBlockList = elementBlockList;
-            this.checkItems.stream().filter(e->!e.empty()).forEach(c->{
+            tec.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->t.getEName().contains(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->t.getEName().contains(FormulaUtils.parseItemName(c.getEName()))&&t.getEName().contains("合格")&&StringUtils.isEquals(t.getTableName(),c.getTableName())).collect(Collectors.toList()).get(0);
+                         FormData designList=itemMatch(c,0);
+                         FormData pass=itemMatch(c,1);
                          if(targetItem==null){
                              if(eb==null){
                                  eb=new ElementBlock();
@@ -1043,6 +1041,23 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
     }
 
+    /**
+     * @Description 根据实测值元素匹配相关联的元素如设计值合格率
+     * @Param [measured:实测值, type:0设计值 1合格率]
+     * @Date 2023.04.25 14:41
+     **/
+    public FormData itemMatch(FormData measured,@NotNull Integer type){
+        Predicate<FormData> predicate =(FormData t)-> StringUtils.isEquals(t.getTableName(),measured.getTableName());
+        if(type ==0){
+            predicate=  predicate.and((FormData t)->t.getEName().contains("设计"));
+        }else {
+            predicate=   predicate.and((FormData t)->t.getEName().contains("合格"));
+        }
+        predicate= predicate.and((FormData t)->FormulaUtils.similarity(t.getEName(),measured.getEName())>0.75);
+        //FormData target=tec.getFormDataMap().values().stream().filter(t->StringUtils.isEquals(t.getTableName(),measured.getTableName())&&t.getEName().contains("设计")&&FormulaUtils.similarity(t.getEName(),measured.getEName())>0.75).max(Comparator.comparingDouble((FormData t)->FormulaUtils.similarity(t.getEName(),measured.getEName()))).orElse(null);
+        return tec.getFormDataMap().values().stream().filter(predicate).max(Comparator.comparingDouble((FormData t)->FormulaUtils.similarity(t.getEName(),measured.getEName()))).orElse(null);
+    }
+
     public  void write(FormData fd,Object data){
         /*如果需要向额外元素或对象输出数据,在此处修改*/
                fd.setUpdate(1);
@@ -1135,7 +1150,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
     @Override
     public void format() {
         /*数据格式化*/
-        for(FormData fd:this.formDataList){
+        for(FormData fd:tec.formDataList){
             if(fd.verify()){
                 /*保留小数位*/
                 if(fd.getFormula()!=null&&!fd.empty()&&fd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isDouble)){
@@ -1348,7 +1363,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                            if(kOp.isPresent()){
                                /*表名+合同段+父节点*/
                                String findStr="OP['"+fd.getTableName()+"']['"+fd.getKey()+"']['TF']";
-                               flag=StringUtils.handleNull(Expression.parse(findStr).calculate(this.constantMap));
+                               flag=StringUtils.handleNull(Expression.parse(findStr).calculate(tec.constantMap));
                            }
                        }else if(flag.contains("E[")){
                            List<FormData> target = getFormDataByCode(flag);
@@ -1392,7 +1407,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                      while (m.find()) {
                          Object data=null;
                          List<String> codeList = getCodeList(m.group(2));
-                         Map<String,List<Map<String,Object>>> textInfoMap= (Map<String, List<Map<String, Object>>>) this.constantMap.getOrDefault(TEXT_INFO_MAP,new HashMap<>());
+                         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)){
                              Optional<RangeInfo> op=tableColKeyVal.stream().map(map-> BeanUtil.toBean(JSON.parseObject(map.get("val").toString()),RangeInfo.class)).findFirst();
@@ -1429,7 +1444,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
 
 
    public Map<String,Object> createCurrentMap(String el){
-         Map<String,Object> currentMap= new HashMap<String,Object>(this.constantMap);
+         Map<String,Object> currentMap= new HashMap<String,Object>(tec.constantMap);
          List<FormData> fds= getFormDataByCode(String.join(",", getCodeByEl(el)));
          if(Func.isNotEmpty(fds)){
              Map<String,Object> Em= (Map<String, Object>) currentMap.computeIfAbsent(E, k->new HashMap<String,Object>());
@@ -1467,7 +1482,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                         }
                         String key ="HA"+HashUtil.identityHashCode(data);
                         fd.getFormula().setFormula(key);
-                        this.constantMap.put(key,data);
+                        tec.constantMap.put(key,data);
                     }else{
                         fd.getFormula().setFormula(StringPool.EMPTY);
                     }
@@ -1505,7 +1520,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
     /**把计算结果放入固定常量集,创建key来引用*/
     public String putDataWithKey(Object data){
         String key ="HA"+HashUtil.identityHashCode(data);
-        this.constantMap.put(key,data);
+        tec.constantMap.put(key,data);
         return key;
     }