Forráskód Böngészése

计算方法重写 修改方法

zhangchenglong 2 éve
szülő
commit
abf9c3971b

+ 1 - 1
pom.xml

@@ -51,7 +51,7 @@
         <dependency>
             <groupId>com.googlecode.aviator</groupId>
             <artifactId>aviator</artifactId>
-            <version>5.2.5</version>
+            <version>5.2.6</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 324 - 36
src/main/java/com/syjy/calculate/conotroller/Test.java

@@ -1,14 +1,14 @@
 package com.syjy.calculate.conotroller;
 
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
+import com.googlecode.aviator.Expression;
+import com.syjy.calculate.entity.CalculateRequest;
+import com.syjy.calculate.entity.CalculationInfo;
 import com.syjy.calculate.service.AccuracyPassRateCalculateService;
 import com.syjy.calculate.util.CreateAndInsertSqlUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
-
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.util.*;
@@ -20,42 +20,330 @@ public class Test {
     private AccuracyPassRateCalculateService accuracyPassRateCalculateService;
     @Resource
     private CreateAndInsertSqlUtil createAndInsertSqlUtil;
-
     @RequestMapping(value = "/test")
     @ResponseBody
     public void saveElectricField() {
-        // 测试数据组装
-        JSONArray powerData = new JSONArray();
-        JSONObject dataText = new JSONObject();
-        dataText.put("sj", new BigDecimal(8));
-        dataText.put("yc", new BigDecimal(7));
-        powerData.add(dataText);
-        dataText = new JSONObject();
-        dataText.put("sj", new BigDecimal(9));
-        dataText.put("yc", new BigDecimal(7));
-        powerData.add(dataText);
-
-        dataText = new JSONObject();
-        dataText.put("sj", new BigDecimal(5));
-        dataText.put("yc", new BigDecimal(6));
-        powerData.add(dataText);
-
-        dataText = new JSONObject();
-        dataText.put("sj", new BigDecimal(8));
-        dataText.put("yc", new BigDecimal(10));
-        powerData.add(dataText);
-
-        BigDecimal rl = new BigDecimal("10");
-        String provinceEnum = "E51";
-        String type = "MAE";
-        // 计算
-        JSONObject jsonResult = accuracyPassRateCalculateService.calculate(powerData, rl, provinceEnum, type, new BigDecimal("80"));
-        // 计算结果
-        String reslut = jsonResult.getString("reslut");
-        String accuracy = "";
-        if ("success".equals(reslut)) {
-            accuracy = jsonResult.getString("value");
-        }
+
+
+        List<CalculationInfo> calculationInfoList = new ArrayList<>();
+        CalculationInfo calculationInfo = new CalculationInfo();
+        calculationInfo.setSj(new BigDecimal("5"));
+        calculationInfo.setYc(new BigDecimal("4"));
+        calculationInfo.setRl(new BigDecimal("4"));
+        calculationInfo.setTime(1663084800000L);
+        calculationInfoList.add(calculationInfo);
+
+        calculationInfo = new CalculationInfo();
+        calculationInfo.setSj(new BigDecimal("8"));
+        calculationInfo.setYc(new BigDecimal("6"));
+        calculationInfo.setRl(new BigDecimal("9"));
+        calculationInfo.setTime(1663084800000L);
+        calculationInfoList.add(calculationInfo);
+
+        calculationInfo = new CalculationInfo();
+        calculationInfo.setSj(new BigDecimal("6"));
+        calculationInfo.setYc(new BigDecimal("4"));
+        calculationInfo.setRl(new BigDecimal("7"));
+
+        calculationInfo.setTime(1663085700000L);
+        calculationInfoList.add(calculationInfo);
+
+        calculationInfo = new CalculationInfo();
+        calculationInfo.setSj(new BigDecimal("7"));
+        calculationInfo.setYc(new BigDecimal("6"));
+        calculationInfo.setRl(new BigDecimal("8"));
+        calculationInfo.setTime(1663086600000L);
+        calculationInfoList.add(calculationInfo);
+
+        calculationInfo = new CalculationInfo();
+        calculationInfo.setSj(new BigDecimal("9"));
+        calculationInfo.setYc(new BigDecimal("6"));
+        calculationInfo.setRl(new BigDecimal("9"));
+        calculationInfo.setTime(1663086600000L);
+        calculationInfoList.add(calculationInfo);
+
+        CalculateRequest calculateRequest = new CalculateRequest();
+        calculateRequest.setCalculationInfoList(calculationInfoList);
+
+        calculateRequest.setCap(new BigDecimal("12"));
+        calculateRequest.setFormulaType("DAY_SHORT_PASS");
+        calculateRequest.setProvince("E64");
+        calculateRequest.setElectricType("E2");
+
+        Map<String,Object> resultMap = accuracyPassRateCalculateService.calculate(calculateRequest);
+
+        System.out.println("666666");
+
+        Expression exp = null;
+        //            exp = AviatorEvaluator.getInstance().compileScript("examples/aaa.av",true);
+//            Expression script = AviatorEvaluator.getInstance().compile("0M+one-(math.sqrt(sum)/rl)");
+//            Object aad = exp.execute();
+
+//        Map<String , Object> rty = new HashMap<>();
+//        rty.put("sj",new BigDecimal("10"));
+//        rty.put("yc",new BigDecimal("8"));
+//        rty.put("rl",new BigDecimal("3"));
+//        String aacc =  "sj-yc/math.sqrt(rl)";
+//        Expression script = AviatorEvaluator.getInstance().compile(aacc);
+//        Object erew = script.execute(rty);
+//        System.out.println(erew);
+
+
+
+//        CalculationInfo calculationInfo = new CalculationInfo();
+//        calculationInfo.setSj(new BigDecimal("9"));
+//
+//        BigDecimal yc = calculationInfo.getYc();
+//
+//        List<Map<String,Object>> lastList = new ArrayList<>();
+//        Map<String,Object> m1 = new HashMap<>();
+//        m1.put("sj",new BigDecimal("9"));
+//        m1.put("yc",new BigDecimal("9"));
+//        m1.put("rl",new BigDecimal("9"));
+//        m1.put("time",1662998400000L);
+//        lastList.add(m1);
+//        Map<String,Object> m2 = new HashMap<>();
+//        m2.put("sj",new BigDecimal("7"));
+//        m2.put("yc",new BigDecimal("6"));
+//        m2.put("rl",new BigDecimal("8"));
+//        m2.put("time",1662998400000L);
+//        lastList.add(m2);
+//
+//        Map<String,Object> m3 = new HashMap<>();
+//        m3.put("sj",new BigDecimal("9"));
+//        m3.put("yc",new BigDecimal("6"));
+//        m3.put("rl",new BigDecimal("10"));
+//        m3.put("time",1662999300000L);
+//        lastList.add(m3);
+//
+//        Map<String,Object> m4 = new HashMap<>();
+//        m4.put("sj",new BigDecimal("5"));
+//        m4.put("yc",new BigDecimal("4"));
+//        m4.put("rl",new BigDecimal("7"));
+//        m4.put("time",1663000200000L);
+//        lastList.add(m4);
+//
+//        Map<String,Object> m5 = new HashMap<>();
+//        m5.put("sj",new BigDecimal("7"));
+//        m5.put("yc",new BigDecimal("6"));
+//        m5.put("rl",new BigDecimal("7"));
+//        m5.put("time",1663000200000L);
+//        lastList.add(m5);
+//
+//        Map<String,Object> m6 = new HashMap<>();
+//        m6.put("sj",new BigDecimal("12"));
+//        m6.put("yc",new BigDecimal("11"));
+//        m6.put("rl",new BigDecimal("10"));
+//        m6.put("time",1663000200000L);
+//        lastList.add(m6);
+//
+//        Map<String,Object> evv = new HashMap<>();
+//        evv.put("list",lastList);
+//        evv.put("rl",new BigDecimal("10"));
+////        Object rr24 = AviatorEvaluator.execute("listToListList(list)",evv);
+////
+////        System.out.println(rr24);
+//
+//
+//        Expression exp = null;
+//        try {
+//            String aa = System.getProperty("user.dir");
+//            exp = AviatorEvaluator.getInstance().compileScript("examples/aaa.av",true);
+//            Object aad = exp.execute(evv);
+//            System.out.println(aad);
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+
+
+
+
+
+
+
+//        Date ddd = new Date();
+//        ddd.getTime();
+//
+//        long startTime = DateUtil.beginOfDay(DateTime.now()).getTime();
+//        DateTime startTime2 = DateUtil.beginOfDay(DateTime.now());
+//        long nowTime = DateTime.now().getTime();
+//
+//
+//
+//
+//
+//
+//        List<CalculationInfo> calculationInfoList = new ArrayList<>();
+//        CalculationInfo calculationInfo = new CalculationInfo();
+//        calculationInfo.setSj(new BigDecimal("5"));
+//        calculationInfo.setYc(new BigDecimal("4"));
+//        calculationInfo.setRl(new BigDecimal("4"));
+//        calculationInfoList.add(calculationInfo);
+//
+//        CalculateRequest calculateRequest = new CalculateRequest();
+//        calculateRequest.setCalculationInfoList(calculationInfoList);
+//
+//        calculateRequest.setCap(new BigDecimal("12"));
+//        calculateRequest.setFormulaType("DAY_SHORT_ACCURACY");
+//        calculateRequest.setProvince("E99");
+//        calculateRequest.setElectricType("E2");
+//        Map<String,Object> result23 = new HashMap<>();
+//        result23 = accuracyPassRateCalculateService.calculate(calculateRequest);
+//
+//
+//        CalculateResult aa = CalculateResult.error();
+//        String cc = CalculateResult.Type.SUCCESS.value();
+//
+//
+//        Map<String,Object> q1 = new HashMap<>();
+//
+//        Map<String,BigDecimal> q2 = new HashMap<>();
+//        q2.put("aa",new BigDecimal("10"));
+//        q2.put("bb",new BigDecimal("7"));
+//
+//        q1.put("dd",q2);
+//
+//        Map<String,Object> q3 = (Map<String,Object>)q1.get("dd");
+//
+//        Object tr = AviatorEvaluator.execute("math.abs((aa-bb)/bb)",q3);
+//
+//
+//        Map<String,Object> mqww = new HashMap<>();
+//        mqww.put("sj",new BigDecimal("5"));
+//        mqww.put("yc",new BigDecimal("8"));
+//        Object rr24 = AviatorEvaluator.execute("differenceAbsolute(sj,yc)",mqww);
+//
+//
+//        Expression exp = null;
+//        try {
+//            exp = AviatorEvaluator.getInstance().compileScript("examples/hello.av",true);
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//
+//        List<Map<String,BigDecimal>> listMap = new ArrayList<>();
+//        Map<String,BigDecimal> mq = new HashMap<>();
+//        mq.put("sj",new BigDecimal("8"));
+//        mq.put("yc",new BigDecimal("6"));
+//        mq.put("rl",new BigDecimal("11"));
+//        listMap.add(mq);
+//
+//        Map<String,BigDecimal> mq1 = new HashMap<>();
+//        mq1.put("sj",new BigDecimal("9"));
+//        mq1.put("yc",new BigDecimal("8"));
+//        mq1.put("rl",new BigDecimal("11"));
+//        listMap.add(mq1);
+//
+//        Map<String,Object> tM = new HashMap<>();
+//
+//        tM.put("list",listMap);
+//        tM.put("rl",new BigDecimal("10"));
+//
+//
+//        Object result = null;
+//        try {
+//            result = exp.execute(tM);
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+//
+//        System.out.println(result);
+//        //注册函数
+//        AviatorEvaluator.addFunction(new SumFunction());
+//        Map<String, Object> m66 = new HashMap<>();
+//        m66.put("a",new BigDecimal("12"));
+//        m66.put("b",new BigDecimal("13"));
+//        System.out.println(AviatorEvaluator.execute("sum(a, b)",m66));           // 3.0
+//
+//        // Compile the script into a Expression instance.
+//        exp = null;
+//        try {
+//            exp = AviatorEvaluator.getInstance().compileScript("examples/hello.av",true);
+//
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//        }
+//
+////        // 文本存在数据库中的时候
+////        Expression script = AviatorEvaluator.getInstance().compile("name","println('Hello, AviatorScript!');",true);
+//        Map<String, Object> testMap = new HashMap<>();
+//        List<Map<String,BigDecimal>> list = new ArrayList<>();
+//        Map<String,BigDecimal> m1 = new HashMap<String,BigDecimal>();
+//        m1.put("sj",new BigDecimal("8"));
+//        m1.put("yc",new BigDecimal("7"));
+//        m1.put("rl",new BigDecimal("10"));
+//        list.add(m1);
+//        Map<String,BigDecimal> m2 = new HashMap<String,BigDecimal>();
+//        m2.put("sj",new BigDecimal("5"));
+//        m2.put("yc",new BigDecimal("6"));
+//        m2.put("rl",new BigDecimal("10"));
+//        list.add(m2);
+//        Map<String,BigDecimal> m3 = new HashMap<String,BigDecimal>();
+//        m3.put("sj",new BigDecimal("6"));
+//        m3.put("yc",new BigDecimal("9"));
+//        m3.put("rl",new BigDecimal("10"));
+//        list.add(m3);
+//
+//        testMap.put("list",list);
+//
+//        result = exp.execute(testMap);
+//
+//        // 测试数据组装
+//        JSONArray powerData = new JSONArray();
+//        JSONObject dataText = new JSONObject();
+//
+//        String aa = dataText.getString(null);
+//
+//        if(aa == null){
+//            System.out.println("1111111");
+//        }
+//
+//        dataText.put("sj", new BigDecimal(8));
+//        dataText.put("yc", new BigDecimal(7));
+//        powerData.add(dataText);
+//        dataText = new JSONObject();
+//        dataText.put("sj", new BigDecimal(9));
+//        dataText.put("yc", new BigDecimal(7));
+//        powerData.add(dataText);
+//
+//        dataText = new JSONObject();
+//        dataText.put("sj", new BigDecimal(5));
+//        dataText.put("yc", new BigDecimal(6));
+//        powerData.add(dataText);
+//
+//        dataText = new JSONObject();
+//        dataText.put("sj", new BigDecimal(8));
+//        dataText.put("yc", new BigDecimal(10));
+//        powerData.add(dataText);
+//
+//        Map<String, Object> env = new HashMap<String, Object>();
+//        env.put("powerData",powerData);
+//
+//        Map<String, Object> map1 = new HashMap<>();
+//        List<Map<String,Object>> list1 = new ArrayList<>();
+//        Map<String, Object> map2 = new HashMap<>();
+//        map2.put("sj",new BigDecimal(8));
+//        map2.put("yc",new BigDecimal(7));
+//        list1.add(map2);
+//        Map<String, Object> map3 = new HashMap<>();
+//        map3.put("sj",new BigDecimal(8));
+//        map3.put("yc",new BigDecimal(6));
+//        list1.add(map3);
+//        map1.put("list1",list1);
+//
+//
+//        BigDecimal rl = new BigDecimal("10");
+//        String provinceEnum = "E51";
+//        String type = "MAE";
+//        String electricType = "E1";
+//        // 计算
+//        JSONObject jsonResult = accuracyPassRateCalculateService.calculate(powerData, rl, provinceEnum, type,electricType);
+//        // 计算结果
+//        String reslut = jsonResult.getString("reslut");
+//        String accuracy = "";
+//        if ("success".equals(reslut)) {
+//            accuracy = jsonResult.getString("value");
+//        }
     }
 
     @RequestMapping("testExportSql")

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

@@ -61,6 +61,7 @@ public class CalculateResult extends HashMap<String, Object> {
     public static final String MSG_PROVINCE_NULL = "省调为空";
     public static final String MSG_ELECTRIC_TYPE_NULL = "场站类型为空";
     public static final String MSG_CALCULATE_DATA_NULL = "计算数据为空";
+    public static final String MSG_CAP_NULL = "实时容量有空值";
     public static final String MSG_DATA_CHECK_ERROR = "数据校验错误";
     public static final String MSG_NO_FORMULA = "未匹配到公式:";
     public static final String MSG_CALCULATE_SUCCESS = "计算成功";

+ 0 - 5
src/main/java/com/syjy/calculate/entity/CalculationFormula.java

@@ -1,14 +1,9 @@
 package com.syjy.calculate.entity;
 
-
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import lombok.Getter;
-import lombok.Setter;
 import org.springframework.format.annotation.DateTimeFormat;
-
-import javax.persistence.Table;
 import java.io.Serializable;
 import java.util.Date;
 

+ 2 - 2
src/main/java/com/syjy/calculate/function/ListToListList.java → src/main/java/com/syjy/calculate/function/DoubleList.java

@@ -19,7 +19,7 @@ import java.util.Map;
  * @version 1.0
  * @since 2022/9/8 9:30
  */
-public class ListToListList extends AbstractFunction {
+public class DoubleList extends AbstractFunction {
     @Override
     public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
         // 获取参数
@@ -54,6 +54,6 @@ public class ListToListList extends AbstractFunction {
     }
     @Override
     public String getName() {
-        return "listToListList";
+        return "doubleList";
     }
 }

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

@@ -38,12 +38,17 @@ public class Pass extends AbstractFunction {
             Map<String, Object> map = (Map<String, Object>) obj;
             BigDecimal calculateResult = (BigDecimal) AviatorEvaluator.execute("1-math.abs((sj-yc)/rl)",map);
             Map<String, Object> passMap = new HashMap<>();
-            passMap.put("forResult",calculateResult);
+            passMap.put("calculateResult",calculateResult);
             passMap.put("compare",compare);
-            BigDecimal forResult = (BigDecimal) AviatorEvaluator.execute("IF(calculateResult>=compare ,1,0)",passMap);
+            BigDecimal forResult = (BigDecimal) AviatorEvaluator.execute("calculateResult>=compare ? 1M:0M",passMap);
             sum = sum.add(forResult);
         }
-        return new AviatorDecimal(sum);
+        BigDecimal size = new BigDecimal(seq.hintSize());
+        Map<String ,Object> map = new HashMap<>();
+        map.put("sum",sum);
+        map.put("size",size);
+        BigDecimal result = (BigDecimal) AviatorEvaluator.execute("sum/size",map);
+        return new AviatorDecimal(result);
     }
     @Override
     public String getName() {

+ 8 - 6
src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorA.java

@@ -1,6 +1,8 @@
 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;
@@ -34,15 +36,15 @@ public class RootMeanSquaredErrorA extends AbstractFunction {
             BigDecimal forResult = (BigDecimal) AviatorEvaluator.execute("differenceSquare(sj,yc) * (differenceAbsolute(sj,yc)/sumDifferenceAbsolute)",map);
             sum = sum.add(forResult);
         }
-        // 获取容量
-        BigDecimal rl = (BigDecimal)env.get("rl");
         Map<String, Object> map = new HashMap<>();
         map.put("sum",sum);
+        // 获取开根号结果并转为BigDecimal类型(因为Aviator中,只要有double类型的数据进行计算,结果就会是double类型,开根号的计算结果必为double,所以这里先将开根号计算的结果转为BigDecimal)
+        BigDecimal sqrtValue = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(sum)",map)));
+        // 获取容量
+        BigDecimal rl = (BigDecimal)env.get("rl");
+        map.put("sqrtValue",sqrtValue);
         map.put("rl",rl);
-        BigDecimal one = BigDecimal.ONE;
-        map.put("one",one);
-        // 对求和结果开根号
-        Double result = (Double) AviatorEvaluator.execute("one-(math.sqrt(sum)/rl)",map);
+        BigDecimal result = (BigDecimal)AviatorEvaluator.execute("1-(sqrtValue/rl)",map);
         return new AviatorDecimal(result);
     }
     @Override

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

@@ -34,7 +34,10 @@ public class RootMeanSquaredErrorC extends AbstractFunction {
         map.put("sum",sum);
         BigDecimal size = new BigDecimal(seq.hintSize());
         map.put("size",size);
-        BigDecimal result = (BigDecimal) AviatorEvaluator.execute("1-math.sqrt(sum/size)",map);
+        // 求开根号的结果
+        BigDecimal sqrtValue =new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(sum/size)",map)));
+        map.put("sqrtValue",sqrtValue);
+        BigDecimal result = (BigDecimal) AviatorEvaluator.execute("1-sqrtValue",map);
         return new AviatorDecimal(result);
     }
     @Override

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

@@ -30,13 +30,15 @@ public class RootMeanSquaredErrorR extends AbstractFunction {
             BigDecimal forResult = (BigDecimal) AviatorEvaluator.execute("((sj-yc)/sj)**2",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);
-
-        BigDecimal result = (BigDecimal) AviatorEvaluator.execute("1-math.sqrt(sum/size)",map);
+        // 求开根号的结果
+        BigDecimal sqrtSumSize = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(sum/size)",map)));
+        map.put("sqrtSumSize",sqrtSumSize);
+        BigDecimal result = (BigDecimal) AviatorEvaluator.execute("1-sqrtSumSize",map);
         return new AviatorDecimal(result);
     }
     @Override

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

@@ -6,7 +6,6 @@ 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 java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
@@ -27,12 +26,18 @@ public class RootMeanSquaredErrorS extends AbstractFunction {
         BigDecimal sumDifferenceSquare = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sumDifferenceSquare(list)",env)));
         Map<String, Object> map = new HashMap<>();
         map.put("sumDifferenceSquare",sumDifferenceSquare);
-        map.put("rl",env.get("rl"));
+        // 求开根号的结果
+        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);
-        BigDecimal result = (BigDecimal) AviatorEvaluator.execute("math.sqrt(sumDifferenceSquare)/(rl*math.sqrt(size))",map);
+        // 求开根号的结果
+        BigDecimal sqrtSize = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(size)",map)));
+        map.put("sqrtSize",sqrtSize);
+        map.put("rl",env.get("rl"));
+        BigDecimal result = (BigDecimal) AviatorEvaluator.execute("sqrtSum/(rl*sqrtSize)",map);
         return new AviatorDecimal(result);
     }
     @Override

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

@@ -1,6 +1,7 @@
 package com.syjy.calculate.listener;
 
 import com.googlecode.aviator.AviatorEvaluator;
+import com.googlecode.aviator.Options;
 import com.googlecode.aviator.runtime.JavaMethodReflectionFunctionMissing;
 import com.syjy.calculate.function.*;
 import org.springframework.boot.context.event.ApplicationStartedEvent;
@@ -14,6 +15,7 @@ public class ApplicationListenerImpl implements ApplicationListener<ApplicationS
     public void onApplicationEvent(ApplicationStartedEvent event) {
         // 启用基于反射的方法查找和调用
         AviatorEvaluator.setFunctionMissing(JavaMethodReflectionFunctionMissing.getInstance());
+        AviatorEvaluator.setOption(Options.ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL, true);
         AviatorEvaluator.addFunction(new RootMeanSquaredErrorA());
         AviatorEvaluator.addFunction(new RootMeanSquaredErrorC());
         AviatorEvaluator.addFunction(new RootMeanSquaredErrorS());
@@ -24,12 +26,10 @@ public class ApplicationListenerImpl implements ApplicationListener<ApplicationS
         AviatorEvaluator.addFunction(new Pass());
         AviatorEvaluator.addFunction(new MeanAbsoluteError());
         AviatorEvaluator.addFunction(new SumDifferenceSquare());
-        AviatorEvaluator.addFunction(new ListToListList());
+        AviatorEvaluator.addFunction(new DoubleList());
         // (sj-yc)²
         AviatorEvaluator.defineFunction("differenceSquare", "lambda (sj,yc) -> math.pow((sj - yc), 2) end");
         // |sj-yc|
         AviatorEvaluator.defineFunction("differenceAbsolute", "lambda (sj,yc) -> math.abs(sj - yc) end");
-
-
     }
 }

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

@@ -10,6 +10,7 @@ import com.syjy.calculate.repository.CalculationFormulaRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -56,7 +57,9 @@ public class AccuracyPassRateCalculateService {
         //缓存公式名称
         String scriptName = calculateRequest.getProvince() + calculateRequest.getFormulaType() + calculateRequest.getElectricType() + CalculateResult.FORMULA;
         // 初始化公式并缓存公式
-        Expression expression = AviatorEvaluator.getInstance().compile(formula);
+        if (AviatorEvaluator.getCachedExpression(scriptName) == null) {
+            AviatorEvaluator.getInstance().compile(scriptName, formula, true);
+        }
         // 上下文
         Map<String, Object> env = new HashMap<>();
         // 将需要计算的list数据放入上下文
@@ -65,14 +68,9 @@ public class AccuracyPassRateCalculateService {
         // 执行计算并得出结果
         try {
             // 获取计算结果
-            Map<String, Object> executeResult = (Map<String, Object>) expression.execute(env);
-            // 如果计算失败,返回失败内容
-            if (String.valueOf(executeResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.ERROR)) {
-                String resultValue = String.valueOf(executeResult.get(CalculateResult.MSG_TAG));
-                return CalculateResult.error(String.valueOf(executeResult.get(CalculateResult.MSG_TAG)), resultValue);
-            }
+            BigDecimal executeResult = (BigDecimal) AviatorEvaluator.getCachedExpression(scriptName).execute(env);
             // 过滤计算结果
-            String result = filterResult(executeResult.get(CalculateResult.DATA_TAG));
+            String result = filterResult(executeResult);
             return CalculateResult.success(CalculateResult.MSG_CALCULATE_SUCCESS, result);
         } catch (Exception e) {
             e.printStackTrace();
@@ -86,22 +84,21 @@ public class AccuracyPassRateCalculateService {
      * @param result 过滤前的结果
      * @return 过滤后的结果
      */
-    private String filterResult(Object result) {
-        BigDecimal resultBig = (BigDecimal) result;
+    private String filterResult(BigDecimal result) {
         //当结果为负数时,说明偏差过大,准确率为0
-        if (resultBig.compareTo(BigDecimal.ZERO) == -1 || resultBig.compareTo(BigDecimal.ZERO) == 0) {
-            resultBig = BigDecimal.ZERO;
+        if (result.compareTo(BigDecimal.ZERO) == -1 || result.compareTo(BigDecimal.ZERO) == 0) {
+            result = BigDecimal.ZERO;
         }
         // 如果结果大于1,则准确率设为100
-        if (resultBig.compareTo(BigDecimal.ONE) == 1) {
-            resultBig = BigDecimal.ONE;
+        if (result.compareTo(BigDecimal.ONE) == 1) {
+            result = BigDecimal.ONE;
         }
         // 对数据*100
-        resultBig = resultBig.multiply(new BigDecimal(CalculateResult.ONE_HUNDRED));
+        result = result.multiply(new BigDecimal(CalculateResult.ONE_HUNDRED));
         // 对数据进行四舍五入
-        resultBig = resultBig.setScale(2, BigDecimal.ROUND_HALF_UP);
+        result = result.setScale(2, BigDecimal.ROUND_HALF_UP);
         // 数据加上百分号
-        return resultBig + CalculateResult.PERCENT;
+        return result + CalculateResult.PERCENT;
     }
 
     /**
@@ -142,6 +139,15 @@ public class AccuracyPassRateCalculateService {
                 return CalculateResult.error(CalculateResult.MSG_CALCULATE_DATA_NULL);
             }
         }
+        // 如果固定功率为空
+        if(calculateRequest.getCap()==null){
+            // 循环判断实时功率是否为空
+            for (CalculationInfo calculationInfo : calculationInfoList) {
+                if (calculationInfo.getRl() == null) {
+                    return CalculateResult.error(CalculateResult.MSG_CAP_NULL);
+                }
+            }
+        }
         // 将数据转为List Map 格式
         List<Map<String, Object>> calculationInfoListMap = getCalculationInfoList(calculationInfoList);
         // 获取细则公式
@@ -150,15 +156,19 @@ public class AccuracyPassRateCalculateService {
             // 未匹配到细则文件,则不进行细则校验,返回数据
             return CalculateResult.success(calculationInfoListMap);
         }
+        // 脚本名称
+        String scriptName = calculateRequest.getProvince() + calculateRequest.getFormulaType() + calculateRequest.getElectricType() + CalculateResult.RULES;
         // 初始化公式并缓存公式
-        Expression expression = AviatorEvaluator.getInstance().compile(rulesCalculationFormula.getFormula());
+        if (AviatorEvaluator.getCachedExpression(scriptName) == null) {
+            AviatorEvaluator.getInstance().compile(scriptName, rulesCalculationFormula.getFormula(), true);
+        }
         // 通过校验的数据
         List<Map<String, Object>> passList = new ArrayList<>();
         // 循环数据,对数据进行校验
         for (Map<String, Object> calculationMap : calculationInfoListMap) {
             // 循环公式,对每条功率信息进行细则处理
             try {
-                Map<String, Object> checkResult = (HashMap<String, Object>) expression.execute(calculationMap);
+                Map<String, Object> checkResult = (HashMap<String, Object>) AviatorEvaluator.getCachedExpression(scriptName).execute(calculationMap);
                 // 如果返回结果是忽略,则结束本次循环
                 if (String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.IGNORE)) {
                     continue;