Pārlūkot izejas kodu

公式计算修改,将公式参数设置为变量

zhangchenglong 2 gadi atpakaļ
vecāks
revīzija
ef1129c1aa

+ 2 - 3
src/main/java/com/syjy/calculate/conotroller/Test.java

@@ -23,7 +23,6 @@ public class Test {
     @RequestMapping(value = "/test")
     @ResponseBody
     public void test() {
-
         List<CalculationInfo> calculationInfoList = new ArrayList<>();
         CalculationInfo calculationInfo = new CalculationInfo();
         calculationInfo.setAbleValue(new BigDecimal("5"));
@@ -54,8 +53,8 @@ public class Test {
         calculateRequest.setCalculationInfoList(calculationInfoList);
 
         calculateRequest.setElectricCapacity(new BigDecimal("12"));
-        calculateRequest.setFormulaType("DAY_SHORT_ACCURACY");
-        calculateRequest.setProvince("E99");
+        calculateRequest.setFormulaType("DAY_SHORT_PASS");
+        calculateRequest.setProvince("E14");
         calculateRequest.setElectricType("E2");
 
         Map<String,Object> resultMap = accuracyPassRateCalculateService.calculate(calculateRequest);

+ 1 - 1
src/main/java/com/syjy/calculate/entity/CalculateRequest.java

@@ -32,7 +32,7 @@ public class CalculateRequest implements Serializable {
     private  String province;
 
     /**
-     * 省调类型
+     * 公式类型
      */
     private String formulaType;
 

+ 34 - 0
src/main/java/com/syjy/calculate/function/CommonUtil.java

@@ -1,7 +1,9 @@
 package com.syjy.calculate.function;
 
+import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.RuntimeUtils;
 import com.googlecode.aviator.runtime.type.Sequence;
+import java.math.BigDecimal;
 import java.util.Map;
 
 /**
@@ -20,4 +22,36 @@ public class CommonUtil {
         Sequence seq = RuntimeUtils.seq(obj, env);
         return seq;
     }
+
+    /**
+     * 根据集合循环公式求和
+     * @param exp
+     * @param seq
+     * @return
+     */
+    public static BigDecimal sum(String exp,Sequence seq){
+        BigDecimal sum = BigDecimal.ZERO;
+        for (Object obj : seq) {
+            Map<String, Object> map = (Map<String, Object>) obj;
+            // 计算: (实际-预测)的平方
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute(exp,map)));
+            // 求和
+            sum = sum.add(forResult);
+        }
+        return sum;
+    }
+
+    /**
+     * 校验参数是否为空
+     * @param paramOne
+     * @param paramTwo
+     * @return
+     */
+    public static boolean checkParam(Object paramOne,Object paramTwo,Object paramThree){
+        if(paramOne==null || paramTwo==null || paramThree == null ){
+            return false;
+        }
+        return true;
+    }
+
 }

+ 8 - 4
src/main/java/com/syjy/calculate/function/MeanAbsoluteError.java

@@ -3,6 +3,7 @@ package com.syjy.calculate.function;
 import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import com.syjy.calculate.entity.CalculateResult;
@@ -21,24 +22,27 @@ import java.util.Map;
 @Slf4j
 public class MeanAbsoluteError extends AbstractFunction {
     @Override
-    public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
         // 获取参数
         Object first = arg1.getValue(env);
+        String second = ((AviatorJavaType) arg2).getName();
+        String third = ((AviatorJavaType) arg3).getName();
+        String exp = "sumDifferenceAbsolute(list," + second + "," + third + ")";
         // 将参数转为集合
         Sequence seq = CommonUtil.getSeq(first,env);
         // 获取Σ|实际-预测|
-        BigDecimal sumDifferenceAbsolute = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sumDifferenceAbsolute(list)",env)));
+        BigDecimal sumDifferenceAbsolute = new BigDecimal(String.valueOf(AviatorEvaluator.execute(exp,env)));
         // 获取容量
         BigDecimal electricCapacity = (BigDecimal)env.get("electricCapacity");
         BigDecimal size = new BigDecimal(seq.hintSize());
         // 如果容量为0,则分母为0,返回100
         if (electricCapacity.compareTo(BigDecimal.ZERO) == 0) {
-            log.error(CalculateResult.MSG_CAP_ZERO);
+            log.warn(CalculateResult.MSG_CAP_ZERO);
             return new AviatorDecimal(CalculateResult.ONE_HUNDRED);
         }
         // 如果数据个数为0,则分母为0,返回100
         if (size.compareTo(BigDecimal.ZERO) == 0) {
-            log.error(CalculateResult.MSG_SIZE_ZERO);
+            log.warn(CalculateResult.MSG_SIZE_ZERO);
             return new AviatorDecimal(CalculateResult.ONE_HUNDRED);
         }
         Map<String ,Object> map = new HashMap<>();

+ 8 - 3
src/main/java/com/syjy/calculate/function/Pass.java

@@ -4,6 +4,7 @@ import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.RuntimeUtils;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import com.syjy.calculate.entity.CalculateResult;
@@ -26,17 +27,21 @@ public class Pass extends AbstractFunction {
      * @return
      */
     @Override
-    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2) {
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3, AviatorObject arg4, AviatorObject arg5) {
         // 获取参数
         Object first = arg1.getValue(env);
         BigDecimal compare = new BigDecimal(String.valueOf(arg2.getValue(env)));
-        compare = compare.divide(CalculateResult.ONE_HUNDRED,8,BigDecimal.ROUND_HALF_UP);
+        compare = compare.divide(CalculateResult.ONE_HUNDRED, 8, BigDecimal.ROUND_HALF_UP);
         BigDecimal sum = BigDecimal.ZERO;
         Sequence seq = RuntimeUtils.seq(first, env);
+        String third = ((AviatorJavaType) arg3).getName();
+        String fourth = ((AviatorJavaType) arg4).getName();
+        String fifth = ((AviatorJavaType) arg5).getName();
         // 循环集合获取实际功率、预测功率信息并计算
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
-            BigDecimal calculateResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-math.abs((ableValue-forecastAbleValue)/openCapacity)", map)));
+            String forExp = "1-math.abs((" + third + "-" + fourth + ")/" + fifth + ")";
+            BigDecimal calculateResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute(forExp, map)));
             Map<String, Object> passMap = new HashMap<>();
             passMap.put("calculateResult", calculateResult);
             passMap.put("compare", compare);

+ 9 - 4
src/main/java/com/syjy/calculate/function/PointS.java

@@ -3,6 +3,7 @@ package com.syjy.calculate.function;
 import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import java.math.BigDecimal;
@@ -17,20 +18,24 @@ import java.util.Map;
  */
 public class PointS extends AbstractFunction {
     @Override
-    public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
         // 获取参数
         Object first = arg1.getValue(env);
-        // 将参数转为集合
-        Sequence seq = CommonUtil.getSeq(first,env);
+        String second = ((AviatorJavaType) arg2).getName();
+        String third = ((AviatorJavaType) arg3).getName();
         BigDecimal result = BigDecimal.ZERO;
+        // 将参数转为集合
+        Sequence seq = CommonUtil.getSeq(first, env);
         // 循环集合
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
-            result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-math.abs((ableValue-forecastAbleValue)/forecastAbleValue)",map)));
+            String exp = "1-math.abs((" + second + "-" + third + ")/" + third + ")";
+            result = new BigDecimal(String.valueOf(AviatorEvaluator.execute(exp, map)));
             break;
         }
         return new AviatorDecimal(result);
     }
+
     @Override
     public String getName() {
         return "pointS";

+ 16 - 8
src/main/java/com/syjy/calculate/function/PointU.java

@@ -3,6 +3,7 @@ package com.syjy.calculate.function;
 import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import java.math.BigDecimal;
@@ -18,26 +19,33 @@ import java.util.Map;
  */
 public class PointU extends AbstractFunction {
     @Override
-    public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
         // 获取参数
         Object first = arg1.getValue(env);
-        // 将参数转为集合
-        Sequence seq = CommonUtil.getSeq(first,env);
         BigDecimal sum = BigDecimal.ZERO;
+        String second = ((AviatorJavaType) arg2).getName();
+        String third = ((AviatorJavaType) arg3).getName();
+        // 拼接公式
+        String exp = "sumDifferenceAbsolute(list," + second + "," + third + ")";
         // 获取Σ|实际-预测|
-        BigDecimal sumDifferenceAbsolute = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sumDifferenceAbsolute(list)",env)));
+        BigDecimal sumDifferenceAbsolute = new BigDecimal(String.valueOf(AviatorEvaluator.execute(exp, env)));
+
+        // 将参数转为集合
+        Sequence seq = CommonUtil.getSeq(first, env);
         // 循环集合
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
-            map.put("sumDifferenceAbsolute",sumDifferenceAbsolute);
-            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("math.abs((ableValue/(ableValue+forecastAbleValue)-0.5M)) * (math.abs(ableValue-forecastAbleValue)/sumDifferenceAbsolute)",map)));
+            map.put("sumDifferenceAbsolute", sumDifferenceAbsolute);
+            String forExp = "math.abs((" + second + "/(" + second + "+" + third + ")-0.5M)) * (math.abs(" + second + "-" + third + ")/sumDifferenceAbsolute)";
+            BigDecimal forResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute(forExp, map)));
             sum = sum.add(forResult);
         }
         Map<String, Object> map = new HashMap<>();
-        map.put("sum",sum);
-        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-(2*sum)",map)));
+        map.put("sum", sum);
+        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-(2*sum)", map)));
         return new AviatorDecimal(result);
     }
+
     @Override
     public String getName() {
         return "pointU";

+ 10 - 4
src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorA.java

@@ -4,6 +4,7 @@ import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.RuntimeUtils;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import com.syjy.calculate.entity.CalculateResult;
@@ -20,12 +21,16 @@ import java.util.Map;
  */
 public class RootMeanSquaredErrorA extends AbstractFunction {
     @Override
-    public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
         // 获取参数
         Object first = arg1.getValue(env);
-        // 获取Σ|实际-预测|
+        String second = ((AviatorJavaType) arg2).getName();
+        String third = ((AviatorJavaType) arg3).getName();
         env.put("list",first);
-        BigDecimal sumDifferenceAbsolute = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sumDifferenceAbsolute(list)",env)));
+        // 拼接公式
+        String exp = "sumDifferenceAbsolute(list," + second + "," + third + ")";
+        // 获取Σ|实际-预测|
+        BigDecimal sumDifferenceAbsolute = new BigDecimal(String.valueOf(AviatorEvaluator.execute(exp,env)));
         //当所有点位的预测和实际相减之和为0 ,说明所有点 预测和实际相等 那么准确率是100%
         if(sumDifferenceAbsolute.compareTo(BigDecimal.ZERO)==0){
             return new AviatorDecimal(CalculateResult.ONE_HUNDRED);
@@ -36,7 +41,8 @@ public class RootMeanSquaredErrorA extends AbstractFunction {
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
             map.put("sumDifferenceAbsolute",sumDifferenceAbsolute);
-            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("differenceSquare(ableValue,forecastAbleValue) * (differenceAbsolute(ableValue,forecastAbleValue)/sumDifferenceAbsolute)",map)));
+            String forExp = "differenceSquare(" + second + "," + third + ") * (differenceAbsolute(" + second + "," + third + ")/sumDifferenceAbsolute)";
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute(forExp,map)));
             sum = sum.add(forResult);
         }
         Map<String, Object> map = new HashMap<>();

+ 9 - 3
src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorC.java

@@ -4,6 +4,7 @@ import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.RuntimeUtils;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import java.math.BigDecimal;
@@ -19,15 +20,20 @@ import java.util.Map;
  */
 public class RootMeanSquaredErrorC extends AbstractFunction {
     @Override
-    public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3, AviatorObject arg4) {
         // 获取参数
         Object first = arg1.getValue(env);
-        BigDecimal sum = BigDecimal.ZERO;
         Sequence seq = RuntimeUtils.seq(first, env);
+        BigDecimal sum = BigDecimal.ZERO;
+        String second = ((AviatorJavaType) arg2).getName();
+        String third = ((AviatorJavaType) arg3).getName();
+        String fourth = ((AviatorJavaType) arg4).getName();
+
         // 循环集合获取实际功率、预测功率信息并计算
         for (Object obj : seq) {
+            String forExp = "math.pow((" + second + "-" + third + ")/" + fourth + ",2)";
             Map<String, Object> map = (Map<String, Object>) obj;
-            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("math.pow((ableValue-forecastAbleValue)/openCapacity,2)",map)));
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute(forExp,map)));
             sum = sum.add(forResult);
         }
         Map<String, Object> map = new HashMap<>();

+ 13 - 8
src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorR.java

@@ -4,6 +4,7 @@ import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.RuntimeUtils;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import java.math.BigDecimal;
@@ -19,28 +20,32 @@ import java.util.Map;
  */
 public class RootMeanSquaredErrorR extends AbstractFunction {
     @Override
-    public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
         // 获取参数
         Object first = arg1.getValue(env);
-        BigDecimal sum = BigDecimal.ZERO;
+        String second = ((AviatorJavaType) arg2).getName();
+        String third = ((AviatorJavaType) arg3).getName();
         Sequence seq = RuntimeUtils.seq(first, env);
+        BigDecimal sum = BigDecimal.ZERO;
         // 循环集合获取实际功率、预测功率信息并计算
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
-            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("math.power((ableValue-forecastAbleValue)/ableValue,2)",map)));
+            String forExp = "math.pow((" + second + "-" + third + ")/" + second + ",2)";
+            BigDecimal forResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute(forExp, map)));
             sum = sum.add(forResult);
         }
         // 上下文参数
         Map<String, Object> map = new HashMap<>();
         BigDecimal size = new BigDecimal(seq.hintSize());
-        map.put("size",size);
-        map.put("sum",sum);
+        map.put("size", size);
+        map.put("sum", sum);
         // 求开根号的结果
-        BigDecimal sqrtSumSize = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(sum/size)",map)));
-        map.put("sqrtSumSize",sqrtSumSize);
-        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-sqrtSumSize",map)));
+        BigDecimal sqrtSumSize = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(sum/size)", map)));
+        map.put("sqrtSumSize", sqrtSumSize);
+        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-sqrtSumSize", map)));
         return new AviatorDecimal(result);
     }
+
     @Override
     public String getName() {
         return "rootMeanSquaredErrorR";

+ 16 - 10
src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorS.java

@@ -4,6 +4,7 @@ import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.RuntimeUtils;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import java.math.BigDecimal;
@@ -19,27 +20,32 @@ import java.util.Map;
  */
 public class RootMeanSquaredErrorS extends AbstractFunction {
     @Override
-    public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
         // 获取参数
         Object first = arg1.getValue(env);
+        String second = ((AviatorJavaType) arg2).getName();
+        String third = ((AviatorJavaType) arg3).getName();
+        // 拼接参数
+        String sumExp = "sumDifferenceSquare(list" + "," + second + "," + third + ")";
         // 获取Σ(实际-预测)²
-        BigDecimal sumDifferenceSquare = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sumDifferenceSquare(list)",env)));
+        BigDecimal sumDifferenceSquare = new BigDecimal(String.valueOf(AviatorEvaluator.execute(sumExp, env)));
         Map<String, Object> map = new HashMap<>();
-        map.put("sumDifferenceSquare",sumDifferenceSquare);
+        map.put("sumDifferenceSquare", sumDifferenceSquare);
         // 求开根号的结果
-        BigDecimal sqrtSum = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(sumDifferenceSquare)",map)));
-        map.put("sqrtSum",sqrtSum);
+        BigDecimal sqrtSum = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(sumDifferenceSquare)", map)));
+        map.put("sqrtSum", sqrtSum);
         // 将参数转为集合
         Sequence seq = RuntimeUtils.seq(first, env);
         BigDecimal size = new BigDecimal(seq.hintSize());
-        map.put("size",size);
+        map.put("size", size);
         // 求开根号的结果
-        BigDecimal sqrtSize = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(size)",map)));
-        map.put("sqrtSize",sqrtSize);
-        map.put("electricCapacity",env.get("electricCapacity"));
-        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-sqrtSum/(electricCapacity*sqrtSize)",map)));
+        BigDecimal sqrtSize = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(size)", map)));
+        map.put("sqrtSize", sqrtSize);
+        map.put("electricCapacity", env.get("electricCapacity"));
+        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-sqrtSum/(electricCapacity*sqrtSize)", map)));
         return new AviatorDecimal(result);
     }
+
     @Override
     public String getName() {
         return "rootMeanSquaredErrorS";

+ 10 - 11
src/main/java/com/syjy/calculate/function/SumDifferenceAbsolute.java

@@ -1,9 +1,8 @@
 package com.syjy.calculate.function;
 
-import com.googlecode.aviator.AviatorEvaluator;
-import com.googlecode.aviator.runtime.RuntimeUtils;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import java.math.BigDecimal;
@@ -18,19 +17,19 @@ import java.util.Map;
  */
 public class SumDifferenceAbsolute extends AbstractFunction {
     @Override
-    public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
         Object first = arg1.getValue(env);
+        String second = ((AviatorJavaType) arg2).getName();
+        String third = ((AviatorJavaType) arg3).getName();
         // 将参数转为集合
-        Sequence seq = CommonUtil.getSeq(first,env);
-        BigDecimal sum = BigDecimal.ZERO;
-        // 循环集合
-        for (Object obj : seq) {
-            Map<String, Object> map = (Map<String, Object>) obj;
-            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("differenceAbsolute(ableValue,forecastAbleValue)",map)));
-            sum = sum.add(forResult);
-        }
+        Sequence seq = CommonUtil.getSeq(first, env);
+        BigDecimal sum;
+        // 拼接表达式
+        String exp = "differenceAbsolute(" + second + "," + third + ")";
+        sum = CommonUtil.sum(exp, seq);
         return new AviatorDecimal(sum);
     }
+
     @Override
     public String getName() {
         return "sumDifferenceAbsolute";

+ 11 - 12
src/main/java/com/syjy/calculate/function/SumDifferenceSquare.java

@@ -1,8 +1,8 @@
 package com.syjy.calculate.function;
 
-import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import java.math.BigDecimal;
@@ -17,21 +17,20 @@ import java.util.Map;
  */
 public class SumDifferenceSquare extends AbstractFunction {
     @Override
-    public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
         Object first = arg1.getValue(env);
         // 将参数转为集合
-        Sequence seq = CommonUtil.getSeq(first,env);
-        BigDecimal sum = BigDecimal.ZERO;
-        // 循环集合
-        for (Object obj : seq) {
-            Map<String, Object> map = (Map<String, Object>) obj;
-            // 计算: (实际-预测)的平方
-            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("differenceSquare(ableValue,forecastAbleValue)",map)));
-            // 求和
-            sum = sum.add(forResult);
-        }
+        Sequence seq = CommonUtil.getSeq(first, env);
+        BigDecimal sum;
+        Object second = ((AviatorJavaType) arg2).getName();
+        Object third = ((AviatorJavaType) arg3).getName();
+        // 拼接表达式
+        String exp = "differenceSquare(" + second + "," + third + ")";
+        // 根据公式和集合,循环计算公式结果并求和
+        sum = CommonUtil.sum(exp, seq);
         return new AviatorDecimal(sum);
     }
+
     @Override
     public String getName() {
         return "sumDifferenceSquare";

+ 9 - 9
src/main/java/com/syjy/calculate/listener/ApplicationListenerImpl.java

@@ -30,21 +30,21 @@ public class ApplicationListenerImpl implements ApplicationListener<ApplicationS
         // 启用基于反射的方法查找和调用
         AviatorEvaluator.setFunctionMissing(JavaMethodReflectionFunctionMissing.getInstance());
         AviatorEvaluator.setOption(Options.ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL, true);
+        AviatorEvaluator.addFunction(new DoubleList());
+        AviatorEvaluator.addFunction(new GetBeginOfDay());
+        AviatorEvaluator.addFunction(new MeanAbsoluteError());
+        AviatorEvaluator.addFunction(new Pass());
+        AviatorEvaluator.addFunction(new PointS());
+        AviatorEvaluator.addFunction(new PointU());
         AviatorEvaluator.addFunction(new RootMeanSquaredErrorA());
         AviatorEvaluator.addFunction(new RootMeanSquaredErrorC());
-        AviatorEvaluator.addFunction(new RootMeanSquaredErrorS());
         AviatorEvaluator.addFunction(new RootMeanSquaredErrorR());
+        AviatorEvaluator.addFunction(new RootMeanSquaredErrorS());
         AviatorEvaluator.addFunction(new SumDifferenceAbsolute());
-        AviatorEvaluator.addFunction(new PointS());
-        AviatorEvaluator.addFunction(new PointU());
-        AviatorEvaluator.addFunction(new Pass());
-        AviatorEvaluator.addFunction(new MeanAbsoluteError());
         AviatorEvaluator.addFunction(new SumDifferenceSquare());
-        AviatorEvaluator.addFunction(new DoubleList());
-        AviatorEvaluator.addFunction(new GetBeginOfDay());
         // (实际-预测)²
-        AviatorEvaluator.defineFunction("differenceSquare", "lambda (ableValue,forecastAbleValue) -> math.pow((ableValue - forecastAbleValue), 2) end");
+        AviatorEvaluator.defineFunction("differenceSquare", "lambda (a,b) -> math.pow((a - b), 2) end");
         // |实际-预测|
-        AviatorEvaluator.defineFunction("differenceAbsolute", "lambda (ableValue,forecastAbleValue) -> math.abs(ableValue - forecastAbleValue) end");
+        AviatorEvaluator.defineFunction("differenceAbsolute", "lambda (a,b) -> math.abs(a - b) end");
     }
 }

+ 1 - 1
src/main/java/com/syjy/calculate/repository/repositoryImpl/CalculationFormulaRepositoryImpl.java

@@ -58,7 +58,7 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
             // 从表中获取旧版本
             String oldVersion = getVersion();
             // 如果版本没变化,不进行初始化表操作
-            if(oldVersion.equals(version)){
+            if(oldVersion.equals(version) || oldVersion.equals("null")){
                 return;
             }
             // 如果版本不同,则初始化表

+ 5 - 2
src/main/java/com/syjy/calculate/service/AccuracyPassRateCalculateService.java

@@ -72,10 +72,9 @@ public class AccuracyPassRateCalculateService {
 
         Map<String, Object> calculateRequestMap = new HashMap<>();
         BeanMap beanMap = BeanMap.create(calculateRequest);
-        for (Object key : calculateRequestMap.keySet()) {
+        for (Object key : beanMap.keySet()) {
             calculateRequestMap.put(String.valueOf(key), beanMap.get(key));
         }
-
         // 执行计算并得出结果
         try {
             // 获取计算结果
@@ -96,6 +95,10 @@ public class AccuracyPassRateCalculateService {
      * @return 过滤后的结果
      */
     private String filterResult(Object result) {
+        // 如果返回的不是数值类型,则不用过滤,直接返回
+        if(!(result instanceof BigDecimal)){
+            return String.valueOf(result);
+        }
         BigDecimal resultBig = new BigDecimal(String.valueOf(result));
         //当结果为负数时,说明偏差过大,准确率为0
         if (resultBig.compareTo(BigDecimal.ZERO) == -1 || resultBig.compareTo(BigDecimal.ZERO) == 0) {

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 4 - 4
src/main/resources/sql/t_calculation_formula.sql


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels