zhangchenglong 2 роки тому
батько
коміт
c54cd1691b

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

@@ -1,5 +1,6 @@
 package com.syjy.calculate.entity;
 
+import java.math.BigDecimal;
 import java.util.HashMap;
 
 /**
@@ -14,7 +15,7 @@ public class CalculateResult extends HashMap<String, Object> {
     private static final long serialVersionUID = 1L;
 
     /** 100 */
-    public static final String ONE_HUNDRED = "100";
+    public static final BigDecimal ONE_HUNDRED = new BigDecimal("100");
 
     /** 百分号 */
     public static final String PERCENT = "%";
@@ -67,6 +68,8 @@ public class CalculateResult extends HashMap<String, Object> {
     public static final String MSG_NO_FORMULA = "未匹配到公式:";
     public static final String MSG_CALCULATE_SUCCESS = "计算成功";
     public static final String MSG_CALCULATE_FAIL = "计算失败:";
+    public static final String MSG_CAP_ZERO = "容量为0";
+    public static final String MSG_SIZE_ZERO = "个数为0";
 
     /**
      * 状态类型

+ 1 - 0
src/main/java/com/syjy/calculate/function/DoubleList.java

@@ -56,4 +56,5 @@ public class DoubleList extends AbstractFunction {
     public String getName() {
         return "doubleList";
     }
+
 }

+ 13 - 1
src/main/java/com/syjy/calculate/function/MeanAbsoluteError.java

@@ -5,7 +5,8 @@ import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
-
+import com.syjy.calculate.entity.CalculateResult;
+import lombok.extern.slf4j.Slf4j;
 import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
@@ -17,6 +18,7 @@ import java.util.Map;
  * @version 1.0
  * @since 2022/9/8 9:30
  */
+@Slf4j
 public class MeanAbsoluteError extends AbstractFunction {
     @Override
     public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
@@ -29,6 +31,16 @@ public class MeanAbsoluteError extends AbstractFunction {
         // 获取容量
         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);
+            return new AviatorDecimal(CalculateResult.ONE_HUNDRED);
+        }
+        // 如果数据个数为0,则分母为0,返回100
+        if (size.compareTo(BigDecimal.ZERO) == 0) {
+            log.error(CalculateResult.MSG_SIZE_ZERO);
+            return new AviatorDecimal(CalculateResult.ONE_HUNDRED);
+        }
         Map<String ,Object> map = new HashMap<>();
         map.put("electricCapacity",electricCapacity);
         map.put("sumDifferenceAbsolute",sumDifferenceAbsolute);

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

@@ -6,7 +6,7 @@ import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
-
+import com.syjy.calculate.entity.CalculateResult;
 import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
@@ -30,16 +30,17 @@ public class Pass extends AbstractFunction {
         // 获取参数
         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);
         BigDecimal sum = BigDecimal.ZERO;
         Sequence seq = RuntimeUtils.seq(first, env);
         // 循环集合获取实际功率、预测功率信息并计算
         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)/electricCapacity)", map)));
+            BigDecimal calculateResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-math.abs((ableValue-forecastAbleValue)/openCapacity)", map)));
             Map<String, Object> passMap = new HashMap<>();
             passMap.put("calculateResult", calculateResult);
             passMap.put("compare", compare);
-            BigDecimal forResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute("calculateResult>=compare ? 1M:0M", passMap)));
+            BigDecimal forResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute("if(calculateResult>=compare){ return 1M; } else{return 0M;}", passMap)));
             sum = sum.add(forResult);
         }
         BigDecimal size = new BigDecimal(seq.hintSize());

+ 5 - 2
src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorA.java

@@ -1,13 +1,12 @@
 package com.syjy.calculate.function;
 
 import com.googlecode.aviator.AviatorEvaluator;
-import com.googlecode.aviator.Expression;
-import com.googlecode.aviator.Options;
 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.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
+import com.syjy.calculate.entity.CalculateResult;
 import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
@@ -27,6 +26,10 @@ public class RootMeanSquaredErrorA extends AbstractFunction {
         // 获取Σ|实际-预测|
         env.put("list",first);
         BigDecimal sumDifferenceAbsolute = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sumDifferenceAbsolute(list)",env)));
+        //当所有点位的预测和实际相减之和为0 ,说明所有点 预测和实际相等 那么准确率是100%
+        if(sumDifferenceAbsolute.compareTo(BigDecimal.ZERO)==0){
+            return new AviatorDecimal(CalculateResult.ONE_HUNDRED);
+        }
         BigDecimal sum = BigDecimal.ZERO;
         Sequence seq = RuntimeUtils.seq(first, env);
         // 循环集合获取实际功率、预测功率信息并计算

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

@@ -27,7 +27,7 @@ public class RootMeanSquaredErrorC extends AbstractFunction {
         // 循环集合获取实际功率、预测功率信息并计算
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
-            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("((ableValue-forecastAbleValue)/openCapacity)**2",map)));
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("math.pow((ableValue-forecastAbleValue)/openCapacity,2)",map)));
             sum = sum.add(forResult);
         }
         Map<String, Object> map = new HashMap<>();

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

@@ -27,7 +27,7 @@ public class RootMeanSquaredErrorR extends AbstractFunction {
         // 循环集合获取实际功率、预测功率信息并计算
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
-            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("((ableValue-forecastAbleValue)/ableValue)**2",map)));
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("math.power((ableValue-forecastAbleValue)/ableValue,2)",map)));
             sum = sum.add(forResult);
         }
         // 上下文参数

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

@@ -37,6 +37,12 @@ public class AccuracyPassRateCalculateService {
      * @return
      */
     public CalculateResult calculate(CalculateRequest calculateRequest) {
+        // 根据类型从数据库中查出公式列表
+        CalculationFormula calculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.FORMULA, calculateRequest.getFormulaType(), calculateRequest.getProvince(), calculateRequest.getElectricType());
+        if (calculationFormula == null || calculationFormula.getFormula() == null) {
+            // 未匹配到公式
+            return CalculateResult.error(CalculateResult.MSG_NO_FORMULA);
+        }
         // 对细则进行校验
         CalculateResult checkedDataResult = checkDataRules(calculateRequest);
         // 如果细则校验失败,返回细则结果
@@ -49,12 +55,6 @@ public class AccuracyPassRateCalculateService {
             return CalculateResult.error(CalculateResult.MSG_USEFUL_CALCULATE_DATA_NULL);
         }
 
-        // 根据类型从数据库中查出公式列表
-        CalculationFormula calculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.FORMULA, calculateRequest.getFormulaType(), calculateRequest.getProvince(), calculateRequest.getElectricType());
-        if (calculationFormula == null || calculationFormula.getFormula() == null) {
-            // 未匹配到公式
-            return CalculateResult.error(CalculateResult.MSG_NO_FORMULA);
-        }
         // 获取公式
         String formula = calculationFormula.getFormula();
         //缓存公式名称
@@ -106,7 +106,7 @@ public class AccuracyPassRateCalculateService {
             resultBig = BigDecimal.ONE;
         }
         // 对数据*100
-        resultBig = resultBig.multiply(new BigDecimal(CalculateResult.ONE_HUNDRED));
+        resultBig = resultBig.multiply(CalculateResult.ONE_HUNDRED);
         // 对数据进行四舍五入
         resultBig = resultBig.setScale(2, BigDecimal.ROUND_HALF_UP);
         // 数据加上百分号