Prechádzať zdrojové kódy

支持多区间范围判断

‘xugp 2 rokov pred
rodič
commit
bf585ab8d5

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

@@ -115,19 +115,18 @@ public class ScoreCalculationSchedule {
 			if (intervalScoringTables.size() == 1){
 				String regularExpression = intervalScoringTables.get(0).getRegularExpression();
 				//公式计算得分
-				score = MathCalculatorUtil.handle(regularExpression);
-				//score = MathCalculatorUtil.calculator(regularExpression);
+				score = MathCalculatorUtil.handle(regularExpression.trim());
 			}
-			/*else {
+			else {
 				//针对多区间评分
 				for (IntervalScoringTable intervalScoringTable : intervalScoringTables){
 					String range = intervalScoringTable.getRange();
-					if (MathCalculatorUtil.handle(range)){
-						score = MathCalculatorUtil.calculator(intervalScoringTable.getRegularExpression());
+					if (rangeHandle(range)){
+						score =  MathCalculatorUtil.handle(intervalScoringTable.getRegularExpression().trim());
 						break;
 					}
 				}
-			}*/
+			}
 		}else {
 			throw new Exception("该指标是非量化指标!");
 		}
@@ -135,24 +134,62 @@ public class ScoreCalculationSchedule {
 	}
 
 
+	/*
+	 *  判断是否在该区间
+	 * */
+	public Boolean rangeHandle(String range) {
 
+		Boolean s = true;
+		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));
+					}
+				}
+				Map<String,Object> map = new HashMap<>();
+				s = (Boolean) ScriptShell.parseExpr(alarmExpression.getExpression(), map);
+			}
+		}catch (Exception e){
+			log.info(e.getMessage());
+		}
+		return s;
+	}
 
 
 
 	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 s4 = "if(2-1<0,-(2-1)/min(2-1,4-1)+5,(2-1)/max(2-1,4-1)+5)";
+		String s5 = "if(1>0,2,3)==0";
 		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);
+		ArrayList<Token> tokens = Analyzer.getTokens(s5);
 
 		//使用不同编码代替函数
 		AlarmExpression alarmExpression = Analyzer.createAlarmExpression(tokens);
@@ -179,10 +216,12 @@ public class ScoreCalculationSchedule {
 				}
 			}
 		}
-
+		Map<String,Object> map = new HashMap<>();
+		Object o = ScriptShell.parseExpr(alarmExpression.getExpression(), map);
+		System.out.println(o);
 		//判断表达式返回结果
-		String calculator = MathCalculatorUtil.calculator(alarmExpression.getExpression());
-		System.out.println(calculator);
+//		String calculator = MathCalculatorUtil.calculator(alarmExpression.getExpression());
+//		System.out.println(calculator);
 
 	}
 

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

@@ -692,14 +692,14 @@ public class MathCalculatorUtil {
 	}
 
 	/*
-	 *  判断是否在这个区间
+	 *  解析函数,计算得分
 	 * */
 	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();
@@ -733,6 +733,7 @@ public class MathCalculatorUtil {
 	}
 
 
+
 	/**
 	 * @Author xugp
 	 * @Description  标准计算,不包含自定义函数, 但包含括号与其他符号表达式