Explorar o código

公式相关:动态范围查找元素

yangyj %!s(int64=2) %!d(string=hai) anos
pai
achega
f7b0914dbe

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

@@ -1,7 +1,6 @@
 package org.springblade.manager.formula.impl;
 
 
-import cn.hutool.core.util.StrUtil;
 import cn.hutool.log.StaticLog;
 import com.mixsmart.utils.StringUtils;
 import lombok.Data;
@@ -13,14 +12,12 @@ 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.entity.WbsTreeContract;
 import org.springblade.manager.formula.ITableElementConverter;
 import org.springblade.manager.formula.KeyMapper;
 import org.springblade.manager.vo.AppWbsTreeContractVO;
 import org.springblade.manager.vo.CurrentNode;
 
 import java.util.*;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -44,7 +41,7 @@ public class TableElementConverter implements ITableElementConverter {
     Map<Long,Formula> formulaMap=new HashMap<>();
     /**公式执行时的元素对象*/
     List<FormData> fds =new ArrayList<>();
-    /*所有元素数据集*/
+    /**所有元素数据集*/
     Map<String,FormData> formDataMap = new HashMap<>();
     /**{tableName:{key:val}}*/
     Map<String,Map<String,String>> coordinateMap;
@@ -52,7 +49,10 @@ public class TableElementConverter implements ITableElementConverter {
     Map<String,ElementData> elementDataMap = new HashMap<>();
     CurrentNode currentNode;
     List<AppWbsTreeContractVO> tableAll;
-
+    /**记录表公式执行的日志*/
+    StringBuilder log;
+    /**元素取数日志*/
+    Pattern RP= Pattern.compile("(?<=E\\[)[^]]+(?=])");
 
     public TableElementConverter(List<TableInfo> tableInfoList, List<KeyMapper> keyMappers, List<Formula> formulas, Map<String,Map<String,String>> coordinateMap, CurrentNode wtc,List<AppWbsTreeContractVO> tableAll) {
         this.tableInfoList = tableInfoList;
@@ -82,7 +82,7 @@ public class TableElementConverter implements ITableElementConverter {
     public void relyParse(Formula f){
         if(Func.isNotBlank(f.getFormula())){
             List<String> l = new ArrayList<>();
-            Matcher m = Pattern.compile("(?<=E\\[)[^]]+(?=\\])").matcher(f.getFormula());
+            Matcher m = RP.matcher(f.getFormula());
             while (m.find()){
                 l.add(m.group());
             }
@@ -152,7 +152,8 @@ public class TableElementConverter implements ITableElementConverter {
                                  String[] sa=k.split(StringPool.AT);
                                  eds.add(new ElementData(Func.toInt(sa[2]),Func.toInt(sa[1]),val,Func.toInt(sa[3]),Func.toInt(sa[4])));
                             });
-                            StaticLog.error("FORMULA_LOG@元素{}定位信息不存在,请检查配置",fd.getTableName()+StringPool.COLON+fd.getKey());
+                            log.append(fd.getEName()).append(fd.getCode()).append("定位信息不存在;");
+                           // StaticLog.error("FORMULA_LOG@元素{}定位信息不存在,请检查配置",fd.getTableName()+StringPool.COLON+fd.getKey());
                         }
                     }
                 }

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

@@ -325,6 +325,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
     @Override
     public void formulaFillData(List<TableInfo> tableInfoList, Long nodeId) {
         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();
@@ -346,13 +348,21 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                 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();
                 }
                 stopWatch.stop();
-                StaticLog.info("公式执行用时:{}", stopWatch.getTotalTimeMillis());
+                Long totalTime=stopWatch.getTotalTimeMillis();
+                log.append("公式执行消耗时间:").append(totalTime);
+                StaticLog.info("公式执行用时:{}", totalTime);
+                String[] sql=new String[]{
+                        "delete from m_formula_log where id ="+wtc.getPKeyId(),
+                        "INSERT INTO m_formula_log (id,content) VALUES ("+wtc.getPKeyId()+", '"+log+"')"
+                };
+                this.jdbcTemplate.batchUpdate(sql);
             }
         }
     }

+ 21 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -124,6 +124,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         if(Func.isEmpty(nodes)){
             nodes=wpService.chain(contractId,one.getRelateId(),primaryKeyId,null);
         }
+        if(Func.isEmpty(nodes)){
+            this.tec.getLog().append("WBS信息缺失;");
+        }
         this.constantMap.put(CHAIN,nodes.stream().map(WbsTreeContract::getNodeName).collect(Collectors.toList()));
         /*节点参数*/
         this.constantMap.put(WP,getWpMap(one));
@@ -149,6 +152,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             }
         });
         missingFill(missingList);
+        if(Func.isNotEmpty(missingList)){
+            this.tec.getLog().append("无法识别的依赖:").append(missingList.stream().map(e->e.replaceAll("'","")).collect(Collectors.joining(",")));
+        }
         /*实测值参数*/
         List<Map<String,Object>>  textInfoMap= this.jdbcTemplate.queryForList("SELECT b.tab_id pkId, b.col_key ekey,b.col_name val ,c.init_table_name tableName " +
                 "from m_wbs_tree_contract a " +
@@ -342,6 +348,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                 result.put(p.getK(),p.getV());
             }
         }
+        this.tec.getLog().append("本节点参数情况:").append(result.entrySet().stream().map(p->p.getKey()+":"+p.getValue()).collect(Collectors.joining(";")));
         /*元素动态绑定*/
         this.formDataMap.values().stream().filter(e->e.getIsCurrentNodeElement()&&e.getFormula()==null).forEach(e->{
             /*执行列表里不存在,且元素的名称和节点参数名称匹配成功*/
@@ -356,6 +363,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     formula.setFormula("WP["+d.getK()+"]");
                 }
                 e.setFormula(formula);
+                tec.getLog().append("动态绑定参数:").append(e.getEName()).append(";");
                 this.formDataList.add(e);
             });
         });
@@ -464,7 +472,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                                }
                             });
                             if(ele.size()<relyList.size()){
-                                System.out.println(formula.getFormula()+"不满足依赖要求");
+                                this.tec.getLog().append(fd.getEName()).append(fd.getFormula().getFormula().replaceAll("'", "")).append("不满足执行依赖;");
                             }
                             LinkedHashMap<String,FormData> fdMap =new LinkedHashMap<>();
                             ele.forEach(e->{
@@ -504,7 +512,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             write(fd,data);
                         }
                     }catch (Exception e){
-                        write(fd,"计算错误");
+                       tec.getLog().append(fd.getEName()).append("计算错误; ");
                     }
 
                 }
@@ -702,9 +710,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
      * 先把公式脚本需要聚合部分预处理
      * */
     public void  polymerization(FormData fd){
-//        for(FormData fd:this.formDataList){
-//            Formula formula = fd.getFormula();
-//        }
         Formula formula = fd.getFormula();
         if(Func.isNotEmpty(formula)){
             String f=formula.getFormula();
@@ -730,9 +735,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             }else{
                                 Map<String, Object> currentMap = new HashMap<>(this.constantMap);
                                 List<String> relyList = fd.getFormula().getRelyList();
-                                List<FormData> tmp = this.formDataList.stream().filter(e -> relyList.contains(e.getCode())).collect(Collectors.toList());
                                 Map<String, Object> E = getMap(currentMap, "E");
-                                tmp.forEach(e -> E.put(e.getCode(), e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList())));
+                                for(String k:relyList){
+                                    FormData e=this.formDataMap.get(k);
+                                    if(e==null){
+                                        this.tec.getLog().append(fd.getEName()).append("缺失依赖:").append(k);
+                                        return;
+                                    }
+                                    E.put(e.getCode(),e.getValues().stream().map(ElementData::getValue).collect(Collectors.toList()));
+                                }
                                 data = Expression.parse(CustomFunction.CLASS_CALL + m.group()).calculate(currentMap);
                             }
                             String key ="HA"+HashUtil.identityHashCode(data);
@@ -824,9 +835,9 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     if(args.size()<18){
                         args.addAll(Collections.nCopies(18-args.size(),"''"));
                         System.out.println("原:"+formula);
-                        String newformula=("FC."+fn+"("+String.join(",",args)+")");
-                        System.out.println("改:"+newformula);
-                        this.update(Wrappers.<Formula>lambdaUpdate().set(Formula::getFormula,newformula).eq(Formula::getId,ident));
+                        String newFormula=("FC."+fn+"("+String.join(",",args)+")");
+                        System.out.println("改:"+newFormula);
+                        this.update(Wrappers.<Formula>lambdaUpdate().set(Formula::getFormula,newFormula).eq(Formula::getId,ident));
                     }
                 }
             }