|
@@ -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;
|