Explorar o código

后台计算支持if自定义函数计算

‘xugp %!s(int64=2) %!d(string=hai) anos
pai
achega
dfbd958ced

+ 5 - 4
ims-service/ims-eval/src/main/java/com/ims/eval/entity/SelfMathFormulaEnum.java

@@ -19,13 +19,14 @@ public enum SelfMathFormulaEnum {
 		exp("exp", 1, 3,"exp()", "返回 e 的指数"),
 		floor("floor", 1, 5,"floor()", "对数进行下舍入"),
 		log("log", 1, 3,"log()", "返回数的自然对数(底为e)"),
-		max("max", 2, 3,"max()", "返回 x 和 y 中的最高值"),
-		min("min", 2, 3,"min()", "返回 x 和 y 中的最低值"),
-		pow("pow", 2, 3,"pow()", "返回 x 的 y 次幂"),
+		max("max", 2, 3,"max(,)", "返回 x 和 y 中的最高值"),
+		min("min", 2, 3,"min(,)", "返回 x 和 y 中的最低值"),
+		pow("pow", 2, 3,"pow(,)", "返回 x 的 y 次幂"),
 		round("round", 1, 5,"round()", "把数四舍五入为最接近的整数"),
 		sin("sin", 1, 3,"sin()", "返回数的正弦"),
 		sqrt("sqrt", 1, 4,"sqrt()", "返回数的平方根"),
-		tan("tan", 1, 3,"tan()", "返回角的正切");
+		tan("tan", 1, 3,"tan()", "返回角的正切"),
+	    ifs("if",3, 2,"if(,,)", "if表达式");
 
 
 		/**

+ 52 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/expression/AlarmFunction.java

@@ -0,0 +1,52 @@
+package com.ims.eval.expression;
+
+
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+@Slf4j
+public class AlarmFunction {
+
+
+
+    private AlarmExpression alarmExpression;
+
+    private List<AlarmFunction> children;
+
+    private AlarmFunction parent;
+
+
+
+    private long lastExplainTime = 0;
+
+
+
+    public Object explain() {
+
+        Map<String, Object> varMap = new HashMap<>();
+        if (alarmExpression.getVarList() != null && alarmExpression.getVarList().size() > 0) {
+            for (String varName : alarmExpression.getVarList()) {
+
+
+            }
+        }
+
+        if (children != null && children.size() > 0) {
+            for (AlarmFunction af : children) {
+                Object result = af.explain();
+                varMap.put(af.getAlarmExpression().getFunCode(), result);
+            }
+        }
+
+        return ScriptShell.parseExpr(alarmExpression.getExpression(), varMap);
+    }
+
+
+}

+ 1 - 0
ims-service/ims-eval/src/main/java/com/ims/eval/expression/Analyzer.java

@@ -28,6 +28,7 @@ public class Analyzer {
 		add("sin");
 		add("sqrt");
 		add("tan");
+		add("if");
     }};
 
     public static AlarmExpression getAlarmExpression(String exp) {

+ 53 - 30
ims-service/ims-eval/src/main/java/com/ims/eval/schedule/ScoreCalculationSchedule.java

@@ -4,10 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ims.common.utils.StringUtils;
 import com.ims.eval.dao.*;
 import com.ims.eval.entity.*;
-import com.ims.eval.expression.AlarmExpression;
-import com.ims.eval.expression.Analyzer;
-import com.ims.eval.expression.ScriptShell;
-import com.ims.eval.expression.Token;
+import com.ims.eval.expression.*;
 import com.ims.eval.service.IEvaluationScoreCountService;
 import com.ims.eval.util.MathCalculatorUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -118,17 +115,19 @@ public class ScoreCalculationSchedule {
 			if (intervalScoringTables.size() == 1){
 				String regularExpression = intervalScoringTables.get(0).getRegularExpression();
 				//公式计算得分
-				score = MathCalculatorUtil.calculator(regularExpression);
-			}else {
+				score = MathCalculatorUtil.handle(regularExpression);
+				//score = MathCalculatorUtil.calculator(regularExpression);
+			}
+			/*else {
 				//针对多区间评分
 				for (IntervalScoringTable intervalScoringTable : intervalScoringTables){
 					String range = intervalScoringTable.getRange();
-					if (handle(range)){
+					if (MathCalculatorUtil.handle(range)){
 						score = MathCalculatorUtil.calculator(intervalScoringTable.getRegularExpression());
 						break;
 					}
 				}
-			}
+			}*/
 		}else {
 			throw new Exception("该指标是非量化指标!");
 		}
@@ -136,31 +135,55 @@ public class ScoreCalculationSchedule {
 	}
 
 
-	/*
-	*  判断是否在这个区间
-	* */
-	public Boolean handle(String range) {
 
-		Boolean o = true;
-		try {
-			//将区间表达式拆分
-			ArrayList<Token> tokens = Analyzer.getTokens(range);
-			//使用不同编码代替函数
-			AlarmExpression alarmExpression = Analyzer.createAlarmExpression(tokens);
-			List<AlarmExpression> children = alarmExpression.getChildren();
-			for (AlarmExpression alarmExpression1 : children){
-				String calculator = MathCalculatorUtil.calculator(alarmExpression1.getExpression());
-				alarmExpression.setExpression(alarmExpression.getExpression().replaceAll(alarmExpression1.getFunCode(), calculator));
-			}
 
-			//判断表达式返回结果
-			Map<String,Object> map = new HashMap<>();
-			o = (Boolean) ScriptShell.parseExpr(alarmExpression.getExpression(), map);
-		}catch (Exception e){
-			log.info(e.getMessage());
+
+
+	public static void main(String[] args) {
+
+		Map<String,Object> map = new HashMap<>();
+		Object o = ScriptShell.parseExpr("0==1", map);
+		System.out.println(o);
+
+		String s2 = "if(if(2>0,max(1,2)+20,min(1,3)+10)>11,12,if(2<0,min(5,4)+1,max(1,3)+2))";
+
+		String s4 = "if(abs(99)<=10%,(5%-abs(99))/1%*0.2+5,4)";
+		String s3 = "if(abs(99)<=5%,if(abs(99)>=1%,(5%-abs(99))/1%*0.25+5,6),if(abs(99)<=10%,(5%-abs(99))/1%*0.2+5,4))+if(99==0,5,if(99>0,6,4))";
+		/*String sd = "max(1,min(1,2))";
+		String sc = MathCalculatorUtil.calculator(sd);*/
+		String ss = "if(max(1,3)<1,1,2)";
+		ArrayList<Token> tokens = Analyzer.getTokens(s3);
+
+		//使用不同编码代替函数
+		AlarmExpression alarmExpression = Analyzer.createAlarmExpression(tokens);
+		if (alarmExpression.getVarList() != null && alarmExpression.getVarList().size() > 0) {
+			List<AlarmExpression> alarmExpressions = alarmExpression.getChildren();
+			for (AlarmExpression alarmExpression1 : alarmExpressions){
+				if (alarmExpression1.getChildren().size() > 0 && alarmExpression1.getChildren() != null){
+					for (AlarmExpression alarmExpression2 : alarmExpression1.getChildren()){
+						if (alarmExpression2.getChildren().size() > 0 && alarmExpression2.getChildren() != null){
+							List<AlarmExpression> al = alarmExpression2.getChildren();
+							for (AlarmExpression alarmExpression3 : al){
+								String calculator = MathCalculatorUtil.calculator(alarmExpression3.getExpression());
+								alarmExpression2.setExpression(alarmExpression2.getExpression().replaceAll(alarmExpression3.getFunCode(), calculator));
+							}
+						}
+						String calculator = MathCalculatorUtil.calculator(alarmExpression2.getExpression());
+						alarmExpression1.setExpression(alarmExpression1.getExpression().replaceAll(alarmExpression2.getFunCode(), calculator));
+					}
+					String calculator = MathCalculatorUtil.calculator(alarmExpression1.getExpression());
+					alarmExpression.setExpression(alarmExpression.getExpression().replaceAll(alarmExpression1.getFunCode(), calculator));
+				}else {
+					String calculator = MathCalculatorUtil.calculator(alarmExpression1.getExpression());
+					alarmExpression.setExpression(alarmExpression.getExpression().replaceAll(alarmExpression1.getFunCode(), calculator));
+				}
+			}
 		}
-		return o;
-	}
 
+		//判断表达式返回结果
+		String calculator = MathCalculatorUtil.calculator(alarmExpression.getExpression());
+		System.out.println(calculator);
+
+	}
 
 }

+ 75 - 2
ims-service/ims-eval/src/main/java/com/ims/eval/util/MathCalculatorUtil.java

@@ -2,6 +2,10 @@ package com.ims.eval.util;
 
 import com.alibaba.fastjson.JSON;
 import com.ims.eval.entity.SelfMathFormulaEnum;
+import com.ims.eval.expression.AlarmExpression;
+import com.ims.eval.expression.Analyzer;
+import com.ims.eval.expression.ScriptShell;
+import com.ims.eval.expression.Token;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -225,7 +229,14 @@ public class MathCalculatorUtil {
 				} else if (arr[i] == ',') {
 					//判定规则,如果有逗号,1,匹配该逗号是否被括号()包着,且左括号当前前面是否是自定义公式
 					checkComma(expression, i, i);
-				} else {
+				} else if (arr[i] == '>') {
+
+				} else if (arr[i] == '<') {
+
+				} else if (arr[i] == '=') {
+
+				}
+				else {
 					//非数字和运算符
 					log.error("非数字和运算符:==>" + arr[i]);
 					throw new RuntimeException("非数字和运算符:==>" + arr[i]);
@@ -662,6 +673,14 @@ public class MathCalculatorUtil {
 			case sqrt:
 				result = Math.sqrt(Double.parseDouble(args[0]));
 				break;
+			case ifs:
+				if (args[0].equals("1")) {
+					String calculator = calculator(args[1]);
+					result = Double.valueOf(calculator);
+				}else {
+					result  = Double.valueOf(calculator(args[2]));
+				}
+				break;
 			case tan:
 				result = Math.tan(Double.parseDouble(args[0]));
 				break;
@@ -672,6 +691,47 @@ public class MathCalculatorUtil {
 		return String.valueOf(result);
 	}
 
+	/*
+	 *  判断是否在这个区间
+	 * */
+	public static String handle(String range) {
+
+		try {
+			//将区间表达式拆分
+			ArrayList<Token> tokens = Analyzer.getTokens(range);
+			//使用不同编码代替函数  支吃三级函数嵌套
+			AlarmExpression alarmExpression = Analyzer.createAlarmExpression(tokens);
+			if (alarmExpression.getVarList() != null && alarmExpression.getVarList().size() > 0) {
+				List<AlarmExpression> alarmExpressions = alarmExpression.getChildren();
+				for (AlarmExpression alarmExpression1 : alarmExpressions){
+					if (alarmExpression1.getChildren().size() > 0 && alarmExpression1.getChildren() != null){
+						for (AlarmExpression alarmExpression2 : alarmExpression1.getChildren()){
+							if (alarmExpression2.getChildren().size() > 0 && alarmExpression2.getChildren() != null){
+								List<AlarmExpression> al = alarmExpression2.getChildren();
+								for (AlarmExpression alarmExpression3 : al){
+									String calculator = MathCalculatorUtil.calculator(alarmExpression3.getExpression());
+									alarmExpression2.setExpression(alarmExpression2.getExpression().replaceAll(alarmExpression3.getFunCode(), calculator));
+								}
+							}
+							String calculator = MathCalculatorUtil.calculator(alarmExpression2.getExpression());
+							alarmExpression1.setExpression(alarmExpression1.getExpression().replaceAll(alarmExpression2.getFunCode(), calculator));
+						}
+						String calculator = MathCalculatorUtil.calculator(alarmExpression1.getExpression());
+						alarmExpression.setExpression(alarmExpression.getExpression().replaceAll(alarmExpression1.getFunCode(), calculator));
+					}else {
+						String calculator = MathCalculatorUtil.calculator(alarmExpression1.getExpression());
+						alarmExpression.setExpression(alarmExpression.getExpression().replaceAll(alarmExpression1.getFunCode(), calculator));
+					}
+				}
+				return calculator(alarmExpression.getExpression());
+			}
+			//判断表达式返回结果
+		}catch (Exception e){
+			log.info(e.getMessage());
+		}
+		return "";
+	}
+
 
 	/**
 	 * @Author xugp
@@ -726,9 +786,22 @@ public class MathCalculatorUtil {
 		int mulIndex = str.indexOf('*');
 		int divIndex = str.indexOf('/');
 		int modIndex = str.indexOf('%');
+		int lessIndex = str.indexOf('<');
+		int greaterIndex = str.indexOf('>');
+		int equalIndex = str.indexOf('=');
 		//只有加法和减法
 		if (mulIndex == -1 && divIndex == -1 && modIndex == -1) {
-			return AASOperation(str);
+			if (lessIndex == -1 && greaterIndex == -1 && equalIndex == -1){
+				return AASOperation(str);
+			}else {
+				Map<String,Object> map = new HashMap<>();
+				Object o = ScriptShell.parseExpr(str, map);
+				if ((Boolean) o) {
+					return "1";
+				} else {
+					return "0";
+				}
+			}
 		}
 		String result0 = "0";