Эх сурвалжийг харах

试验-公式
1、添加ifelse 多重判断
2、公式返回接口添加公式拆解字段

LHB 1 долоо хоног өмнө
parent
commit
585206d932

+ 2 - 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,7 @@ public class FormulaBean {
     public static Integer PARAM = 35;
     private Long id;
     private String formula;
+    private List<FormulaMultipleIf> formulas;
     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;
+}

+ 103 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/FormulaController.java

@@ -216,6 +216,15 @@ 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","");
+                    List<FormulaMultipleIf> formulaMultipleIfs = new ArrayList<>();
+                    strParse(formula,formulaMultipleIfs);
+                    fb.setFormulas(formulaMultipleIfs);
+                }
                 return R.data(fb);
             }
 
@@ -223,6 +232,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("(")){
+                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")

+ 75 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/FormulaServiceImpl.java

@@ -5660,6 +5660,56 @@ public class FormulaServiceImpl extends BaseServiceImpl<FormulaMapper, Formula>
                     } while (f.contains("ifelse") && max < 20);
                 }
             }
+            //多条件判断
+            if (f.contains("ifelseMulti")){
+                int max = 0;
+                do {
+                    // 修改正则表达式,使用非贪婪匹配来处理嵌套情况
+                    Matcher m = RegexUtils.matcher(FC_REG + "(ifelseMulti)\\(((?:[^()]++|\\([^()]*\\))*?)\\)", f);
+                    boolean found = false;
+
+                    while (m.find()) {
+                        found = true;
+                        String el = m.group();
+
+                        try {
+                            // 提取括号内的内容(去掉外层的ifelse())
+                            String content = el.replaceFirst("^" + FC_REG + "ifelseMulti\\(", "").replaceFirst("\\)$", "");
+
+                            // 解析参数,处理嵌套逗号(在括号内的逗号不应该作为分隔符)
+                            List<String> pa = parseParameters(content);
+
+                            if (pa.size() == 3) {
+                                Map<String, Object> currentMap = createCurrentMap(el, tec);
+                                //判断 为
+                                String falseStr = pa.get(2);;
+                                if(pa.get(2).contains("(")){
+                                    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(falseStr,currentMap);
+                                }
+                                f = f.replace(el, putDataWithKey(data, tec));
+                            } else {
+                                f = f.replace(el, "参数格式错误");
+                            }
+                        } catch (Exception e) {
+                            f = f.replace(el, "解析错误");
+                        }
+                    }
+
+                    max++;
+                    // 如果没有找到匹配项,提前退出循环
+                    if (!found) {
+                        break;
+                    }
+                } while (f.contains("ifelseMulti") && max < 20);
+            }
             if (f.contains("avg4segment")) {
                 Matcher m = RegexUtils.matcher(FC_REG + "(avg4segment)\\(([^)]+)\\)", f);
                 while (m.find()) {
@@ -5719,6 +5769,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.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