Browse Source

公式相关:试验执行流程

yangyj 1 year ago
parent
commit
a61c5ced16

+ 2 - 5
blade-auth/blade-auth.iml

@@ -21,11 +21,6 @@
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="blade-common" />
-    <orderEntry type="module" module-name="blade-manager-api" />
-    <orderEntry type="module" module-name="blade-business-api" />
-    <orderEntry type="module" module-name="blade-system-api" />
-    <orderEntry type="module" module-name="blade-dict-api" />
-    <orderEntry type="module" module-name="blade-common" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-launch:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.3.12.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.3.12.RELEASE" level="project" />
@@ -82,6 +77,8 @@
     <orderEntry type="library" name="Maven: io.opentracing:opentracing-noop:0.33.0" level="project" />
     <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ram:3.1.0" level="project" />
     <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-kms:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.drewnoakes:metadata-extractor:2.16.0" level="project" />
+    <orderEntry type="library" name="Maven: com.adobe.xmp:xmpcore:6.1.11" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-db:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-tool:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.4" level="project" />

+ 21 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/enums/ExecuteType.java

@@ -0,0 +1,21 @@
+package org.springblade.manager.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author yangyj
+ */
+
+@Getter
+@AllArgsConstructor
+public enum ExecuteType {
+    /*Quality Inspection (质量检查)*/
+    INSPECTION("质检",0),
+    /*Material Testing (材料试验) */
+    TESTING("试验",1),
+    /*First Article 首件*/
+    FAI("首件",2);
+    final String name;
+    final int mode;
+}

+ 2 - 3
blade-service-api/blade-user-api/blade-user-api.iml

@@ -19,9 +19,6 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="blade-manager-api" />
-    <orderEntry type="module" module-name="blade-business-api" />
-    <orderEntry type="module" module-name="blade-common" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-cache:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-tool:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-launch:2.9.1.RELEASE" level="project" />
@@ -159,6 +156,8 @@
     <orderEntry type="library" name="Maven: io.opentracing:opentracing-noop:0.33.0" level="project" />
     <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ram:3.1.0" level="project" />
     <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-kms:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.drewnoakes:metadata-extractor:2.16.0" level="project" />
+    <orderEntry type="library" name="Maven: com.adobe.xmp:xmpcore:6.1.11" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-mybatis:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus:3.5.1" level="project" />
     <orderEntry type="library" name="Maven: com.baomidou:mybatis-plus-extension:3.5.1" level="project" />

+ 2 - 7
blade-service/blade-desk/blade-desk.iml

@@ -20,13 +20,6 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="blade-desk-api" />
-    <orderEntry type="module" module-name="blade-manager-api" />
-    <orderEntry type="module" module-name="blade-business-api" />
-    <orderEntry type="module" module-name="blade-flow-api" />
-    <orderEntry type="module" module-name="blade-common" />
-    <orderEntry type="module" module-name="blade-dict-api" />
-    <orderEntry type="module" module-name="blade-scope-api" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-boot:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-context:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-db:2.9.1.RELEASE" level="project" />
@@ -303,6 +296,8 @@
     <orderEntry type="library" name="Maven: io.opentracing:opentracing-noop:0.33.0" level="project" />
     <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ram:3.1.0" level="project" />
     <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-kms:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.drewnoakes:metadata-extractor:2.16.0" level="project" />
+    <orderEntry type="library" name="Maven: com.adobe.xmp:xmpcore:6.1.11" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-metrics:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: io.micrometer:micrometer-core:1.6.3" level="project" />
     <orderEntry type="library" name="Maven: org.hdrhistogram:HdrHistogram:2.1.12" level="project" />

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

@@ -1843,26 +1843,7 @@ public class CustomFunction {
 	}
 
 
-	 public static Map<String, String> getElementCell(String uri) {
-		try {
-			return  Jsoup.parse(IoUtil.readToString(new FileInputStream(ResourceUtil.getFile(uri))))
-					.select("table").first()
-					.select("tr").stream()
-					.flatMap(tr->tr.select("td").stream())
-					.filter(d->!d.children().isEmpty())
-					.map(d->d.children().get(0)).map(d->d.attr("keyname")).filter(StringUtils::isNotEmpty).map(e->e.split("__"))
-					.reduce(
-							new HashMap<>(),
-							(a,b)->{
-								a.merge(b[0], b[1], (v1, v2) -> v1 + ";" + v2);
-								return  a;},
-							(a,b)->null
-					);
-		}catch (Exception e){
-			e.printStackTrace();
-			return new HashMap<>();
-		}
-	}
+
 
 
 

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

@@ -4,8 +4,13 @@ package com.mixsmart.utils;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import org.apache.commons.text.similarity.JaccardSimilarity;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.ss.usermodel.*;
+import org.jsoup.Jsoup;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.IoUtil;
+import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.Coords;
 import org.springblade.manager.dto.ElementData;
@@ -334,22 +339,22 @@ public class FormulaUtils {
         Pattern p = Pattern.compile(regex);
 
         return Arrays.stream(candidate)
-                .map(s -> filterString(s, p))
                 .filter(s -> !isContainKeywords(s))
+                .map(s -> filterString(s, p))
                 .collect(Collectors.joining());
     }
 
     private static String filterString(String s, Pattern p) {
         Matcher matcher = p.matcher(s);
-        return matcher.replaceAll("").replaceAll(getRegex(), "");
+        return matcher.replaceAll("").replaceAll(getRegex(), "").replaceAll("(设计|合格).*","");
     }
     private static String getRegex() {
-        return "(在合格标准内|满足设计要求|质量评定|评定|判定|项目|总数|抽测|实测|偏差|设计|合格)[率值]?";
+        return "(在合格标准内|满足设计要求|质量评定|评定|判定|项目|总数|抽测|实测|偏差|尺量)";
     }
 
 
     private static boolean isContainKeywords(String s) {
-        List<String> keywords = Arrays.asList("或", "每", "个","附录","抽查","测","求","小于","大于","检查","仪");
+        List<String> keywords = Arrays.asList( "每", "个","附录","抽查","测","求","小于","大于","检查","仪","按");
         return keywords.stream().anyMatch(s::contains);
     }
 
@@ -380,6 +385,62 @@ public class FormulaUtils {
         return null;
     }
 
+    /**
+     * @Description  Poi 动态执行公式 测试
+     * @Param [url]
+     * @Author yangyj
+     * @Date 2023.05.05 14:28
+     **/
+    public static void evaluateFormulaCell(String url)  {
+        try {
+            url="C:/Users/yangyj/Desktop/test.xlsx";
+            Workbook workbook = WorkbookFactory.create(new File(url));
+            Sheet sheet = workbook.getSheetAt(0);
+            Cell cell = sheet.getRow(0).getCell(0);
+            FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
+            CellType cellType = evaluator.evaluateFormulaCellEnum(cell);
+            if (cellType == CellType.NUMERIC) {
+                double value = cell.getNumericCellValue();
+                System.out.println("公式计算结果:" + value);
+            } else if (cellType == CellType.STRING) {
+                String value = cell.getStringCellValue();
+                System.out.println("公式计算结果:" + value);
+            }
+            cell.setCellFormula("B1+C1+D1");
+            evaluator.clearAllCachedResultValues();
+            cellType = evaluator.evaluateFormulaCellEnum(cell);
+            if (cellType == CellType.NUMERIC) {
+                double value = cell.getNumericCellValue();
+                System.out.println("公式计算结果:" + value);
+            } else if (cellType == CellType.STRING) {
+                String value = cell.getStringCellValue();
+                System.out.println("公式计算结果:" + value);
+            }
+        }catch (IOException | InvalidFormatException e){
+            e.printStackTrace();
+        }
+    }
+
+    public static Map<String, String> getElementCell(String uri) {
+        try {
+            return  Jsoup.parse(IoUtil.readToString(new FileInputStream(ResourceUtil.getFile(uri))))
+                    .select("table").first()
+                    .select("tr").stream()
+                    .flatMap(tr->tr.select("td").stream())
+                    .filter(d->!d.children().isEmpty())
+                    .map(d->d.children().get(0)).map(d->d.attr("keyname")).filter(StringUtils::isNotEmpty).map(e->e.split("__"))
+                    .reduce(
+                            new HashMap<>(),
+                            (a,b)->{
+                                a.merge(b[0], b[1], (v1, v2) -> v1 + ";" + v2);
+                                return  a;},
+                            (a,b)->null
+                    );
+        }catch (Exception e){
+            e.printStackTrace();
+            return new HashMap<>();
+        }
+    }
 
 
     public static List<String> itemNames =Arrays.asList(
@@ -409,9 +470,10 @@ public class FormulaUtils {
             ,"实 测 项 目_花卉数量_满足设计要求_实测值或实测偏差值"
             ,"实 测 项 目_2△_草坪、草本地被覆盖率(%)_取弃土场绿 地_≥90_实测值或实测偏差值"
             ,"轴线偏位(mm)_全站仪:20m检查3点_实测值或实测偏差值"
+            ,"1△_基材混合物喷射厚度(mm)_设计厚度±10_实测值或实测偏差值"
     );
 
-    public static void maink(String[] args) {
+    public static void maino(String[] args) {
         itemNames.stream().map(FormulaUtils::parseItemName).forEach(System.out::println);
     }
 

+ 5 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -44,6 +44,7 @@ import org.springblade.core.tool.constant.BladeConstant;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.mapper.WbsTreePrivateMapper;
 import org.springblade.manager.service.*;
 import org.springblade.manager.utils.FileUtils;
@@ -1672,6 +1673,7 @@ public class ExcelTabController extends BladeController {
                 for (Long pk : tableAllIds) {
                     if (!exclude.contains(pk)) {
                         R bussDataInfo = this.excelTabService.getBussDataInfo(pk, 1);
+                        @SuppressWarnings("unchecked")
                         Map<String, Object> jo = (Map<String, Object>) bussDataInfo.getData();
                         jo.put("pkeyId", pk);
                         extra.add(jo);
@@ -1693,12 +1695,8 @@ public class ExcelTabController extends BladeController {
                 tableInfoList.sort(Comparator.comparingInt(a -> tableAllIds.indexOf(Long.parseLong(a.getPkeyId()))));
             }
         }
-
-        try {
-            this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeid));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+        //公式填充
+        this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeid), ExecuteType.INSPECTION);
         // 保存数据到数据库
         R info = this.excelTabService.saveOrUpdateInfo(tableInfoList);
         if (!info.isSuccess()) {
@@ -2559,7 +2557,7 @@ public class ExcelTabController extends BladeController {
         String nodeid = tableInfo1.getString("nodeId");
         List<TableInfo> tableInfoList = this.excelTabService.getTableInfoList(dataArray);
         try {
-            this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeid));
+            this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeid),ExecuteType.FAI);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 3 - 7
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/ExcelTabClientImpl.java

@@ -19,6 +19,7 @@ import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.ExcelTab;
 import org.springblade.manager.entity.TrialSelfDataRecord;
+import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.service.IExcelTabService;
 import org.springblade.manager.utils.FileUtils;
 import org.springblade.resource.feign.NewIOSSClient;
@@ -63,16 +64,11 @@ public class ExcelTabClientImpl implements ExcelTabClient {
         //获取表模板,已处理隐藏表问题
         List<TableInfo> tableInfoList = this.excelTabService.getTableInfoListTrial(dataArray, tabIds);
 
+        //------公式填充------
+        this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId), ExecuteType.TESTING);
         //------试验填报数据保存,当前记录id作为groupId------
         this.excelTabService.saveOrUpdateInfoTrial(tableInfoList, id);
 
-        //------公式填充------
-        try {
-            this.excelTabService.formulaFillData(tableInfoList, Long.parseLong(nodeId));
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
         if (isBatchSave == 0) {
             //------单表PDF保存------
             TableInfo tableInfo = tableInfoList.stream().findAny().orElse(null);

+ 8 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/NodeTable.java

@@ -9,10 +9,14 @@ import lombok.Data;
  */
 @Data
 public class NodeTable {
+    private Long pKeyId;
     private String nodeName;
-    private Long nodeId;
-    private String tabName;
     private String initTableName;
-    private Long tabId;
-    private String url;
+    private String wbsId;
+    private Integer tableType;
+    private Long parentId;
+    private String fullName;
+    private String ancestors;
+    private Integer sort;
+    private String htmlUrl;
 }

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

@@ -12,8 +12,10 @@ import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.Formula;
 import org.springblade.manager.dto.Coords;
+import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.formula.ITableElementConverter;
 import org.springblade.manager.formula.KeyMapper;
+import org.springblade.manager.formula.NodeTable;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
 import org.springblade.manager.vo.CurrentNode;
 
@@ -40,23 +42,24 @@ public class TableElementConverter implements ITableElementConverter {
     private Long projectId;
     private Long nodeId;
     private Long wbsTreeId;
+    private ExecuteType executeType;
     List<KeyMapper> keyMappers;
     List<Formula> formulas;
     Map<Long,Formula> formulaMap=new HashMap<>();
     /**公式执行时的元素对象*/
     List<FormData> fds =new ArrayList<>();
     /**所有元素数据集*/
-    Map<String,FormData> formDataMap = new HashMap<>();
+   public Map<String,FormData> formDataMap = new HashMap<>();
     /**{tableName:{key:val}}*/
     Map<String,Map<String,String>> coordinateMap= new HashMap<>();
     /**{code:List<ElementData>}*/
     Map<String,ElementData> elementDataMap = new HashMap<>();
     /**跨表数据*/
-    Map<String,Map<String,Object>> tableDataMaps=new HashMap<>();
+    public Map<String,Map<String,Object>> tableDataMaps=new HashMap<>();
     /**当前节点相关信息*/
     CurrentNode currentNode;
     /**当前节点所有表节点对象*/
-    List<AppWbsTreeContractVO> tableAll;
+    List<NodeTable> tableAll;
     /**记录表公式执行的日志*/
     StringBuilder log;
     /**当前执行环境全局变量*/
@@ -70,7 +73,7 @@ public class TableElementConverter implements ITableElementConverter {
 
 
 
-    public TableElementConverter(List<TableInfo> tableInfoList, List<KeyMapper> keyMappers, List<Formula> formulas, Map<String,Map<String,String>> coordinateMap, CurrentNode wtc,List<AppWbsTreeContractVO> tableAll) {
+    public TableElementConverter(List<TableInfo> tableInfoList, List<KeyMapper> keyMappers, List<Formula> formulas, Map<String,Map<String,String>> coordinateMap, CurrentNode wtc,List<NodeTable> tableAll) {
         this.tableInfoList = tableInfoList;
         this.keyMappers = keyMappers;
         this.formulas = formulas;

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/IExcelTabService.java

@@ -22,6 +22,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.ExcelEditCallback;
 import org.springblade.manager.entity.ExcelTab;
+import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.vo.ExceTabTreVO;
 import org.springblade.manager.vo.ExcelTabVO;
 import org.springblade.core.mp.base.BaseService;
@@ -96,7 +97,7 @@ public interface IExcelTabService extends BaseService<ExcelTab> {
     /**
      * 公式填充
      */
-    void formulaFillData(List<TableInfo> tableInfoList, Long nodeId);
+    void formulaFillData(List<TableInfo> tableInfoList, Long nodeId, ExecuteType type);
 
     /**
      * 结果信息持久化

+ 51 - 30
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.mixsmart.utils.FormulaUtils;
 import com.mixsmart.utils.ListUtils;
 import com.mixsmart.utils.RegexUtils;
 import com.spire.xls.CellRange;
@@ -48,7 +49,9 @@ import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.core.tool.utils.*;
 import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.entity.*;
+import org.springblade.manager.enums.ExecuteType;
 import org.springblade.manager.formula.KeyMapper;
+import org.springblade.manager.formula.NodeTable;
 import org.springblade.manager.formula.impl.TableElementConverter;
 import org.springblade.manager.mapper.ExcelTabMapper;
 import org.springblade.manager.service.*;
@@ -320,46 +323,64 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     }
 
     @Override
-    public void formulaFillData(List<TableInfo> tableInfoList, Long nodeId) {
+    public void formulaFillData(List<TableInfo> tableInfoList, Long nodeId, ExecuteType type) {
         if (Func.isNotEmpty(tableInfoList)) {
-            /*用来保存日志执行情况*/
-            StringBuilder log = new StringBuilder();
-            /*每次都是部分表单提交,保证跨节点跨表取数正常,其次是反向依赖的被动刷新*/
-            List<AppWbsTreeContractVO> tableAll = wbsTreeContractService.searchNodeAllTable(nodeId.toString(), "1", tableInfoList.get(0).getContractId(), tableInfoList.get(0).getProjectId());
-            StopWatch stopWatch = new StopWatch();
-            List<KeyMapper> keyMappers = this.formulaService.getKeyMapperList(tableInfoList.stream().map(TableInfo::getPkeyId).filter(Func::isNotEmpty).map(Long::parseLong).collect(Collectors.toList()), tableInfoList.get(0).getProjectId(), String.valueOf(nodeId));
-            if (Func.isNotEmpty(keyMappers)) {
-                Map<String, Map<String, String>> coordinateMap = createCoordinateMap(keyMappers);
-                stopWatch.start("公式处理");
-                List<Formula> formulas = this.formulaService.getFormulaList(keyMappers);
-                WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
-                CurrentNode currentNode = createCurrentNode(wtc);
-                TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap, currentNode, tableAll);
-                tec.setLog(log);
-                if (tec.isPresent()) {
-                    tec.before();
-                    this.formulaService.execute(tec);
-                    tec.after();
-                } else {
-                    tec.getLog().append("【").append("没有执行任何公式").append("】");
+            try {
+                /*用来保存日志执行情况*/
+                StringBuilder log = new StringBuilder();
+                /*每次都是部分表单提交,保证跨节点跨表取数正常,其次是反向依赖的被动刷新*/
+                List<NodeTable> tableAll = createNodeTables(nodeId,tableInfoList.get(0).getContractId(),tableInfoList.get(0).getProjectId(),type);
+                StopWatch stopWatch = new StopWatch();
+                List<KeyMapper> keyMappers = this.formulaService.getKeyMapperList(tableInfoList.stream().map(TableInfo::getPkeyId).filter(Func::isNotEmpty).map(Long::parseLong).collect(Collectors.toList()), tableInfoList.get(0).getProjectId(), String.valueOf(nodeId));
+                if (Func.isNotEmpty(keyMappers)) {
+                    Map<String, Map<String, String>> coordinateMap = createCoordinateMap(keyMappers);
+                    stopWatch.start("公式处理");
+                    List<Formula> formulas = this.formulaService.getFormulaList(keyMappers);
+                    WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getPKeyId, nodeId));
+                    CurrentNode currentNode = createCurrentNode(wtc);
+                    TableElementConverter tec = new TableElementConverter(tableInfoList, keyMappers, formulas, coordinateMap, currentNode, tableAll);
+                    tec.setExecuteType(type);
+                    tec.setLog(log);
+                    if (tec.isPresent()) {
+                        tec.before();
+                        this.formulaService.execute(tec);
+                        tec.after();
+                    } else {
+                        tec.getLog().append("【").append("没有执行任何公式").append("】");
+                    }
+                    stopWatch.stop();
+                    Long totalTime = stopWatch.getTotalTimeMillis();
+                    log.append("公式执行消耗时间:").append(totalTime);
+                    StaticLog.info("公式执行用时:{}", totalTime);
+                    updateFormulaLog(log, wtc);
                 }
-                stopWatch.stop();
-                Long totalTime = stopWatch.getTotalTimeMillis();
-                log.append("公式执行消耗时间:").append(totalTime);
-                StaticLog.info("公式执行用时:{}", totalTime);
-                updateFormulaLog(log, wtc);
+            }catch (Exception e){
+                e.printStackTrace();
             }
         }
     }
 
+
+    private  List<NodeTable> createNodeTables(Long nodeId,String contractId,String projectId,ExecuteType type){
+        List<NodeTable> tableAll =new ArrayList<>();
+        if(type.equals(ExecuteType.INSPECTION)){
+            List<AppWbsTreeContractVO> treeNode = wbsTreeContractService.searchNodeAllTable(nodeId.toString(), "1", contractId, projectId);
+            tableAll = BeanUtil.copyProperties(treeNode,NodeTable.class);
+        }else if(type.equals(ExecuteType.TESTING)){
+            List<WbsTreePrivateVO4> wbsTreePrivateVO4s = wbsTreePrivateService.searchNodeAllTable(nodeId.toString(), "1", "9", contractId, projectId, null, null);
+             tableAll = BeanUtil.copyProperties(wbsTreePrivateVO4s,NodeTable.class);
+        }
+        return tableAll;
+    }
+
     private Map<String, Map<String, String>> createCoordinateMap(List<KeyMapper> keyMappers) {
         Map<String, Map<String, String>> coordinateMap = new HashMap<>(keyMappers.size() * 2);
         for (KeyMapper keyMapper : keyMappers) {
             if (!coordinateMap.containsKey(keyMapper.getTableName())) {
-                try {
-                    coordinateMap.put(keyMapper.getTableName(), getTablbCols(keyMapper.getPkId().toString(), null));
-                } catch (FileNotFoundException e) {
-                    e.printStackTrace();
+                WbsTreeContract wbsTreeContract = wbsTreeContractService.getBaseMapper().selectOne(Wrappers.<WbsTreeContract>query().lambda()
+                        .eq(WbsTreeContract::getPKeyId, keyMapper.getPkId()));
+                if(wbsTreeContract!=null&&Func.isNotBlank(wbsTreeContract.getHtmlUrl())) {
+                    coordinateMap.put(keyMapper.getTableName(), FormulaUtils.getElementCell(wbsTreeContract.getHtmlUrl()));
                 }
             }
         }

+ 102 - 162
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -78,10 +78,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     private   TableElementConverter tec;
 //    private   Map<String,Object> constantMap;
 //    private   List<FormData> formDataList;
-    private   Map<String,FormData> formDataMap;
-    private   Map<String,Map<String,Object>> tableDataMaps;
-
-
+//    private   Map<String,FormData> formDataMap;
+//    private   Map<String,Map<String,Object>> tableDataMaps;
     public final static String WP="WP";
     public final static String CHAIN="trees";
     public final static String FC="FC.";
@@ -116,27 +114,47 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
 
     @Override
     public IFormulaService init() {
-        this.tableDataMaps=this.tec.getTableDataMaps();
-        this.formDataMap=this.tec.getFormDataMap();
+        /*基础数据*/
+        baseData();
+        /*依赖加载*/
+        checkingMissingList();
+        /*实测值参数*/
+        textInfo();
+        /*公式参数*/
+        option();
+        /*评定表*/
+        assessmentForm();
+        return this;
+    }
+
+    public  void option(){
+        FormulaOption formulaOption = this.formulaOptionService.getOne(Wrappers.<FormulaOption>lambdaQuery().eq(FormulaOption::getParentId,tec.getCurrentNode().getRelateId()).eq(FormulaOption::getContractId,tec.getContractId()));
+        if(formulaOption!=null){
+            tec.constantMap.put(FMOT,JSON.parseObject(formulaOption.getVal(),LinkedHashMap.class));
+        }
+    }
+
+    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();
-        Long contractId=this.tec.getContractId();
         CurrentNode one=this.tec.getCurrentNode();
-        Long id =one.getId();
-        Long primaryKeyId=one.getPkId();
         tec.formDataList=list;
-        tec.constantMap.put("contractId",contractId);
         keyWord(tec.constantMap);
-        ContractInfo info =this.contractInfoService.getById(contractId);
-        /*合同段信息*/
-        tec.constantMap.put(CTI,info);
-        /*项目信息*/
+        ContractInfo info =this.contractInfoService.getById(tec.getContractId());
         ProjectInfo pji=this.projectInfoService.getById(info.getPId());
         tec.setProjectId(pji.getId());
-        tec.constantMap.put(PJI,pji);
         /*wbs节点链*/
-        List<WbsTreeContract> nodes = wpService.chain(contractId,id,primaryKeyId,null);
+        List<WbsTreeContract> nodes = wpService.chain(tec.getContractId(),one.getId(),one.getPkId(),null);
         if(Func.isEmpty(nodes)){
-            nodes=wpService.chain(contractId,one.getRelateId(),primaryKeyId,null);
+            nodes=wpService.chain(tec.getContractId(),one.getRelateId(),one.getPkId(),null);
         }
         if(Func.isEmpty(nodes)){
             this.tec.getLog().append("【WBS信息缺失】");
@@ -145,51 +163,39 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         /*节点参数*/
         tec.constantMap.put(WP,getWpMap(one));
         /*表格名称*/
-        List<AppWbsTreeContractVO> tableList =wbsTreeContractService.searchNodeAllTable(primaryKeyId.toString(), "1", contractId.toString(),info.getPId());
+        List<AppWbsTreeContractVO> tableList =wbsTreeContractService.searchNodeAllTable(one.getPkId().toString(), "1", tec.getContractId().toString(),info.getPId());
         tec.constantMap.put(TABLE_LIST,tableList);
         /*通过判断元素名称来确定,加入汇总公式延后执行*/
-      //  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().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<>();
-        tec.formDataList.forEach(fd->{
-            if(fd.executable()){
-                relyParse(fd.getFormula());
-                Formula f= fd.getFormula();
-                List<String> relyList=f.getRelyList();
-                if(Func.isNotEmpty(relyList)){
-                    relyList.forEach(r->{
-                        if(this.formDataMap.values().stream().map(FormData::getCode).noneMatch(k->StringUtils.isEquals(k,r))){
-                            missingList.add(r);
-                        }
-                    });
-                }
-            }
-        });
-
-        missingFill(missingList);
-        if(Func.isNotEmpty(missingList)){
-            this.tec.getLog().append("【没有能加载的跨节点数据:").append(missingList.stream().map(e->e.replaceAll("'","")).collect(Collectors.joining(","))).append("】");
-        }
 
+    /**补充确实的原始依赖*/
+   public void checkingMissingList(){
+       List<String> missingList = new ArrayList<>();
+       tec.formDataList.forEach(fd->{
+           if(fd.executable()){
+               relyParse(fd.getFormula());
+               Formula f= fd.getFormula();
+               List<String> relyList=f.getRelyList();
+               if(Func.isNotEmpty(relyList)){
+                   relyList.forEach(r->{
+                       if(tec.formDataMap.values().stream().map(FormData::getCode).noneMatch(k->StringUtils.isEquals(k,r))){
+                           missingList.add(r);
+                       }
+                   });
+               }
+           }
+       });
 
-        /*实测值参数*/
-        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(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()));
-            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){
-           tec.constantMap.put(FMOT,JSON.parseObject(formulaOption.getVal(),LinkedHashMap.class));
-        }
-        /*评定表*/
-        assessmentForm();
-        return this;
+       missingFill(missingList);
+       if(Func.isNotEmpty(missingList)){
+           tec.getLog().append("【没有能加载的跨节点数据:").append(missingList.stream().map(e->e.replaceAll("'","")).collect(Collectors.joining(","))).append("】");
+       }
     }
 
+
     public  FormulaDataBlock findFdb(){
         /*查找第一个包含分项评定子节点的父节点*/
         Long ancestor=findFirstParentId();
@@ -222,7 +228,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
         return parentId;
     }
-    /*评定表处理*/
+    /**评定表处理*/
     public void assessmentForm(){
         try {
             if (tec.getTableAll().stream().anyMatch(e -> StringUtils.isEquals(e.getTableType(), 5))) {
@@ -231,7 +237,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 if (!StringUtils.isEquals("[]", fdb.getVal())) {
                     List<ElementBlock> elementBlockList = JSON.parseArray(fdb.getVal(), ElementBlock.class);
                     Map<String, Measurement> itemsMap = new HashMap<>();
-                    this.formDataMap.values().stream().filter(FormData::getIsCurrentNodeElement).forEach(e -> {
+                    tec.formDataMap.values().stream().filter(FormData::getIsCurrentNodeElement).forEach(e -> {
                         String eName = e.getEName();
                         if (eName.contains("实测") && !eName.contains("平均") && !eName.contains("合格率") && !eName.contains("判")) {
                             String point = FormulaUtils.parseItemName(eName);
@@ -327,64 +333,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     }
 
 
-    /**评定表自动匹配*/
-//    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){
         /*数据池里面没有任何元素匹配和当前依赖匹配*/
@@ -397,15 +346,16 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 for (String r : missingList) {
                     String tn = r.substring(0, r.indexOf(StringPool.COLON));
                     String key = r.substring(r.indexOf(StringPool.COLON) + 1);
-                    List<AppWbsTreeContractVO> nodeList = this.tec.getTableAll().stream().filter(e -> e.getInitTableName().equals(tn)).collect(Collectors.toList());
+                    List<NodeTable> nodeList = this.tec.getTableAll().stream().filter(e -> e.getInitTableName().equals(tn)).collect(Collectors.toList());
                     if (Func.isNotEmpty(nodeList)) {
                         removeList.add(r);
+                        @SuppressWarnings("unchecked")
                         Map<String, Object> elementInfo = (Map<String, Object>) elementInfoMap.get(r);
                         String tableName = nodeList.get(0).getInitTableName();
                         if (!this.tec.getCoordinateMap().containsKey(tableName)) {
-                            this.tec.getCoordinateMap().put(tableName, CustomFunction.getElementCell(nodeList.get(0).getHtmlUrl()));
+                            this.tec.getCoordinateMap().put(tableName, FormulaUtils.getElementCell(nodeList.get(0).getHtmlUrl()));
                         }
-                        List<Map<String, Object>> tableDatas = this.jdbcTemplate.queryForList("select * from " + tableName + " where p_key_id in(" + nodeList.stream().map(AppWbsTreeContractVO::getPKeyId).map(StringUtils::handleNull).collect(Collectors.joining(",")) + ")");
+                        List<Map<String, Object>> tableDatas = this.jdbcTemplate.queryForList("select * from " + tableName + " where p_key_id in(" + nodeList.stream().map(NodeTable::getPKeyId).map(StringUtils::handleNull).collect(Collectors.joining(",")) + ")");
                         fill(tableDatas, removeList, tn, key, StringUtils.handleNull(elementInfo.get("ename")));
                     }
                 }
@@ -421,6 +371,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 if(Func.isNotEmpty(tableNamePkIdsMaps)){
                    // removeList.clear();
                     missingList.forEach(miss->{
+                        @SuppressWarnings("unckecked")
                         Map<String,Object> elementInfo= (Map<String, Object>) elementInfoMap.get(miss);
                         String tn = miss.substring(0,miss.indexOf(StringPool.COLON));
                         String key =miss.substring(miss.indexOf(StringPool.COLON)+1);
@@ -428,7 +379,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         if(Func.isNotEmpty(targetIds)){
                             if(!this.tec.getCoordinateMap().containsKey(tn)){
                                 tableNamePkIdsMaps.stream().filter(m->StringUtils.isEquals(m.get("tableName"),tn)).findAny().ifPresent(m->{
-                                    this.tec.getCoordinateMap().put(tn,CustomFunction.getElementCell(StringUtils.handleNull(m.get("url"))));
+                                    this.tec.getCoordinateMap().put(tn,FormulaUtils.getElementCell(StringUtils.handleNull(m.get("url"))));
                                 });
                             }
                             List<Map<String,Object>> tableDatas= this.jdbcTemplate.queryForList("select * from "+tn+" where p_key_id in ("+targetIds+")");
@@ -455,12 +406,12 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     }
                 }
             });
-            this.tableDataMaps.put(tn,map);
+            tec.tableDataMaps.put(tn,map);
             String values= StringUtils.handleNull(map.get(key));
             String r= tn+StringPool.COLON+key;
             FormData tmp=createFormDataFast(name,r,values);
             if(tmp!=null){
-                this.formDataMap.put(r,tmp);
+                tec.formDataMap.put(r,tmp);
             }
         }
     }
@@ -544,7 +495,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
         this.tec.getLog().append("【本节点参数情况:").append(result.entrySet().stream().map(p->logMap.get(p.getKey())+":"+p.getValue()).collect(Collectors.joining(";"))).append("】");
         /*元素动态绑定*/
-        this.formDataMap.values().stream().filter(e->e.getIsCurrentNodeElement()&&e.getFormula()==null).forEach(e->{
+        tec.formDataMap.values().stream().filter(e->e.getIsCurrentNodeElement()&&e.getFormula()==null).forEach(e->{
             /*执行列表里不存在,且元素的名称和节点参数名称匹配成功*/
             total.stream().filter(p->e.getEName().contains(p.getName().replace("【水】","").trim())&&!tec.formDataList.contains(e)).findAny().ifPresent(d->{
                 Formula  formula=new Formula();
@@ -596,28 +547,28 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         tec.formDataList.stream().filter(FormData::executable).filter(e->StringUtils.isEquals("CKI",e.getFormula().getNumber())||StringUtils.isEquals("CKD",e.getFormula().getNumber())).forEach(t->tec.summary.add(t));
         tec.formDataList.removeAll(tec.summary);
         /*监表的处理*/
-        Optional<AppWbsTreeContractVO> aop=tec.getTableAll().stream().filter(e->e.getNodeName().contains("A15")).findAny();
+        Optional<NodeTable> aop=tec.getTableAll().stream().filter(e->e.getNodeName().contains("A15")).findAny();
         if(aop.isPresent()){
             /*存在监表,则需要收集检查项目和检查时间等元素*/
-            List<String> wop=tec.getTableAll().stream().filter(e->e.getNodeName().contains("检验单")||e.getNodeName().contains("检验表")).map(AppWbsTreeContractVO::getInitTableName).distinct().collect(Collectors.toList());
+            List<String> wop=tec.getTableAll().stream().filter(e->e.getNodeName().contains("检验单")||e.getNodeName().contains("检验表")).map(NodeTable::getInitTableName).distinct().collect(Collectors.toList());
             if(wop.size()>0){
                 /*存在检验表*/
-                tec.getKeyMappers().stream().filter(e->wop.contains(e.getTableName())&&this.formDataMap.containsKey(e.getCode())).forEach(k->{
+                tec.getKeyMappers().stream().filter(e->wop.contains(e.getTableName())&&tec.formDataMap.containsKey(e.getCode())).forEach(k->{
                     if(k.getEName().contains("实测值")&&k.getEName().contains("偏差值")){
-                        tec.checkItems.add(this.formDataMap.get(k.getCode()));
+                        tec.checkItems.add(tec.formDataMap.get(k.getCode()));
                     }else if(k.getEName().contains("检验日期")){
-                        tec.checkDate.add(this.formDataMap.get(k.getCode()));
+                        tec.checkDate.add(tec.formDataMap.get(k.getCode()));
                     }
                 });
             }else{
                 /*不存在检验表的的情况则获取记录表*/
-                List<String> recordTable=tec.getTableAll().stream().filter(e->StringUtils.isEquals(2,e.getTableType())).map(AppWbsTreeContractVO::getInitTableName).distinct().collect(Collectors.toList());
+                List<String> recordTable=tec.getTableAll().stream().filter(e->StringUtils.isEquals(2,e.getTableType())).map(NodeTable::getInitTableName).distinct().collect(Collectors.toList());
                 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("实测值")){
-                        tec.checkItems.add(this.formDataMap.get(ka[0]));
+                        tec.checkItems.add(tec.formDataMap.get(ka[0]));
                     }else if(ka[1].contains("日期")||ka[1].contains("年月日")){
-                        tec.checkDate.add(this.formDataMap.get(ka[0]));
+                        tec.checkDate.add(tec.formDataMap.get(ka[0]));
                     }
                 });
 
@@ -625,7 +576,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         }
         if(tec.checkItems.size()>0){
             /**排序*/
-            List<String> iniTableNames=tec.getTableAll().stream().map(AppWbsTreeContractVO::getInitTableName).distinct().collect(Collectors.toList());
+            List<String> iniTableNames=tec.getTableAll().stream().map(NodeTable::getInitTableName).distinct().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();
@@ -667,7 +618,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     }
                 }
                 fd.getFormula().setFormula(tmp);
-                this.formDataMap.put(fd.getCode(),fd);
+                tec.formDataMap.put(fd.getCode(),fd);
             }
         }
 
@@ -705,7 +656,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
     /**通用计算*/
     public void generalCalc(){
         String checkTable ="";
-        Optional<AppWbsTreeContractVO> op=tec.getTableAll().stream().filter(e->StringUtils.isEquals(1,e.getTableType())).findAny();
+        Optional<NodeTable> op=tec.getTableAll().stream().filter(e->StringUtils.isEquals(1,e.getTableType())).findAny();
         if(op.isPresent()){
             checkTable=op.get().getInitTableName();
         }
@@ -733,16 +684,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             }
                             if(fd.getCoordsList().size()>1&&f.split("[/+\\-*]").length>1){
                                 LinkedHashMap<String,FormData> fdMap =new LinkedHashMap<>();
-//                                Optional<FormData> tto= ele.stream().max(Comparator.comparingInt(fe->fe.getValues().size()));
-//                                Optional<FormData> tts= ele.stream().min(Comparator.comparingInt(fe->fe.getValues().size()));
-//                                if(tto.isPresent()&&tts.isPresent()){
-//                                    if(tto.get().getValues().size()!=tts.get().getValues().size()){
-//                                        int baseLength=tto.get().getValues().size();
-//                                        ele.forEach(e->{
-//                                            e.setStep(baseLength/e.getValues().size());
-//                                        });
-//                                    }
-//                                }
                                 FormData maxFormData = Collections.max(ele, Comparator.comparingInt((FormData ef)->ef.getValues().size()));
                                 FormData minFormData = Collections.min(ele, Comparator.comparingInt((FormData ef)->ef.getValues().size()));
                                 if (maxFormData.getValues().size() != minFormData.getValues().size()) {
@@ -817,7 +758,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 /*获取所有挂在表里的元素映射关系*/
                 this.tec.getKeyMappers().stream().filter(p -> p.getPkId().equals(e.getPKeyId())).forEach(k -> {
                     /*元素长度筛选超页的元素*/
-                    List<FormData> target = this.formDataMap.values().stream().filter(f -> f.getCode().equals(k.getCode()) && f.getAddPages() > 0).collect(Collectors.toList());
+                    List<FormData> target = tec.formDataMap.values().stream().filter(f -> f.getCode().equals(k.getCode()) && f.getAddPages() > 0).collect(Collectors.toList());
                     if (Func.isNotEmpty(target)) {
                         inspectionList.addAll(target);
                     }
@@ -825,7 +766,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             });
             if (Func.isNotEmpty(inspectionList)) {
                 /*检查是否存在附表,不存在挂载*/
-                List<AppWbsTreeContractVO> subTabList = this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("附表")).collect(Collectors.toList());
+                List<NodeTable> subTabList = this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("附表")).collect(Collectors.toList());
                 if (subTabList.size() == 0) {
                     boolean pd=tec.getTableAll().stream().anyMatch(e->e.getNodeName().contains("评定表"));
                     WbsTreePrivate sub = wbsTreePrivateService.getOne(Wrappers.<WbsTreePrivate>lambdaQuery().and(e->e.eq(WbsTreePrivate::getNodeName, pd?"质量检验评定表(附表)":"质量检验表(附表)").or().eq(WbsTreePrivate::getFullName, pd?"质量检验评定表(附表)":"质量检验表(附表)")).eq(WbsTreePrivate::getProjectId, tec.getProjectId()).eq(WbsTreePrivate::getIsLinkTable,2));
@@ -833,27 +774,27 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         this.tec.getLog().append("该项目没有挂有附表信息");
                     } else {
                         this.wbsTreePrivateService.addWbsTreeContractInfo(this.tec.getCurrentNode().getPkId().toString(), sub.getPKeyId().toString(), tec.getContractId());
-                        AppWbsTreeContractVO one = this.tec.getTableAll().get(0);
-                        WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, one.getParentId()).eq(WbsTreeContract::getContractId,one.getContractId()).eq(WbsTreeContract::getWbsId, one.getWbsId()).and(e->e.eq(WbsTreeContract::getNodeName, pd?"质量检验评定表(附表)":"质量检验表(附表)").or().eq(WbsTreeContract::getFullName, pd?"质量检验评定表(附表)":"质量检验表(附表)")));
+                        NodeTable one = this.tec.getTableAll().get(0);
+                        WbsTreeContract wtc = this.wbsTreeContractService.getOne(Wrappers.<WbsTreeContract>lambdaQuery().eq(WbsTreeContract::getParentId, one.getParentId()).eq(WbsTreeContract::getContractId,tec.getContractId()).eq(WbsTreeContract::getWbsId, one.getWbsId()).and(e->e.eq(WbsTreeContract::getNodeName, pd?"质量检验评定表(附表)":"质量检验表(附表)").or().eq(WbsTreeContract::getFullName, pd?"质量检验评定表(附表)":"质量检验表(附表)")));
                         if (wtc != null) {
                             /*附表的顺序在检验单或者评定表之后*/
-                            int sort=this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("检验单") || e.getNodeName().contains("评定表")).map(AppWbsTreeContractVO::getSort).max(Integer::compareTo).orElse(30);
+                            int sort=this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("检验单") || e.getNodeName().contains("评定表")).map(NodeTable::getSort).max(Integer::compareTo).orElse(30);
                             this.wbsTreeContractService.update(Wrappers.<WbsTreeContract>lambdaUpdate()
                                     .set(WbsTreeContract::getSort,sort).set(WbsTreeContract::getContractType,-1).set(WbsTreeContract::getAncestors,one.getAncestors())
                                     .set(WbsTreeContract::getIsCopeTab,2)
                                     .eq(WbsTreeContract::getPKeyId,wtc.getPKeyId()));
                             /*只需要挂载一张*/
-                            AppWbsTreeContractVO obj = BeanUtil.copy(wtc, AppWbsTreeContractVO.class);
-                            this.tec.getTableAll().add(obj);
+                            NodeTable obj = BeanUtil.copy(wtc, NodeTable.class);
+                            tec.getTableAll().add(obj);
                             subTabList.add(obj);
                         }
                     }
                 }
-                AppWbsTreeContractVO first = subTabList.get(0);
+                NodeTable first = subTabList.get(0);
                 if (tec.getTableInfoList().stream().noneMatch(e -> StringUtils.isEquals(e.getPkeyId(), first.getPKeyId()))) {
                     /*找不到附表表单数据,则从数据库加载*/
                     JSONArray dataArray = new JSONArray();
-                    for (WbsTreeContract data : subTabList) {
+                    for (NodeTable data : subTabList) {
                         /*自动挂载附表情况下,装配TableInfo数据*/
                         R bussDataInfo = this.getBussDataInfo(data.getPKeyId(), 1);
                         @SuppressWarnings("unchecked")
@@ -873,7 +814,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     });
                     tec.getTableInfoList().addAll(subTableInfo);
                     /*获取附表元素定位集*/
-                    tec.getCoordinateMap().put(subTabList.get(0).getInitTableName(), CustomFunction.getElementCell(first.getHtmlUrl()));
+                    tec.getCoordinateMap().put(subTabList.get(0).getInitTableName(), FormulaUtils.getElementCell(first.getHtmlUrl()));
                     /*附表元素关键信息*/
                     List<Map<String, Object>> elementMaps = this.jdbcTemplate.queryForList("select b.e_name ename , CONCAT(a.tab_en_name,':',b.e_key) code , b.e_key ekey ,b.id fieldId,a.tab_en_name tableName from m_table_info a join m_wbs_form_element b on a.id = b.f_id where a.tab_en_name='" + first.getInitTableName() + "' and b.is_deleted=0 ");
                     if (Func.isNotEmpty(elementMaps)) {
@@ -883,7 +824,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             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);
+                                tec.formDataMap.put(tmp.getCode(),tmp);
                                 tec.formDataList.add(tmp);
                             }
                         });
@@ -902,7 +843,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     }
                 }
                 /*获取封装好的附表元素*/
-                List<FormData> subTableFds=this.formDataMap.values().stream().filter(e->StringUtils.isEquals(first.getInitTableName(),e.getTableName())).collect(Collectors.toList());
+                List<FormData> subTableFds=tec.formDataMap.values().stream().filter(e->StringUtils.isEquals(first.getInitTableName(),e.getTableName())).collect(Collectors.toList());
                 /*初始化附表对象*/
                 SubTable sta=new SubTable(subTableFds);
                 /*根据行号排序*/
@@ -915,7 +856,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     String itemName=FormulaUtils.parseItemName(f.getEName());
                     String key=itemName.trim();
                     /*同项目*/
-                    Optional<FormData> designFdOp=  this.formDataMap.values().stream().filter(o->o.getTableName().equals(f.getTableName())&&StringUtils.isEquals(itemName,FormulaUtils.parseItemName(o.getEName()))&&o.getEName().contains("设计值")&&!o.getEName().contains("判定")).findAny();
+                    Optional<FormData> designFdOp=  tec.formDataMap.values().stream().filter(o->o.getTableName().equals(f.getTableName())&&StringUtils.isEquals(itemName,FormulaUtils.parseItemName(o.getEName()))&&o.getEName().contains("设计值")&&!o.getEName().contains("判定")).findAny();
                     if(designFdOp.isPresent()){
                         key+="@"+designFdOp.get().getValues().stream().map(ElementData::getValue).filter(StringUtils::isNotEmpty).findAny().orElse("");
                     }
@@ -925,7 +866,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     /*把附表数据刷入对应的附表元素对象*/
                     sta.flush();
                 }
-                String mainTableName = this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("检验单") || e.getNodeName().contains("评定表")).map(AppWbsTreeContractVO::getInitTableName).findFirst().orElse("");
+                String mainTableName = this.tec.getTableAll().stream().filter(e -> e.getNodeName().contains("检验单") || e.getNodeName().contains("评定表")).map(NodeTable::getInitTableName).findFirst().orElse("");
                 if(Func.isNotBlank(mainTableName)){
                     List<FormData> sourceFds=tec.getFormDataMap().values().stream().filter(s->!s.empty()).filter(s->StringUtils.isEquals(s.getTableName(),mainTableName)).collect(Collectors.toList());
                     Map<String,Object> copyMap= new HashMap<>();
@@ -1089,7 +1030,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             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);
     }
 
@@ -1161,7 +1101,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
            //enlarge(fd,pageAdd);
        }
        /*复制只有一个单元格的元素*/
-       this.formDataMap.values().stream().filter(e->StringUtils.isEquals(e.getTableName(),fd.getTableName())&&fd.getCoordsList().size()==1).forEach(t->{
+       tec.formDataMap.values().stream().filter(e->StringUtils.isEquals(e.getTableName(),fd.getTableName())&&fd.getCoordsList().size()==1).forEach(t->{
            ElementData data=t.getValues().get(t.getValues().size()-1);
            int start =data.getIndex();
            for(int i=0;i<pageAdd;i++){
@@ -1195,7 +1135,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
             }
         }
         /*检查超页情况*/
-        this.formDataMap.values().stream().filter(e->e.getIsCurrentNodeElement()&&e.getUpdate()==1&&e.getAddPages()>0).sorted(Comparator.comparing(FormData::getAddPages).reversed())
+        tec.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)));
     }
@@ -1482,8 +1422,8 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
                                  data=  d.getPassList().stream().mapToInt(Func::toInt).count();
                              }
                          }else{
-                             FormData dataFd=this.formDataMap.get(codeList.get(0));
-                             FormData designFd=this.formDataMap.get(codeList.get(1));
+                             FormData dataFd=tec.formDataMap.get(codeList.get(0));
+                             FormData designFd=tec.formDataMap.get(codeList.get(1));
                              if(dataFd!=null&&designFd!=null){
                                  if(dataFd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isNotEmpty)&&(designFd.getValues().size()>1||designFd.getValues().stream().map(ElementData::getValue).anyMatch(StringUtils::isEmpty))){
                                      /*多少个设计值暂时默认全部合格,满足绝大部分结果*/
@@ -1595,7 +1535,7 @@ public  List<ElementData> setScale(Integer scale,List<ElementData> data){
         String[] tfa=codes.split(",");
         for(String code:tfa){
             code=code.replace("E['","").replace("']","");
-            FormData fdt=this.formDataMap.get(code);
+            FormData fdt=tec.formDataMap.get(code);
             if(fdt!=null){
                 target.add(fdt);
             }

+ 2 - 6
blade-service/blade-system/blade-system.iml

@@ -20,12 +20,6 @@
     </content>
     <orderEntry type="inheritedJdk" />
     <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="blade-system-api" />
-    <orderEntry type="module" module-name="blade-manager-api" />
-    <orderEntry type="module" module-name="blade-business-api" />
-    <orderEntry type="module" module-name="blade-common" />
-    <orderEntry type="module" module-name="blade-dict-api" />
-    <orderEntry type="module" module-name="blade-scope-api" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-boot:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-context:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-core-db:2.9.1.RELEASE" level="project" />
@@ -302,6 +296,8 @@
     <orderEntry type="library" name="Maven: io.opentracing:opentracing-noop:0.33.0" level="project" />
     <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-ram:3.1.0" level="project" />
     <orderEntry type="library" name="Maven: com.aliyun:aliyun-java-sdk-kms:2.11.0" level="project" />
+    <orderEntry type="library" name="Maven: com.drewnoakes:metadata-extractor:2.16.0" level="project" />
+    <orderEntry type="library" name="Maven: com.adobe.xmp:xmpcore:6.1.11" level="project" />
     <orderEntry type="library" name="Maven: org.springblade:blade-starter-metrics:2.9.1.RELEASE" level="project" />
     <orderEntry type="library" name="Maven: io.micrometer:micrometer-core:1.6.3" level="project" />
     <orderEntry type="library" name="Maven: org.hdrhistogram:HdrHistogram:2.1.12" level="project" />