Bläddra i källkod

准确率计算修改

zhangchenglong 2 år sedan
förälder
incheckning
e2ab9a3df1
26 ändrade filer med 497 tillägg och 464 borttagningar
  1. 0 1
      pom.xml
  2. 5 5
      src/main/java/com/syjy/calculate/config/StarterProperties.java
  3. 22 41
      src/main/java/com/syjy/calculate/conotroller/JarCalculate.java
  4. 18 30
      src/main/java/com/syjy/calculate/conotroller/Test.java
  5. 5 6
      src/main/java/com/syjy/calculate/entity/CalculateRequest.java
  6. 4 6
      src/main/java/com/syjy/calculate/entity/CalculateResult.java
  7. 1 1
      src/main/java/com/syjy/calculate/entity/CalculationFormula.java
  8. 16 84
      src/main/java/com/syjy/calculate/entity/CalculationInfo.java
  9. 31 0
      src/main/java/com/syjy/calculate/function/GetBeginOfDay.java
  10. 5 5
      src/main/java/com/syjy/calculate/function/MeanAbsoluteError.java
  11. 9 9
      src/main/java/com/syjy/calculate/function/Pass.java
  12. 1 1
      src/main/java/com/syjy/calculate/function/PointS.java
  13. 3 5
      src/main/java/com/syjy/calculate/function/PointU.java
  14. 5 5
      src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorA.java
  15. 2 2
      src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorC.java
  16. 2 2
      src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorR.java
  17. 3 3
      src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorS.java
  18. 2 2
      src/main/java/com/syjy/calculate/function/SumDifferenceAbsolute.java
  19. 2 2
      src/main/java/com/syjy/calculate/function/SumDifferenceSquare.java
  20. 19 4
      src/main/java/com/syjy/calculate/listener/ApplicationListenerImpl.java
  21. 30 2
      src/main/java/com/syjy/calculate/repository/CalculationFormulaRepository.java
  22. 172 43
      src/main/java/com/syjy/calculate/repository/repositoryImpl/CalculationFormulaRepositoryImpl.java
  23. 36 27
      src/main/java/com/syjy/calculate/service/AccuracyPassRateCalculateService.java
  24. 7 4
      src/main/java/com/syjy/calculate/util/CreateAndInsertSqlUtil.java
  25. 8 16
      src/main/resources/META-INF/resources/calculateView/calculate.html
  26. 89 158
      src/main/resources/sql/t_calculation_formula.sql

+ 0 - 1
pom.xml

@@ -89,7 +89,6 @@
             <artifactId>commons-io</artifactId>
             <version>2.6</version>
         </dependency>
-
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-thymeleaf</artifactId>

+ 5 - 5
src/main/java/com/syjy/calculate/config/StarterProperties.java

@@ -13,13 +13,13 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
 @ConfigurationProperties("calculate.service")
 public class StarterProperties {
 
-    private String dropTableFlag;
+    private String version;
 
-    public String getDropTableFlag() {
-        return dropTableFlag;
+    public String getVersion() {
+        return version;
     }
 
-    public void setDropTableFlag(String dropTableFlag) {
-        this.dropTableFlag = dropTableFlag;
+    public void setVersion(String version) {
+        this.version = version;
     }
 }

+ 22 - 41
src/main/java/com/syjy/calculate/conotroller/JarCalculate.java

@@ -3,13 +3,8 @@ package com.syjy.calculate.conotroller;
 import com.syjy.calculate.entity.CalculationFormula;
 import com.syjy.calculate.repository.CalculationFormulaRepository;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.dao.DataAccessException;
-import org.springframework.jdbc.core.BeanPropertyRowMapper;
-import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -22,67 +17,53 @@ import java.util.List;
 @Controller
 @RequestMapping("calculateView/jarCalculate")
 public class JarCalculate {
-    @Resource
-    public JdbcTemplate jdbcTemplate;
     @Autowired
     CalculationFormulaRepository calculationFormulaRepository;
 
+    /**
+     * 查询所有公式
+     * @return
+     */
     @GetMapping("select")
     @ResponseBody
     public List<CalculationFormula> select() {
-        String sql = "SELECT * from t_calculation_formula";
-        List<CalculationFormula> calculationFormulaList = new ArrayList<>();
-        try {
-            calculationFormulaList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(CalculationFormula.class));
-        } catch (DataAccessException e) {
-            e.printStackTrace();
-        }
-        return calculationFormulaList;
+        return calculationFormulaRepository.select();
     }
 
+    /**
+     * 更新公式
+     * @param calculationFormula
+     * @return
+     */
     @PostMapping("edit")
     @ResponseBody
     public String edit(@RequestBody CalculationFormula calculationFormula) {
-        Integer id = calculationFormula.getId();
-        String type = calculationFormula.getType();
-        Integer orderNo = calculationFormula.getOrderNo();
-        String formula = calculationFormula.getFormula();
-        String province = calculationFormula.getProvinceEnum();
-        String state = calculationFormula.getState();
-        try {
-            jdbcTemplate.update("update t_calculation_formula set type=?,orderNo=?,formula=?,province_enum=?,state=? where id=?", type, orderNo, formula, province, state, id);
-        } catch (DataAccessException e) {
-            e.printStackTrace();
+        if(calculationFormulaRepository.update(calculationFormula)==0){
+            return "修改失败";
         }
         return "修改成功";
     }
 
+    /**
+     * 新增公式
+     * @param calculationFormula
+     * @return
+     */
     @PostMapping("add")
     @ResponseBody
     public String add(@RequestBody CalculationFormula calculationFormula) {
-        String type = calculationFormula.getType();
-        Integer orderNo = calculationFormula.getOrderNo();
-        String formula = calculationFormula.getFormula();
-        String province_enum = calculationFormula.getProvinceEnum();
-        try {
-            jdbcTemplate.update(
-                    "INSERT INTO t_calculation_formula(TYPE,ORDERNO,FORMULA,PROVINCE_ENUM) VALUES (?, ?,?,?)", type, orderNo, formula, province_enum
-            );
-        } catch (DataAccessException e) {
-            e.printStackTrace();
+        if(calculationFormulaRepository.add(calculationFormula)==0){
+            return "新增失败";
         }
         return "新增成功";
     }
 
-    @PostMapping("delet")
+    @PostMapping("delete")
     @ResponseBody
     public String delete(@RequestBody CalculationFormula calculationFormula) {
-        System.out.println("id" + calculationFormula.getId());
         Integer id = calculationFormula.getId();
-        try {
-            jdbcTemplate.update("delete from t_calculation_formula where id=?", id);
-        } catch (DataAccessException e) {
-            e.printStackTrace();
+        if(calculationFormulaRepository.delete(id)==0){
+            return "删除失败";
         }
         return "删除成功";
     }

+ 18 - 30
src/main/java/com/syjy/calculate/conotroller/Test.java

@@ -1,6 +1,5 @@
 package com.syjy.calculate.conotroller;
 
-import com.googlecode.aviator.Expression;
 import com.syjy.calculate.entity.CalculateRequest;
 import com.syjy.calculate.entity.CalculationInfo;
 import com.syjy.calculate.service.AccuracyPassRateCalculateService;
@@ -20,58 +19,47 @@ public class Test {
     private AccuracyPassRateCalculateService accuracyPassRateCalculateService;
     @Resource
     private CreateAndInsertSqlUtil createAndInsertSqlUtil;
+
     @RequestMapping(value = "/test")
     @ResponseBody
-    public void saveElectricField() {
+    public void test() {
 
         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.setAbleValue(new BigDecimal("5"));
+        calculationInfo.setRealValue(new BigDecimal("5"));
+        calculationInfo.setForecastAbleValue(new BigDecimal("4"));
+        calculationInfo.setOpenCapacity(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.setAbleValue(new BigDecimal("8"));
+        calculationInfo.setRealValue(new BigDecimal("8"));
+        calculationInfo.setForecastAbleValue(new BigDecimal("6"));
+        calculationInfo.setOpenCapacity(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.setAbleValue(new BigDecimal("6"));
+        calculationInfo.setRealValue(new BigDecimal("6"));
+        calculationInfo.setForecastAbleValue(new BigDecimal("4"));
+        calculationInfo.setOpenCapacity(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.setElectricCapacity(new BigDecimal("12"));
+        calculateRequest.setFormulaType("DAY_SHORT_ACCURACY");
+        calculateRequest.setProvince("E99");
         calculateRequest.setElectricType("E2");
 
         Map<String,Object> resultMap = accuracyPassRateCalculateService.calculate(calculateRequest);
-        System.out.println("666666");
-
+        System.out.println(resultMap.get("msg"));
     }
 
     @RequestMapping("testExportSql")

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

@@ -1,7 +1,6 @@
 package com.syjy.calculate.entity;
 
 import lombok.Data;
-
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.List;
@@ -25,7 +24,7 @@ public class CalculateRequest implements Serializable {
     /**
      * 容量
      */
-    private BigDecimal cap;
+    private BigDecimal electricCapacity;
 
     /**
      * 省调
@@ -43,13 +42,13 @@ public class CalculateRequest implements Serializable {
     private String electricType;
 
     /**
-     * 备用字段
+     * 场站标识
      */
-    private String backUpA;
+    private String sign;
 
     /**
-     * 备用字段
+     * 场站状态
      */
-    private String backUpB;
+    private String stationStatus;
 
 }

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

@@ -46,14 +46,11 @@ public class CalculateResult extends HashMap<String, Object> {
     /** 公式上下文中的数据 */
     public static final String LIST = "list";
 
-    /** 实际功率 */
-    public static final String SJ = "sj";
-
-    /** 预测功率 */
-    public static final String YC = "yc";
+    /** 场站标识 */
+    public static final String SIGN = "sign";
 
     /** 容量 */
-    public static final String RL = "rl";
+    public static final String CAPACITY = "electricCapacity";
 
     /** 时间 */
     public static final String TIME = "time";
@@ -64,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_USEFUL_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 = "未匹配到公式:";

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

@@ -43,7 +43,7 @@ public class CalculationFormula implements Serializable  {
     /**
      * 上报省调
      */
-    private String provinceEnum;
+    private String province;
 
     /**
      * 场站类型

+ 16 - 84
src/main/java/com/syjy/calculate/entity/CalculationInfo.java

@@ -6,7 +6,7 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
- * 计算入参
+ * 计算公式的入参
  *
  * @author zcl
  * @version 1.0
@@ -19,25 +19,11 @@ public class CalculationInfo implements Serializable  {
     private static final long serialVersionUID = 1L;
 
     /**
-     * 实际功率
-     */
-    private BigDecimal sj;
-
-    /**
-     * 预测功率
-     */
-    private BigDecimal yc;
-
-    /**
-     *  容量
-     */
-    private BigDecimal rl;
-
-    /**
      * 时间
      */
     private long time;
 
+    // PowerStationStatusData 相关数据
     /**
      * 人工判断是否限电
      * 0 以系统判断结果为准
@@ -47,59 +33,24 @@ public class CalculationInfo implements Serializable  {
     private Integer isRationingByManualControl;
 
     /**
-     * 可用功率(MW)
-     */
-    private BigDecimal ableValue;
-
-    /**
-     * 理论功率(MW)
-     */
-    private BigDecimal theoryValue;
-
-    /**
-     * 样板机参照功率(MW) 理论
-     */
-    private BigDecimal referencePowerBySample;
-
-    /**
-     * 测风/测光 参照功率(MW) 理论
-     */
-    private BigDecimal referencePowerByMeasuring;
-
-    /**
-     *  机头风速法参照功率(MW) 理论
+     * 系统自动判断是否限电
      */
-    private BigDecimal referencePowerByHubSpeed;
+    Boolean isRationingByAutoControl;
 
     /**
-     * 样板机法功率(MW) 可用
+     * 实际功率(MW)
      */
-    private BigDecimal ablePowerBySample;
+    private BigDecimal realValue;
 
     /**
-     *  测风/测光(MW) 可用
-     */
-    private BigDecimal ablePowerByMeasuring;
-
-    /**
-     * 机头风速法参照功率(MW) 可用
-     */
-    private BigDecimal ablePowerByHubSpeed;
-
-    /**
-     * 样板机法的异常值
-     */
-    private BigDecimal abnormalOfSample;
-
-    /**
-     * 测风光法的异常值
+     * 可用功率(MW)
      */
-    private BigDecimal abnormalOfMeasuring;
+    private BigDecimal ableValue;
 
     /**
-     *  机头风速法的异常值
+     * 理论功率(MW
      */
-    private BigDecimal abnormalOfHubSpeed;
+    private BigDecimal theoryValue;
 
     /**
      * 开机容量(MW)
@@ -111,44 +62,25 @@ public class CalculationInfo implements Serializable  {
      */
     private BigDecimal capacity;
 
-    /**
-     * 站内受阻功率(MW)
-     */
-    private BigDecimal onSiteObstructed;
-
-    /**
-     * 日发电量(MW)
-     */
-    private BigDecimal dailyOutPut;
-
-    /**
-     * 日上网电量(MW)
-     */
-    private BigDecimal dailyGridOutPut;
-
-    /**
-     * 站外受阻功率(MW)
-     */
-    private BigDecimal offSiteObstructed;
-
+    // 预测相关数据
     /**
      * 可用预测功率(MW)
      */
-    private BigDecimal ableValueYc;
+    private BigDecimal forecastAbleValue;
 
     /**
      * 理论预测功率(MW)
      */
-    private BigDecimal theoryValueYc;
+    private BigDecimal forecastTheoryValue;
 
     /**
      *  开机容量(MW)
      */
-    private BigDecimal suCapacity;
+    private BigDecimal forecastSuCapacity;
 
     /**
-     *  提前预测多久
+     * 装机容量(MW)
      */
-    private Integer forecastHowLongAgo;
+    private BigDecimal forecastCapacity;
 
 }

+ 31 - 0
src/main/java/com/syjy/calculate/function/GetBeginOfDay.java

@@ -0,0 +1,31 @@
+package com.syjy.calculate.function;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.googlecode.aviator.runtime.function.AbstractFunction;
+import com.googlecode.aviator.runtime.type.*;
+import java.util.Map;
+
+/**
+ * 计算合格率
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/9/8 9:30
+ */
+public class GetBeginOfDay extends AbstractFunction {
+    /**
+     *
+     * @param env
+     * @return
+     */
+    @Override
+    public AviatorObject call(Map<String, Object> env) {
+        long toDayZero = DateUtil.beginOfDay(DateTime.now()).getTime();
+        return AviatorRuntimeJavaType.valueOf(toDayZero);
+    }
+    @Override
+    public String getName() {
+        return "getBeginOfDay";
+    }
+}

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

@@ -24,17 +24,17 @@ public class MeanAbsoluteError extends AbstractFunction {
         Object first = arg1.getValue(env);
         // 将参数转为集合
         Sequence seq = CommonUtil.getSeq(first,env);
-        // 获取Σ|sj-yc|
+        // 获取Σ|实际-预测|
         BigDecimal sumDifferenceAbsolute = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sumDifferenceAbsolute(list)",env)));
         // 获取容量
-        BigDecimal rl = (BigDecimal)env.get("rl");
+        BigDecimal electricCapacity = (BigDecimal)env.get("electricCapacity");
         BigDecimal size = new BigDecimal(seq.hintSize());
         Map<String ,Object> map = new HashMap<>();
-        map.put("rl",rl);
+        map.put("electricCapacity",electricCapacity);
         map.put("sumDifferenceAbsolute",sumDifferenceAbsolute);
         map.put("size",size);
-        // 计算 1-(Σ|sj-yc|/cap*n)
-        BigDecimal result = (BigDecimal) AviatorEvaluator.execute("1-(sumDifferenceAbsolute/(rl*size))",map);
+        // 计算 1-(Σ|实际-预测|/cap*n)
+        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-(sumDifferenceAbsolute/(electricCapacity*size))",map))) ;
         // 返回结果
         return new AviatorDecimal(result);
     }

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

@@ -20,7 +20,6 @@ import java.util.Map;
  */
 public class Pass extends AbstractFunction {
     /**
-     *
      * @param env
      * @param arg1
      * @param arg2
@@ -36,20 +35,21 @@ public class Pass extends AbstractFunction {
         // 循环集合获取实际功率、预测功率信息并计算
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
-            BigDecimal calculateResult = (BigDecimal) AviatorEvaluator.execute("1-math.abs((sj-yc)/rl)",map);
+            BigDecimal calculateResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-math.abs((ableValue-forecastAbleValue)/electricCapacity)", map)));
             Map<String, Object> passMap = new HashMap<>();
-            passMap.put("calculateResult",calculateResult);
-            passMap.put("compare",compare);
-            BigDecimal forResult = (BigDecimal) AviatorEvaluator.execute("calculateResult>=compare ? 1M:0M",passMap);
+            passMap.put("calculateResult", calculateResult);
+            passMap.put("compare", compare);
+            BigDecimal forResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute("calculateResult>=compare ? 1M:0M", passMap)));
             sum = sum.add(forResult);
         }
         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);
+        Map<String, Object> map = new HashMap<>();
+        map.put("sum", sum);
+        map.put("size", size);
+        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sum/size", map)));
         return new AviatorDecimal(result);
     }
+
     @Override
     public String getName() {
         return "pass";

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

@@ -26,7 +26,7 @@ public class PointS extends AbstractFunction {
         // 循环集合
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
-            result = (BigDecimal) AviatorEvaluator.execute("1-math.abs((sj-yc)/yc)",map);
+            result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-math.abs((ableValue-forecastAbleValue)/forecastAbleValue)",map)));
             break;
         }
         return new AviatorDecimal(result);

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

@@ -24,20 +24,18 @@ public class PointU extends AbstractFunction {
         // 将参数转为集合
         Sequence seq = CommonUtil.getSeq(first,env);
         BigDecimal sum = BigDecimal.ZERO;
-        // 获取Σ|sj-yc|
+        // 获取Σ|实际-预测|
         BigDecimal sumDifferenceAbsolute = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sumDifferenceAbsolute(list)",env)));
-        BigDecimal halfOfOne = new BigDecimal("0.5");
         // 循环集合
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
             map.put("sumDifferenceAbsolute",sumDifferenceAbsolute);
-            map.put("halfOfOne",halfOfOne);
-            BigDecimal forResult = (BigDecimal) AviatorEvaluator.execute("math.abs((sj/(sj+yc)-halfOfOne)) * (math.abs(sj-yc)/sumDifferenceAbsolute)",map);
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("math.abs((ableValue/(ableValue+forecastAbleValue)-0.5M)) * (math.abs(ableValue-forecastAbleValue)/sumDifferenceAbsolute)",map)));
             sum = sum.add(forResult);
         }
         Map<String, Object> map = new HashMap<>();
         map.put("sum",sum);
-        BigDecimal result = (BigDecimal) AviatorEvaluator.execute("1-(2*sum)",map);
+        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-(2*sum)",map)));
         return new AviatorDecimal(result);
     }
     @Override

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

@@ -24,7 +24,7 @@ public class RootMeanSquaredErrorA extends AbstractFunction {
     public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
         // 获取参数
         Object first = arg1.getValue(env);
-        // 获取Σ|sj-yc|
+        // 获取Σ|实际-预测|
         env.put("list",first);
         BigDecimal sumDifferenceAbsolute = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sumDifferenceAbsolute(list)",env)));
         BigDecimal sum = BigDecimal.ZERO;
@@ -33,7 +33,7 @@ public class RootMeanSquaredErrorA extends AbstractFunction {
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
             map.put("sumDifferenceAbsolute",sumDifferenceAbsolute);
-            BigDecimal forResult = (BigDecimal) AviatorEvaluator.execute("differenceSquare(sj,yc) * (differenceAbsolute(sj,yc)/sumDifferenceAbsolute)",map);
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("differenceSquare(ableValue,forecastAbleValue) * (differenceAbsolute(ableValue,forecastAbleValue)/sumDifferenceAbsolute)",map)));
             sum = sum.add(forResult);
         }
         Map<String, Object> map = new HashMap<>();
@@ -41,10 +41,10 @@ public class RootMeanSquaredErrorA extends AbstractFunction {
         // 获取开根号结果并转为BigDecimal类型(因为Aviator中,只要有double类型的数据进行计算,结果就会是double类型,开根号的计算结果必为double,所以这里先将开根号计算的结果转为BigDecimal)
         BigDecimal sqrtValue = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(sum)",map)));
         // 获取容量
-        BigDecimal rl = (BigDecimal)env.get("rl");
+        BigDecimal electricCapacity = (BigDecimal)env.get("electricCapacity");
         map.put("sqrtValue",sqrtValue);
-        map.put("rl",rl);
-        BigDecimal result = (BigDecimal)AviatorEvaluator.execute("1-(sqrtValue/rl)",map);
+        map.put("electricCapacity",electricCapacity);
+        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-(sqrtValue/electricCapacity)",map)));
         return new AviatorDecimal(result);
     }
     @Override

+ 2 - 2
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 = (BigDecimal) AviatorEvaluator.execute("((sj-yc)/rl)**2",map);
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("((ableValue-forecastAbleValue)/openCapacity)**2",map)));
             sum = sum.add(forResult);
         }
         Map<String, Object> map = new HashMap<>();
@@ -37,7 +37,7 @@ public class RootMeanSquaredErrorC extends AbstractFunction {
         // 求开根号的结果
         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);
+        BigDecimal result = new BigDecimal(String.valueOf( AviatorEvaluator.execute("1-sqrtValue",map)));
         return new AviatorDecimal(result);
     }
     @Override

+ 2 - 2
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 = (BigDecimal) AviatorEvaluator.execute("((sj-yc)/sj)**2",map);
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("((ableValue-forecastAbleValue)/ableValue)**2",map)));
             sum = sum.add(forResult);
         }
         // 上下文参数
@@ -38,7 +38,7 @@ public class RootMeanSquaredErrorR extends AbstractFunction {
         // 求开根号的结果
         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);
+        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-sqrtSumSize",map)));
         return new AviatorDecimal(result);
     }
     @Override

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

@@ -22,7 +22,7 @@ public class RootMeanSquaredErrorS extends AbstractFunction {
     public AviatorObject call(Map<String, Object> env, AviatorObject arg1) {
         // 获取参数
         Object first = arg1.getValue(env);
-        // 获取Σ(sj-yc
+        // 获取Σ(实际-预测
         BigDecimal sumDifferenceSquare = new BigDecimal(String.valueOf(AviatorEvaluator.execute("sumDifferenceSquare(list)",env)));
         Map<String, Object> map = new HashMap<>();
         map.put("sumDifferenceSquare",sumDifferenceSquare);
@@ -36,8 +36,8 @@ public class RootMeanSquaredErrorS extends AbstractFunction {
         // 求开根号的结果
         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("1-sqrtSum/(rl*sqrtSize)",map);
+        map.put("electricCapacity",env.get("electricCapacity"));
+        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-sqrtSum/(electricCapacity*sqrtSize)",map)));
         return new AviatorDecimal(result);
     }
     @Override

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

@@ -10,7 +10,7 @@ import java.math.BigDecimal;
 import java.util.Map;
 
 /**
- * 计算两个数的差值的绝对值并求和:Σ|sj-yc|
+ * 计算两个数的差值的绝对值并求和:Σ|实际-预测|
  *
  * @author zcl
  * @version 1.0
@@ -26,7 +26,7 @@ public class SumDifferenceAbsolute extends AbstractFunction {
         // 循环集合
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
-            BigDecimal forResult = (BigDecimal) AviatorEvaluator.execute("differenceAbsolute(sj,yc)",map);
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("differenceAbsolute(ableValue,forecastAbleValue)",map)));
             sum = sum.add(forResult);
         }
         return new AviatorDecimal(sum);

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

@@ -9,7 +9,7 @@ import java.math.BigDecimal;
 import java.util.Map;
 
 /**
- * 计算两个数的差值的平方并求和:Σ(sj-yc
+ * 计算两个数的差值的平方并求和:Σ(实际-预测
  *
  * @author zcl
  * @version 1.0
@@ -26,7 +26,7 @@ public class SumDifferenceSquare extends AbstractFunction {
         for (Object obj : seq) {
             Map<String, Object> map = (Map<String, Object>) obj;
             // 计算: (实际-预测)的平方
-            BigDecimal forResult = (BigDecimal) AviatorEvaluator.execute("differenceSquare(sj,yc)",map);
+            BigDecimal forResult = new BigDecimal(String.valueOf( AviatorEvaluator.execute("differenceSquare(ableValue,forecastAbleValue)",map)));
             // 求和
             sum = sum.add(forResult);
         }

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

@@ -4,15 +4,29 @@ import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.Options;
 import com.googlecode.aviator.runtime.JavaMethodReflectionFunctionMissing;
 import com.syjy.calculate.function.*;
+import com.syjy.calculate.repository.CalculationFormulaRepository;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.event.ApplicationStartedEvent;
 import org.springframework.context.ApplicationListener;
 import org.springframework.stereotype.Component;
 
+/**
+ * 监听项目启动
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/9/9 10:34
+ */
 @Component
 public class ApplicationListenerImpl implements ApplicationListener<ApplicationStartedEvent> {
 
+    @Autowired
+    private CalculationFormulaRepository calculationFormulaRepository;
+
     @Override
     public void onApplicationEvent(ApplicationStartedEvent event) {
+        // 初始化表
+        calculationFormulaRepository.initTable();
         // 启用基于反射的方法查找和调用
         AviatorEvaluator.setFunctionMissing(JavaMethodReflectionFunctionMissing.getInstance());
         AviatorEvaluator.setOption(Options.ALWAYS_PARSE_FLOATING_POINT_NUMBER_INTO_DECIMAL, true);
@@ -27,9 +41,10 @@ public class ApplicationListenerImpl implements ApplicationListener<ApplicationS
         AviatorEvaluator.addFunction(new MeanAbsoluteError());
         AviatorEvaluator.addFunction(new SumDifferenceSquare());
         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");
+        AviatorEvaluator.addFunction(new GetBeginOfDay());
+        // (实际-预测)²
+        AviatorEvaluator.defineFunction("differenceSquare", "lambda (ableValue,forecastAbleValue) -> math.pow((ableValue - forecastAbleValue), 2) end");
+        // |实际-预测|
+        AviatorEvaluator.defineFunction("differenceAbsolute", "lambda (ableValue,forecastAbleValue) -> math.abs(ableValue - forecastAbleValue) end");
     }
 }

+ 30 - 2
src/main/java/com/syjy/calculate/repository/CalculationFormulaRepository.java

@@ -2,21 +2,49 @@ package com.syjy.calculate.repository;
 
 import com.syjy.calculate.entity.CalculationFormula;
 import org.springframework.stereotype.Repository;
+import java.util.List;
 
+/**
+ * 公式计算
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/9/9 10:34
+ */
 @Repository
 public interface CalculationFormulaRepository {
 
     /**
      * 创建公式表
      */
-    void createTable();
+    void initTable();
 
+
+    /**
+     * 查询公式列表
+     */
+    List<CalculationFormula> select();
+
+    /**
+     * 更新公式
+     */
+    int update(CalculationFormula calculationFormula);
+
+    /**
+     * 新增公式
+     */
+    int add(CalculationFormula calculationFormula);
+
+    /**
+     * 删除公式
+     */
+    int delete(int id);
     /**
      * 查询公式数据
      *
      * @param type 类型
      * @return 返回记录
      */
-    CalculationFormula findByTypeAndProvince(String type, String formulaType,String provinceEnum,String electricType);
+    CalculationFormula findByTypeAndProvince(String type, String formulaType,String province,String electricType);
 
 }

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

@@ -1,5 +1,6 @@
 package com.syjy.calculate.repository.repositoryImpl;
 
+import com.googlecode.aviator.AviatorEvaluator;
 import com.syjy.calculate.config.StarterProperties;
 import com.syjy.calculate.entity.CalculateResult;
 import com.syjy.calculate.entity.CalculationFormula;
@@ -13,7 +14,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.ResultSetExtractor;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ClassUtils;
-
 import javax.annotation.Resource;
 import java.io.*;
 import java.net.URL;
@@ -22,10 +22,16 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * 公式计算
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/9/9 10:34
+ */
 @Service
 @Slf4j
 public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepository {
-
     @Autowired
     StarterProperties properties;
     @Resource
@@ -35,23 +41,148 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
      * 创建公式表
      */
     @Override
-    public void createTable() {
-        String config = properties.getDropTableFlag();
-        // 如果不删除表,通过页面更改
-        if ("false".equals(config)) {
-            // 判断表是否存在
-            String checkSql = "SHOW TABLES LIKE 't_calculation_formula'";
-            Boolean created = jdbcTemplate.query(checkSql, null, null, new ResultSetExtractor<Boolean>() {
-                @Override
-                public Boolean extractData(ResultSet rs) throws SQLException, DataAccessException {
-                    return rs.next();
-                }
-            });
-            // 如果表存在,不对表做任何操作
-            if (created) {
+    public void initTable() {
+        // 从配置文件中获取版本
+        String version = properties.getVersion();
+        // 判断表是否存在
+        String checkSql = "SHOW TABLES LIKE 't_calculation_formula'";
+        Boolean created = jdbcTemplate.query(checkSql, null, null, new ResultSetExtractor<Boolean>() {
+            @Override
+            public Boolean extractData(ResultSet rs) throws SQLException, DataAccessException {
+                return rs.next();
+            }
+        });
+
+        // 如果表存在
+        if (created) {
+            // 从表中获取旧版本
+            String oldVersion = getVersion();
+            // 如果版本没变化,不进行初始化表操作
+            if(oldVersion.equals(version)){
                 return;
             }
+            // 如果版本不同,则初始化表
+            this.createTable();
+        // 如果表不存在,初始化表
+        }else{
+            this.createTable();
         }
+    }
+
+    /**
+     * 查询所有公式
+     *
+     * @return
+     */
+    @Override
+    public List<CalculationFormula> select() {
+        String sql = "SELECT * from t_calculation_formula";
+        List<CalculationFormula> calculationFormulaList = new ArrayList<>();
+        try {
+            calculationFormulaList = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(CalculationFormula.class));
+        } catch (DataAccessException e) {
+            e.printStackTrace();
+        }
+        return calculationFormulaList;
+    }
+
+    /**
+     * 更新公式
+     *
+     * @param calculationFormula
+     * @return
+     */
+    @Override
+    public int update(CalculationFormula calculationFormula) {
+        Integer id = calculationFormula.getId();
+        String type = calculationFormula.getType();
+        String formula = calculationFormula.getFormula();
+        String province = calculationFormula.getProvince();
+        String electricType = calculationFormula.getElectricType();
+        String state = calculationFormula.getState();
+        int count = 0;
+        try {
+            count = jdbcTemplate.update("update t_calculation_formula set type=?,formula=?,province=?,electric_type=?,state=? where id=?", type, formula, province, electricType, state, id);
+        } catch (DataAccessException e) {
+            e.printStackTrace();
+        }
+        if (count > 0) {
+            // 清除缓存公式
+            AviatorEvaluator.clearExpressionCache();
+        }
+        return count;
+    }
+
+    /**
+     * 新增公式
+     *
+     * @param calculationFormula
+     * @return
+     */
+    @Override
+    public int add(CalculationFormula calculationFormula) {
+        String type = calculationFormula.getType();
+        String formula = calculationFormula.getFormula();
+        String province = calculationFormula.getProvince();
+        int count = 0;
+        try {
+            count = jdbcTemplate.update(
+                    "INSERT INTO t_calculation_formula(TYPE,FORMULA,PROVINCE) VALUES (?, ?,?,?)", type, formula, province);
+        } catch (DataAccessException e) {
+            e.printStackTrace();
+        }
+        return count;
+    }
+
+    /**
+     * 删除公式
+     *
+     * @param id
+     * @return
+     */
+    @Override
+    public int delete(int id) {
+        int count = 0;
+        try {
+            count = jdbcTemplate.update("delete from t_calculation_formula where id=?", id);
+        } catch (DataAccessException e) {
+            e.printStackTrace();
+        }
+        return count;
+    }
+
+    /**
+     * 查询公式数据
+     *
+     * @param type         类型
+     * @param province 省调
+     * @param formulaType  公式类型
+     * @param electricType 场站类型
+     * @return
+     */
+    @Override
+    public CalculationFormula findByTypeAndProvince(String type, String formulaType, String province, String electricType) {
+
+        String sql = "";
+        // 查询sql
+        if (CalculateResult.FORMULA.equals(type)) {
+            sql = "SELECT * from t_calculation_formula where ELECTRIC_TYPE = ? and PROVINCE = ? and TYPE = ? limit 1 ";
+        } else if (CalculateResult.RULES.equals(type)) {
+            sql = "SELECT * from t_calculation_formula where TYPE = 'RULES' and ELECTRIC_TYPE = ? and PROVINCE = ? and RULE_FORMULA = ? limit 1";
+        }
+        // 根据类型和省调查询公式
+        try {
+            CalculationFormula calculationFormula = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(CalculationFormula.class), electricType, province, formulaType);
+            return calculationFormula;
+        } catch (EmptyResultDataAccessException e) {
+            return null;
+        }
+    }
+
+    /**
+     * 创建表
+     */
+    private void createTable(){
         try {
             // 获取初始化公式表sql
             String path = "sql/t_calculation_formula.sql";
@@ -72,41 +203,39 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
             inputStream.close();
             // 执行sql文件
             jdbcTemplate.execute(builder.toString());
-        } catch (DataAccessException e) {
-            e.printStackTrace();
-            log.info("删除/创建表错误:" + e.toString());
-        } catch (FileNotFoundException e) {
-            throw new RuntimeException(e);
         } catch (IOException e) {
-            throw new RuntimeException(e);
+            e.printStackTrace();
         }
+        // 更新公式
+        updateVersion();
     }
 
+
     /**
-     * 查询公式数据
-     *
-     * @param type         类型
-     * @param provinceEnum 省调
-     * @param formulaType  公式类型
-     * @param electricType 场站类型
-     * @return
+     * 获取版本
      */
-    @Override
-    public CalculationFormula findByTypeAndProvince(String type, String formulaType, String provinceEnum, String electricType) {
-
-        String sql = "";
-        // 查询sql
-        if (CalculateResult.FORMULA.equals(type)) {
-            sql = "SELECT * from t_calculation_formula where ELECTRIC_TYPE = ? and PROVINCE_ENUM = ? and TYPE = ? limit 1 ";
-        } else if (CalculateResult.RULES.equals(type)) {
-            sql = "SELECT * from t_calculation_formula where TYPE = 'RULES' and ELECTRIC_TYPE = ? and PROVINCE_ENUM = ? and RULE_FORMULA = ? limit 1";
+    private String getVersion(){
+        String version = "";
+        String sql = " SELECT * FROM t_calculation_formula where type = 'VERSION' ";
+        try {
+            CalculationFormula calculationFormula = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(CalculationFormula.class));
+            version = calculationFormula.getFormula();
+        } catch (DataAccessException e) {
+            e.printStackTrace();
         }
-        // 根据类型和省调查询公式
+        return version;
+    }
+
+    /**
+     * 更新版本
+     */
+    private void updateVersion(){
+        String version = properties.getVersion();
+        String sql = " UPDATE t_calculation_formula set FORMULA = '" + version +"' where type = 'VERSION' ";
         try {
-            CalculationFormula calculationFormula = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(CalculationFormula.class), electricType, provinceEnum, formulaType);
-            return calculationFormula;
-        } catch (EmptyResultDataAccessException e) {
-            return null;
+            jdbcTemplate.update(sql);
+        } catch (DataAccessException e) {
+            e.printStackTrace();
         }
     }
 

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

@@ -1,7 +1,6 @@
 package com.syjy.calculate.service;
 
 import com.googlecode.aviator.AviatorEvaluator;
-import com.googlecode.aviator.Expression;
 import com.syjy.calculate.entity.CalculateResult;
 import com.syjy.calculate.entity.CalculationFormula;
 import com.syjy.calculate.entity.CalculationInfo;
@@ -9,8 +8,8 @@ import com.syjy.calculate.entity.CalculateRequest;
 import com.syjy.calculate.repository.CalculationFormulaRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.beans.BeanMap;
 import org.springframework.stereotype.Service;
-
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -46,6 +45,10 @@ public class AccuracyPassRateCalculateService {
         }
         // 获取细则校验过的数据
         List<Map<String, Object>> checkedData = (List<Map<String, Object>>) checkedDataResult.get(CalculateResult.DATA_TAG);
+        if (checkedData == null || checkedData.size() == 0) {
+            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) {
@@ -57,18 +60,26 @@ public class AccuracyPassRateCalculateService {
         //缓存公式名称
         String scriptName = calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.FORMULA;
         // 初始化公式并缓存公式
-        if (AviatorEvaluator.getCachedExpression(scriptName) == null) {
+        if (AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName) == null) {
             AviatorEvaluator.getInstance().compile(scriptName, formula, true);
         }
         // 上下文
         Map<String, Object> env = new HashMap<>();
         // 将需要计算的list数据放入上下文
         env.put(CalculateResult.LIST, checkedData);
-        env.put(CalculateResult.RL, calculateRequest.getCap());
+        env.put(CalculateResult.CAPACITY, calculateRequest.getElectricCapacity());
+        env.put(CalculateResult.SIGN, calculateRequest.getSign());
+
+        Map<String, Object> calculateRequestMap = new HashMap<>();
+        BeanMap beanMap = BeanMap.create(calculateRequest);
+        for (Object key : calculateRequestMap.keySet()) {
+            calculateRequestMap.put(String.valueOf(key), beanMap.get(key));
+        }
+
         // 执行计算并得出结果
         try {
             // 获取计算结果
-            BigDecimal executeResult = (BigDecimal) AviatorEvaluator.getCachedExpression(scriptName).execute(env);
+            Object executeResult = AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName).execute(env);
             // 过滤计算结果
             String result = filterResult(executeResult);
             return CalculateResult.success(CalculateResult.MSG_CALCULATE_SUCCESS, result);
@@ -84,21 +95,22 @@ public class AccuracyPassRateCalculateService {
      * @param result 过滤前的结果
      * @return 过滤后的结果
      */
-    private String filterResult(BigDecimal result) {
+    private String filterResult(Object result) {
+        BigDecimal resultBig = new BigDecimal(String.valueOf(result));
         //当结果为负数时,说明偏差过大,准确率为0
-        if (result.compareTo(BigDecimal.ZERO) == -1 || result.compareTo(BigDecimal.ZERO) == 0) {
-            result = BigDecimal.ZERO;
+        if (resultBig.compareTo(BigDecimal.ZERO) == -1 || resultBig.compareTo(BigDecimal.ZERO) == 0) {
+            resultBig = BigDecimal.ZERO;
         }
         // 如果结果大于1,则准确率设为100
-        if (result.compareTo(BigDecimal.ONE) == 1) {
-            result = BigDecimal.ONE;
+        if (resultBig.compareTo(BigDecimal.ONE) == 1) {
+            resultBig = BigDecimal.ONE;
         }
         // 对数据*100
-        result = result.multiply(new BigDecimal(CalculateResult.ONE_HUNDRED));
+        resultBig = resultBig.multiply(new BigDecimal(CalculateResult.ONE_HUNDRED));
         // 对数据进行四舍五入
-        result = result.setScale(2, BigDecimal.ROUND_HALF_UP);
+        resultBig = resultBig.setScale(2, BigDecimal.ROUND_HALF_UP);
         // 数据加上百分号
-        return result + CalculateResult.PERCENT;
+        return resultBig + CalculateResult.PERCENT;
     }
 
     /**
@@ -135,15 +147,15 @@ public class AccuracyPassRateCalculateService {
         }
         // 循环判断实际功率/预测功率是否为空
         for (CalculationInfo calculationInfo : calculationInfoList) {
-            if (calculationInfo.getYc() == null || calculationInfo.getSj() == null) {
+            if (calculationInfo.getAbleValue() == null || calculationInfo.getForecastAbleValue() == null || calculationInfo.getRealValue() == null) {
                 return CalculateResult.error(CalculateResult.MSG_CALCULATE_DATA_NULL);
             }
         }
         // 如果固定功率为空
-        if (calculateRequest.getCap() == null) {
+        if (calculateRequest.getElectricCapacity() == null) {
             // 循环判断实时功率是否为空
             for (CalculationInfo calculationInfo : calculationInfoList) {
-                if (calculationInfo.getRl() == null) {
+                if (calculationInfo.getOpenCapacity() == null) {
                     return CalculateResult.error(CalculateResult.MSG_CAP_NULL);
                 }
             }
@@ -159,7 +171,7 @@ public class AccuracyPassRateCalculateService {
         // 脚本名称
         String scriptName = calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.RULES;
         // 初始化公式并缓存公式
-        if (AviatorEvaluator.getCachedExpression(scriptName) == null) {
+        if (AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName) == null) {
             AviatorEvaluator.getInstance().compile(scriptName, rulesCalculationFormula.getFormula(), true);
         }
         // 通过校验的数据
@@ -168,7 +180,7 @@ public class AccuracyPassRateCalculateService {
         for (Map<String, Object> calculationMap : calculationInfoListMap) {
             // 循环公式,对每条功率信息进行细则处理
             try {
-                Map<String, Object> checkResult = (HashMap<String, Object>) AviatorEvaluator.getCachedExpression(scriptName).execute(calculationMap);
+                Map<String, Object> checkResult = (HashMap<String, Object>) AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName).execute(calculationMap);
                 // 如果返回结果是忽略,则结束本次循环
                 if (String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.IGNORE)) {
                     continue;
@@ -196,17 +208,14 @@ public class AccuracyPassRateCalculateService {
      */
     private List<Map<String, Object>> getCalculationInfoList(List<CalculationInfo> calculationInfoList) {
         List<Map<String, Object>> resultList = new ArrayList<>();
+        // 循环每条数据
         for (CalculationInfo calculationInfo : calculationInfoList) {
+            // 将bean BeanMap
+            BeanMap beanMap = BeanMap.create(calculationInfo);
             Map<String, Object> map = new HashMap<>();
-            map.put(CalculateResult.SJ, calculationInfo.getSj());
-            map.put(CalculateResult.YC, calculationInfo.getYc());
-            // 如果容量不为空,放入容量字段
-            if (calculationInfo.getRl() != null) {
-                map.put(CalculateResult.RL, calculationInfo.getRl());
-            }
-            // 如果时间不为空,放入时间字段
-            if (calculationInfo.getTime() != 0) {
-                map.put(CalculateResult.TIME, calculationInfo.getTime());
+            // 将beanMap转为Map
+            for (Object key : beanMap.keySet()) {
+                map.put(String.valueOf(key), beanMap.get(key));
             }
             resultList.add(map);
         }

+ 7 - 4
src/main/java/com/syjy/calculate/util/CreateAndInsertSqlUtil.java

@@ -17,6 +17,13 @@ import org.springframework.stereotype.Component;
 import java.io.File;
 import java.util.List;
 
+/**
+ * 生成sql文件工具
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/8/8 9:30
+ */
 @Component
 public class CreateAndInsertSqlUtil {
     private static final String FILE_NAME = "sql/test.sql";
@@ -38,10 +45,6 @@ public class CreateAndInsertSqlUtil {
             ""
     );
 
-/*    public static void main(String[] args) {
-        CreateAndInsertSqlUtil.start("test-db-dev", "ipfcst-v3");
-    }*/
-
     /**
      * 生成 sql
      *

+ 8 - 16
src/main/resources/META-INF/resources/calculateView/calculate.html

@@ -262,9 +262,8 @@
 
     // 删除
     function postDelet(index) {
-
         $.ajax({
-            url: "jarCalculate/delet",
+            url: "jarCalculate/delete",
             data: JSON.stringify({
                 id: students[index].id
             }),
@@ -374,8 +373,7 @@
                 if (students[i].number == deleteIndex.children[0].innerHTML) {
                     postDelet(i)
                 }
-            }
-            ;
+            };
             students.splice(i, 1);
             var nums = document.querySelectorAll('.nums');
             // 删除行的同时,控制删除行以外行数序号的删减
@@ -385,13 +383,10 @@
                     index = i;
                     var nums = document.querySelectorAll('.nums');
                     nums[index].innerHTML = index + 1;
-                }
-                ;
-            }
-            ;
+                };
+            };
             number--;
-        }
-        ;
+        };
     };
 
     //TODO 修改函数
@@ -400,8 +395,7 @@
         for (var i = 1; i < tds2.length - 2; i++) {
             inputs[i - 1].value = tds2[i].innerHTML;
             tds2[i].innerHTML = `<input type="text" value='${tds2[i].innerText}'/>`;
-        }
-        ;
+        };
         element.parentNode.innerHTML = `<button class="change" data-event="updateMess">更新</button>`;
     };
 
@@ -416,10 +410,8 @@
             var b = tds3[0].innerHTML;
             if (students[i].id == tds3[0].innerHTML) {
                 id = students[i].id;
-            }
-            ;
-        }
-        ;
+            };
+        };
         students.splice(firstNumber - 1, 1);
         var message2 = {
             "number": firstNumber - 1,

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 89 - 158
src/main/resources/sql/t_calculation_formula.sql


Vissa filer visades inte eftersom för många filer har ändrats