Browse Source

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

jyyw 11 tháng trước cách đây
mục cha
commit
1495771e96
37 tập tin đã thay đổi với 1113 bổ sung93 xóa
  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;