Browse Source

新增考核计算

zhangchenglong 2 năm trước cách đây
mục cha
commit
d3ee8f1150

+ 19 - 8
pom.xml

@@ -10,7 +10,8 @@
     </parent>
     <groupId>com.syjy</groupId>
     <artifactId>calculation-spring-boot-starter</artifactId>
-    <version>0.0.1-SNAPSHOT</version>
+    <version>0.0.1</version>
+    <!--<version>0.0.1-SNAPSHOT</version>-->
     <name>calculation</name>
     <description>Demo project for Spring Boot</description>
     <properties>
@@ -108,13 +109,23 @@
 
     <distributionManagement>
         <repository>
-            <id>jiayue-releases</id>
-            <url>http://49.4.68.219:8888/nexus/content/repositories/jiayue-releases/</url>
-        </repository>
-        <snapshotRepository>
-            <id>jiayue-snapshots</id>
-            <url>http://49.4.68.219:8888/nexus/content/repositories/jiayue-snapshots/</url>
-        </snapshotRepository>
+        <id>jiayue-releases</id>
+        <url>http://49.4.68.219:8888/nexus/content/repositories/jiayue-releases/</url>
+    </repository>
+    <snapshotRepository>
+        <id>jiayue-snapshots</id>
+        <url>http://49.4.68.219:8888/nexus/content/repositories/jiayue-snapshots/</url>
+    </snapshotRepository>
+
+    <!--<repository>-->
+        <!--<id>jiayue-csc-releases</id>-->
+        <!--<url>http://49.4.68.219:8888/nexus/content/repositories/jiayue-csc-releases/</url>-->
+    <!--</repository>-->
+        <!--<snapshotRepository>-->
+            <!--<id>jiayue-csc-snapshots</id>-->
+            <!--<url>http://49.4.68.219:8888/nexus/content/repositories/jiayue-csc-snapshots/</url>-->
+        <!--</snapshotRepository>-->
+
     </distributionManagement>
 
     <build>

+ 8 - 0
src/main/java/com/syjy/calculate/config/StarterAutoConfigure.java

@@ -5,6 +5,7 @@ import com.syjy.calculate.conotroller.Test;
 import com.syjy.calculate.listener.ApplicationListenerImpl;
 import com.syjy.calculate.repository.repositoryImpl.CalculationFormulaRepositoryImpl;
 import com.syjy.calculate.service.AccuracyPassRateCalculateService;
+import com.syjy.calculate.service.AssessmentCalculateService;
 import com.syjy.calculate.util.CreateAndInsertSqlUtil;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -34,6 +35,13 @@ public class StarterAutoConfigure {
     @Bean
     @ConditionalOnMissingBean
     @ConditionalOnProperty(prefix = "calculate.service", value = "enabled", havingValue = "true")
+    AssessmentCalculateService assessmentCalculateService() {
+        return new AssessmentCalculateService();
+    }
+
+    @Bean
+    @ConditionalOnMissingBean
+    @ConditionalOnProperty(prefix = "calculate.service", value = "enabled", havingValue = "true")
     CalculationFormulaRepositoryImpl calculationFormulaRepositoryImpl() {
         return new CalculationFormulaRepositoryImpl();
     }

+ 62 - 0
src/main/java/com/syjy/calculate/entity/AssessmentInfo.java

@@ -0,0 +1,62 @@
+package com.syjy.calculate.entity;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 考核信息
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/11/17 10:16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AssessmentInfo implements Serializable  {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 时间
+     */
+    private long time;
+
+    /**
+     * 考核类型(电量/分)
+     */
+    private String assessmentType;
+
+    /**
+     * 短期上报率考核
+     */
+    private String shortReportRate;
+
+    /**
+     * 超短期上报率考核
+     */
+    private String ultraShortReportRate;
+
+    /**
+     * 短期准确率考核
+     */
+    private String shortAccuracyRate;
+
+    /**
+     * 超短期准确率考核
+     */
+    private String ultraShortAccuracyRate;
+
+    /**
+     * 短期合格率考核
+     */
+    private String shortPassRate;
+
+    /**
+     * 超短期合格率考核
+     */
+    private String ultraShortPassRate;
+
+}

+ 99 - 0
src/main/java/com/syjy/calculate/entity/AssessmentRequest.java

@@ -0,0 +1,99 @@
+package com.syjy.calculate.entity;
+
+import com.sun.org.apache.bcel.internal.generic.BIPUSH;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 计算考核请求参数
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/11/18 10:16
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AssessmentRequest implements Serializable  {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 省调
+     */
+    private String province;
+
+    /**
+     * 场站类型:风/光(E1/E2)
+     */
+    private String electricType;
+
+//    /**
+//     * 风场站额定容量
+//     */
+//    private BigDecimal windRatedCapacity;
+//
+//    /**
+//     * 光场站额定容量
+//     */
+//    private BigDecimal photoElectricityRatedCapacity;
+
+    /**
+     * 额定容量
+     */
+    private BigDecimal ratedCapacity;
+
+    /**
+     * 发电量
+     */
+    private BigDecimal powerGeneration;
+
+    /**
+     * 短期上报率考
+     */
+    private BigDecimal shortReportRate;
+
+    /**
+     * 超短期上报率
+     */
+    private BigDecimal ultraShortReportRate;
+
+    /**
+     * 短期准确率
+     */
+    private BigDecimal shortAccuracyRate;
+
+    /**
+     * 超短期准确率
+     */
+    private BigDecimal ultraShortAccuracyRate;
+
+    /**
+     * 短期合格率
+     */
+    private BigDecimal shortPassRate;
+
+    /**
+     * 超短期合格率
+     */
+    private BigDecimal ultraShortPassRate;
+
+    public AssessmentRequest(String province, String electricType, BigDecimal ratedCapacity, BigDecimal powerGeneration, BigDecimal shortReportRate, BigDecimal ultraShortReportRate, BigDecimal shortAccuracyRate ,BigDecimal ultraShortAccuracyRate ,BigDecimal shortPassRate,BigDecimal ultraShortPassRate)
+    {
+        this.setProvince(province);
+        this.setElectricType(electricType);
+        this.setRatedCapacity(ratedCapacity);
+        this.setPowerGeneration(powerGeneration);
+        this.setShortReportRate(shortReportRate);
+        this.setUltraShortReportRate(ultraShortReportRate);
+        this.setShortAccuracyRate(shortAccuracyRate);
+        this.setUltraShortAccuracyRate(ultraShortAccuracyRate);
+        this.setShortPassRate(shortPassRate);
+        this.setUltraShortPassRate(ultraShortPassRate);
+    }
+
+    public AssessmentRequest(){}
+
+}

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

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

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

@@ -23,6 +23,12 @@ public class CalculateResult extends HashMap<String, Object> {
     /** formula */
     public static final String FORMULA = "FORMULA";
 
+    /** 光场站 */
+    public static final String E1 = "E1";
+
+    /** 风场站 */
+    public static final String E2 = "E2";
+
     /** rules */
     public static final String RULES = "RULES";
 
@@ -59,16 +65,50 @@ public class CalculateResult extends HashMap<String, Object> {
     /** 时间 */
     public static final String TIME = "time";
 
+    /** 短期上报率考核量 */
+    public static final String SHORT_REPORT_RATE = "ASSESSMENT_SHORT_REPORT_RATE";
+
+    /** 超短期上报率考核量 */
+    public static final String ULTRA_SHORT_REPORT_RATE = "ASSESSMENT_ULTRA_SHORT_REPORT_RATE";
+
+    /** 短期准确率考核量 */
+    public static final String SHORT_ACCURACY_RATE = "ASSESSMENT_SHORT_ACCURACY_RATE";
+
+    /** 超短期准确率考核量 */
+    public static final String ULTRA_SHORT_ACCURACY_RATE = "ASSESSMENT_ULTRA_SHORT_ACCURACY_RATE";
+
+    /** 短期合格率考核量 */
+    public static final String SHORT_PASS_RATE = "ASSESSMENT_SHORT_PASS_RATE";
+
+    /** 短期合格率考核量 */
+    public static final String ULTRA_SHORT_PASS_RATE = "ASSESSMENT_ULTRA_SHORT_PASS_RATE";
+
+
+
     /** 消息信息*/
     public static final String MSG_REQUEST_NULL = "入参为空";
     public static final String MSG_FORMULA_TYPE_NULL = "公式类型为空";
     public static final String MSG_PROVINCE_NULL = "省调为空";
     public static final String MSG_ELECTRIC_TYPE_NULL = "场站类型为空";
+    public static final String MSG_PHOTO_ELECTRICITY_RATED_CAPACITY_NULL = "光场站额定容量为空";
+    public static final String MSG_WIND_RATED_CAPACITY_NULL = "风场站类型为空";
+    public static final String MSG_ALL_RATED_CAPACITY_NULL = "全场额定容量为空";
+    public static final String MSG_SHORT_REPORT_RATE_NULL = "短期上报率为空";
+    public static final String MSG_ULTRA_SHORT_REPORT_RATE_NULL = "超短期上报率为空";
+    public static final String MSG_SHORT_ACCURACY_RATE_NULL = "短期准确率为空";
+    public static final String MSG_ULTRA_SHORT_ACCURACY_RATE_NULL = "超短期准确率为空";
+    public static final String MSG_SHORT_PASS_RATE_NULL = "短期合格率为空";
+    public static final String MSG_ULTRA_SHORT_PASS_RATE_NULL = "超短期合格率为空";
+
+
     public static final String MSG_CALCULATE_DATA_NULL = "计算数据为空";
     public static final String MSG_CAP_NULL = "容量为空/0,不予考核";
     public static final String MSG_DATA_CHECK_ERROR = "数据校验错误";
     public static final String MSG_NO_FORMULA = "未匹配到公式:";
     public static final String MSG_CALCULATE_SUCCESS = "计算成功";
+    public static final String MSG_CHECK_SUCCESS = "校验成功";
+    public static final String MSG_NO_CALCULATE_TYPE = "无计算类型";
+
     public static final String MSG_CALCULATE_FAIL = "计算失败:";
     public static final String MSG_CAP_ZERO = "容量为0";
     public static final String MSG_SIZE_ZERO = "个数为0";

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

@@ -1,11 +1,9 @@
 package com.syjy.calculate.service;
 
 import com.googlecode.aviator.AviatorEvaluator;
-import com.syjy.calculate.entity.CalculateResult;
-import com.syjy.calculate.entity.CalculationFormula;
-import com.syjy.calculate.entity.CalculationInfo;
-import com.syjy.calculate.entity.CalculateRequest;
+import com.syjy.calculate.entity.*;
 import com.syjy.calculate.repository.CalculationFormulaRepository;
+import com.syjy.calculate.util.CommonlUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cglib.beans.BeanMap;
@@ -26,6 +24,8 @@ public class AccuracyPassRateCalculateService {
 
     @Autowired
     private CalculationFormulaRepository calculationFormulaRepository;
+    @Autowired
+    private CommonlUtil commonlUtil;
 
     /**
      * 计算准确率、合格率
@@ -52,14 +52,21 @@ public class AccuracyPassRateCalculateService {
             return CalculateResult.error(CalculateResult.MSG_CALCULATE_DATA_NULL);
         }
 
+//        // 获取公式
+//        String formula = calculationFormula.getFormula();
+//        //缓存公式名称
+//        String scriptName = calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.FORMULA;
+//        // 初始化公式并缓存公式
+//        if (AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName) == null) {
+//            AviatorEvaluator.getInstance().compile(scriptName, formula, true);
+//        }
+
+
         // 获取公式
         String formula = calculationFormula.getFormula();
-        //缓存公式名称
-        String scriptName = calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.FORMULA;
-        // 初始化公式并缓存公式
-        if (AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName) == null) {
-            AviatorEvaluator.getInstance().compile(scriptName, formula, true);
-        }
+        // 初始化公式并获取缓存的公式
+        String scriptName = commonlUtil.initFormula(formula,calculateRequest.getProvince(),calculateRequest.getFormulaType(),calculateRequest.getElectricType(),CalculateResult.FORMULA);
+
         // 上下文
         Map<String, Object> env = new HashMap<>();
         // 将需要计算的list数据放入上下文
@@ -187,12 +194,17 @@ public class AccuracyPassRateCalculateService {
             // 未匹配到细则文件,则不进行细则校验,返回数据
             return CalculateResult.success(calculationInfoListMap);
         }
-        // 脚本名称
-        String scriptName = calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.RULES;
-        // 初始化公式并缓存公式
-        if (AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName) == null) {
-            AviatorEvaluator.getInstance().compile(scriptName, rulesCalculationFormula.getFormula(), true);
-        }
+
+//        // 脚本名称
+//        String scriptName = calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.RULES;
+//        // 初始化公式并缓存公式
+//        if (AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName) == null) {
+//            AviatorEvaluator.getInstance().compile(scriptName, rulesCalculationFormula.getFormula(), true);
+//        }
+
+        String formula = rulesCalculationFormula.getFormula();
+        // 初始化公式并获取缓存的公式
+        String scriptName = commonlUtil.initFormula(formula,calculateRequest.getProvince(),calculateRequest.getFormulaType(),calculateRequest.getElectricType(),CalculateResult.FORMULA);
         // 通过校验的数据
         List<Map<String, Object>> passList = new ArrayList<>();
         // 循环数据,对数据进行校验

+ 168 - 0
src/main/java/com/syjy/calculate/service/AssessmentCalculateService.java

@@ -0,0 +1,168 @@
+package com.syjy.calculate.service;
+
+import com.googlecode.aviator.AviatorEvaluator;
+import com.syjy.calculate.entity.*;
+import com.syjy.calculate.repository.CalculationFormulaRepository;
+import com.syjy.calculate.util.CommonlUtil;
+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.util.*;
+
+/**
+ * 计算准确率、合格率
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/8/8 9:30
+ */
+@Service
+@Slf4j
+public class AssessmentCalculateService {
+
+    @Autowired
+    private CalculationFormulaRepository calculationFormulaRepository;
+
+    @Autowired
+    private CommonlUtil commonlUtil;
+
+    /**
+     * 计算考核电量
+     * @return
+     */
+    public CalculateResult calculateAssessment(AssessmentRequest assessmentRequest){
+        AssessmentInfo assessmentInfo = new AssessmentInfo();
+
+        CalculateResult checkResult = checkRequestInfo(assessmentRequest);
+        // 如果校验失败
+        if(!String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.Type.SUCCESS.value())){
+            return checkResult;
+        }
+        // 上下文
+        Map<String, Object> env = new HashMap<>();
+        BeanMap map = BeanMap.create(assessmentRequest);
+        // 将考核bean转为map
+        for (Object key : map.keySet()) {
+            env.put(String.valueOf(key), map.get(key));
+        }
+
+        // 短期上报率
+        String shortReportRate = calculateDetail(assessmentRequest,env,CalculateResult.SHORT_REPORT_RATE);
+        // 超短期上报率
+        String ultraShortReportRate = calculateDetail(assessmentRequest,env,CalculateResult.ULTRA_SHORT_REPORT_RATE);
+        // 短期准确率
+        String shortAccuracyRate = calculateDetail(assessmentRequest,env,CalculateResult.SHORT_ACCURACY_RATE);
+        // 超短期准确率
+        String ultraShortAccuracyRate = calculateDetail(assessmentRequest,env,CalculateResult.ULTRA_SHORT_ACCURACY_RATE);
+        // 短期合格率
+        String shortPassRate = calculateDetail(assessmentRequest,env,CalculateResult.SHORT_PASS_RATE);
+        // 超短期合格率
+        String ultraShortPassRate = calculateDetail(assessmentRequest,env,CalculateResult.ULTRA_SHORT_PASS_RATE);
+
+        assessmentInfo.setShortReportRate(shortReportRate);
+        assessmentInfo.setUltraShortReportRate(ultraShortReportRate);
+        assessmentInfo.setShortAccuracyRate(shortAccuracyRate);
+        assessmentInfo.setUltraShortAccuracyRate(ultraShortAccuracyRate);
+        assessmentInfo.setShortPassRate(shortPassRate);
+        assessmentInfo.setUltraShortPassRate(ultraShortPassRate);
+        return CalculateResult.success(CalculateResult.MSG_CALCULATE_SUCCESS, assessmentInfo);
+    }
+
+    /**
+     * 校验请求参数
+     * @param assessmentRequest
+     * @return
+     */
+    private CalculateResult checkRequestInfo(AssessmentRequest assessmentRequest){
+
+        // 判断入参
+        if (assessmentRequest == null) {
+            return CalculateResult.error(CalculateResult.MSG_REQUEST_NULL);
+        }
+
+        // 判断省调
+        if (assessmentRequest.getProvince() == null) {
+            return CalculateResult.error(CalculateResult.MSG_PROVINCE_NULL);
+        }
+
+        // 判断场站类型
+        if (assessmentRequest.getElectricType() == null) {
+            return CalculateResult.error(CalculateResult.MSG_ELECTRIC_TYPE_NULL);
+        }
+        return CalculateResult.success();
+    }
+
+    /**
+     * 计算短期上报率考核
+     * @return
+     */
+    private String calculateDetail(AssessmentRequest assessmentRequest,Map<String,Object> env,String formulaType){
+
+        // 根据类型从数据库中查出公式列表
+        CalculationFormula calculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.FORMULA,formulaType, assessmentRequest.getProvince(),assessmentRequest.getElectricType());
+        // 判断是否有公式
+        if (calculationFormula == null || calculationFormula.getFormula() == null) {
+            // 未匹配到公式
+            return CalculateResult.MSG_NO_FORMULA;
+        }
+
+        // 根据类型从数据库中查出公式列表
+        CalculationFormula rulesCalculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.RULES, formulaType, assessmentRequest.getProvince(), assessmentRequest.getElectricType());
+
+        // 判断是否有约束
+        if (rulesCalculationFormula != null && rulesCalculationFormula.getFormula() != null) {
+            // 校验规则
+            String checkResult = calculate(env,rulesCalculationFormula.getFormula(),assessmentRequest.getProvince(),formulaType,assessmentRequest.getElectricType(),CalculateResult.RULES);
+            // 如果校验失败,返回失败原因
+            if(!checkResult.equals(CalculateResult.MSG_CHECK_SUCCESS)){
+                return checkResult;
+            }
+        }
+
+        // 计算考核
+        String result = calculate(env,calculationFormula.getFormula(),assessmentRequest.getProvince(),formulaType,assessmentRequest.getElectricType(),CalculateResult.FORMULA);
+
+        return result;
+    }
+
+    /**
+     * 计算
+     * @param env
+     * @param formulaContent
+     * @param province
+     * @param formulaType
+     * @param electricType
+     * @param calculateType
+     * @return
+     */
+    private String calculate(Map<String, Object> env,String formulaContent,String province,String formulaType,String electricType,String calculateType){
+        // 获取公式缓存名称
+        String scriptName = commonlUtil.initFormula(formulaContent ,province, formulaType, electricType, calculateType);
+        try {
+            // 根据公式和上下文进行计算
+            Object executeResult = AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName).execute(env);
+            // 如果是校验规则
+            if(calculateType.equals(CalculateResult.RULES)){
+                Map<String, Object> checkResult = (HashMap<String, Object>)executeResult;
+                // 如果返回500,则为校验不通过,返回原因
+                if (String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.ERROR)) {
+                    return String.valueOf(checkResult.get(CalculateResult.MSG_TAG));
+                }
+                // 校验成功
+                return CalculateResult.MSG_CHECK_SUCCESS;
+            // 如果是计算,则返回计算结果
+            }else if(calculateType.equals(CalculateResult.FORMULA)){
+                return String.valueOf(executeResult);
+            }else{
+                // 计算类型错误,计算类型必须是RULES或者FORMULA
+                return CalculateResult.MSG_NO_CALCULATE_TYPE;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return CalculateResult.MSG_CALCULATE_FAIL + e.toString();
+        }
+    }
+
+}
+

+ 54 - 0
src/main/java/com/syjy/calculate/util/CommonlUtil.java

@@ -0,0 +1,54 @@
+package com.syjy.calculate.util;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.io.file.FileWriter;
+import cn.hutool.core.text.StrBuilder;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.Db;
+import cn.hutool.db.DbUtil;
+import cn.hutool.db.Entity;
+import cn.hutool.db.ds.DSFactory;
+import com.googlecode.aviator.AviatorEvaluator;
+import com.syjy.calculate.entity.CalculateResult;
+import lombok.Data;
+import lombok.SneakyThrows;
+import lombok.experimental.Accessors;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 生成sql文件工具
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/8/8 9:30
+ */
+@Component
+public class CommonlUtil {
+
+    /**
+     *
+     * @param formulaContent 公式内容
+     * @param province 省调
+     * @param formulaType 公式类型
+     * @param electricType 场站类型
+     * @param calculateType 计算类型(计算/规则)
+     */
+    public String initFormula(String formulaContent ,String province, String formulaType, String electricType, String calculateType) {
+        //缓存公式名称
+        String scriptName = province + CalculateResult.UNDERLINE + formulaType + CalculateResult.UNDERLINE + electricType + CalculateResult.UNDERLINE + calculateType;
+        // 初始化公式并缓存公式
+        if (AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName) == null) {
+            AviatorEvaluator.getInstance().compile(scriptName, formulaContent, true);
+        }
+        return scriptName;
+    }
+
+
+
+}

+ 11 - 3
src/main/resources/sql/t_calculation_formula.sql

@@ -5,13 +5,13 @@
  Source Server Type    : MySQL
  Source Server Version : 80029
  Source Host           : localhost:3306
- Source Schema         : test3
+ Source Schema         : test
 
  Target Server Type    : MySQL
  Target Server Version : 80029
  File Encoding         : 65001
 
- Date: 04/11/2022 10:23:39
+ Date: 22/11/2022 15:38:46
 */
 
 SET NAMES utf8mb4;
@@ -36,7 +36,7 @@ CREATE TABLE `t_calculation_formula`  (
   `LAST_MODIFIER` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改时间',
   `LAST_MODIFY_TIME` datetime NULL DEFAULT NULL COMMENT '修改人',
   PRIMARY KEY (`ID`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 214 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
+) ENGINE = InnoDB AUTO_INCREMENT = 215 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
 -- ----------------------------
 -- Records of t_calculation_formula
@@ -212,5 +212,13 @@ INSERT INTO `t_calculation_formula` VALUES (168, 'POINT_ULTRA_SHORT_AVERAGE_FORE
 INSERT INTO `t_calculation_formula` VALUES (169, 'POINT_ULTRA_SHORT_FORECAST_ERRORS', 1, '        let result = 0;\r\n        for x in list {\r\n            result = (x.forecastAbleValue- x.ableValue)/x.forecastAbleValue;\r\n            break;\r\n        }\r\n        return math.abs(result);', 'E999', 'E1;E2', '', '0', '1', NULL, NULL, NULL, NULL);
 INSERT INTO `t_calculation_formula` VALUES (170, 'POINT_SHORT_ACCURACY', 1, 'let result = 0;\r\n        for x in list {\r\n            result = 1-(math.abs(x.realValue-x.forecastAbleValue )/electricCapacity);\r\n            break;\r\n        }\r\n        return result ;', 'E32', 'E1;E2', '', '1', '1', NULL, NULL, NULL, NULL);
 INSERT INTO `t_calculation_formula` VALUES (214, 'POINT_ULTRA_SHORT_ACCURACY', 1, '        let result = 0;\r\n	let count = count(list);\r\n	let max = list[count-1];\r\n	result = 1-(math.abs(max.realValue-max.forecastAbleValue )/electricCapacity);\r\n        return result ;', 'E32', 'E1;E2', '', '1', '1', NULL, NULL, NULL, NULL);
+INSERT INTO `t_calculation_formula` VALUES (215, 'ASSESSMENT_SHORT_REPORT_RATE', 1, '(1-shortReportRate)*960*0.0005*powerGeneration*1', 'E42', 'E1;E2', NULL, '0', '1', NULL, NULL, NULL, NULL);
+INSERT INTO `t_calculation_formula` VALUES (216, 'ASSESSMENT_ULTRA_SHORT_REPORT_RATE', 1, '(1-ultraShortReportRate)*960*0.000005*powerGeneration*1', 'E42', 'E1;E2', NULL, '0', '1', NULL, NULL, NULL, NULL);
+INSERT INTO `t_calculation_formula` VALUES (217, 'ASSESSMENT_SHORT_ACCURACY_RATE', 1, 'if(shortAccuracyRate>0.8){\r\n  return 0;\r\n}\r\nreturn (0.8-shortAccuracyRate)*ratedCapacity*0.1*0.1;\r\n\r\n\r\n', 'E42', 'E1', NULL, '0', '1', NULL, NULL, NULL, NULL);
+INSERT INTO `t_calculation_formula` VALUES (218, 'ASSESSMENT_ULTRA_SHORT_ACCURACY_RATE', 1, 'if(ultraShortAccuracyRate>0.85){\r\n  return 0;\r\n}\r\nreturn (0.85-ultraShortAccuracyRate)*ratedCapacity*0.1*0.1;\r\n\r\n\r\n', 'E42', 'E1', NULL, '0', '1', NULL, NULL, NULL, NULL);
+INSERT INTO `t_calculation_formula` VALUES (219, 'RULES', 1, '	let m = seq.map(\"code\", \"500\", \"msg\", \"校验不通过\", \"data\", \"0.00%\");\r\n	if (shortReportRate == nil) {\r\n      m.code = \"500\";\r\n      m.msg = \"短期上报率为空\";\r\n      return m;\r\n    }\r\n	if (powerGeneration == nil) {\r\n      m.code = \"500\";\r\n      m.msg = \"发电量为空\";\r\n      return m;\r\n    }\r\n    m.code = \"200\";\r\n    m.msg = \"校验通过\";\r\n    return m;', 'E42', 'E1;E2', 'ASSESSMENT_SHORT_REPORT_RATE', '0', '1', NULL, NULL, NULL, NULL);
+INSERT INTO `t_calculation_formula` VALUES (220, 'RULES', 1, '	let m = seq.map(\"code\", \"500\", \"msg\", \"校验不通过\", \"data\", \"0.00%\");\r\n	if (ultraShortReportRate == nil) {\r\n      m.code = \"500\";\r\n      m.msg = \"短期上报率为空\";\r\n      return m;\r\n    }\r\n	if (powerGeneration == nil) {\r\n      m.code = \"500\";\r\n      m.msg = \"发电量为空\";\r\n      return m;\r\n    }\r\n    m.code = \"200\";\r\n    m.msg = \"校验通过\";\r\n    return m;', 'E42', 'E1;E2', 'ASSESSMENT_ULTRA_SHORT_REPORT_RATE', '0', '1', NULL, NULL, NULL, NULL);
+INSERT INTO `t_calculation_formula` VALUES (221, 'RULES', 1, '	let m = seq.map(\"code\", \"500\", \"msg\", \"校验不通过\", \"data\", \"0.00%\");\r\n	if (shortAccuracyRate == nil) {\r\n      m.code = \"500\";\r\n      m.msg = \"短期准确率为空\";\r\n      return m;\r\n    }\r\n	if (ratedCapacity == nil) {\r\n      m.code = \"500\";\r\n      m.msg = \"额定容量为空\";\r\n      return m;\r\n    }\r\n    m.code = \"200\";\r\n    m.msg = \"校验通过\";\r\n    return m;', 'E42', 'E1;E2', 'ASSESSMENT_SHORT_ACCURACY_RATE', '0', '1', NULL, NULL, NULL, NULL);
+INSERT INTO `t_calculation_formula` VALUES (222, 'RULES', 1, '	let m = seq.map(\"code\", \"500\", \"msg\", \"校验不通过\", \"data\", \"0.00%\");\r\n	if (ultraShortAccuracyRate == nil) {\r\n      m.code = \"500\";\r\n      m.msg = \"超短期准确率为空\";\r\n      return m;\r\n    }\r\n	if (ratedCapacity == nil) {\r\n      m.code = \"500\";\r\n      m.msg = \"额定容量为空\";\r\n      return m;\r\n    }\r\n    m.code = \"200\";\r\n    m.msg = \"校验通过\";\r\n    return m;', 'E42', 'E1;E2', 'ASSESSMENT_ULTRA_SHORT_ACCURACY_RATE', '0', '1', NULL, NULL, NULL, NULL);
 
 SET FOREIGN_KEY_CHECKS = 1;