Ver código fonte

Merge branch 'refs/heads/feature-lihb-20250918-formula' into dev

# Conflicts:
#	blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java
LHB 2 dias atrás
pai
commit
a91fbc34f6

+ 3 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaBean.java

@@ -4,6 +4,7 @@ import lombok.Data;
 import org.springblade.manager.entity.Formula;
 import org.springframework.beans.BeanUtils;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -39,6 +40,8 @@ public class FormulaBean {
     public static Integer PARAM = 35;
     private Long id;
     private String formula;
+    private List<FormulaMultipleIf> formulas;
+    private String method;
     private String remark;
     private String number;
     private Long nodeId;

+ 23 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaIfElse.java

@@ -0,0 +1,23 @@
+package org.springblade.manager.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 公式 ifelse 返回数据
+ * @author LHB
+ */
+@Data
+public class FormulaIfElse {
+    @ApiModelProperty("参数1")
+    private String parameter1;
+
+    @ApiModelProperty("符号")
+    private String symbol;
+
+    @ApiModelProperty("参数1")
+    private String parameter2;
+
+    @ApiModelProperty("组合条件")
+    private String groupTerm;
+}

+ 21 - 0
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/dto/FormulaMultipleIf.java

@@ -0,0 +1,21 @@
+package org.springblade.manager.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 公式 多重if 返回数据
+ * @author LHB
+ */
+@Data
+public class FormulaMultipleIf {
+    @ApiModelProperty("组合判断条件")
+    private List<FormulaIfElse> formulaIfElse;
+
+    @ApiModelProperty("满足值")
+    private String trueData;
+    @ApiModelProperty("不满足值")
+    private String falseData;
+}

+ 1 - 1
blade-service/blade-manager/src/main/java/com/jfireel/expression/token/Operator.java

@@ -11,7 +11,7 @@ public enum Operator implements TokenType {
     MULTI("*"), //
     DIVISION("/"), //
     QUESTION("?"), //
-    EQ("=="), //
+    EQ("="), //
     GT(">"), //
     LT("<"), //
     PERCENT("%"), //

+ 19 - 2
blade-service/blade-manager/src/main/java/com/jfireel/expression/util/ValueUtil.java

@@ -19,14 +19,31 @@ public class ValueUtil {
                 if (tmp.size() == 0) {
                     return null;
                 }
-                left = sum(tmp);
+                if(tmp.size() == 1){
+                    if(StringUtils.isNumber(tmp.get(0).toString())){
+                        left = Double.valueOf(tmp.get(0).toString());
+                    }else{
+                        left = tmp.get(0);
+                    }
+
+                }else{
+                    left = sum(tmp);
+                }
             }
             if (right instanceof List) {
                 List<Object> tmp = CustomFunction.obj2ListNe(right);
                 if (tmp.size() == 0) {
                     return null;
                 }
-                right = sum(tmp);
+                if(tmp.size() == 1){
+                    if(StringUtils.isNumber(tmp.get(0).toString())){
+                        right = Double.valueOf(tmp.get(0).toString());
+                    }else{
+                        right = tmp.get(0);
+                    }
+                }else{
+                    right = sum(tmp);
+                }
 
             }
             if (StringUtils.isNotEmpty(left) && StringUtils.isNotEmpty(right)) {

+ 187 - 9
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -8,10 +8,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
-import com.mixsmart.utils.CustomFunction;
-import com.mixsmart.utils.FormulaUtils;
-import com.mixsmart.utils.ListUtils;
-import com.mixsmart.utils.StringUtils;
+import com.mixsmart.utils.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -21,10 +18,7 @@ import org.springblade.core.log.exception.ServiceException;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
-import org.springblade.core.tool.utils.BeanUtil;
-import org.springblade.core.tool.utils.Func;
-import org.springblade.core.tool.utils.RegexUtil;
-import org.springblade.core.tool.utils.StringPool;
+import org.springblade.core.tool.utils.*;
 import org.springblade.manager.dto.*;
 import org.springblade.manager.entity.*;
 import org.springblade.manager.enums.ExecuteType;
@@ -80,6 +74,41 @@ public class FormulaController {
     @PostMapping("/save")
     @Deprecated
     public R save(@RequestBody FormulaBean f) {
+        //ifelseMulti 多条件处理
+        if(CollectionUtil.isNotEmpty(f.getFormulas())){
+            StringBuilder sb = new StringBuilder();
+            sb.append("FC.ifelseMulti(");
+            if (StringUtil.isNotBlank(f.getMethod())) {
+                sb.append(f.getMethod());
+            }
+            sb.append(",");
+            for (int i = 0; i < f.getFormulas().size(); i++) {
+                if(i != 0){
+                    sb.append(",(");
+                }
+                FormulaMultipleIf formulaMultipleIf = f.getFormulas().get(i);
+                //盘点条件
+                for (FormulaIfElse formulaIfElse : formulaMultipleIf.getFormulaIfElse()) {
+                    sb.append(formulaIfElse.getParameter1())
+                            .append(formulaIfElse.getSymbol())
+                            .append(formulaIfElse.getParameter2());
+                    if(StringUtils.isNotEmpty(formulaIfElse.getGroupTerm())){
+                        String s = formulaIfElse.getGroupTerm().replaceAll("&amp;&amp;", "&&");
+                        sb.append(s);
+                    }
+                }
+                sb.append(",").append(formulaMultipleIf.getTrueData());
+                //当前是否为最后一层判断
+                if(i >= f.getFormulas().size() - 1){
+                    sb.append(",").append(formulaMultipleIf.getFalseData());
+                }
+                if(i != 0){
+                    sb.append(")");
+                }
+            }
+            sb.append(")");
+            f.setFormula(sb.toString());
+        }
         return saveOrUpdate(f);
     }
 
@@ -90,6 +119,40 @@ public class FormulaController {
     @PostMapping("/update")
     @Deprecated
     public R update(@RequestBody FormulaBean f) {
+        if(CollectionUtil.isNotEmpty(f.getFormulas())){
+            StringBuilder sb = new StringBuilder();
+            sb.append("FC.ifelseMulti(");
+            if (StringUtil.isNotBlank(f.getMethod())) {
+                sb.append(f.getMethod());
+            }
+            sb.append(",");
+            for (int i = 0; i < f.getFormulas().size(); i++) {
+                if(i != 0){
+                    sb.append(",(");
+                }
+                FormulaMultipleIf formulaMultipleIf = f.getFormulas().get(i);
+                //盘点条件
+                for (FormulaIfElse formulaIfElse : formulaMultipleIf.getFormulaIfElse()) {
+                    sb.append(formulaIfElse.getParameter1())
+                            .append(formulaIfElse.getSymbol())
+                            .append(formulaIfElse.getParameter2());
+                    if(StringUtils.isNotEmpty(formulaIfElse.getGroupTerm())){
+                        String s = formulaIfElse.getGroupTerm().replaceAll("&amp;&amp;", "&&");
+                        sb.append(s);
+                    }
+                }
+                sb.append(",").append(formulaMultipleIf.getTrueData());
+                //当前是否为最后一层判断
+                if(i >= f.getFormulas().size() - 1){
+                    sb.append(",").append(formulaMultipleIf.getFalseData());
+                }
+                if(i != 0){
+                    sb.append(")");
+                }
+            }
+            sb.append(")");
+            f.setFormula(sb.toString());
+        }
         return saveOrUpdate(f);
     }
 
@@ -145,7 +208,7 @@ public class FormulaController {
                 old.setDev(fa.getDev());
                 old.setScale(fa.getScale());
               //  this.service.updateById(old);
-                this.service.update(Wrappers.<Formula>lambdaUpdate().set(Formula::getFormula,fa.getFormula()).set(Formula::getMap,fa.getMap()).set(Formula::getRely,fa.getRely()).set(Formula::getDev,fa.getDev()).set(Formula::getScale,fa.getScale()).eq(Formula::getId,fa.getId()));
+                this.service.update(Wrappers.<Formula>lambdaUpdate().set(Formula::getFormula,fa.getFormula()).set(Formula::getRemark,fa.getRemark()).set(Formula::getMap,fa.getMap()).set(Formula::getRely,fa.getRely()).set(Formula::getDev,fa.getDev()).set(Formula::getScale,fa.getScale()).eq(Formula::getId,fa.getId()));
                 return R.data(fa.getId());
             }
         }
@@ -216,6 +279,27 @@ public class FormulaController {
                 String rely = StringUtils.handleNull(map.get("rely"));
                 FormulaBean fb = BeanUtil.toBean(map, FormulaBean.class);
                 fb.setDict(this.service.getElementInfoByCodes(rely));
+                //多重if重新组装参数
+                String formula = fb.getFormula();
+                if(formula.contains(".ifelseMulti")){
+                    //处理数据
+                    formula = formula.replaceFirst("FC.ifelseMulti","");
+
+                    String sumStr = formula;
+                    sumStr = sumStr.replaceFirst("\\(","").replaceFirst("\\)$","");
+                    List<String> list = parseParameters(sumStr);
+                    if(list.size() == 4){
+                        String remove = list.remove(0);
+                        String s = remove.replaceAll("\\(", "");
+                        fb.setMethod(s);
+                        list.set(0,"(" + list.get(0));
+                        formula = StringUtil.join(list,",") + ")";
+                    }
+
+                    List<FormulaMultipleIf> formulaMultipleIfs = new ArrayList<>();
+                    strParse(formula,formulaMultipleIfs);
+                    fb.setFormulas(formulaMultipleIfs);
+                }
                 return R.data(fb);
             }
 
@@ -223,6 +307,100 @@ public class FormulaController {
         return R.success("无数据");
     }
 
+
+    private Boolean strParse(String str, List<FormulaMultipleIf> formulaMultipleIfs){
+        str = str.replaceFirst("\\(","").replaceFirst("\\)$","");
+        FormulaMultipleIf formulaMultipleIf = new FormulaMultipleIf();
+        List<String> split = parseParameters(str);
+        if(split.size() == 3){
+            List<FormulaIfElse> formulaIfElses = new ArrayList<>();
+            String s0 = split.get(0);
+            String s1 = split.get(1);
+            String s2 = split.get(2);
+            //处理 判断体 E[m_20220826103001_1562990720141230080:key_40]=2
+            String[] split1 = null;
+            String groupSymbol = null;
+            if(s0.contains("||") || s0.contains("&&")){
+
+
+                if(s0.contains("||")){
+                    split1 = s0.split("\\|\\|");
+                    groupSymbol = "||";
+                }else{
+                    split1 = s0.split("&&");
+                    groupSymbol = "&&";
+                }
+            }else{
+                split1 = new String[]{s0};
+            }
+            for (String s : split1) {
+                FormulaIfElse formulaIfElse = new FormulaIfElse();
+                String s3 = strContainsSymbol(s);
+                if(!s3.isEmpty()){
+                    String[] split2 = s.split(s3);
+                    formulaIfElse.setParameter1(split2[0]);
+                    formulaIfElse.setSymbol(s3);
+                    formulaIfElse.setParameter2(split2[1]);
+                    formulaIfElse.setGroupTerm(groupSymbol);
+                    formulaIfElses.add(formulaIfElse);
+                }
+            }
+            formulaMultipleIf.setFormulaIfElse(formulaIfElses);
+            formulaMultipleIf.setTrueData(s1);
+            if(s2.contains("(") && s2.contains(",") && s2.split(",").length == 3){
+                formulaMultipleIfs.add(formulaMultipleIf);
+                Boolean b = strParse(s2, formulaMultipleIfs);
+                if(!b){
+                    formulaMultipleIf.setFalseData(s2);
+                    formulaMultipleIfs.add(formulaMultipleIf);
+                }
+            }else{
+                formulaMultipleIf.setFalseData(s2);
+                formulaMultipleIfs.add(formulaMultipleIf);
+            }
+            return true;
+        }
+        return false;
+    }
+    public String strContainsSymbol(String str){
+        String s = null;
+        if(str.contains(">=")){
+            s = ">=";
+        }else if (str.contains("<=")){
+            s = "<=";
+        }else if (str.contains(">") && !str.contains("=")){
+            s = ">";
+        }else if (str.contains("<") && !str.contains("=")){
+            s = "<";
+        }else if (str.contains("=")){
+            s = "=";
+        }
+        return s;
+    }
+    // 添加参数解析方法,处理嵌套逗号
+    private List<String> parseParameters(String content) {
+        List<String> params = new ArrayList<>();
+        int depth = 0;
+        int start = 0;
+
+        for (int i = 0; i < content.length(); i++) {
+            char c = content.charAt(i);
+            if (c == '(') {
+                depth++;
+            } else if (c == ')') {
+                depth--;
+            } else if (c == ',' && depth == 0) {
+                // 只有在最外层才分割参数
+                params.add(content.substring(start, i).trim());
+                start = i + 1;
+            }
+        }
+        // 添加最后一个参数
+        params.add(content.substring(start).trim());
+
+        return params;
+    }
+
     @ApiOperationSupport(order = 8)
     @ApiOperation(value = "公式翻页查询", notes = "公式翻页查询")
     @GetMapping("/page")

+ 457 - 4
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -1,7 +1,9 @@
 package org.springblade.manager.service.impl;
 
 
+import cn.hutool.core.date.DateField;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.StopWatch;
 import cn.hutool.core.util.HashUtil;
 import cn.hutool.log.StaticLog;
@@ -9,10 +11,12 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
+import com.alibaba.nacos.common.utils.NumberUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.Lists;
 import com.jfireel.expression.Expression;
 import com.mixsmart.utils.CustomFunction;
 import com.mixsmart.utils.FormulaUtils;
@@ -1371,9 +1375,235 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                             if (fd.getCoordsList().size() > 1 && f.split("[/+\\-*]").length > 1) {
                                 LinkedHashMap<String, FormData> fdMap = step(ele);
                                 if (fdMap != null) {
-                                    List<LocalVariable> local = slice2Local(f, fdMap, tec);
+                                    List<LocalVariable> local = null;
+                                    //求和公式 判断是否按坐标分组求和
+                                    if(f.contains("sum") && (f.contains(",x") || f.contains(",y"))){
+                                        FormData formData = fdMap.get(relyList.get(0));
+
+                                        Map<Integer, List<ElementData>> collect = new HashMap<>();
+                                        if(f.contains(",y")){
+                                            fd.getValues().sort(Comparator.comparing(ElementData::getY));
+                                            collect = formData.getValues().stream().collect(Collectors.groupingBy(ElementData::getY,TreeMap::new, Collectors.toList()));
+                                        }else{
+                                            //需要解析html获取当前key的对应的excel 坐标 通过excel坐标 统计相同列的数据
+                                            Long pKeyId = op.get().getPKeyId();
+                                            WbsTreePrivate wbsTreePrivate1 = wbsTreePrivateMapper.selectById(pKeyId);
+
+                                            String[] split = fd.getCode().split(":");
+                                            if(wbsTreePrivate1.getInitTableName().equals(split[0])){
+                                                //公式key
+                                                String dataKey = split[1];
+                                                //目标key
+                                                String rely = fd.getFormula().getRely().split(":")[1];
+                                                //获取html 解析html
+                                                InputStream fileInputStream = FileUtils.getInputStreamByUrl(wbsTreePrivate1.getHtmlUrl());
+                                                String htmlString = IoUtil.readToString(fileInputStream);
+                                                Document doc = Jsoup.parse(htmlString);
+                                                Elements select = doc.select("[id*="+dataKey+"]");
+                                                //通过excel坐标来确认同一列的单元格有哪些
+                                                HashMap<String, List<String>> stringListHashMap = new HashMap<>();
+                                                for (Element element : select) {
+                                                    String id = element.attr("id");
+                                                    String x1 = element.attr("x1");
+                                                    List<String> strings = new ArrayList<>();
+                                                    Elements select1 = doc.select("[id*=" + rely + "][x1=" + x1 + "]");
+                                                    for (Element element1 : select1) {
+                                                        strings.add(element1.attr("id"));
+                                                    }
+                                                    stringListHashMap.put(id,strings);
+                                                }
+                                                //对原始key排序 确保顺序以方便赋值
+                                                fd.getValues().sort(Comparator.comparing(ElementData::getX));
+                                                for (ElementData key : fd.getValues()) {
+                                                    String  newKey = dataKey + "__" + key.getY() + "_" + key.getX();
+                                                    List<String> strings = stringListHashMap.get(newKey);
+                                                    List<ElementData> values = formData.getValues();
+
+                                                    List<ElementData> objects = new ArrayList<>();
+                                                    for (String string : strings) {
+                                                        String[] split1 = string.split("__")[1].split("_");
+                                                        List<ElementData> collect1 = values.stream()
+                                                                .filter(y -> y.getX().equals(Integer.valueOf(split1[1])) && y.getY().equals(Integer.valueOf(split1[0])))
+                                                                .collect(Collectors.toList());
+                                                        objects.addAll(collect1);
+                                                    }
+                                                    collect.put(key.getX(),objects);
+                                                }
+                                            }
+                                        }
+                                        f = f.replaceAll(",x","").replaceAll(",y","");
+                                        formula.setFormula(f);
+                                        local = slice3Local(f, tec, collect, relyList.get(0));
+                                    } else if (f.contains("dataChange")) {
+                                        //试验-数据自变公式处理
+                                        // 提取括号内的内容(去掉外层的ifelse())
+                                        String content = f.replaceFirst("^" + FC_REG + "dataChange\\(", "").replaceFirst("\\)$", "");
+                                        //按,分割参数
+                                        String[] split = content.split(",");
+                                        if (split.length == 9) {
+                                            if(split[1].isEmpty() || split[4].isEmpty() || split[5].isEmpty() || split[0].isEmpty() || split[6].isEmpty() || split[8].isEmpty()){
+                                                throw new ServiceException("公式参数异常");
+                                            }
+                                            /**
+                                             *  split[0];//自变的数据源  时:分
+                                             *  split[1];//自增还是自减
+                                             *  split[2];//数据类型
+                                             *  split[3];//协同元素 时间类型附带的 年月日
+                                             *  split[4];//频率
+                                             *  split[5];//类型 时间按频率变化还是分钟按频率变化
+                                             *  split[6];//停止条件元素
+                                             *  split[7];//停止条件判断
+                                             *  split[8];//停止条件值
+                                             */
+                                            //需要变化的数据
+                                            FormData sourceData = fdMap.get(split[0].replace("E['", "").replace("']", ""));
+                                            //协同元素
+                                            FormData attachData = null;
+                                            if (!split[3].isEmpty()) {
+                                                attachData = fdMap.get(split[3].replace("E['", "").replace("']", ""));
+                                            }
+                                            //停止判断条件的数据源
+                                            FormData stopData = fdMap.get(split[6].replace("E['", "").replace("']", ""));
+                                            //按y分组
+                                            Map<Integer, List<ElementData>> collect = stopData.getValues().stream().collect(Collectors.groupingBy(ElementData::getY));
+
+                                            //初始数据
+                                            Boolean initStart = true;
+                                            Boolean stop = false;
+                                            //时间
+                                            String dateStr = "";
+                                            //时间格式
+                                            String jsonFormMat = "";
+                                            Integer var = 0;
+
+                                            if ("+".equals(split[1])) {
+                                                var += Integer.parseInt(split[4]);
+                                            } else {
+                                                var -= Integer.parseInt(split[4]);
+                                            }
+                                            //时间类型
+                                            DateField dateField = null;
+                                            switch (Integer.valueOf(split[5])) {
+                                                case 1:
+                                                    dateField = DateField.YEAR;
+                                                    break;
+                                                case 2:
+                                                    dateField = DateField.MONTH;
+                                                    break;
+                                                case 3:
+                                                    dateField = DateField.DAY_OF_YEAR;
+                                                    break;
+                                                case 4:
+                                                    dateField = DateField.HOUR_OF_DAY;
+                                                    break;
+                                                case 5:
+                                                    dateField = DateField.MINUTE;
+                                                    break;
+                                                case 6:
+                                                    dateField = DateField.SECOND;
+                                                    break;
+                                                default:
+                                                    break;
+                                            }
+                                            if (dateField == null) {
+                                                break;
+                                            }
+                                            //时间 计算处理
+                                            for (int i = 0; i < sourceData.getValues().size(); i++) {
+                                                ElementData value = sourceData.getValues().get(i);
+                                                if (!stop) {
+                                                    if (initStart) {
+                                                        if (value.getValue().toString().isEmpty()) {
+                                                            continue;
+                                                        }
+                                                        String dateStartTime = "";
+                                                        //协同数据
+                                                        if (attachData != null) {
+                                                            ElementData elementData1 = attachData.getValues().get(i);
+                                                            if (elementData1.getValue().toString().isEmpty()) {
+                                                                continue;
+                                                            }
+                                                            dateStartTime = elementData1.getValue().toString();
+                                                        }
+                                                        if (StringUtils.isNotEmpty(dateStartTime)) {
+                                                            dateStr = dateStartTime + " " + value.getValue().toString();
+                                                            jsonFormMat = "yyyy年MM月dd日 HH:mm";
+                                                        } else {
+                                                            dateStr = value.getValue().toString();
+                                                            jsonFormMat = "HH:mm";
+                                                        }
+                                                        initStart = false;
+                                                    }
+                                                    if (StringUtils.isNotEmpty(dateStr) && i != 0) {
+                                                        //开始计算
+                                                        DateTime offset = DateUtil.offset(DateUtil.parse(dateStr, jsonFormMat), dateField, var);
+                                                        dateStr = offset.toString(jsonFormMat);
+                                                        if (dateStr.contains(" ")) {
+                                                            String[] split1 = dateStr.split(" ");
+                                                            value.setValue(split1[1]);
+                                                            if (attachData != null) {
+                                                                ElementData elementData1 = attachData.getValues().get(i);
+                                                                elementData1.setValue(split1[0]);
+                                                            }
+                                                        } else {
+                                                            value.setValue(dateStr);
+                                                        }
+                                                    }
+                                                }
+                                                //终止判断
+                                                List<ElementData> elementData = collect.get(value.getY());
+                                                long count = 0;
+                                                switch (split[7]) {
+                                                    case "=":
+                                                        count = elementData.stream().filter(e -> e.getValue().equals(split[8])).count();
+                                                        break;
+                                                    case ">":
+                                                        count = elementData.stream().filter(e -> Integer.parseInt(e.getValue().toString()) > Integer.parseInt(split[8])).count();
+                                                        break;
+                                                    case "<":
+                                                        count = elementData.stream().filter(e -> Integer.parseInt(e.getValue().toString()) < Integer.parseInt(split[8])).count();
+                                                        break;
+                                                    case ">=":
+                                                        count = elementData.stream().filter(e -> Integer.parseInt(e.getValue().toString()) >= Integer.parseInt(split[8])).count();
+                                                        break;
+                                                    case "<=":
+                                                        count = elementData.stream().filter(e -> Integer.parseInt(e.getValue().toString()) <= Integer.parseInt(split[8])).count();
+                                                        break;
+                                                    case "!=":
+                                                        count = elementData.stream().filter(e -> !e.getValue().equals(split[8])).count();
+                                                        break;
+                                                }
+                                                if (stop) {
+                                                    value.setValue("");
+                                                    if (attachData != null) {
+                                                        ElementData elementData1 = attachData.getValues().get(i);
+                                                        elementData1.setValue("");
+                                                    }
+                                                }
+                                                if (count > 0) {
+                                                    //当前截至行不需要清空数据
+                                                    stop = true;
+                                                }
+                                            }
+                                            if (attachData != null) {
+                                                Map<String, FormData> formDataMap = tec.getFormDataMap();
+                                                FormData formData = formDataMap.get(split[3].replace("E['", "").replace("']", ""));
+                                                formData.setFinished(true);
+                                                formData.setUpdate(1);
+                                                formData.setValues(attachData.getValues());
+                                            }
+
+                                            List<Object> values = sourceData.getValues().stream().map(ElementData::getValue).collect(Collectors.toList());
+                                            //处理完之后
+                                            FormulaUtils.write(fd, values, !fd.getTableName().equals(checkTable));
+                                        }
+                                        local = new ArrayList<>();
+                                    }else{
+                                        local = slice2Local(f, fdMap, tec);
+                                    }
                                     if (local.size() > 0) {
                                         List<Object> values = FormulaUtils.slice(local, f);
+                                        values = values.stream().map(s -> StringUtils.isEmpty(s) ? "/" : s).collect(Collectors.toList());
                                         FormulaUtils.write(fd, values, !fd.getTableName().equals(checkTable));
                                     }
                                 } else {
@@ -1527,6 +1757,28 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return local;
     }
 
+    private List<LocalVariable> slice3Local(String f, TableElementConverter tec, Map<Integer, List<ElementData>> collect, String str) {
+        List<LocalVariable> local = new ArrayList<>();
+        collect.keySet().forEach(key -> {
+
+            Map<String, Object> variable = new HashMap<>(tec.constantMap);
+            Map<String, Object> em = (Map<String, Object>) variable.computeIfAbsent(E, k -> new HashMap<>());
+            List<ElementData> elementData = collect.get(key);
+            Integer index = elementData.get(0).getIndex();
+
+
+            List<Object> collect1 = elementData.stream().map(ElementData::getValue).collect(Collectors.toList());
+            List<Double> collect2 = collect1.stream()
+                    .filter(Objects::nonNull)
+                    .filter(StringUtils::isNumber)
+                    .map(obj -> NumberUtils.toDouble(obj.toString(), Double.NaN))
+                    .collect(Collectors.toList());
+            em.put(str,collect2);
+            local.add(new LocalVariable(index, f, variable));
+        });
+        return local;
+    }
+
     private void putEle(String f, List<FormData> ele, Map<String, Object> currentMap, FormData fd) {
         @SuppressWarnings("unchecked")
         Map<String, Object> em = (Map<String, Object>) currentMap.computeIfAbsent(E, (k) -> new HashMap<>());
@@ -1961,6 +2213,40 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
             FormulaUtils.write(fd, data, !fd.getIsRemoveEmpty());
         }
     }
+    //处理
+    public void write(String key, String value, TableElementConverter tec) {
+        Map<String, FormData> formDataMap = tec.getFormDataMap();
+
+        key = key.replace("E[","").replace("'","").replace("]","");
+
+        FormData formData = formDataMap.get(key);
+        formData.setFinished(true);
+        formData.setUpdate(1);
+        List<ElementData> values = formData.getValues();
+        //取的值是从其他元素获取的
+        if(value.contains("E[")){
+            value = value.replace("E[","").replace("'","").replace("]","");
+            //获取value的值
+            FormData valueFormData = formDataMap.get(value);
+            List<ElementData> values1 = valueFormData.getValues();
+            //如果是一个元素多个单元格 便利每一个单元格赋值
+            if(CollectionUtil.isNotEmpty(values) && CollectionUtil.isNotEmpty(values1)){
+                int count = values.size();
+                if(values1.size() < count){
+                    count = values1.size();
+                }
+                for (int i = 0; i < count; i++) {
+                    ElementData elementData = values.get(i);
+                    ElementData elementData1 = values1.get(i);
+                    elementData.setValue(elementData1.getValue());
+                }
+            }
+        }else{
+            if(CollectionUtil.isNotEmpty(values)){
+                values.get(0).setValue(value);
+            }
+        }
+    }
 
     /**
      * 加页增容
@@ -5607,6 +5893,151 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     } while (f.contains("ifelse") && max < 20);
                 }
             }
+            //多条件判断
+            if (f.contains("ifelseMulti")){
+                try {
+                    // 提取括号内的内容(去掉外层的ifelse())
+                    String content = f.replaceFirst("^" + FC_REG + "ifelseMulti\\(", "").replaceFirst("\\)$", "");
+
+                    // 解析参数,处理嵌套逗号(在括号内的逗号不应该作为分隔符)
+                    List<String> pa = parseParameters(content);
+                    String method = null;
+                    if(pa.size() == 4){
+                        method = pa.remove(0);
+                    }
+
+                    if (pa.size() == 3) {
+                        Map<String, Object> currentMap = createCurrentMap(f, tec);
+                        //判断 为
+                        String falseStr = pa.get(2);;
+                        if(pa.get(2).contains("(") && pa.get(2).contains(",") && pa.get(2).split(",").length == 3){
+                            pa.set(2,"(-10086)");
+                        }else{
+                            if(pa.get(2).isEmpty()){
+                                pa.set(2, "''");
+                            }else{
+                                if(!pa.get(2).contains("(")){
+                                    pa.set(2, "(" + pa.get(2) + ")");
+                                }
+                            }
+                        }
+                        String string = pa.get(0) + "?" + pa.get(1) + ":" + pa.get(2);
+                        Expression parse = Expression.parse(string);
+
+                        // 针对一个元素多个单元格的数据单独处理
+                        Object o = currentMap.get("E");
+                        if(o != null){
+                            Map<String, List<String>> tableDataMap = (Map<String, List<String>>) o;
+
+                            Set<Integer> set = tableDataMap.values().stream().map(List::size).filter(size -> size != 1).collect(Collectors.toSet());
+                            List<Integer> collect = new ArrayList<>(set);
+                            if(collect.size() > 1){
+                                throw new com.alibaba.nacos.shaded.com.google.protobuf.ServiceException("计算单元格不一致 无法计算");
+                            }
+                            //一个元素存在多单元格
+                            if(collect.size() == 1){
+                                List<List<String>> collect1 = tableDataMap.values().stream().filter(x -> x.size() > 1).collect(Collectors.toList());
+                                //复制一份
+                                List<List<String>> lists = collect1.stream().map(ArrayList::new).collect(Collectors.toList());
+                                List<Object> dataAll = new ArrayList<>();
+                                //数据按 行单独计算
+                                for (int i = 0; i < collect.get(0); i++) {
+                                    for (int j = 0; j < lists.size(); j++) {
+                                        List<String> strings = collect1.get(j);
+                                        strings.clear();
+                                        strings.add(lists.get(j).get(i).toString());
+                                    }
+
+                                    Object data = parse.calculate(currentMap);
+                                    //递归计算
+                                    if(Objects.equals(String.valueOf(data),"-10086")){
+                                        //进入递归算法
+                                        data = multipleIfElse(falseStr,currentMap);
+                                    }
+                                    if("".equals(data)){
+                                        data = "/";
+                                    }
+                                    dataAll.add(data);
+                                }
+                                //赋值元素是否是多个单元格
+                                if(fd.getValues().size() > 1){
+                                    f = f.replace(f, putDataWithKey(dataAll, tec));
+                                } else {
+                                    if(StringUtil.isNotBlank(method) && "sum".equals(method)){
+                                        double sum = dataAll.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).sum();
+                                        f = f.replace(f, putDataWithKey(sum, tec));
+                                    } else{
+                                        //计算平均值
+                                        OptionalDouble op = dataAll.stream().filter(StringUtils::isNumber).map(StringUtils::handleNull).mapToDouble(Double::parseDouble).average();
+                                        if (op.isPresent()) {
+                                            f = f.replace(f, putDataWithKey(op.getAsDouble(), tec));
+                                        }
+                                    }
+
+                                }
+                            } else {
+                                Object data = parse.calculate(currentMap);
+                                //递归计算
+                                if(Objects.equals(String.valueOf(data),"-10086")){
+                                    //进入递归算法
+                                    data = multipleIfElse(falseStr,currentMap);
+                                }
+                                f = f.replace(f, putDataWithKey(data, tec));
+                            }
+                        }
+                    } else {
+                        f = f.replace(f, "参数格式错误");
+                    }
+                } catch (Exception e) {
+                    f = f.replace(f, "解析错误");
+                }
+            }
+            // switch-case 选择公式
+            if (f.contains("switchCase")){
+                try {
+                    // 提取括号内的内容(去掉外层的ifelse())
+                    String content = f.replaceFirst("^" + FC_REG + "switchCase\\(", "").replaceFirst("\\)$", "");
+
+                    String key = null;
+                    String value = null;
+
+                    Map<String, Object> currentMap = createCurrentMap(f, tec);
+
+                    //根据分号分组 数据样例:a=x -> b=0; a=y -> c=1; else -> d=2
+                    String[] ruleArray = content.trim().split(",");
+                    if(ruleArray.length % 2 != 0){
+                        throw new ServiceException("数据格式错误");
+                    }
+                    List<String> list = Arrays.asList(ruleArray);
+                    //2条数据为一组
+                    List<List<String>> partition = Lists.partition(list, 2);
+                    for (List<String> strings : partition) {
+                        String s = strings.get(0);
+                        String s1 = strings.get(1);
+                        String[] action = s1.split("=");
+                        if ("else".equals(s)) {
+                            key = action[0];
+                            value = action[1];
+                            break;
+                        }
+                        Expression parse = Expression.parse(s + "?1:0");
+                        Object data = parse.calculate(currentMap);
+                        if(Objects.equals("1",String.valueOf(data))){
+                            key = action[0];
+                            value = action[1];
+                            break;
+                        }
+                    }
+                    f = "";
+                    if(key != null && value != null){
+                        /*数据回写*/
+                        write(key,value.replaceAll("\\(","").replaceAll("\\)",""),tec);
+                    }
+                } catch (Exception e) {
+                    f = f.replace(f, "解析错误");
+                }
+            }
+
             if (f.contains("avg4segment")) {
                 Matcher m = RegexUtils.matcher(FC_REG + "(avg4segment)\\(([^)]+)\\)", f);
                 while (m.find()) {
@@ -5769,6 +6200,31 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         return params;
     }
 
+    private Object multipleIfElse(String str,Map<String, Object> currentMap) {
+        str = str.replaceFirst("\\(","").replaceFirst("\\)$","");
+        // 解析参数,处理嵌套逗号(在括号内的逗号不应该作为分隔符)
+        List<String> pa = parseParameters(str);
+
+        if (pa.size() == 3) {
+            String s = pa.get(2);;
+            //
+            if(pa.get(2).contains("(") && pa.get(2).contains(",") && pa.get(2).split(",").length == 3){
+                pa.set(2,"-10086");
+            }
+            String string = pa.get(0) + "?" + pa.get(1) + ":(" + pa.get(2) + ")";
+            Expression parse = Expression.parse(string);
+            Object data = parse.calculate(currentMap);
+            //递归计算
+            if(Objects.equals(String.valueOf(data),"-10086")){
+                //进入递归算法
+                data = multipleIfElse(s,currentMap);
+            }
+            return data;
+        } else {
+            return null;
+        }
+    }
+
     /**
      * 符号替换
      * @param s1
@@ -5784,9 +6240,6 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
         if(Objects.equals("≠",s1)){
             s1 = "!=";
         }
-        if(Objects.equals("=",s1)){
-            s1 = "==";
-        }
         if(Objects.equals("<",s1)){
             s1 = "<";
         }