Selaa lähdekoodia

1.增加highgo类型
2.增加compute接口,计算全省准确率考核信息

jyyw 9 kuukautta sitten
vanhempi
commit
1495771e96
37 muutettua tiedostoa jossa 1113 lisäystä ja 93 poistoa
  1. 29 14
      pom.xml
  2. 147 7
      src/main/java/com/syjy/calculate/conotroller/ApiCalculate.java
  3. 1 0
      src/main/java/com/syjy/calculate/conotroller/JarCalculate.java
  4. 4 3
      src/main/java/com/syjy/calculate/conotroller/Test.java
  5. 0 1
      src/main/java/com/syjy/calculate/entity/AssessmentInfo.java
  6. 1 0
      src/main/java/com/syjy/calculate/entity/AssessmentRequest.java
  7. 1 0
      src/main/java/com/syjy/calculate/entity/CalculateRequest.java
  8. 4 0
      src/main/java/com/syjy/calculate/entity/CalculateResult.java
  9. 0 1
      src/main/java/com/syjy/calculate/entity/CalculationInfo.java
  10. 394 0
      src/main/java/com/syjy/calculate/entity/ComputeReponse.java
  11. 40 0
      src/main/java/com/syjy/calculate/entity/ComputeRequest.java
  12. 192 0
      src/main/java/com/syjy/calculate/entity/ComputeResult.java
  13. 0 4
      src/main/java/com/syjy/calculate/entity/PageReq.java
  14. 0 1
      src/main/java/com/syjy/calculate/function/CommonUtil.java
  15. 0 1
      src/main/java/com/syjy/calculate/function/DevianceElectric.java
  16. 1 0
      src/main/java/com/syjy/calculate/function/DoubleList.java
  17. 3 1
      src/main/java/com/syjy/calculate/function/GetBeginOfDay.java
  18. 4 1
      src/main/java/com/syjy/calculate/function/ManyDayThreeDayDeviationElectricity.java
  19. 0 1
      src/main/java/com/syjy/calculate/function/MeanAbsoluteError.java
  20. 0 1
      src/main/java/com/syjy/calculate/function/Pass.java
  21. 0 1
      src/main/java/com/syjy/calculate/function/PointS.java
  22. 0 1
      src/main/java/com/syjy/calculate/function/PointU.java
  23. 1 0
      src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorC.java
  24. 0 1
      src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorR.java
  25. 0 1
      src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorS.java
  26. 1 0
      src/main/java/com/syjy/calculate/function/RootMeanSquaredErrorSouthernPowerGrid.java
  27. 0 1
      src/main/java/com/syjy/calculate/function/SumDifferenceAbsolute.java
  28. 0 1
      src/main/java/com/syjy/calculate/function/SumDifferenceSquare.java
  29. 1 0
      src/main/java/com/syjy/calculate/repository/CalculationFormulaRepository.java
  30. 20 4
      src/main/java/com/syjy/calculate/repository/repositoryImpl/CalculationFormulaRepositoryImpl.java
  31. 10 4
      src/main/java/com/syjy/calculate/service/AccuracyPassRateCalculateService.java
  32. 6 2
      src/main/java/com/syjy/calculate/service/AssessmentCalculateService.java
  33. 193 0
      src/main/java/com/syjy/calculate/service/ComputeService.java
  34. 20 20
      src/main/resources/application.yml
  35. BIN
      src/main/resources/sql/t_calculation_formula.xlsx
  36. 20 0
      src/main/resources/sql/t_calculation_formula_highgo.sql
  37. 20 21
      src/main/resources/sql/t_calculation_formula_postgresql.sql

+ 29 - 14
pom.xml

@@ -34,6 +34,21 @@
             <version>1.18.24</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.highgo</groupId>
+            <artifactId>HgdbJdbc</artifactId>
+            <version>6.2.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.highgo.hibernate</groupId>
+            <artifactId>hgdb-hibernate-dialect</artifactId>
+            <version>6.1.6</version>
+        </dependency>
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>42.5.0</version> <!-- 请使用最新的稳定版本 -->
+        </dependency>
 
         <!--mysql 驱动-->
         <dependency>
@@ -42,18 +57,18 @@
         </dependency>
 
         <!--本地使用时候放开-->
-                <dependency>
-                    <groupId>kingbasejdbc4</groupId>
-                    <artifactId>kingbasejdbc4</artifactId>
-                    <version>1</version>
-                </dependency>
+        <dependency>
+            <groupId>kingbasejdbc4</groupId>
+            <artifactId>kingbasejdbc4</artifactId>
+            <version>1</version>
+        </dependency>
 
         <!--发布时候放开-->
-<!--        <dependency>-->
-<!--            <groupId>com.alibaba.cloud</groupId>-->
-<!--            <version>2.2.0.RELEASE</version>-->
-<!--            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
-<!--        </dependency>-->
+        <!--        <dependency>-->
+        <!--            <groupId>com.alibaba.cloud</groupId>-->
+        <!--            <version>2.2.0.RELEASE</version>-->
+        <!--            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
+        <!--        </dependency>-->
 
         <!-- druid 连接池 -->
         <dependency>
@@ -153,10 +168,10 @@
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-maven-plugin</artifactId>
                 <!--独立打包作为服务和对外接口时候需要注释,上传Maven取消注释-->
-<!--                <configuration>-->
-<!--                    <skip>true</skip>-->
-<!--                    <mainClass>com.syjy.calculate.CalculationApplication</mainClass>-->
-<!--                </configuration>-->
+                <!--                <configuration>-->
+                <!--                    <skip>true</skip>-->
+                <!--                    <mainClass>com.syjy.calculate.CalculationApplication</mainClass>-->
+                <!--                </configuration>-->
                 <executions>
                     <execution>
                         <goals>

+ 147 - 7
src/main/java/com/syjy/calculate/conotroller/ApiCalculate.java

@@ -1,12 +1,19 @@
 package com.syjy.calculate.conotroller;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.ReUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
-import com.syjy.calculate.entity.AssessmentRequest;
-import com.syjy.calculate.entity.CalculateRequest;
-import com.syjy.calculate.entity.CalculateResult;
-import com.syjy.calculate.entity.CalculationFormula;
+import cn.hutool.json.JSONUtil;
+import com.syjy.calculate.entity.*;
 import com.syjy.calculate.repository.CalculationFormulaRepository;
 import com.syjy.calculate.service.AccuracyPassRateCalculateService;
+import com.syjy.calculate.service.AssessmentCalculateService;
+import com.syjy.calculate.service.ComputeService;
 import com.syjy.calculate.util.Common;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -15,7 +22,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 公式管理
@@ -32,7 +41,11 @@ public class ApiCalculate {
   @Autowired
   private AccuracyPassRateCalculateService accuracyPassRateCalculateService;
   @Autowired
+  private AssessmentCalculateService assessmentCalculateService;
+  @Autowired
   private Common common;
+  @Autowired
+  private ComputeService computeService;
 
   /**
    * 计算单个公式准确率
@@ -66,12 +79,139 @@ public class ApiCalculate {
     }
     AssessmentRequest assessmentRequest;
     // 将传入的数据转为bean
-    assessmentRequest = data.toBean(CalculateRequest.class);
+    assessmentRequest = data.toBean(AssessmentRequest.class);
     // 调用计算方法
-    CalculateResult resultMap = accuracyPassRateCalculateService.calculate(assessmentRequest);
+    CalculateResult resultMap = assessmentCalculateService.calculateAssessment(assessmentRequest);
     return resultMap;
   }
 
+
+  @PostMapping("/province")
+  @SuppressWarnings({"rawtypes", "unchecked"})
+  public List<Map<String, Object>> calculateByProvince(HttpServletRequest request, @RequestBody JSONObject data) {
+    List<Map<String, Object>> result = new ArrayList<>();
+    // 校验信息
+    CalculateResult checkResult = checkAuthorization(request);
+    // 如果校验不成功,返回失败信息
+    if (!CalculateResult.Type.SUCCESS.value().equals(String.valueOf(checkResult.get(CalculateResult.CODE_TAG)))) {
+      Map<String, Object> map = MapUtil.builder(new HashMap<String, Object>()).put("error", checkResult).build();
+      result.add(map);
+      return result;
+    }
+    //按省份获取公式
+    List<CalculationFormula> formulaList = calculationFormulaRepository.findFormulaWithProvince(data.get("province", String.class), data.get("electricType", String.class));
+    List<CalculationFormula> formulaAsms = new ArrayList<>();// 准确率公式
+    List<CalculationFormula> formulaAccs = new ArrayList<>();// 考核公式
+    //
+    List<CalculationFormula> formulas = formulaList.stream().filter(t -> {// 过滤,排除版本,规则和用户
+      boolean v = !StrUtil.equalsIgnoreCase("VERSION", t.getType());
+      boolean r = !StrUtil.equalsIgnoreCase("RULES", t.getType());
+      boolean u = !StrUtil.equalsIgnoreCase("USER", t.getType());
+      if (v && r && u) {
+        if (StrUtil.startWithIgnoreCase(t.getType(), "ASSESSMENT_")) {
+          formulaAsms.add(t);// 考核公式
+        } else {
+          formulaAccs.add(t);// 准确率合格率公式
+        }
+      }
+      return v && r && u;
+    }).collect(Collectors.toList());
+    AssessmentRequest requestOfAsm = data.toBean(AssessmentRequest.class);// 考核计算参数
+    CalculateRequest requestOfAcc = data.toBean(CalculateRequest.class);// 准确率计算参数
+    requestOfAsm.setRatedCapacity(requestOfAcc.getElectricCapacity());
+    for (CalculationFormula formulaAcc : formulaAccs) {
+      Map<String, Object> accMap = new HashMap<>();
+      CalculateResult accResult;
+      formulaAcc.setIsRate("0");
+      // 准确率、合格率
+      requestOfAcc.setFormulaType(formulaAcc.getType());
+      List<AssessmentRequest> powers = new ArrayList<>();
+      if (StrUtil.containsAny(formulaAcc.getType(), "POINT_SHORT_ACCURACY")) { // 单点准确率
+        List<CalculationInfo> points = requestOfAcc.getCalculationInfoList();
+        List<CalculateResult> pointResults = new ArrayList<>();
+        for (CalculationInfo point : points) { // 按点计算
+          CalculateRequest pointRequest = BeanUtil.copyProperties(requestOfAcc, CalculateRequest.class);
+          pointRequest.setCalculationInfoList(ListUtil.toList(point));
+          CalculateResult pointResult = accuracyPassRateCalculateService.calculate(pointRequest, formulaAcc);
+          pointResults.add(pointResult);
+          AssessmentRequest asmRequest = new AssessmentRequest();
+          boolean forecastEqualN99 = point.getForecastAbleValue().compareTo(new BigDecimal(-99)) == 0;
+          boolean forecastEqualRei = point.getForecastAbleValue().compareTo(BigDecimal.ZERO) == 0;
+          boolean realEqualN99 = point.getRealValue().compareTo(new BigDecimal(-99)) == 0;
+          boolean realEqualRei = point.getRealValue().compareTo(BigDecimal.ZERO) == 0;
+          asmRequest.setDeviationPower(!(forecastEqualN99 && forecastEqualRei) ? point.getForecastAbleValue() : !(realEqualN99 && realEqualRei) ? point.getRealValue() : BigDecimal.ZERO);
+          powers.add(asmRequest);
+        }
+        accMap.put(formulaAcc.getType(), pointResults);
+        result.add(accMap);
+      } else { // 整日准确率
+        // 调用计算方法
+        accResult = accuracyPassRateCalculateService.calculate(requestOfAcc, formulaAcc);
+        accMap.put(formulaAcc.getType(), ListUtil.toList(accResult));
+        result.add(accMap);
+      }
+      if (StrUtil.containsAny(formulaAcc.getType(), "DAY_", "POINT_")) {
+        String finalType = ReUtil.replaceAll(formulaAcc.getType(), "^DAY_|^POINT_", "");
+        Optional<CalculationFormula> o = formulaAsms.stream().filter(t -> StrUtil.startWithIgnoreCase(StrUtil.removePrefix(t.getType(), "ASSESSMENT_"), finalType)).findFirst();
+        CalculationFormula asmFormula = o.orElse(null);
+        if (null != asmFormula) {
+          List<CalculateResult> rateList = MapUtil.get(accMap, formulaAcc.getType(), List.class);
+          List<CalculateResult> asmResults = new ArrayList<>();
+          Map<String, Object> asmMap = new HashMap<>();
+          for (int i = 0; i < rateList.size(); i++) {
+            CalculateResult calculateResult = rateList.get(i);
+            if (!powers.isEmpty()) {
+              AssessmentRequest asmRequest = powers.get(i);
+              requestOfAsm.setDeviationPower(asmRequest.getDeviationPower());
+            }
+            CalculateResult asmResult;
+            if (NumberUtil.isNumber(ObjectUtil.toString(calculateResult.get("data")))) {
+              BigDecimal rate = NumberUtil.toBigDecimal(ObjectUtil.toString(calculateResult.get("data")));
+              if (StrUtil.startWith(finalType, "ULTRA_SHORT_ACCURACY")) {
+                requestOfAsm.setUltraShortAccuracyRate(rate);
+              } else if (StrUtil.startWith(finalType, "SHORT_ACCURACY")) {
+                requestOfAsm.setShortAccuracyRate(rate);
+              } else if (StrUtil.startWith(finalType, "MID_ACCURACY")) {
+                requestOfAsm.setMidAccuracyRate(rate);
+              }
+            }
+            requestOfAcc.setFormulaType(asmFormula.getType());
+            asmResult = assessmentCalculateService.calculateAssessment(requestOfAsm);
+            asmResults.add(asmResult);
+          }
+          asmMap.put(asmFormula.getType(), asmResults);
+          result.add(asmMap);
+        }
+      }
+    }
+    System.out.println(JSONUtil.toJsonPrettyStr(result));
+    return result;
+  }
+
+  /**
+   * 计算单个公式准确率
+   *
+   * @param request
+   * @return
+   */
+  @PostMapping("/compute")
+  public ComputeReponse compute(HttpServletRequest request, @RequestBody JSONObject data) {
+    // 校验信息
+    ComputeReponse reponse = ComputeReponse.success("200", "Ok");
+    reponse.clear();
+    reponse.putAll(checkAuthorization(request));
+    // 如果校验不成功,返回失败信息
+    if (!ComputeReponse.Type.SUCCESS.value().equals(String.valueOf(reponse.get(CalculateResult.CODE_TAG)))) {
+      return reponse;
+    }
+    ComputeRequest computeRequest = BeanUtil.toBean(data, ComputeRequest.class);
+    ComputeResult computeResult = computeService.calculate(computeRequest);
+    reponse.put("data", computeResult);
+    System.out.println(JSONUtil.toJsonPrettyStr(reponse));
+    // 调用计算方法
+    return reponse;
+  }
+
 //    /**
 //     * 计算所有公式准确率
 //     *

+ 1 - 0
src/main/java/com/syjy/calculate/conotroller/JarCalculate.java

@@ -6,6 +6,7 @@ import com.syjy.calculate.repository.CalculationFormulaRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
+
 import javax.servlet.http.HttpServletRequest;
 import java.util.List;
 

+ 4 - 3
src/main/java/com/syjy/calculate/conotroller/Test.java

@@ -1,8 +1,6 @@
 package com.syjy.calculate.conotroller;
 
-import com.syjy.calculate.entity.AssessmentRequest;
 import com.syjy.calculate.entity.CalculateRequest;
-import com.syjy.calculate.entity.CalculateResult;
 import com.syjy.calculate.entity.CalculationInfo;
 import com.syjy.calculate.service.AccuracyPassRateCalculateService;
 import com.syjy.calculate.service.AssessmentCalculateService;
@@ -11,9 +9,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
+
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 @Controller
 @RequestMapping("/test")

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

@@ -4,7 +4,6 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
-import java.math.BigDecimal;
 
 /**
  * 考核信息

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

@@ -2,6 +2,7 @@ package com.syjy.calculate.entity;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
+
 import java.io.Serializable;
 import java.math.BigDecimal;
 

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

@@ -1,6 +1,7 @@
 package com.syjy.calculate.entity;
 
 import lombok.Data;
+
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.List;

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

@@ -92,6 +92,9 @@ public class CalculateResult extends HashMap<String, Object> {
     /** 超短期准确率考核量 */
     public static final String ULTRA_SHORT_ACCURACY_RATE = "ASSESSMENT_ULTRA_SHORT_ACCURACY_RATE";
 
+    /** 中期合格率考核量 */
+    public static final String MID_PASS_RATE = "ASSESSMENT_MID_PASS_RATE";
+
     /** 短期合格率考核量 */
     public static final String SHORT_PASS_RATE = "ASSESSMENT_SHORT_PASS_RATE";
 
@@ -158,6 +161,7 @@ public class CalculateResult extends HashMap<String, Object> {
     public static final String DB_MYSQL = "mysql";
     public static final String DB_KINGBASE = "kingbase";
     public static final String DB_POSTGRES = "postgres";
+    public static final String DB_HIGHGO = "highgo";
     // 授权信息
     public static final String AUTHORIZATION = "Authorization";
 

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

@@ -2,7 +2,6 @@ package com.syjy.calculate.entity;
 
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-import lombok.RequiredArgsConstructor;
 
 import java.io.Serializable;
 import java.math.BigDecimal;

+ 394 - 0
src/main/java/com/syjy/calculate/entity/ComputeReponse.java

@@ -0,0 +1,394 @@
+package com.syjy.calculate.entity;
+
+import com.sun.xml.internal.ws.developer.Serialization;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+
+@Serialization
+public class ComputeReponse extends HashMap<String, Object> {
+
+  private static final long serialVersionUID = 1L;
+
+  /**
+   * 100
+   */
+  public static final BigDecimal ONE_HUNDRED = new BigDecimal("100");
+
+  /**
+   * 百分号
+   */
+  public static final String PERCENT = "%";
+
+  /**
+   * 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";
+
+  /**
+   * 下划线
+   */
+  public static final String UNDERLINE = "_";
+
+  /**
+   * 横线
+   */
+  public static final String LINE = "-";
+
+  /**
+   * 冒号
+   */
+  public static final String COLON = ":";
+
+  /**
+   * 逗号
+   */
+  public static final String COMMA = ",";
+
+  /**
+   * 忽略
+   */
+  public static final String IGNORE = "666";
+
+  /**
+   * 失败
+   */
+  public static final String ERROR = "500";
+
+  /**
+   * 状态码
+   */
+  public static final String CODE_TAG = "code";
+
+  /**
+   * 返回内容
+   */
+  public static final String MSG_TAG = "msg";
+
+  /**
+   * 数据对象
+   */
+  public static final String DATA_TAG = "data";
+
+  /**
+   * 公式上下文中的数据
+   */
+  public static final String LIST = "list";
+
+  /**
+   * 场站标识
+   */
+  public static final String SIGN = "sign";
+
+  /**
+   * 容量
+   */
+  public static final String CAPACITY = "electricCapacity";
+
+  /**
+   * 最大容量
+   */
+  public static final String MAX_OPEN_CAPACITY = "maxOpenCapacity";
+
+  /**
+   * 时间
+   */
+  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";
+
+  /**
+   * 超短期准确率考核量
+   */
+  public static final String ULTRA_SHORT_ACCURACY_RATE = "ASSESSMENT_ULTRA_SHORT_ACCURACY_RATE";
+
+  /**
+   * 中期合格率考核量
+   */
+  public static final String MID_PASS_RATE = "ASSESSMENT_MID_PASS_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 SINGLE_MACHINE_PASS_RATE = "SINGLE_MACHINE_PASS_RATE";
+
+  /**
+   * 可用发电功率可用率
+   */
+  public static final String ABLE_POWER_ACCURACY_RATE = "ABLE_POWER_ACCURACY_RATE";
+
+  /**
+   * 理论发电功率可用率
+   */
+  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 DAY_MID_ACCURACY = "DAY_MID_ACCURACY";
+  public static final String DAY_SHORT_ACCURACY = "DAY_SHORT_ACCURACY";
+  public static final String DAY_ULTRA_SHORT_ACCURACY = "DAY_ULTRA_SHORT_ACCURACY";
+  public static final String POINT_MID_ACCURACY = "POINT_MID_ACCURACY";
+  public static final String POINT_SHORT_ACCURACY = "POINT_SHORT_ACCURACY";
+  public static final String POINT_ULTRA_SHORT_ACCURACY = "POINT_ULTRA_SHORT_ACCURACY";
+
+
+  /**
+   * 消息信息
+   */
+  public static final String MSG_REQUEST_NULL = "入参为空";
+  public static final String MSG_FORMULA_TYPE_NULL = "公式类型为空";
+  public static final String MSG_FORMULA_TYPE_ERROR = "公式类型不正确";
+  public static final String MSG_PROVINCE_NULL = "省调为空";
+  public static final String MSG_STATION_CODE_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_GEN_TIME_NULL = "数据生成时间为空";
+  public static final String MSG_DATA_SOURCE_TYPE_NULL = "数据文件类型为空";
+  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_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 = "计算包所用数据库类型不存在或未在配置文件中配置:";
+
+  public static final String MSG_CALCULATE_FAIL = "计算失败:";
+  public static final String MSG_AUTHORIZATION_ERROR = "验证信息失败,账号或密码错误";
+  public static final String MSG_USERINFO_ERROR = "数据库中未查到用户信息";
+  public static final String MSG_CAP_ZERO = "容量为0";
+  public static final String MSG_SIZE_ZERO = "个数为0";
+  public static final String STR_TRUE = "1";
+  public static final String STR_FALSE = "0";
+
+  public static final String DB_ERROR_TABLE_EXIST = "java.sql.SQLException: [KingbaseES Server]ERROR: relation \"t_calculation_formula\" does not exist";
+  public static final String DB_MYSQL = "mysql";
+  public static final String DB_KINGBASE = "kingbase";
+  public static final String DB_POSTGRES = "postgres";
+  public static final String DB_HIGHGO = "highgo";
+  // 授权信息
+  public static final String AUTHORIZATION = "Authorization";
+
+
+  /**
+   * 状态类型
+   */
+  public enum Type {
+    /**
+     * 成功
+     */
+    SUCCESS("200"),
+    /**
+     * 忽略
+     */
+    IGNORE("666"),
+    /**
+     * 警告
+     */
+    WARN("301"),
+    /**
+     * 错误
+     */
+    ERROR("500");
+    private final String value;
+
+    Type(String value) {
+      this.value = value;
+    }
+
+    public String value() {
+      return this.value;
+    }
+  }
+
+  /**
+   * 初始化一个新创建的 ComputeReponse 对象
+   *
+   * @param type 状态类型
+   * @param msg  返回内容
+   */
+  public ComputeReponse(ComputeReponse.Type type, String msg) {
+    super.put(CODE_TAG, type.value);
+    super.put(MSG_TAG, msg);
+  }
+
+  /**
+   * 初始化一个新创建的 ComputeReponse 对象
+   *
+   * @param type 状态类型
+   * @param msg  返回内容
+   * @param data 数据对象
+   */
+  public ComputeReponse(ComputeReponse.Type type, String msg, Object data) {
+    super.put(CODE_TAG, type.value);
+    super.put(MSG_TAG, msg);
+    if (data != null) {
+      super.put(DATA_TAG, data);
+    }
+  }
+
+  /**
+   * 返回成功消息
+   *
+   * @return 成功消息
+   */
+  public static ComputeReponse success() {
+    return ComputeReponse.success("操作成功");
+  }
+
+  /**
+   * 返回成功数据
+   *
+   * @return 成功消息
+   */
+  public static ComputeReponse success(Object data) {
+    return ComputeReponse.success("操作成功", data);
+  }
+
+  /**
+   * 返回成功消息
+   *
+   * @param msg 返回内容
+   * @return 成功消息
+   */
+  public static ComputeReponse success(String msg) {
+    return ComputeReponse.success(msg, null);
+  }
+
+  /**
+   * 返回成功消息
+   *
+   * @param msg  返回内容
+   * @param data 数据对象
+   * @return 成功消息
+   */
+  public static ComputeReponse success(String msg, Object data) {
+    return new ComputeReponse(ComputeReponse.Type.SUCCESS, msg, data);
+  }
+
+  /**
+   * 返回警告消息
+   *
+   * @param msg 返回内容
+   * @return 警告消息
+   */
+  public static ComputeReponse warn(String msg) {
+    return ComputeReponse.warn(msg, null);
+  }
+
+  /**
+   * 返回警告消息
+   *
+   * @param msg  返回内容
+   * @param data 数据对象
+   * @return 警告消息
+   */
+  public static ComputeReponse warn(String msg, Object data) {
+    return new ComputeReponse(ComputeReponse.Type.WARN, msg, data);
+  }
+
+  /**
+   * 返回错误消息
+   *
+   * @return
+   */
+  public static ComputeReponse error() {
+    return ComputeReponse.error("操作失败");
+  }
+
+  /**
+   * 返回错误消息
+   *
+   * @param msg 返回内容
+   * @return 警告消息
+   */
+  public static ComputeReponse error(String msg) {
+    return ComputeReponse.error(msg, null);
+  }
+
+  /**
+   * 返回错误消息
+   *
+   * @param msg  返回内容
+   * @param data 数据对象
+   * @return 警告消息
+   */
+  public static ComputeReponse error(String msg, Object data) {
+    return new ComputeReponse(ComputeReponse.Type.ERROR, msg, data);
+  }
+}

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

@@ -0,0 +1,40 @@
+package com.syjy.calculate.entity;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Data
+@Getter
+@Setter
+public class ComputeRequest extends CalculateRequest {
+
+  /**
+   * 额定容量
+   */
+  private BigDecimal ratedCapacity;
+
+  /**
+   * 发电量
+   */
+  private BigDecimal powerGeneration;
+
+  /**
+   * 偏差积分电量(万千瓦时)
+   */
+  private BigDecimal deviationPower;
+
+  /**
+   * 考核计算参数
+   */
+  private ComputeResult computeResult;
+
+  /**
+   * 无参构造函数
+   */
+  public ComputeRequest() {
+    super();
+  }
+}

+ 192 - 0
src/main/java/com/syjy/calculate/entity/ComputeResult.java

@@ -0,0 +1,192 @@
+package com.syjy.calculate.entity;
+
+import com.sun.xml.internal.ws.developer.Serialization;
+import lombok.*;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@RequiredArgsConstructor
+@AllArgsConstructor
+@Serialization
+@Getter
+@Setter
+public class ComputeResult implements Serializable {
+
+
+  /**
+   * 时间
+   */
+  protected long time;
+
+  /**
+   * 考核类型(电量/分)
+   */
+  protected String assessmentType;
+
+  /**
+   * 中期上报率
+   */
+  protected String midReportGoal;
+  /**
+   * 中期上报率考核
+   */
+  protected String midReportRate;
+
+  /**
+   * 短期上报率
+   */
+  protected String shortReportGoal;
+  /**
+   * 短期上报率考核
+   */
+  protected String shortReportRate;
+
+  /**
+   * 超短期上报率
+   */
+  protected String ultraShortReportGoal;
+  /**
+   * 超短期上报率考核
+   */
+  protected String ultraShortReportRate;
+
+  /**
+   * 中期准确率
+   */
+  protected List<String> pointMidAccuracyGoal;
+  /**
+   * 中期准确率考核
+   */
+  protected List<String> pointMidAccuracyRate;
+
+  /**
+   * 短期准确率
+   */
+  protected List<String> pointShortAccuracyGoal;
+  /**
+   * 短期准确率考核
+   */
+  protected List<String> pointShortAccuracyRate;
+
+  /**
+   * 超短期准确率
+   */
+  protected List<String> pointUltraShortAccuracyGoal;
+  /**
+   * 超短期准确率考核
+   */
+  protected List<String> pointUltraShortAccuracyRate;
+
+  /**
+   * 中期准确率
+   */
+  protected String dayMidAccuracyGoal;
+  /**
+   * 中期准确率考核
+   */
+  protected String dayMidAccuracyRate;
+
+  /**
+   * 短期准确率
+   */
+  protected String dayShortAccuracyGoal;
+  /**
+   * 短期准确率考核
+   */
+  protected String dayShortAccuracyRate;
+
+  /**
+   * 超短期准确率
+   */
+  protected String dayUltraShortAccuracyGoal;
+  /**
+   * 超短期准确率考核
+   */
+  protected String dayUltraShortAccuracyRate;
+
+  /**
+   * 短期合格率
+   */
+  protected String midPassGoal;
+  /**
+   * 短期合格率考核
+   */
+  protected String midPassRate;
+
+  /**
+   * 短期合格率
+   */
+  protected String shortPassGoal;
+  /**
+   * 短期合格率考核
+   */
+  protected String shortPassRate;
+
+  /**
+   * 超短期合格率
+   */
+  protected String ultraShortPassGoal;
+  /**
+   * 超短期合格率考核
+   */
+  protected String ultraShortPassRate;
+
+  /**
+   * 单机合格率
+   */
+  protected String singleMachinePassGoal;
+  /**
+   * 单机合格率考核
+   */
+  protected String singleMachinePassRate;
+
+  /**
+   * 可用发电功率
+   */
+  protected String ablePowerAccuracyGoal;
+  /**
+   * 可用发电功率考核
+   */
+  protected String ablePowerAccuracyRate;
+
+  /**
+   * 理论发电功率
+   */
+  protected String theoryPowerAccuracyGoal;
+  /**
+   * 理论发电功率考核
+   */
+  protected String theoryPowerAccuracyRate;
+
+  /**
+   * 测风塔/气象站
+   */
+  protected String anemometerTowerAccuracyGoal;
+  /**
+   * 测风塔/气象站考核
+   */
+  protected String anemometerTowerAccuracyRate;
+
+  /**
+   * 装机容量可用率
+   */
+  protected String installedCapacityAccuracyGoal;
+  /**
+   * 装机容量可用率考核
+   */
+  protected String installedCapacityAccuracyRate;
+
+  /**
+   * 可用容量可用率
+   */
+  protected String availableCapacityAccuracyGoal;
+  /**
+   * 可用容量可用率
+   */
+  protected String availableCapacityAccuracyRate;
+
+
+}

+ 0 - 4
src/main/java/com/syjy/calculate/entity/PageReq.java

@@ -2,12 +2,8 @@ package com.syjy.calculate.entity;
 
 import lombok.AllArgsConstructor;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 
-import java.io.Serializable;
-import java.math.BigDecimal;
-
 /**
  * 分页请求实体
  *

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

@@ -2,7 +2,6 @@ package com.syjy.calculate.function;
 
 import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.RuntimeUtils;
-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;

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

@@ -8,7 +8,6 @@ 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;
 
 /**

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

@@ -7,6 +7,7 @@ import com.googlecode.aviator.runtime.type.AviatorObject;
 import com.googlecode.aviator.runtime.type.AviatorRuntimeJavaType;
 import com.googlecode.aviator.runtime.type.Sequence;
 import com.syjy.calculate.entity.CalculateResult;
+
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;

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

@@ -3,7 +3,9 @@ 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 com.googlecode.aviator.runtime.type.AviatorObject;
+import com.googlecode.aviator.runtime.type.AviatorRuntimeJavaType;
+
 import java.util.Map;
 
 /**

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

@@ -3,9 +3,12 @@ package com.syjy.calculate.function;
 import cn.hutool.json.JSONObject;
 import com.googlecode.aviator.AviatorEvaluator;
 import com.googlecode.aviator.runtime.function.AbstractFunction;
-import com.googlecode.aviator.runtime.type.*;
+import com.googlecode.aviator.runtime.type.AviatorObject;
+import com.googlecode.aviator.runtime.type.AviatorString;
+import com.googlecode.aviator.runtime.type.Sequence;
 import com.syjy.calculate.entity.FormulaParam;
 import lombok.extern.slf4j.Slf4j;
+
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;

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

@@ -3,7 +3,6 @@ package com.syjy.calculate.function;
 import com.googlecode.aviator.AviatorEvaluator;
 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.CalculateResult;

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

@@ -4,7 +4,6 @@ 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.CalculateResult;

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

@@ -3,7 +3,6 @@ package com.syjy.calculate.function;
 import com.googlecode.aviator.AviatorEvaluator;
 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;

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

@@ -3,7 +3,6 @@ package com.syjy.calculate.function;
 import com.googlecode.aviator.AviatorEvaluator;
 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;

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

@@ -7,6 +7,7 @@ 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;

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

@@ -4,7 +4,6 @@ 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;

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

@@ -4,7 +4,6 @@ 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;

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

@@ -7,6 +7,7 @@ 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;

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

@@ -2,7 +2,6 @@ package com.syjy.calculate.function;
 
 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;

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

@@ -2,7 +2,6 @@ package com.syjy.calculate.function;
 
 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;

+ 1 - 0
src/main/java/com/syjy/calculate/repository/CalculationFormulaRepository.java

@@ -64,6 +64,7 @@ public interface CalculationFormulaRepository {
 
   List<CalculationFormula> findFormulaByProvince(String province, String electricType);
 
+  List<CalculationFormula> findFormulaWithProvince(String province, String electricType);
 
   /**
    * 查询考核公式数据

+ 20 - 4
src/main/java/com/syjy/calculate/repository/repositoryImpl/CalculationFormulaRepositoryImpl.java

@@ -56,7 +56,7 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
     // 获取数据库类型
     String dbType = properties.getDbType();
     // 如果是金仓数据库,直接初始化表
-    if (CalculateResult.DB_KINGBASE.equals(dbType) || ObjectUtil.equal(CalculateResult.DB_POSTGRES, dbType)) {
+    if (CalculateResult.DB_KINGBASE.equals(dbType)) {
       this.createTable();
       return;
     }
@@ -325,6 +325,20 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
     return result;
   }
 
+  public List<CalculationFormula> findFormulaWithProvince(String province, String electricType) {
+    List<CalculationFormula> result = new ArrayList<>();
+    electricType = "%" + electricType + "%";
+    // 查询sql
+    String sql = " SELECT * from t_calculation_formula where state = '1' and ELECTRIC_TYPE like ? and PROVINCE = ? ";
+    try {
+      result = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(CalculationFormula.class), electricType, province);
+    } catch (Exception ex) {
+      ex.printStackTrace();
+      log.error(CalculateResult.MSG_NO_FORMULA);
+    }
+    return result;
+  }
+
   /**
    * 查询考核公式数据
    *
@@ -405,10 +419,11 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
       // 如果是金仓数据库
       if (CalculateResult.DB_KINGBASE.equals(dbType)) {
         path = "sql/t_calculation_formula_king_base.sql";
-        // 如果是mysql
-      } if(ObjectUtil.equal(CalculateResult.DB_POSTGRES,dbType)){
+      } else if (ObjectUtil.equal(CalculateResult.DB_POSTGRES, dbType)) {
         path = "sql/t_calculation_formula_postgresql.sql";
-      }else {
+      } else if (ObjectUtil.equal(CalculateResult.DB_HIGHGO, dbType)) {
+        path = "sql/t_calculation_formula_highgo.sql";
+      } else {// 如果是mysql
         path = "sql/t_calculation_formula.sql";
       }
 
@@ -458,6 +473,7 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
       switch (dbType) {
         case CalculateResult.DB_POSTGRES:
         case CalculateResult.DB_KINGBASE:
+        case CalculateResult.DB_HIGHGO:
           jdbcTemplate.execute(SqlUtil.formatSql(IoUtil.read(sqlInputStream, StandardCharsets.UTF_8)));
           jdbcTemplate.batchUpdate("INSERT INTO T_CALCULATION_FORMULA VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", pss);
           break;

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

@@ -44,11 +44,17 @@ public class AccuracyPassRateCalculateService {
    * @return
    */
   public CalculateResult calculate(CalculateRequest calculateRequest) {
+    return calculate(calculateRequest, null);
+  }
+
+  public CalculateResult calculate(CalculateRequest calculateRequest, CalculationFormula calculationFormula) {
     // 根据类型从数据库中查出公式列表
-    CalculationFormula calculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.FORMULA, calculateRequest.getFormulaType(), calculateRequest.getProvince(), calculateRequest.getElectricType(), calculateRequest.getStationCode());
-    if (calculationFormula == null || calculationFormula.getFormula() == null) {
-      // 未匹配到公式
-      return CalculateResult.error(CalculateResult.MSG_NO_FORMULA);
+    if (null == calculationFormula) {
+      calculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.FORMULA, calculateRequest.getFormulaType(), calculateRequest.getProvince(), calculateRequest.getElectricType(), calculateRequest.getStationCode());
+      if (calculationFormula == null || calculationFormula.getFormula() == null) {
+        // 未匹配到公式
+        return CalculateResult.error(CalculateResult.MSG_NO_FORMULA);
+      }
     }
 
     // 对细则进行校验

+ 6 - 2
src/main/java/com/syjy/calculate/service/AssessmentCalculateService.java

@@ -1,14 +1,18 @@
 package com.syjy.calculate.service;
 
 import com.googlecode.aviator.AviatorEvaluator;
-import com.syjy.calculate.entity.*;
+import com.syjy.calculate.entity.AssessmentInfo;
+import com.syjy.calculate.entity.AssessmentRequest;
+import com.syjy.calculate.entity.CalculateResult;
+import com.syjy.calculate.entity.CalculationFormula;
 import com.syjy.calculate.repository.CalculationFormulaRepository;
 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.*;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * 计算准确率、合格率

+ 193 - 0
src/main/java/com/syjy/calculate/service/ComputeService.java

@@ -0,0 +1,193 @@
+package com.syjy.calculate.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.comparator.CompareUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.syjy.calculate.entity.*;
+import com.syjy.calculate.repository.CalculationFormulaRepository;
+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.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@Slf4j
+public class ComputeService {
+
+  @Autowired
+  private CalculationFormulaRepository calculationFormulaRepository;
+
+  @Autowired
+  private Common common;
+
+  @Autowired
+  private AccuracyPassRateCalculateService accuracyPassRateCalculateService;
+  @Autowired
+  private AssessmentCalculateService assessmentCalculateService;
+
+  public ComputeResult calculate(ComputeRequest request) {
+    return calculate(request, null);
+  }
+
+  public ComputeResult calculate(ComputeRequest request, CalculationFormula calculationFormula) {
+    List<ComputeReponse> results = new ArrayList<>();
+    List<CalculationFormula> formulaAsms = new ArrayList<>(); // 考核公式
+    List<CalculationFormula> formulaAccs = new ArrayList<>(); // 准确率公式
+    List<CalculationFormula> formulas = new ArrayList<>();
+    if (null == calculationFormula) {
+      //按省份获取公式
+      List<CalculationFormula> formulaList = calculationFormulaRepository.findFormulaWithProvince(request.getProvince(), request.getElectricType());
+      //
+      formulas = formulaList.stream().map(f -> {
+        CalculationFormula formula = BeanUtil.toBean(f, CalculationFormula.class);
+        formula.setIsRate("0");
+        return formula;
+      }).filter(t -> {// 过滤,排除版本,规则和用户
+        boolean v = !StrUtil.equalsIgnoreCase("VERSION", t.getType());
+        boolean r = !StrUtil.equalsIgnoreCase("RULES", t.getType());
+        boolean u = !StrUtil.equalsIgnoreCase("USER", t.getType());
+        t.setIsRate("0");
+        if (v && r && u) {
+          if (StrUtil.startWithIgnoreCase(t.getType(), "ASSESSMENT_")) {
+            formulaAsms.add(t);// 考核公式
+          } else {
+            formulaAccs.add(t);// 准确率合格率公式
+          }
+        }
+        return v && r && u;
+      }).collect(Collectors.toList());
+    } else {
+      calculationFormula.setIsRate("0");
+      formulas.add(calculationFormula);
+    }
+    ComputeResult computeResult = new ComputeResult();
+    computeResult = compute(request, formulas, computeResult);
+    return computeResult;
+  }
+
+
+  private String compute(CalculateRequest request, CalculationFormula formula) {
+    CalculateResult calculateResult = accuracyPassRateCalculateService.calculate(request, formula);
+    log.info("准确率 :: {}", calculateResult);
+    return ObjectUtil.toString(calculateResult.get("data"));
+  }
+
+  private JSONObject compute(AssessmentRequest request) {
+    CalculateResult calculateResult = assessmentCalculateService.calculateAssessment(request);
+    log.info("考核量 ::{}", calculateResult);
+    return JSONUtil.parseObj(calculateResult.get("data"));
+  }
+
+  private BigDecimal parseDeviationPower(CalculationInfo info) {
+    if (null != info) {
+      boolean fz = CompareUtil.compare(info.getForecastAbleValue(), BigDecimal.ZERO) == 0;
+      boolean rz = CompareUtil.compare(info.getRealValue(), BigDecimal.ZERO) == 0;
+      boolean az = CompareUtil.compare(info.getAbleValue(), BigDecimal.ZERO) == 0;
+      return fz ? info.getRealValue() : info.getForecastAbleValue();
+    }
+    return null;
+  }
+
+  private ComputeResult compute(ComputeRequest request, List<CalculationFormula> formulas, ComputeResult computeResult) {
+    CalculateRequest calculateRequest = BeanUtil.copyProperties(request, CalculateRequest.class);
+    AssessmentRequest assessmentRequest = BeanUtil.copyProperties(request, AssessmentRequest.class);
+    ComputeResult r = request.getComputeResult();
+    BeanUtil.copyProperties(r, assessmentRequest);
+    for (CalculationFormula formula : formulas) {
+      switch (formula.getType()) {
+        case ComputeReponse.DAY_MID_ACCURACY:
+          String dayMidRate = compute(calculateRequest, formula);
+          if (NumberUtil.isNumber(dayMidRate)) {
+            assessmentRequest.setMidAccuracyRate(NumberUtil.toBigDecimal(dayMidRate));
+          }
+          computeResult.setDayMidAccuracyGoal(dayMidRate);
+          JSONObject dayMidObject = compute(assessmentRequest);
+          computeResult.setDayMidAccuracyRate(dayMidObject.get("midAccuracyRate", String.class));
+          break;
+        case ComputeReponse.DAY_SHORT_ACCURACY:
+          String dayShortRate = compute(calculateRequest, formula);
+          if (NumberUtil.isNumber(dayShortRate)) {
+            assessmentRequest.setShortAccuracyRate(NumberUtil.toBigDecimal(dayShortRate));
+          }
+          computeResult.setDayShortAccuracyGoal(dayShortRate);
+          JSONObject dayShortObject = compute(assessmentRequest);
+          computeResult.setDayShortAccuracyRate(dayShortObject.get("shortAccuracyRate", String.class));
+          break;
+        case ComputeReponse.DAY_ULTRA_SHORT_ACCURACY:
+          String dayUltraShortRate = compute(calculateRequest, formula);
+          if (NumberUtil.isNumber(dayUltraShortRate)) {
+            assessmentRequest.setUltraShortAccuracyRate(NumberUtil.toBigDecimal(dayUltraShortRate));
+          }
+          computeResult.setDayUltraShortAccuracyGoal(dayUltraShortRate);
+          JSONObject dayUltraShortObject = compute(assessmentRequest);
+          computeResult.setDayUltraShortAccuracyRate(dayUltraShortObject.get("ultraShortAccuracyRate", String.class));
+          break;
+        case ComputeReponse.POINT_MID_ACCURACY:
+          String pointMidRate = compute(calculateRequest, formula);
+          if (NumberUtil.isNumber(pointMidRate)) {
+            assessmentRequest.setMidAccuracyRate(NumberUtil.toBigDecimal(pointMidRate));
+          }
+          computeResult.setPointMidAccuracyGoal(ListUtil.toList(pointMidRate));
+          JSONObject pointMidObject = compute(assessmentRequest);
+          computeResult.setPointMidAccuracyRate(ListUtil.toList(pointMidObject.get("midAccuracyRate", String.class)));
+          break;
+        case ComputeReponse.POINT_SHORT_ACCURACY:
+          List<String> pointGoals = new ArrayList<>();
+          List<String> pointRates = new ArrayList<>();
+          List<CalculationInfo> infos = request.getCalculationInfoList();
+          AssessmentRequest pAsRequest = BeanUtil.copyProperties(request, AssessmentRequest.class);
+          for (CalculationInfo info : infos) {
+            CalculateRequest pointRequest = BeanUtil.copyProperties(request, CalculateRequest.class);
+            pointRequest.setCalculationInfoList(ListUtil.toList(BeanUtil.toBean(info, CalculationInfo.class)));
+            CalculateResult calculateResult = accuracyPassRateCalculateService.calculate(pointRequest, formula);
+            String pointRate = ObjectUtil.toString(calculateResult.get("data"));
+            if (NumberUtil.isNumber(pointRate)) {
+              pAsRequest.setDeviationPower(parseDeviationPower(info));
+              pAsRequest.setShortAccuracyRate(NumberUtil.toBigDecimal(pointRate));
+            }
+            calculateResult = assessmentCalculateService.calculateAssessment(pAsRequest);
+            pointGoals.add(pointRate);
+            JSONObject jsonObject = JSONUtil.parseObj(calculateResult.get("data"));
+            pointRates.add(jsonObject.get("shortAccuracyRate", String.class));
+            computeResult.setPointShortAccuracyGoal(pointGoals);
+            computeResult.setPointShortAccuracyRate(pointRates);
+          }
+          break;
+        case ComputeReponse.POINT_ULTRA_SHORT_ACCURACY:
+          String pointUltraShortRate = compute(calculateRequest, formula);
+          if (NumberUtil.isNumber(pointUltraShortRate)) {
+            assessmentRequest.setUltraShortAccuracyRate(NumberUtil.toBigDecimal(pointUltraShortRate));
+          }
+          computeResult.setPointUltraShortAccuracyGoal(ListUtil.toList(pointUltraShortRate));
+          JSONObject pointUltraShortObject = compute(assessmentRequest);
+          computeResult.setPointUltraShortAccuracyRate(ListUtil.toList(pointUltraShortObject.get("ultraShortAccuracyRate", String.class)));
+          break;
+      }
+    }
+    JSONObject jsonObject = compute(assessmentRequest);
+    computeResult.setMidReportRate(jsonObject.get("midReportRate", String.class));
+    computeResult.setShortReportRate(jsonObject.get("shortReportRate", String.class));
+    computeResult.setUltraShortReportRate(jsonObject.get("ultraReportRate", String.class));
+    computeResult.setMidPassRate(jsonObject.get("midPassRate", String.class));
+    computeResult.setShortPassRate(jsonObject.get("shortPassRate", String.class));
+    computeResult.setUltraShortPassRate(jsonObject.get("ultraShortPassRate", String.class));
+    computeResult.setSingleMachinePassRate(jsonObject.get("singleMachinePassRate", String.class));
+    computeResult.setAblePowerAccuracyRate(jsonObject.get("ablePowerAccuracyRate", String.class));
+    computeResult.setTheoryPowerAccuracyRate(jsonObject.get("theoryPowerAccuracyRate", String.class));
+    computeResult.setAnemometerTowerAccuracyRate(jsonObject.get("anemometerTowerAccuracyRate", String.class));
+    computeResult.setInstalledCapacityAccuracyRate(jsonObject.get("installedCapacityAccuracyRate", String.class));
+    computeResult.setAvailableCapacityAccuracyRate(jsonObject.get("availableCapacityAccuracyRate", String.class));
+    computeResult.setTime(jsonObject.get("time", Long.class));
+    return computeResult;
+  }
+}

+ 20 - 20
src/main/resources/application.yml

@@ -11,17 +11,17 @@
 #      url: jdbc:mysql://192.168.1.226:3306/ipfcst-v3?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&characterSetResults=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
 #      driver-class-name: com.mysql.cj.jdbc.Driver
 
-#server:
-#  port: 9089
-#spring:
-#  datasource:
-#    type: com.alibaba.druid.pool.DruidDataSource
-#    druid:
-#      # 数据源配置
-#      username: root
-#      password: '!QAZ2root'
-#      url: jdbc:mysql://localhost:3306/ipfcst-v3?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&characterSetResults=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
-#      driver-class-name: com.mysql.cj.jdbc.Driver
+server:
+  port: 9089
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      # 数据源配置
+      username: root
+      password: '!QAZ2root'
+      url: jdbc:mysql://localhost:3306/ipfcst-v3?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&characterSetResults=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+      driver-class-name: com.mysql.cj.jdbc.Driver
 
 #      金仓数据库
 #      username: SYSTEM
@@ -29,14 +29,14 @@
 #      url: jdbc:kingbase://192.168.1.204:54321/ipfcstV3
 #      driver-class-name: com.kingbase.Driver
 
-#logging:
-#  file:
-#    name: ./logs/calculate.log
-#
-#calculate:
-#  service:
-#    enabled: true
-#    version: 0.0.39
-#    dbType: mysql
+logging:
+  file:
+    name: ./logs/calculate.log
+
+calculate:
+  service:
+    enabled: true
+    version: 0.0.40
+    dbType: mysql
 
 version: @project.version@

BIN
src/main/resources/sql/t_calculation_formula.xlsx


+ 20 - 0
src/main/resources/sql/t_calculation_formula_highgo.sql

@@ -0,0 +1,20 @@
+CREATE TABLE T_CALCULATION_FORMULA (
+ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
+TYPE VARCHAR (50) NOT NULL,
+ORDER_NO INTEGER,
+FORMULA TEXT NOT NULL,
+PROVINCE VARCHAR (50) NOT NULL,
+ELECTRIC_TYPE VARCHAR (50) NOT NULL,
+STATION_CODE VARCHAR (50),
+RULE_FORMULA VARCHAR (50),
+IS_RATE VARCHAR (50) NOT NULL,
+MAX_MIN_LIMIT VARCHAR (50),
+STATE VARCHAR (50),
+DATA_SOURCE_TYPE VARCHAR (50),
+HOW_MANY_DAYS VARCHAR (50),
+CREATE_TIME TIMESTAMP(0),
+CREATOR VARCHAR (50),
+LAST_MODIFIER VARCHAR (50),
+LAST_MODIFY_TIME TIMESTAMP(0)
+)
+WITHOUT OIDS;

+ 20 - 21
src/main/resources/sql/t_calculation_formula_postgresql.sql

@@ -1,21 +1,20 @@
-DROP TABLE IF EXISTS T_CALCULATION_FORMULA;
-CREATE TABLE T_CALCULATION_FORMULA(
- "ID" INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
- "TYPE" VARCHAR (50) NOT NULL,
- "ORDER_NO" INTEGER ,
- "FORMULA" TEXT NOT NULL,
- "PROVINCE" VARCHAR (50) NOT NULL,
- "ELECTRIC_TYPE" VARCHAR (50) NOT NULL,
- "STATION_CODE" VARCHAR (50) ,
- "RULE_FORMULA" VARCHAR (50) ,
- "IS_RATE" VARCHAR (50) NOT NULL,
- "MAX_MIN_LIMIT" VARCHAR (50) ,
- "STATE" VARCHAR (50) ,
- "DATA_SOURCE_TYPE" VARCHAR (50) ,
- "HOW_MANY_DAYS" VARCHAR (50) ,
- "CREATE_TIME" TIMESTAMP(0),
- "CREATOR" VARCHAR (50),
- "LAST_MODIFIER" VARCHAR (50),
- "LAST_MODIFY_TIME" TIMESTAMP(0),
-  PRIMARY KEY ("ID") USING INDEX TABLESPACE "SYSTEM") WITHOUT OIDS
-TABLESPACE "SYSTEM";
+CREATE TABLE T_CALCULATION_FORMULA (
+ID INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
+TYPE VARCHAR (50) NOT NULL,
+ORDER_NO INTEGER,
+FORMULA TEXT NOT NULL,
+PROVINCE VARCHAR (50) NOT NULL,
+ELECTRIC_TYPE VARCHAR (50) NOT NULL,
+STATION_CODE VARCHAR (50),
+RULE_FORMULA VARCHAR (50),
+IS_RATE VARCHAR (50) NOT NULL,
+MAX_MIN_LIMIT VARCHAR (50),
+STATE VARCHAR (50),
+DATA_SOURCE_TYPE VARCHAR (50),
+HOW_MANY_DAYS VARCHAR (50),
+CREATE_TIME TIMESTAMP(0),
+CREATOR VARCHAR (50),
+LAST_MODIFIER VARCHAR (50),
+LAST_MODIFY_TIME TIMESTAMP(0)
+)
+WITHOUT OIDS;