Procházet zdrojové kódy

计算准确率通用方法

zhangchenglong před 2 roky
rodič
revize
38f7614689

+ 24 - 0
pom.xml

@@ -34,12 +34,36 @@
             <scope>compile</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+        </dependency>
+
+        <!--mysql 驱动-->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+        </dependency>
+
+        <!-- druid 连接池 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.1.20</version>
+        </dependency>
+
         <!-- java规则引擎(表达式解析器) -->
         <dependency>
             <groupId>com.googlecode.aviator</groupId>
             <artifactId>aviator</artifactId>
             <version>5.2.5</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-jdbc</artifactId>
+            <version>RELEASE</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 
     <build>

+ 1 - 1
src/main/java/com/syjy/calculation/CalculationApplication.java → src/main/java/com/syjy/calculate/CalculationApplication.java

@@ -1,4 +1,4 @@
-package com.syjy.calculation;
+package com.syjy.calculate;
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;

+ 35 - 0
src/main/java/com/syjy/calculate/conotroller/test.java

@@ -0,0 +1,35 @@
+package com.syjy.calculate.conotroller;
+
+import com.syjy.calculate.service.AccuarcyPassRateCalculateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import java.math.BigDecimal;
+import java.util.*;
+
+@RestController
+@RequestMapping("/test")
+public class test {
+    @Autowired
+    private AccuarcyPassRateCalculateService accuarcyPassRateCalculateService;
+    @RequestMapping (value = "/test")
+    public void saveElectricField() {
+
+        List<Map<String, Object>> powerData  = new ArrayList<>();
+        Random rd = new Random();
+        for (int i = 0; i < 4; i++) {
+            Map<String, Object> dataText = new HashMap<>();
+            dataText.put("sj", new BigDecimal(rd.nextInt(10)));
+            dataText.put("yc", new BigDecimal(rd.nextInt(10)));
+            powerData.add(dataText);
+        }
+
+        BigDecimal rl  = new BigDecimal("10");
+        String provinceEnum = "E62";
+        String type = "DQ";
+
+        accuarcyPassRateCalculateService.calculate(powerData,rl,provinceEnum,type);
+    }
+
+}

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

@@ -0,0 +1,59 @@
+package com.syjy.calculate.entity;
+
+import lombok.Data;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 计算公式
+ *
+ * @author zcl
+ * @version 1.0
+ * @since 2022/8/02 10:16
+ */
+@Data
+public class CalculationFormula {
+
+    /**
+     * 公式编号(运维标识,主键)
+     */
+    @Getter
+    @Setter
+    private Integer id;
+
+    /**
+     * 公式类型
+     */
+    @Getter
+    @Setter
+    private String type;
+
+    /**
+     * 公式执行顺序
+     */
+    @Getter
+    @Setter
+    private Integer order;
+
+    /**
+     * 公式内容
+     */
+    @Getter
+    @Setter
+    private String formula;
+
+    /**
+     * 上报省调
+     */
+    @Getter
+    @Setter
+    private String provinceEnum;
+
+    /**
+     * 状态
+     */
+    @Getter
+    @Setter
+    private String state;
+
+}

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

@@ -0,0 +1,44 @@
+package com.syjy.calculate.repository;
+
+import com.syjy.calculate.entity.CalculationFormula;
+import org.springframework.stereotype.Repository;
+import java.util.List;
+
+@Repository
+public interface CalculationFormulaRepository {
+
+    /**
+     * 保存公式数据
+     * @param calculationFormula 单条公式记录
+     */
+    void save(CalculationFormula calculationFormula);
+
+    /**
+     * 更新数据
+     * @param calculationFormula 公式记录
+     */
+    void update(CalculationFormula calculationFormula);
+
+    /**
+     * 查询数据
+     * @param province 省调
+     * @param type 类型
+     * @return 返回记录
+     */
+    List<CalculationFormula> findByTypeAndProvince(String province,String type );
+
+
+    /**
+     * 查询变量数据
+     * @return 返回记录
+     */
+    List<CalculationFormula> findVariate(String provinceEnum);
+
+
+    /**
+     * 查询全部数据
+     * @return 返回全部记录
+     */
+    List<CalculationFormula> findAll();
+
+}

+ 46 - 0
src/main/java/com/syjy/calculate/repository/repositoryImpl/CalculationFormulaRepositoryImpl.java

@@ -0,0 +1,46 @@
+package com.syjy.calculate.repository.repositoryImpl;
+
+import com.syjy.calculate.entity.CalculationFormula;
+import com.syjy.calculate.repository.CalculationFormulaRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jdbc.core.BeanPropertyRowMapper;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepository {
+
+    @Autowired
+    public JdbcTemplate jdbcTemplate;
+
+    @Override
+    public void save(CalculationFormula calculationFormula) {
+
+    }
+
+    @Override
+    public void update(CalculationFormula calculationFormula) {
+
+    }
+
+    @Override
+    public List<CalculationFormula> findByTypeAndProvince( String province, String type) {
+        String sql = "SELECT * from t_calculation_formula where C_PROVINCE_ENUM = ? and C_TYPE = ? ";
+        List<CalculationFormula> calculationFormulaList = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(CalculationFormula.class),province,type);
+        return calculationFormulaList;
+    }
+
+    @Override
+    public List<CalculationFormula> findVariate(String provinceEnum) {
+        String sql = "SELECT * from t_calculation_formula where C_TYPE in ('VariateA','VariateB','VariateC') and C_PROVINCE_ENUM = ?";
+        List<CalculationFormula> calculationFormulaList = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(CalculationFormula.class),provinceEnum);
+        return calculationFormulaList;
+    }
+
+    @Override
+    public List<CalculationFormula> findAll() {
+        return null;
+    }
+}

+ 27 - 25
src/main/java/com/syjy/calculation/calculate/service/AccuarcyPassRateCalculateService.java → src/main/java/com/syjy/calculate/service/AccuarcyPassRateCalculateService.java

@@ -1,7 +1,10 @@
-package com.syjy.calculation.calculate.service;
+package com.syjy.calculate.service;
 
 import com.googlecode.aviator.AviatorEvaluator;
+import com.syjy.calculate.entity.CalculationFormula;
+import com.syjy.calculate.repository.CalculationFormulaRepository;
 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;
@@ -20,6 +23,9 @@ import java.util.Map;
 public class AccuarcyPassRateCalculateService {
   BigDecimal ZERO = new BigDecimal("0");
 
+  @Autowired
+  private CalculationFormulaRepository calculationFormulaRepository;
+
   /**
    *
    * @param powerData 功率相关数据 Map中必要字段:sj(实际功率)、yc(预测功率)
@@ -30,19 +36,19 @@ public class AccuarcyPassRateCalculateService {
    */
   public String calculate( List<Map<String, Object>> powerData , BigDecimal rl ,String provinceEnum,String type){
     String result;
-    // 获取短期公式
-    List<Map<String, Object>> calculationFormulaList = getCalculationFormulaData(provinceEnum, type);
+    // 获取公式
+    List<CalculationFormula> calculationFormulaList = getCalculationFormulaData(provinceEnum, type);
     // 获取当前省调的公式变量值
-    Map<String, String> variateMap = getVariate(provinceEnum, type);
+    Map<String, String> variateMap = getVariate(provinceEnum);
     // 存放每步计算结果
     Map<String, Object> resultMap = new HashMap<>();
     // 公式
     String formula;
     // 循环公式,依次执行公式
-    for (Map<String, Object> calculationFormula : calculationFormulaList) {
+    for (CalculationFormula calculationFormula : calculationFormulaList) {
       BigDecimal formulaResult = ZERO;
       // 获取公式
-      formula = String.valueOf(calculationFormula.get("formula"));
+      formula = calculationFormula.getFormula();
       // 如果包含求和,则进行循环求和计算
       if (formula.contains("sum")) {
         // 获取sum后面的公式
@@ -58,9 +64,9 @@ public class AccuarcyPassRateCalculateService {
             formulaResult = formulaResult.add(new BigDecimal(String.valueOf(AviatorEvaluator.execute(formula, dataMap))));
           } catch (Exception e) {
             e.printStackTrace();
-            log.error("计算公式:" + formula + "错误");
+            log.error("计算公式:" + formula + "错误:" + e.toString());
           }
-          System.out.println("计算公式:" + formula + ";计算结果:" + formulaResult);
+          log.info("计算公式:" + formula + ";计算结果:" + formulaResult);
         }
         // 非求和计算
       }else{
@@ -74,7 +80,7 @@ public class AccuarcyPassRateCalculateService {
         }
       }
       // 记录本次公式的计算结果
-      resultMap.put("result" + calculationFormula.get("order"), formulaResult);
+      resultMap.put("result" + calculationFormula.getOrder(), formulaResult);
       System.out.println(formulaResult);
     }
     // 获取最后一个公式计算的结果
@@ -88,41 +94,37 @@ public class AccuarcyPassRateCalculateService {
    * @param type 类型(短期、超短期)
    * @return
    */
-  public List<Map<String, Object>> getCalculationFormulaData(String provinceEnum, String type) {
-    List<Map<String, Object>> calculationFormulaList = new ArrayList<>();
+  public List<CalculationFormula> getCalculationFormulaData(String provinceEnum, String type) {
+    List<CalculationFormula> calculationFormulaList = new ArrayList<>();
     // 根据当前省调和类型(短期、超短期)从数据库中查出公式列表
-    // todo 获取数据库连接,查询数据
-    // calculationFormulaList = ;
-    // 循环组建公式Map
+     calculationFormulaList = calculationFormulaRepository.findByTypeAndProvince(provinceEnum,type);
     return calculationFormulaList;
   }
 
   /**
    * 获取当前省调的公式变量值
    * @param provinceEnum 当前省调
-   * @param type 类型(短期、超短期)
    * @return
    */
-  public Map<String, String> getVariate(String provinceEnum, String type) {
-    List<Map<String, String>> variateList = new ArrayList<>();
+  public Map<String, String> getVariate(String provinceEnum) {
+    List<CalculationFormula> variateList = new ArrayList<>();
     Map<String, String> variateMap = new HashMap<>();
-    // 根据当前省调和类型(短期、超短期)从数据库中查出公式列表
-    // todo 从数据库中查出数据
-    // variateMap = calculationFormulaRepository.findByProvinceEnumAndType(provinceEnum, type);
+    // 从数据库中查出变量数据
+    variateList = calculationFormulaRepository.findVariate(provinceEnum);
     // 循环组建变量Map
     String formulaType = "";
-    for (Map<String, String> map : variateList) {
-      formulaType = map.get("type");
+    for (CalculationFormula calculationFormula: variateList) {
+      formulaType = calculationFormula.getType();
       // 循环获取3个变量的值
       switch (formulaType) {
         case "VariateA":
-          variateMap.put("VariateA", map.get("formula"));
+          variateMap.put("VariateA", calculationFormula.getFormula());
           break;
         case "VariateB":
-          variateMap.put("VariateB", map.get("formula"));
+          variateMap.put("VariateB", calculationFormula.getFormula());
           break;
         case "VariateC":
-          variateMap.put("VariateC", map.get("formula"));
+          variateMap.put("VariateC", calculationFormula.getFormula());
           break;
         default:
           break;

+ 9 - 0
src/main/resources/application.yml

@@ -1,2 +1,11 @@
 server:
   port: 9088
+spring:
+  datasource:
+    type: com.alibaba.druid.pool.DruidDataSource
+    druid:
+      # 数据源配置
+      username: root
+      password: '123456'
+      url: jdbc:mysql://localhost:3306/ipfcst-v3?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8&autoReconnect=true&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai
+      driver-class-name: com.mysql.cj.jdbc.Driver

+ 1 - 1
src/test/java/com/syjy/calculation/CalculationApplicationTests.java → src/test/java/com/syjy/calculate/CalculationApplicationTests.java

@@ -1,4 +1,4 @@
-package com.syjy.calculation;
+package com.syjy.calculate;
 
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;