Переглянути джерело

考核:新增中期准确率、上报率、装机容量可用率、可用容量可用率
准确率:1.新增南网考核公式 2.辽宁新增超短期计算公式

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

+ 15 - 4
pom.xml

@@ -10,8 +10,8 @@
     </parent>
     <groupId>com.syjy</groupId>
     <artifactId>calculation-spring-boot-starter</artifactId>
-    <version>0.0.5</version>
-    <!--<version>0.0.5-SNAPSHOT</version>-->
+    <version>0.0.6</version>
+    <!--<version>0.0.6-SNAPSHOT</version>-->
     <name>calculation</name>
     <description>Demo project for Spring Boot</description>
     <properties>
@@ -31,7 +31,7 @@
         <dependency>
             <groupId>org.projectlombok</groupId>
             <artifactId>lombok</artifactId>
-            <version>RELEASE</version>
+            <version>1.18.24</version>
             <scope>compile</scope>
         </dependency>
 
@@ -64,7 +64,7 @@
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-jdbc</artifactId>
-            <version>RELEASE</version>
+            <version>3.0.1</version>
             <scope>compile</scope>
         </dependency>
         <!--fast json 版本-->
@@ -126,6 +126,17 @@
         </snapshotRepository>
 
         <!--<repository>-->
+            <!--<id>jiayue-releases</id>-->
+            <!--<name>Nexus Release Repository</name>-->
+            <!--<url>http://49.4.68.219:8888/repository/jiayue-releases/</url>-->
+        <!--</repository>-->
+        <!--<snapshotRepository>-->
+            <!--<id>jiayue-snapshots</id>-->
+            <!--<name>Nexus Snapshot Repository</name>-->
+            <!--<url>http://49.4.68.219:8888/repository/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>-->

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

@@ -30,6 +30,11 @@ public class AssessmentInfo implements Serializable  {
     private String assessmentType;
 
     /**
+     * 中期上报率考核
+     */
+    private String midReportRate;
+
+    /**
      * 短期上报率考核
      */
     private String shortReportRate;
@@ -40,6 +45,11 @@ public class AssessmentInfo implements Serializable  {
     private String ultraShortReportRate;
 
     /**
+     * 中期准确率考核
+     */
+    private String midAccuracyRate;
+
+    /**
      * 短期准确率考核
      */
     private String shortAccuracyRate;
@@ -79,4 +89,14 @@ public class AssessmentInfo implements Serializable  {
      */
     private String anemometerTowerAccuracyRate;
 
+    /**
+     * 装机容量可用率
+     */
+    private String installedCapacityAccuracyRate;
+
+    /**
+     * 可用容量可用率
+     */
+    private String availableCapacityAccuracyRate;
+
 }

+ 30 - 2
src/main/java/com/syjy/calculate/entity/AssessmentRequest.java

@@ -44,6 +44,11 @@ public class AssessmentRequest implements Serializable  {
     private BigDecimal powerGeneration;
 
     /**
+     * 中期上报率考
+     */
+    private BigDecimal midReportRate;
+
+    /**
      * 短期上报率考
      */
     private BigDecimal shortReportRate;
@@ -54,6 +59,11 @@ public class AssessmentRequest implements Serializable  {
     private BigDecimal ultraShortReportRate;
 
     /**
+     * 中期准确率
+     */
+    private BigDecimal midAccuracyRate;
+
+    /**
      * 短期准确率
      */
     private BigDecimal shortAccuracyRate;
@@ -99,14 +109,26 @@ public class AssessmentRequest implements Serializable  {
     private BigDecimal anemometerTowerAccuracyRate;
 
     /**
+     * 装机容量可用率
+     */
+    private BigDecimal installedCapacityAccuracyRate;
+
+    /**
+     * 可用容量可用率
+     */
+    private BigDecimal availableCapacityAccuracyRate;
+
+    /**
      * 构造函数设置值
      * @param province
      * @param electricType
      * @param stationCode
      * @param ratedCapacity
      * @param powerGeneration
+     * @param midReportRate
      * @param shortReportRate
      * @param ultraShortReportRate
+     * @param midAccuracyRate
      * @param shortAccuracyRate
      * @param ultraShortAccuracyRate
      * @param shortPassRate
@@ -116,16 +138,21 @@ public class AssessmentRequest implements Serializable  {
      * @param ablePowerAccuracyRate
      * @param theoryPowerAccuracyRate
      * @param anemometerTowerAccuracyRate
+     * @param installedCapacityAccuracyRate
+     * @param availableCapacityAccuracyRate
+     *
      */
-    public AssessmentRequest(String province, String electricType, String stationCode ,BigDecimal ratedCapacity, BigDecimal powerGeneration, BigDecimal shortReportRate, BigDecimal ultraShortReportRate, BigDecimal shortAccuracyRate ,BigDecimal ultraShortAccuracyRate ,BigDecimal shortPassRate,BigDecimal ultraShortPassRate,BigDecimal singleMachinePassRate,BigDecimal deviationPower,BigDecimal ablePowerAccuracyRate,BigDecimal theoryPowerAccuracyRate ,BigDecimal anemometerTowerAccuracyRate)
+    public AssessmentRequest(String province, String electricType, String stationCode ,BigDecimal ratedCapacity, BigDecimal powerGeneration, BigDecimal midReportRate, BigDecimal shortReportRate, BigDecimal ultraShortReportRate, BigDecimal midAccuracyRate , BigDecimal shortAccuracyRate ,BigDecimal ultraShortAccuracyRate ,BigDecimal shortPassRate,BigDecimal ultraShortPassRate,BigDecimal singleMachinePassRate,BigDecimal deviationPower,BigDecimal ablePowerAccuracyRate,BigDecimal theoryPowerAccuracyRate ,BigDecimal anemometerTowerAccuracyRate,BigDecimal installedCapacityAccuracyRate,BigDecimal availableCapacityAccuracyRate)
     {
         this.setProvince(province);
         this.setElectricType(electricType);
         this.setStationCode(stationCode);
         this.setRatedCapacity(ratedCapacity);
         this.setPowerGeneration(powerGeneration);
+        this.setMidReportRate(midReportRate);
         this.setShortReportRate(shortReportRate);
         this.setUltraShortReportRate(ultraShortReportRate);
+        this.setMidAccuracyRate(midAccuracyRate);
         this.setShortAccuracyRate(shortAccuracyRate);
         this.setUltraShortAccuracyRate(ultraShortAccuracyRate);
         this.setShortPassRate(shortPassRate);
@@ -135,7 +162,8 @@ public class AssessmentRequest implements Serializable  {
         this.setAblePowerAccuracyRate(ablePowerAccuracyRate);
         this.setTheoryPowerAccuracyRate(theoryPowerAccuracyRate);
         this.setAnemometerTowerAccuracyRate(anemometerTowerAccuracyRate);
-
+        this.setInstalledCapacityAccuracyRate(installedCapacityAccuracyRate);
+        this.setAvailableCapacityAccuracyRate(availableCapacityAccuracyRate);
     }
 
     public AssessmentRequest(){}

+ 21 - 2
src/main/java/com/syjy/calculate/entity/CalculateResult.java

@@ -35,6 +35,12 @@ public class CalculateResult extends HashMap<String, Object> {
     /** 下划线 */
     public static final String UNDERLINE = "_";
 
+    /** 横线 */
+    public static final String LINE = "-";
+
+    /** 冒号 */
+    public static final String COLON = ":";
+
     /** 忽略 */
     public static final String IGNORE = "666";
 
@@ -65,12 +71,18 @@ public class CalculateResult extends HashMap<String, Object> {
     /** 时间 */
     public static final String TIME = "time";
 
+    /** 中期上报率考核量 */
+    public static final String MID_REPORT_RATE = "ASSESSMENT_MID_REPORT_RATE";
+
     /** 短期上报率考核量 */
     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 MID_ACCURACY_RATE = "ASSESSMENT_MID_ACCURACY_RATE";
+
     /** 短期准确率考核量 */
     public static final String SHORT_ACCURACY_RATE = "ASSESSMENT_SHORT_ACCURACY_RATE";
 
@@ -92,9 +104,15 @@ public class CalculateResult extends HashMap<String, Object> {
     /** 理论发电功率可用率 */
     public static final String THEORY_POWER_ACCURACY_RATE = "THEORY_POWER_ACCURACY_RATE";
 
-    /** 气象站/测风塔 */
+    /** 气象站/测风塔 可用率 */
     public static final String ANEMOMETER_TOWER_ACCURACY_RATE = "ANEMOMETER_TOWER_ACCURACY_RATE";
 
+    /** 装机容量可用率 */
+    public static final String INSTALLED_CAPACITY_ACCURACY_RATE = "INSTALLED_CAPACITY_ACCURACY_RATE";
+
+    /** 可用容量可用率 */
+    public static final String AVAILABLE_CAPACITY_ACCURACY_RATE = "AVAILABLE_CAPACITY_ACCURACY_RATE";
+
     /** 消息信息*/
     public static final String MSG_REQUEST_NULL = "入参为空";
     public static final String MSG_FORMULA_TYPE_NULL = "公式类型为空";
@@ -118,7 +136,8 @@ public class CalculateResult extends HashMap<String, Object> {
     public static final String MSG_NO_FORMULA = "未匹配到公式:";
     public static final String MSG_CALCULATE_SUCCESS = "计算成功";
     public static final String MSG_CHECK_SUCCESS = "校验成功";
-    public static final String MSG_NO_CALCULATE_TYPE = "无计算类型";
+    public static final String MSG_CHECK_FAIL = "校验失败:";
+    public static final String MSG_NO_CALCULATE_TYPE = "无计算公式";
     public static final String MSG_ERROR = "-0.99";
     public static final String MSG_DB_FAIL = "计算包所用数据库类型不存在或未在配置文件中配置:";
 

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

@@ -4,11 +4,9 @@ import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.RuntimeUtils;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
 import com.googlecode.aviator.runtime.type.AviatorDecimal;
-import com.googlecode.aviator.runtime.type.AviatorJavaType;
 import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.Sequence;
 import com.syjy.calculate.entity.FormulaParam;
-
 import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;

+ 61 - 0
src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorSouthernPowerGrid.java

@@ -0,0 +1,61 @@
+package com.syjy.calculate.function;
+
+import com.googlecode.aviator.AviatorEvaluator;
+import com.googlecode.aviator.runtime.RuntimeUtils;
+import com.googlecode.aviator.runtime.function.AbstractFunction;
+import com.googlecode.aviator.runtime.type.AviatorDecimal;
+import com.googlecode.aviator.runtime.type.AviatorObject;
+import com.googlecode.aviator.runtime.type.Sequence;
+import com.syjy.calculate.entity.FormulaParam;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 计算准确率 :南网专用均方根
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/9/8 9:30
+ */
+public class RootMeanSquaredErrorSouthernPowerGrid extends AbstractFunction {
+    @Override
+    public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3, AviatorObject arg4, AviatorObject arg5) {
+        // 获取参数
+        FormulaParam formulaParam = CommonUtil.getFormulaParam(env, arg1, arg2, arg3, arg4, arg5);
+        BigDecimal sum = BigDecimal.ZERO;
+        Sequence seq = RuntimeUtils.seq(formulaParam.getFirst(), env);
+        // 可用功率
+        BigDecimal ableValue ;
+        // 获取容量
+        BigDecimal electricCapacity = (BigDecimal) env.get("electricCapacity");
+        String forExp;
+        // 循环集合获取实际功率、预测功率信息并计算
+        for (Object obj : seq) {
+            Map<String, Object> map = (Map<String, Object>) obj;
+            ableValue = new BigDecimal(String.valueOf(map.get("ableValue")));
+            // 如果可用功率>=
+            if(ableValue.compareTo(electricCapacity.multiply(new BigDecimal("0.02")))>-1){
+                forExp = "math.pow((" + formulaParam.getSecond() + "-" + formulaParam.getThird() + ")/" + formulaParam.getSecond() + ",2)";
+            }else{
+                forExp = "math.pow((" + formulaParam.getSecond() + "-" + formulaParam.getThird() + ")/" + formulaParam.getFourth() +"*"+ formulaParam.getFifth() + ",2)";
+            }
+            BigDecimal forResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute(forExp, map)));
+            sum = sum.add(forResult);
+        }
+        // 上下文参数
+        Map<String, Object> map = new HashMap<>();
+        map.put("sum", sum);
+
+        // 求开根号的结果
+        BigDecimal sqrtSum = new BigDecimal(String.valueOf(AviatorEvaluator.execute("math.sqrt(sum/96)", map)));
+        map.put("sqrtSum", sqrtSum);
+        BigDecimal result = new BigDecimal(String.valueOf(AviatorEvaluator.execute("1-sqrtSum", map)));
+        return new AviatorDecimal(result);
+    }
+
+    @Override
+    public String getName() {
+        return "rootMeanSquaredErrorSouthernPowerGrid";
+    }
+}

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

@@ -40,6 +40,7 @@ public class ApplicationListenerImpl implements ApplicationListener<ApplicationS
         AviatorEvaluator.addFunction(new RootMeanSquaredErrorC());
         AviatorEvaluator.addFunction(new RootMeanSquaredErrorR());
         AviatorEvaluator.addFunction(new RootMeanSquaredErrorS());
+        AviatorEvaluator.addFunction(new RootMeanSquaredErrorSouthernPowerGrid());
         AviatorEvaluator.addFunction(new SumDifferenceAbsolute());
         AviatorEvaluator.addFunction(new SumDifferenceSquare());
         AviatorEvaluator.addFunction(new DevianceElectric());

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

@@ -40,7 +40,7 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
      */
     @Override
     public void initTable() {
-        log.info("初始化表");
+        log.info("初始化准确率计算公式表");
         // 获取数据库类型
         String dbType = properties.getDbType();
         // 如果是金仓数据库,直接初始化表
@@ -75,6 +75,7 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
             String oldVersion = getVersion();
             // 如果版本没变化,不进行初始化表操作
             if (oldVersion.equals(version) || oldVersion.equals("null")) {
+                log.info("版本没变化,不进行初始化表");
                 return;
             }
             // 如果版本不同,则初始化表
@@ -382,6 +383,7 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
             inputStream.close();
             // 执行sql文件
             jdbcTemplate.execute(builder.toString());
+            log.info("建表成功");
         } catch (IOException e) {
             e.printStackTrace();
         }

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

@@ -34,6 +34,7 @@ public class AccuracyPassRateCalculateService {
      * @return
      */
     public CalculateResult calculate(CalculateRequest calculateRequest) {
+        log.info("--------------------准确率计算开始--------------------");
         // 根据类型从数据库中查出公式列表
         CalculationFormula calculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.FORMULA, calculateRequest.getFormulaType(), calculateRequest.getProvince(), calculateRequest.getElectricType(), calculateRequest.getStationCode());
         if (calculationFormula == null || calculationFormula.getFormula() == null) {
@@ -52,16 +53,6 @@ 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();
         // 初始化公式并获取缓存的公式
@@ -79,7 +70,9 @@ public class AccuracyPassRateCalculateService {
         calculationInfoList.sort(Comparator.comparing(CalculationInfo::getOpenCapacity).reversed());
         BigDecimal maxOpenCapacity = calculationInfoList.get(0).getOpenCapacity();
         env.put(CalculateResult.MAX_OPEN_CAPACITY, maxOpenCapacity);
+
         Map<String, Object> calculateRequestMap = new HashMap<>();
+        // bean 转map
         BeanMap beanMap = BeanMap.create(calculateRequest);
         for (Object key : beanMap.keySet()) {
             calculateRequestMap.put(String.valueOf(key), beanMap.get(key));
@@ -93,9 +86,11 @@ public class AccuracyPassRateCalculateService {
             if(calculationFormula.getIsRate().equals(CalculateResult.STR_TRUE)){
                 result = filterResult(executeResult);
             }
+            log.info("--------------------准确率计算结束--------------------");
             return CalculateResult.success(CalculateResult.MSG_CALCULATE_SUCCESS, result);
         } catch (Exception e) {
             e.printStackTrace();
+            log.info("--------------------准确率计算结束--------------------");
             return CalculateResult.error(CalculateResult.MSG_CALCULATE_FAIL + e.toString());
         }
     }
@@ -170,16 +165,10 @@ public class AccuracyPassRateCalculateService {
             return CalculateResult.error(CalculateResult.MSG_CALCULATE_DATA_NULL);
         }
 
-        // 容量校验
+        // 装机容量校验
         if (calculateRequest.getElectricCapacity() == null || calculateRequest.getElectricCapacity().compareTo(BigDecimal.ZERO) == 0) {
             return CalculateResult.error(CalculateResult.MSG_CAP_NULL);
         }
-        // 循环判断开机容量是否为空
-        for (CalculationInfo calculationInfo : calculationInfoList) {
-            if (calculationInfo.getOpenCapacity() == null || calculationInfo.getOpenCapacity().compareTo(BigDecimal.ZERO) == 0) {
-                return CalculateResult.error(CalculateResult.MSG_CAP_NULL);
-            }
-        }
 
         // 循环判断实际功率/预测功率、开机容量
         for (int i = 0; i < calculationInfoList.size(); i++) {
@@ -202,13 +191,6 @@ 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 formula = rulesCalculationFormula.getFormula();
         // 初始化公式并获取缓存的公式
         String scriptName = common.initFormula(formula,calculateRequest.getProvince(),calculateRequest.getFormulaType(),calculateRequest.getElectricType(),CalculateResult.RULES);

+ 50 - 31
src/main/java/com/syjy/calculate/service/AssessmentCalculateService.java

@@ -7,6 +7,7 @@ import com.syjy.calculate.util.Common;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
 import java.util.*;
 
 /**
@@ -28,14 +29,15 @@ public class AssessmentCalculateService {
 
     /**
      * 计算考核电量
+     *
      * @return
      */
-    public CalculateResult calculateAssessment(AssessmentRequest assessmentRequest){
+    public CalculateResult calculateAssessment(AssessmentRequest assessmentRequest) {
+        log.info("--------------------考核计算开始--------------------");
         AssessmentInfo assessmentInfo = new AssessmentInfo();
-
         CalculateResult checkResult = checkRequestInfo(assessmentRequest);
         // 如果校验失败
-        if(!String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.Type.SUCCESS.value())){
+        if (!String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.Type.SUCCESS.value())) {
             return checkResult;
         }
 //        // 上下文
@@ -48,29 +50,40 @@ public class AssessmentCalculateService {
 
         // 将实体类转为Map
         Map<String, Object> env = common.beanToMap(assessmentRequest);
+
+        // 中期上报率
+        String midReportRate = calculateDetail(assessmentRequest, env, CalculateResult.MID_REPORT_RATE);
         // 短期上报率
-        String shortReportRate = calculateDetail(assessmentRequest,env,CalculateResult.SHORT_REPORT_RATE);
+        String shortReportRate = calculateDetail(assessmentRequest, env, CalculateResult.SHORT_REPORT_RATE);
         // 超短期上报率
-        String ultraShortReportRate = calculateDetail(assessmentRequest,env,CalculateResult.ULTRA_SHORT_REPORT_RATE);
+        String ultraShortReportRate = calculateDetail(assessmentRequest, env, CalculateResult.ULTRA_SHORT_REPORT_RATE);
+        // 中期准确率
+        String midAccuracyRate = calculateDetail(assessmentRequest, env, CalculateResult.MID_ACCURACY_RATE);
         // 短期准确率
-        String shortAccuracyRate = calculateDetail(assessmentRequest,env,CalculateResult.SHORT_ACCURACY_RATE);
+        String shortAccuracyRate = calculateDetail(assessmentRequest, env, CalculateResult.SHORT_ACCURACY_RATE);
         // 超短期准确率
-        String ultraShortAccuracyRate = calculateDetail(assessmentRequest,env,CalculateResult.ULTRA_SHORT_ACCURACY_RATE);
+        String ultraShortAccuracyRate = calculateDetail(assessmentRequest, env, CalculateResult.ULTRA_SHORT_ACCURACY_RATE);
         // 短期合格率
-        String shortPassRate = calculateDetail(assessmentRequest,env,CalculateResult.SHORT_PASS_RATE);
+        String shortPassRate = calculateDetail(assessmentRequest, env, CalculateResult.SHORT_PASS_RATE);
         // 超短期合格率
-        String ultraShortPassRate = calculateDetail(assessmentRequest,env,CalculateResult.ULTRA_SHORT_PASS_RATE);
+        String ultraShortPassRate = calculateDetail(assessmentRequest, env, CalculateResult.ULTRA_SHORT_PASS_RATE);
         // 单机信息可用率
-        String singleMachinePassRate = calculateDetail(assessmentRequest,env,CalculateResult.SINGLE_MACHINE_PASS_RATE);
+        String singleMachinePassRate = calculateDetail(assessmentRequest, env, CalculateResult.SINGLE_MACHINE_PASS_RATE);
         // 可用发电功率可用率
-        String ablePowerAccuracyRate = calculateDetail(assessmentRequest,env,CalculateResult.ABLE_POWER_ACCURACY_RATE);
+        String ablePowerAccuracyRate = calculateDetail(assessmentRequest, env, CalculateResult.ABLE_POWER_ACCURACY_RATE);
         // 理论发电功率可用率
-        String theoryPowerAccuracyRate = calculateDetail(assessmentRequest,env,CalculateResult.THEORY_POWER_ACCURACY_RATE);
+        String theoryPowerAccuracyRate = calculateDetail(assessmentRequest, env, CalculateResult.THEORY_POWER_ACCURACY_RATE);
         // 测风塔/气象站可用率
-        String anemometerTowerAccuracyRate = calculateDetail(assessmentRequest,env,CalculateResult.ANEMOMETER_TOWER_ACCURACY_RATE);
+        String anemometerTowerAccuracyRate = calculateDetail(assessmentRequest, env, CalculateResult.ANEMOMETER_TOWER_ACCURACY_RATE);
+        // 装机容量可用率
+        String installedCapacityAccuracyRate = calculateDetail(assessmentRequest, env, CalculateResult.INSTALLED_CAPACITY_ACCURACY_RATE);
+        // 可用容量可用率
+        String availableCapacityAccuracyRate = calculateDetail(assessmentRequest, env, CalculateResult.AVAILABLE_CAPACITY_ACCURACY_RATE);
 
+        assessmentInfo.setMidReportRate(midReportRate);
         assessmentInfo.setShortReportRate(shortReportRate);
         assessmentInfo.setUltraShortReportRate(ultraShortReportRate);
+        assessmentInfo.setMidAccuracyRate(midAccuracyRate);
         assessmentInfo.setShortAccuracyRate(shortAccuracyRate);
         assessmentInfo.setUltraShortAccuracyRate(ultraShortAccuracyRate);
         assessmentInfo.setShortPassRate(shortPassRate);
@@ -79,15 +92,20 @@ public class AssessmentCalculateService {
         assessmentInfo.setAblePowerAccuracyRate(ablePowerAccuracyRate);
         assessmentInfo.setTheoryPowerAccuracyRate(theoryPowerAccuracyRate);
         assessmentInfo.setAnemometerTowerAccuracyRate(anemometerTowerAccuracyRate);
+        assessmentInfo.setInstalledCapacityAccuracyRate(installedCapacityAccuracyRate);
+        assessmentInfo.setAvailableCapacityAccuracyRate(availableCapacityAccuracyRate);
+        log.info("--------------------考核计算结束--------------------");
         return CalculateResult.success(CalculateResult.MSG_CALCULATE_SUCCESS, assessmentInfo);
+
     }
 
     /**
      * 校验请求参数
+     *
      * @param assessmentRequest
      * @return
      */
-    private CalculateResult checkRequestInfo(AssessmentRequest assessmentRequest){
+    private CalculateResult checkRequestInfo(AssessmentRequest assessmentRequest) {
 
         // 判断入参
         if (assessmentRequest == null) {
@@ -107,40 +125,41 @@ public class AssessmentCalculateService {
     }
 
     /**
-     * 计算短期上报率考核
+     * 各项考核计算
+     *
      * @return
      */
-    private String calculateDetail(AssessmentRequest assessmentRequest,Map<String,Object> env,String formulaType){
+    private String calculateDetail(AssessmentRequest assessmentRequest, Map<String, Object> env, String formulaType) {
 
         // 根据类型从数据库中查出考核公式列表
-        CalculationFormula calculationFormula = calculationFormulaRepository.findAssessmentByTypeAndProvince(CalculateResult.FORMULA,formulaType, assessmentRequest.getProvince(),assessmentRequest.getElectricType(),assessmentRequest.getStationCode());
+        CalculationFormula calculationFormula = calculationFormulaRepository.findAssessmentByTypeAndProvince(CalculateResult.FORMULA, formulaType, assessmentRequest.getProvince(), assessmentRequest.getElectricType(), assessmentRequest.getStationCode());
         // 判断是否有公式
         if (calculationFormula == null || calculationFormula.getFormula() == null) {
             // 未匹配到公式
-            log.info(CalculateResult.MSG_NO_FORMULA);
+            log.info(assessmentRequest.getProvince() + "-" + assessmentRequest.getStationCode() + CalculateResult.LINE + formulaType + CalculateResult.COLON + CalculateResult.MSG_NO_FORMULA);
             return CalculateResult.MSG_ERROR;
         }
-
         // 根据类型从数据库中查出规则列表
-        CalculationFormula rulesCalculationFormula = calculationFormulaRepository.findAssessmentByTypeAndProvince(CalculateResult.RULES, formulaType, assessmentRequest.getProvince(), assessmentRequest.getElectricType(),assessmentRequest.getStationCode());
+        CalculationFormula rulesCalculationFormula = calculationFormulaRepository.findAssessmentByTypeAndProvince(CalculateResult.RULES, formulaType, assessmentRequest.getProvince(), assessmentRequest.getElectricType(), assessmentRequest.getStationCode());
 
         // 判断是否有约束
         if (rulesCalculationFormula != null && rulesCalculationFormula.getFormula() != null) {
             // 校验规则
-            String checkResult = calculate(env,rulesCalculationFormula.getFormula(),assessmentRequest.getProvince(),formulaType,assessmentRequest.getElectricType(),CalculateResult.RULES);
+            String checkResult = calculate(env, rulesCalculationFormula.getFormula(), assessmentRequest.getProvince(), formulaType, assessmentRequest.getElectricType(), CalculateResult.RULES);
             // 如果校验失败,返回失败原因
-            if(!checkResult.equals(CalculateResult.MSG_CHECK_SUCCESS)){
-                log.info(checkResult);
+            if (!checkResult.equals(CalculateResult.MSG_CHECK_SUCCESS)) {
+                log.info(CalculateResult.MSG_CHECK_FAIL + assessmentRequest.getProvince() + "-" + assessmentRequest.getStationCode() + CalculateResult.LINE + formulaType + CalculateResult.COLON + checkResult);
                 return CalculateResult.MSG_ERROR;
             }
         }
         // 计算考核
-        String result = this.calculate(env,calculationFormula.getFormula(),assessmentRequest.getProvince(),formulaType,assessmentRequest.getElectricType(),CalculateResult.FORMULA);
+        String result = this.calculate(env, calculationFormula.getFormula(), assessmentRequest.getProvince(), formulaType, assessmentRequest.getElectricType(), CalculateResult.FORMULA);
         return result;
     }
 
     /**
      * 计算
+     *
      * @param env
      * @param formulaContent
      * @param province
@@ -149,25 +168,25 @@ public class AssessmentCalculateService {
      * @param calculateType
      * @return
      */
-    private String calculate(Map<String, Object> env,String formulaContent,String province,String formulaType,String electricType,String calculateType){
+    private String calculate(Map<String, Object> env, String formulaContent, String province, String formulaType, String electricType, String calculateType) {
         // 获取公式缓存名称
-        String scriptName = common.initFormula(formulaContent ,province, formulaType, electricType, calculateType);
+        String scriptName = common.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;
+            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)){
+                // 如果是计算,则返回计算结果
+            } else if (calculateType.equals(CalculateResult.FORMULA)) {
                 return String.valueOf(executeResult);
-            }else{
+            } else {
                 // 计算类型错误,计算类型必须是RULES或者FORMULA
                 return CalculateResult.MSG_NO_CALCULATE_TYPE;
             }