Browse Source

公式相关

yangyj 2 years ago
parent
commit
ac4b9ce8b3

+ 8 - 0
blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/OperatorResultNode.java

@@ -22,6 +22,14 @@ public abstract class OperatorResultNode implements CalculateNode {
 		rightOperand = node;
 	}
 
+	public CalculateNode getLeftOperand() {
+		return leftOperand ;
+	}
+	public CalculateNode getRightOperand() {
+		return rightOperand ;
+	}
+
+
 	@Override
 	public TokenType type() {
 		return Token.OPERATOR_RESULT;

+ 3 - 1
blade-service/blade-manager/src/main/java/com/jfireel/expression/node/impl/StaticObjectMethodNode.java

@@ -123,7 +123,9 @@ public class StaticObjectMethodNode implements MethodNode {
 		this.argsNodes = argsNodes;
 		type = Token.METHOD_RESULT;
 	}
-
+	public CalculateNode[] getArgsNodes(){
+		return this.argsNodes;
+	}
 	@Override
 	public String literals() {
 		StringBuilder cache = new StringBuilder();

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

@@ -1,13 +1,24 @@
 package com.mixsmart.utils;
 
 
+import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.HashUtil;
+import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.RadixUtil;
 import cn.hutool.dfa.SensitiveUtil;
 import com.jfireel.expression.Expression;
+import com.jfireel.expression.node.CalculateNode;
+import com.jfireel.expression.node.impl.CompileObjectMethodNode;
+import com.jfireel.expression.node.impl.OperatorResultNode;
+import com.jfireel.expression.node.impl.StaticObjectMethodNode;
+import com.jfireel.expression.node.impl.VariableNode;
+import com.jfireel.expression.token.Token;
+import com.jfireel.expression.token.TokenType;
 import org.apache.commons.collections4.MapUtils;
 import org.springblade.core.tool.utils.CollectionUtil;
 import org.springblade.core.tool.utils.Func;
+import org.springblade.manager.dto.ElementData;
+
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -33,6 +44,11 @@ public class CustomFunction {
 	 */
 	public static final String CLASS_CALL = "T(com.mixsmart.utils.CustomFunction).";
 	public static final String CONCAT = "@";
+	public static final Set<String> KEYWORD_SET =new HashSet<>();
+	static {
+		KEYWORD_SET.add("first");
+		KEYWORD_SET.add("last");
+	}
 	/**
 	 * 获取区间内随机值
 	 * @param min
@@ -707,21 +723,30 @@ public class CustomFunction {
 	}
 	public static Object avg(List<Object> list) {
 		if(ListUtils.isNotEmpty(list)){
-			return    list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).average().getAsDouble();
+			OptionalDouble op =list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).average();
+			if(op.isPresent()){
+				return op.getAsDouble();
+			}
 		}
 		return "";
 	}
 
 	public static Object max(List<Object> list) {
 		if(ListUtils.isNotEmpty(list)){
-			return    list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).max().getAsDouble();
+			OptionalDouble op =list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).max();
+			if(op.isPresent()){
+				return op.getAsDouble();
+			}
 		}
 		return "";
 	}
 
 	public static Object min(List<Object> list) {
 		if(ListUtils.isNotEmpty(list)){
-			return    list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).min().getAsDouble();
+			OptionalDouble op =list.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).min();
+			if(op.isPresent()){
+				return op.getAsDouble();
+			}
 		}
 		return "";
 	}
@@ -2505,12 +2530,18 @@ public class CustomFunction {
 	 * @Author yangyj
 	 * @Date 2021.08.09 14:37
 	 **/
-	public static  Object listAt(Object o,Integer index){
+	public static  Object listAt(Object o,Object indexObj){
 		if(o == null){
 			return "";
 		}
 		if(o instanceof List){
 			List<Object> list = obj2ListNe(o);
+			int index =0;
+			if(NumberUtil.isNumber(indexObj.toString())){
+				index=StringUtils.handObj2Integer(indexObj);
+			}else if(StringUtils.isEquals("last",indexObj)){
+				index=list.size()-1;
+			}
 			if(ListUtils.isNotEmpty(list) ){
 			    if(index>0){
 			    	if(list.size()>index){
@@ -2526,6 +2557,39 @@ public class CustomFunction {
 		return "";
 	}
 
+
+	/**
+	 * @Description  关键字转换
+	 * @Param [cn]
+	 * @Author yangyj
+	 * @Date 2022.10.10 17:24
+	 **/
+	public static void formulaKeyWord(CalculateNode cn){
+		if(cn.type().equals(Token.OPERATOR_RESULT)){
+			OperatorResultNode opn = (OperatorResultNode) cn;
+			formulaKeyWord(opn.getLeftOperand());
+			formulaKeyWord(opn.getRightOperand());
+		}else if(cn.type().equals(Token.METHOD_RESULT)){
+			StaticObjectMethodNode cmn=(StaticObjectMethodNode)cn;
+			CalculateNode[] array= cmn.getArgsNodes();
+			if(ArrayUtil.isNotEmpty(array)){
+				for(int i=0;i<array.length;i++){
+					CalculateNode c = array[i];
+					if(c instanceof StaticObjectMethodNode){
+						formulaKeyWord(c);
+					}else if (c instanceof VariableNode){
+						if(KEYWORD_SET.contains(c.literals())){
+							/*关键字需要包裹起来*/
+							array[i]=new VariableNode("'"+c.literals()+"'");
+						}
+					}
+				}
+			}
+			cmn.setArgsNodes(array);
+		}
+
+	}
+
 	public static List<Object> obj2ListNe(Object obj){
 		List<Object> list = obj2List(obj);
 		return  list.parallelStream().filter(StringUtils::isNotEmpty).collect(Collectors.toList());
@@ -2608,6 +2672,7 @@ public class CustomFunction {
 	}
 
 
+
 	public static  Object abs(Object o){
 		/**
 		 * @Description  测试

+ 1 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/bean/TableInfo.java

@@ -17,7 +17,7 @@ public class TableInfo {
     private String contractId;
     private String classify;
     private String projectId;
-    private String groupId;
+    private String groupId="0";
 
     // =============================== 首件相关 start ===============================
     /**

+ 0 - 49
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/Coords.java

@@ -1,49 +0,0 @@
-package org.springblade.manager.formula;
-
-import lombok.Data;
-import org.springblade.core.tool.utils.Func;
-
-import java.util.List;
-
-/**
- * @author yangyj
- * @Date 2022/9/9 11:08
- * @description TODO
- */
-@Data
-public class Coords {
-    /**开始单元格xy
-     * */
-    private Integer x;
-    private Integer y;
-    /**结束单元格xy
-     * */
-    private Integer x2;
-    private Integer y2;
-    /**无效坐标x*/
-    private List<Integer> ex;
-    /**无效坐标y*/
-    private List<Integer> ey;
-    /**读写方向*/
-    private Boolean horizontal=true;
-    public Coords(String x, String y, String x2, String y2) {
-        this.x = Integer.parseInt(x);
-        this.y = Integer.parseInt(y);
-        this.x2 = Integer.parseInt(x2);
-        this.y2 = Integer.parseInt(y2);
-    }
-
-    public Coords(String x, String y) {
-        this.x = Integer.parseInt(x);
-        this.y = Integer.parseInt(y);
-        this.x2 = this.x;
-        this.y2 = this.y;
-    }
-    public Coords(){
-
-    }
-    public Boolean hasMerge(){
-        return Func.isNotEmpty(ex)||Func.isNotEmpty(ey);
-    }
-
-}

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ICoordsBuilder.java

@@ -1,5 +1,7 @@
 package org.springblade.manager.formula;
 
+import org.springblade.manager.dto.Coords;
+
 import java.util.List;
 
 /**

+ 2 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/ITableElementConverter.java

@@ -8,6 +8,8 @@ import java.util.List;
  * @author yangyj
  */
 public interface ITableElementConverter {
+    /**公式执行前输入*/
     void before();
+    /**公式执行后输出*/
     void after();
 }

+ 5 - 12
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/CompositeDataAccess.java

@@ -59,18 +59,11 @@ public class CompositeDataAccess  {
 
     private   LinkedHashMap<String, ElementData> get(Integer index){
         LinkedHashMap<String, ElementData> data =new LinkedHashMap<>();
-        Optional<ElementData> op= fds.values().stream().filter(e->e.getValues().size()>index).map(e->e.getValues().get(index)).filter(e->!e.isEmpty()).findFirst();
-        if(op.isPresent()){
-            ElementData base=op.get();
-            for(FormData fd:fds.values()){
-                int step = fd.getStep()==null?1:fd.getStep();
-                List<ElementData> elementDataList = fd.getValues();
-                int n=index/step;
-                if(n>elementDataList.size()-1){
-                    elementDataList.addAll(Collections.nCopies(n-elementDataList.size()+1,new ElementData(base.getIndex(),base.getGroupId(),null)));
-                }
-                data.put(fd.getCode(),elementDataList.get(n));
-            }
+        for(FormData fd:fds.values()){
+            int step = fd.getStep()==null?1:fd.getStep();
+            List<ElementData> elementDataList = fd.getValues();
+            int n=index/step;
+            data.put(fd.getCode(),elementDataList.get(n));
         }
         return data;
     }

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

@@ -2,7 +2,7 @@ package org.springblade.manager.formula.impl;
 
 import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.StringPool;
-import org.springblade.manager.formula.Coords;
+import org.springblade.manager.dto.Coords;
 import org.springblade.manager.formula.ICoordsBuilder;
 
 import java.util.ArrayList;

+ 16 - 13
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/FormulaMileage.java

@@ -72,19 +72,22 @@ public class FormulaMileage implements FormulaStrategy {
                      /*桩号*/
                     ElementData ea=row.get(relyList.get(0));
                     /*偏距*/
-                    String k = ea.stringValue();
-                    String jz=row.get(relyList.get(1)).stringValue();
-                    String[] coordinate = mileages.get(k+"@"+jz);
-                    Map<String, Object> xyz = FormulaUtils.triangleSquare("-5,+5");
-                    double dx = Double.parseDouble(xyz.get("X").toString());
-                    double dy = Double.parseDouble(xyz.get("Y").toString());
-                    double ds = Double.parseDouble(xyz.get("Z").toString());
-                    double scx= Double.parseDouble(coordinate[0]) + dx * 0.001;
-                    double scy= Double.parseDouble(coordinate[1]) + dy * 0.001;
-                    double sjx= Double.parseDouble(coordinate[0]);
-                    double sjy= Double.parseDouble(coordinate[1]);
-                    List<Object> data = new ArrayList<>(Arrays.asList("占位","占位",sjx,sjy,scx,scy,dx,dy,ds));
-                    this.write(row,data,keys,scale3);
+                    ElementData eb=row.get(relyList.get(1));
+                    if(!ea.isEmpty()&&!eb.isEmpty()){
+                        String k = ea.stringValue();
+                        String jz= eb.stringValue();
+                        String[] coordinate = mileages.get(k+"@"+jz);
+                        Map<String, Object> xyz = FormulaUtils.triangleSquare("-5,+5");
+                        double dx = Double.parseDouble(xyz.get("X").toString());
+                        double dy = Double.parseDouble(xyz.get("Y").toString());
+                        double ds = Double.parseDouble(xyz.get("Z").toString());
+                        double scx= Double.parseDouble(coordinate[0]) + dx * 0.001;
+                        double scy= Double.parseDouble(coordinate[1]) + dy * 0.001;
+                        double sjx= Double.parseDouble(coordinate[0]);
+                        double sjy= Double.parseDouble(coordinate[1]);
+                        List<Object> data = new ArrayList<>(Arrays.asList("占位","占位",sjx,sjy,scx,scy,dx,dy,ds));
+                        this.write(row,data,keys,scale3);
+                    }
                 }
                 listFd.forEach(e->e.setUpdate(1));
             }

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

@@ -1,6 +1,8 @@
 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;
 import org.springblade.common.utils.BaseUtils;
@@ -10,7 +12,7 @@ import org.springblade.manager.bean.TableInfo;
 import org.springblade.manager.dto.ElementData;
 import org.springblade.manager.dto.FormData;
 import org.springblade.manager.entity.Formula;
-import org.springblade.manager.formula.Coords;
+import org.springblade.manager.dto.Coords;
 import org.springblade.manager.formula.ITableElementConverter;
 import org.springblade.manager.formula.KeyMapper;
 import java.util.*;
@@ -72,28 +74,66 @@ public class TableElementConverter implements ITableElementConverter {
             dataMap.keySet().forEach(e->{
                 String[] codeAndId = e.split(StringPool.AT);
                 List<KeyMapper> kms = dataMap.get(e);
-                List<ElementData> eds = new ArrayList<>();
-                AtomicInteger index= new AtomicInteger(0);
-                kms.forEach(b->{
-                    List<TableInfo> elements =this.tableInfoList.stream().filter(t-> StringUtils.isEquals(t.getPkeyId(),b.getNodeId())).collect(Collectors.toList());
-                    elements.forEach(k->{
-                        LinkedHashMap<String,String>   page = k.getDataMap();
-                        String v=page.get(b.getField());
-                        if(StringUtils.isNotEmpty(v)){
-                            String[] values = v.split("☆");
-                            for(String s:values){
-                                String[] t = s.split("_\\^_");
-                                String[] c =t[1].split("_");
-                                ElementData ed = new ElementData(index.get(),0,t[0],Func.toInt(c[1]),Func.toInt(c[0]));
-                                this.elementDataMap.put(StringUtils.join(b.getCode(),ed.getGroupId(),ed.getIndex(),Func.toInt(c[1]),Func.toInt(c[0]),StringPool.AT),ed);
-                                eds.add(ed);
+                KeyMapper one = kms.get(0);
+                FormData fd=new FormData(codeAndId[0],new ArrayList<>(),formulaMap.get(codeAndId[1]),this.coordinateMap.get(one.getTableName()).get(one.getField()));
+                /*初始化元素数据集*/
+                List<ElementData> eds =fd.getValues();
+                String coords = this.coordinateMap.get(fd.getTableName()).get(fd.getKey());
+                if(Func.isNotBlank(coords)){
+                    List<Coords> coordsList = Stream.of(coords).flatMap(s-> Arrays.stream(s.split(";"))).map(s->{String[] xy=s.split("_");return new Coords(xy[1],xy[0]);}).collect(Collectors.toList());
+                    fd.setCoordsList(coordsList);
+                    for(int i=0;i<kms.size();i++){
+                        /*每一页都有自己对立的Id*/
+                        KeyMapper km=kms.get(i);
+                        TableInfo tableInfo =this.tableInfoList.stream().filter(t-> StringUtils.isEquals(t.getPkeyId(),km.getNodeId())).findFirst().orElseGet(TableInfo::new);
+                        int groupId=Integer.parseInt(tableInfo.getGroupId());
+                        LinkedHashMap<String,String> pageData = tableInfo.getDataMap();
+                        if(Func.isNotEmpty(pageData)){
+                            Map<String,Object> tmpMap = new HashMap<>();
+                            String v=pageData.get(km.getField());
+                            if(StringUtils.isNotEmpty(v)){
+                                String[] values = v.split("☆");
+                                for(String s:values){
+                                    String[] t = s.split("_\\^_");
+                                    String[] c =t[1].split("_");
+                                    tmpMap.put(StringUtils.join(fd.getCode(),groupId,i,Func.toInt(c[1]),Func.toInt(c[0]),StringPool.AT),t[0]);
+                                }
+                            }
+                            for(Coords c:coordsList){
+                                Object val = null;
+                                String key =StringUtils.join(fd.getCode(),groupId,i,c.getX(),c.getY(),StringPool.AT);
+                                if(tmpMap.containsKey(key)){
+                                  val =  tmpMap.get(key);
+                                }
+                                eds.add(new ElementData(i,0,val,c.getX(),c.getY()));
                             }
                         }
-                        index.getAndIncrement();
-                    });
-                });
-                KeyMapper one = kms.get(0);
-               this.fds.add(new FormData(codeAndId[0],eds,formulaMap.get(codeAndId[1]),this.coordinateMap.get(one.getTableName()).get(one.getField())));
+                    }
+                }else{
+                    StaticLog.error("FORMULA_LOG@元素{}定位信息不存在,请检查配置",fd.getTableName()+StringPool.COLON+fd.getKey());
+                }
+//                AtomicInteger index= new AtomicInteger(0);
+//                kms.forEach(b->{
+//                    List<TableInfo> elements =this.tableInfoList.stream().filter(t-> StringUtils.isEquals(t.getPkeyId(),b.getNodeId())).collect(Collectors.toList());
+//                    //String coords = this.coordinateMap.get(fd.getTableName()).get(fd.getKey());
+//                    elements.forEach(k->{
+//                        /*把页面上所有的元素区映射对象*/
+//                        LinkedHashMap<String,String>   page = k.getDataMap();
+//                        String v=page.get(b.getField());
+//                        if(StringUtils.isNotEmpty(v)){
+//                            String[] values = v.split("☆");
+//                            for(String s:values){
+//                                String[] t = s.split("_\\^_");
+//                                String[] c =t[1].split("_");
+//                                ElementData ed = new ElementData(index.get(),0,t[0],Func.toInt(c[1]),Func.toInt(c[0]));
+//                                this.elementDataMap.put(StringUtils.join(b.getCode(),ed.getGroupId(),ed.getIndex(),Func.toInt(c[1]),Func.toInt(c[0]),StringPool.AT),ed);
+//                                eds.add(ed);
+//                            }
+//                        }
+//                        index.getAndIncrement();
+//                    });
+//                });
+                this.fds.add(fd);
             });
         }
     }
@@ -102,6 +142,37 @@ public class TableElementConverter implements ITableElementConverter {
 
     @Override
     public void after() {
+        /*这个方法的核心就是把fds的数据按照既定格式(key_xxx_val_y_x)回写到tableInfo,对fds进行tableName分组,非空循环写人*/
+        LinkedHashMap<String,List<KeyMapper>> tabs = keyMappers.stream().collect(Collectors.groupingBy(KeyMapper::getCode,LinkedHashMap::new,Collectors.toList()));
+        for (FormData fd : this.fds) {
+            if(fd.getUpdate().equals(1)){
+                try {
+                    List<ElementData> elementDataList =fd.getValues();
+                    List<KeyMapper> kms = tabs.get(fd.getCode());
+                    List<TableInfo> tables = new ArrayList<>();
+                    for(TableInfo t:this.tableInfoList){
+                        if(kms.stream().anyMatch(e->StringUtils.isEquals(e.getNodeId(),t.getPkeyId()))){
+                            /*获取将要写入的tableInfo*/
+                            tables.add(t);
+                        }
+                    }
+                    LinkedHashMap<Integer,List<ElementData>> pages = elementDataList.stream().collect(Collectors.groupingBy(ElementData::getIndex,LinkedHashMap::new,Collectors.toList()));
+                    for(int i=0;i<pages.size();i++){
+                        /*每一页映射一个tableInfo*/
+                        List<ElementData> p = pages.get(i);
+                        TableInfo info = tables.get(i);
+                        info.getDataMap().put(fd.getKey(), recovery(p));
+                    }
+                }catch (Exception e){
+                    StaticLog.error("元素{}回写报错",fd.getCode());
+                    e.printStackTrace();
+                }
+            }
+        }
+
+    }
+    /**备份*/
+    public void _after() {
         /*可以优化对每一张表进行元素分类,同一张元素*/
         /*根据数据库表分组*/
         LinkedHashMap<String,List<KeyMapper>> tabs = keyMappers.stream().collect(Collectors.groupingBy(KeyMapper::getCode,LinkedHashMap::new,Collectors.toList()));
@@ -124,13 +195,13 @@ public class TableElementConverter implements ITableElementConverter {
                 tableMap.put(fd.getTableName(),tables);
             }
             groups.forEach((groupId, group) -> {
-                   group.forEach((index,page)->{
-                       if(Func.isNotEmpty(page)) {
-                           TableInfo info = tables.get(index);
-                           /*每一页对应一个info*/
-                           info.getDataMap().put(fd.getKey(), recovery(page, fd));
-                       }
-                   });
+                group.forEach((index,page)->{
+                    if(Func.isNotEmpty(page)) {
+                        TableInfo info = tables.get(index);
+                        /*每一页对应一个info*/
+                        info.getDataMap().put(fd.getKey(), recovery(page,fd));
+                    }
+                });
             });
 
         }
@@ -139,7 +210,7 @@ public class TableElementConverter implements ITableElementConverter {
 
     /**格式化回写内容*/
     @Deprecated
-    public String recovery(List<ElementData> dataList,String position){
+    public String recovery(List<ElementData> dataList,String position,String z){
         List<Coords> coordsList = CoordsBuilder.getInstance().build(position);
         StringBuilder sb = new StringBuilder();
         List<Integer[]> total = new ArrayList<>();
@@ -183,6 +254,7 @@ public class TableElementConverter implements ITableElementConverter {
         return sb.toString();
     }
 
+    @Deprecated
     public String recovery(List<ElementData> dataList,FormData fd){
         String coords = this.coordinateMap.get(fd.getTableName()).get(fd.getKey());
         StringBuilder sb = new StringBuilder();
@@ -202,6 +274,13 @@ public class TableElementConverter implements ITableElementConverter {
         return sb.toString();
     }
 
+    public String recovery(List<ElementData> dataList){
+           if(Func.isNotEmpty(dataList)){
+               return dataList.stream().filter(e->!e.isEmpty()).map(e->e.stringValue()+"_^_"+e.getY()+"_"+e.getX()).collect(Collectors.joining("☆"));
+           }
+          return "";
+    }
+
 
 
 

+ 85 - 27
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1,8 +1,10 @@
 package org.springblade.manager.service.impl;
 
 
+import cn.hutool.log.StaticLog;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.jfireel.expression.Expression;
+import com.jfireel.expression.node.CalculateNode;
 import com.mixsmart.utils.*;
 import lombok.AllArgsConstructor;
 import org.springblade.core.mp.base.BaseServiceImpl;
@@ -93,6 +95,7 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         this.env.constantMap=new HashMap<>(100);
         this.env.formDataList=list;
         this.env.constantMap.put("contractId",contractId);
+        keyWord(this.env.constantMap);
         ContractInfo info =this.contractInfoService.getById(contractId);
         /*合同段信息*/
         this.env.constantMap.put(CTI,info);
@@ -106,6 +109,13 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return this;
     }
 
+     /**引入关键字*/
+    public void keyWord(Map<String,Object> constantMap){
+           CustomFunction.KEYWORD_SET.forEach(e->{
+               constantMap.put(e,e);
+           });
+    }
+
     /**
      * @Description 获取节点参数
      * @return java.util.Map<java.lang.String,java.lang.Object>
@@ -194,6 +204,8 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return this;
     }
 
+
+
     @Override
     public IFormulaService special() {
         for(FormData fd:this.env.formDataList) {
@@ -213,7 +225,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             if(fd.verify()){
                 Formula formula =fd.getFormula();
                 String f=formula.getFormula();
-                List<ElementData> cp = new ArrayList<>(fd.getValues());
                 if(Func.isNotBlank(f)){
                     Map<String, Object> currentMap = new HashMap<>(this.env.constantMap);
                     List<String>  relyList = fd.getFormula().getRelyList();
@@ -234,8 +245,16 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             if(dataSource.size()>0){
                                 for(Map.Entry<Integer,Map<String,List<Object>>> entry:dataSource.entrySet()){
                                     if(entry.getValue().keySet().size()>=ele.size()){
-                                        List<ElementData> eds = slice(entry.getValue(),this.env.constantMap,f,entry.getKey());
-                                        fd.setValues(eds);
+                                        List<Object> values = slice(entry.getValue(),this.env.constantMap,f,entry.getKey());
+                                        if(values.size()>fd.getValues().size()){
+                                            /*当生成的数据超过实际容量的时候,会自动合并到第一个单元格*/
+                                            fd.getValues().get(0).setValue(values.stream().map(StringUtils::handleNull).collect(Collectors.joining("、")));
+                                        }else{
+                                            for(int n=0;n<values.size();n++){
+                                                fd.getValues().get(n).setValue(values.get(n));
+                                            }
+                                        }
+
                                     }
                                 }
                             }
@@ -247,15 +266,15 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                         fd.getValues().add(new ElementData(0,0,Expression.parse(formula.getFormula()).calculate(currentMap)));
                     }
                 }
-                if(notEquals(cp,fd.getValues())){
                      /*数量不相等*/
                     fd.setUpdate(1);
-                }
             }
         }
         return this;
     }
 
+
+
     /**对比内容再觉得是否刷新,如果允许牺牲部分性能,也可以不做判断进行全部刷新*/
     public boolean notEquals(List<ElementData> old,List<ElementData> enw){
         List<Object> a=old.stream().map(ElementData::getValue).collect(Collectors.toList());
@@ -292,40 +311,79 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return CNDMap;
     }
 
-    public  List<ElementData> slice(Map<String,List<Object>> elementMap,Map<String,Object> constantMap,String formula,Integer groupId){
+    public  List<ElementData> _slice(Map<String,List<Object>> elementMap,Map<String,Object> constantMap,String formula,Integer groupId){
         int min =0;
         List<ElementData> result = new ArrayList<>();
+        try {
+            for(Map.Entry<String,List<Object>> entry:elementMap.entrySet()){
+                List<Object> tmp =  entry.getValue();
+                min = min==0?tmp.size():Math.min(min,tmp.size());
+            }
+            if(min>0){
+                List<LocalVariable>  lvab= new ArrayList<>();
 
-        for(Map.Entry<String,List<Object>> entry:elementMap.entrySet()){
-            List<Object> tmp =  entry.getValue();
-            min = min==0?tmp.size():Math.min(min,tmp.size());
-        }
-        if(min>0){
-            List<LocalVariable>  lvab= new ArrayList<>();
+                for(int i=0;i<min;i++){
+                    Map<String, Object> currentMap = new HashMap<>(constantMap);
+                    Map<String,Object> E=getMap(currentMap,"E");
+
+                    for(Map.Entry<String,List<Object>> e:elementMap.entrySet()){
+                        E.put(e.getKey(),e.getValue().get(i));
+                    }
 
-            for(int i=0;i<min;i++){
-                Map<String, Object> currentMap = new HashMap<>(constantMap);
-                Map<String,Object> E=getMap(currentMap,"E");
+                    lvab.add(new LocalVariable(0,formula,currentMap));
+                }
+                /*并发执行*/
+                List<ElementData>   r= lvab.stream().map(e->{
+                    try {
+                        Object data =Expression.parse(e.getFormula()).calculate(e.getCurrentMap());
+                        return new ElementData(e.getIndex(),groupId,data);
+                    }catch (Exception e2){
+                        e2.printStackTrace();
+                    }
+                    return new ElementData(e.getIndex(),groupId,"");
+                }).collect(Collectors.toList());
 
-                for(Map.Entry<String,List<Object>> e:elementMap.entrySet()){
-                    E.put(e.getKey(),e.getValue().get(i));
+                if(CollectionUtil.isNotEmpty(r)){
+                    result.addAll(r);
                 }
+            }
+        }catch (Exception e){
+            StaticLog.error("公式:{},执行出错",formula);
+        }
+        return  result;
+    }
 
-                lvab.add(new LocalVariable(0,formula,currentMap));
+    public  List<Object> slice(Map<String,List<Object>> elementMap,Map<String,Object> constantMap,String formula,Integer groupId){
+        int min =0;
+        List<Object> result = new ArrayList<>();
+        try {
+            for(Map.Entry<String,List<Object>> entry:elementMap.entrySet()){
+                List<Object> tmp =  entry.getValue();
+                min = min==0?tmp.size():Math.min(min,tmp.size());
             }
-            /*并发执行*/
-            List<ElementData>   r= lvab.parallelStream().map(e->{
-                Object data =Expression.parse(e.getFormula()).calculate(e.getCurrentMap());
-                return new ElementData(e.getIndex(),groupId,data);
-            }).collect(Collectors.toList());
-
-            if(CollectionUtil.isNotEmpty(r)){
-                result.addAll(r);
+            if(min>0){
+                List<LocalVariable>  lvab= new ArrayList<>();
+                for(int i=0;i<min;i++){
+                    Map<String, Object> currentMap = new HashMap<>(constantMap);
+                    Map<String,Object> E=getMap(currentMap,"E");
+
+                    for(Map.Entry<String,List<Object>> e:elementMap.entrySet()){
+                        E.put(e.getKey(),e.getValue().get(i));
+                    }
+
+                    lvab.add(new LocalVariable(0,formula,currentMap));
+                }
+                /*并发执行*/
+                List<Object>  r= lvab.stream().map(e-> Expression.parse(e.getFormula()).calculate(e.getCurrentMap())).collect(Collectors.toList());
+                if(CollectionUtil.isNotEmpty(r)&&r.stream().anyMatch(StringUtils::isNotEmpty)){
+                    result.addAll(r);
+                }
             }
+        }catch (Exception e){
+            StaticLog.error("公式:{},执行出错",formula);
         }
         return  result;
     }
-
     public  static void sort( List<FormData> list,int n){
         /*System.out.println("剩余计算次数:"+n+"次");*/
         if(move(list)&&n>0){