|
@@ -1,12 +1,12 @@
|
|
package com.syjy.calculate.service;
|
|
package com.syjy.calculate.service;
|
|
|
|
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
import com.googlecode.aviator.AviatorEvaluator;
|
|
import com.googlecode.aviator.AviatorEvaluator;
|
|
import com.syjy.calculate.entity.CalculationFormula;
|
|
import com.syjy.calculate.entity.CalculationFormula;
|
|
import com.syjy.calculate.repository.CalculationFormulaRepository;
|
|
import com.syjy.calculate.repository.CalculationFormulaRepository;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
-
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
import java.util.ArrayList;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.HashMap;
|
|
@@ -22,8 +22,9 @@ import java.util.Map;
|
|
*/
|
|
*/
|
|
@Service
|
|
@Service
|
|
@Slf4j
|
|
@Slf4j
|
|
-public class AccuarcyPassRateCalculateService {
|
|
|
|
|
|
+public class AccuracyPassRateCalculateService {
|
|
BigDecimal ZERO = new BigDecimal("0");
|
|
BigDecimal ZERO = new BigDecimal("0");
|
|
|
|
+ BigDecimal HUNDRED = new BigDecimal("100");
|
|
|
|
|
|
@Autowired
|
|
@Autowired
|
|
private CalculationFormulaRepository calculationFormulaRepository;
|
|
private CalculationFormulaRepository calculationFormulaRepository;
|
|
@@ -33,12 +34,18 @@ public class AccuarcyPassRateCalculateService {
|
|
* @param rl 容量
|
|
* @param rl 容量
|
|
* @param provinceEnum 省调
|
|
* @param provinceEnum 省调
|
|
* @param type 短期、超短期
|
|
* @param type 短期、超短期
|
|
- * @return
|
|
|
|
|
|
+ * @return 返回Json result:fail/success value: 99% msg:失败及原因
|
|
*/
|
|
*/
|
|
- public String calculate(List<Map<String, Object>> powerData, BigDecimal rl, String provinceEnum, String type) {
|
|
|
|
- String result;
|
|
|
|
|
|
+ public JSONObject calculate(List<Map<String, Object>> powerData, BigDecimal rl, String provinceEnum, String type) {
|
|
|
|
+ JSONObject jsonResult = new JSONObject();
|
|
|
|
+ String lastResult = "";
|
|
|
|
+ jsonResult.put("result","fail");
|
|
// 获取公式
|
|
// 获取公式
|
|
- List<CalculationFormula> calculationFormulaList = getCalculationFormulaData(provinceEnum, type);
|
|
|
|
|
|
+ List<CalculationFormula> calculationFormulaList = getCalculationFormulaData(type);
|
|
|
|
+ if (calculationFormulaList == null || calculationFormulaList.size() == 0) {
|
|
|
|
+ jsonResult.put("msg","计算失败,未匹配到公式");
|
|
|
|
+ }
|
|
|
|
+ BigDecimal count = BigDecimal.valueOf(calculationFormulaList.size());
|
|
// 获取当前省调的公式变量值
|
|
// 获取当前省调的公式变量值
|
|
Map<String, String> variateMap = getVariate(provinceEnum);
|
|
Map<String, String> variateMap = getVariate(provinceEnum);
|
|
// 存放每步计算结果
|
|
// 存放每步计算结果
|
|
@@ -60,12 +67,15 @@ public class AccuarcyPassRateCalculateService {
|
|
// 将执行过的公式结果放入dataMap
|
|
// 将执行过的公式结果放入dataMap
|
|
dataMap.putAll(resultMap);
|
|
dataMap.putAll(resultMap);
|
|
dataMap.put("rl", rl);
|
|
dataMap.put("rl", rl);
|
|
|
|
+ dataMap.put("count", count);
|
|
try {
|
|
try {
|
|
// 求和计算 AviatorEvaluator.execute(公式,公式中的参数及值(以Map形式存放))
|
|
// 求和计算 AviatorEvaluator.execute(公式,公式中的参数及值(以Map形式存放))
|
|
formulaResult = formulaResult.add(new BigDecimal(String.valueOf(AviatorEvaluator.execute(formula, dataMap))));
|
|
formulaResult = formulaResult.add(new BigDecimal(String.valueOf(AviatorEvaluator.execute(formula, dataMap))));
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
e.printStackTrace();
|
|
log.error("计算公式:" + formula + "错误:" + e.toString());
|
|
log.error("计算公式:" + formula + "错误:" + e.toString());
|
|
|
|
+ jsonResult.put("msg", "计算失败" + "错误:" + e.toString());
|
|
|
|
+ return jsonResult;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// 非求和计算
|
|
// 非求和计算
|
|
@@ -76,12 +86,16 @@ public class AccuarcyPassRateCalculateService {
|
|
Map<String, Object> dataMap = powerData.get(0);
|
|
Map<String, Object> dataMap = powerData.get(0);
|
|
// 将执行过的公式结果放入dataMap
|
|
// 将执行过的公式结果放入dataMap
|
|
dataMap.putAll(resultMap);
|
|
dataMap.putAll(resultMap);
|
|
|
|
+ dataMap.put("rl", rl);
|
|
|
|
+ dataMap.put("count", count);
|
|
try {
|
|
try {
|
|
// 根据公式进行计算
|
|
// 根据公式进行计算
|
|
formulaResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute(formula, dataMap)));
|
|
formulaResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute(formula, dataMap)));
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
- e.printStackTrace();
|
|
|
|
log.error("计算公式:" + formula + "错误:" + e.toString());
|
|
log.error("计算公式:" + formula + "错误:" + e.toString());
|
|
|
|
+ e.printStackTrace();
|
|
|
|
+ jsonResult.put("msg", "计算失败" + "错误:" + e.toString());
|
|
|
|
+ return jsonResult;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -90,24 +104,28 @@ public class AccuarcyPassRateCalculateService {
|
|
log.info("result" + calculationFormula.getOrder() + ":" + formulaResult);
|
|
log.info("result" + calculationFormula.getOrder() + ":" + formulaResult);
|
|
}
|
|
}
|
|
// 获取最后一个公式计算的结果
|
|
// 获取最后一个公式计算的结果
|
|
- result = String.valueOf(resultMap.get("result" + calculationFormulaList.size()));
|
|
|
|
- BigDecimal bResult = new BigDecimal(result);
|
|
|
|
|
|
+ lastResult = String.valueOf(resultMap.get("result" + calculationFormulaList.size()));
|
|
|
|
+ BigDecimal bResult = new BigDecimal(lastResult);
|
|
bResult = bResult.setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
bResult = bResult.setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
- result = bResult + "%";
|
|
|
|
- return result;
|
|
|
|
|
|
+ // 过滤准确率
|
|
|
|
+ bResult = filterResult(bResult);
|
|
|
|
+ lastResult = bResult + "%";
|
|
|
|
+ jsonResult.put("result","success");
|
|
|
|
+ jsonResult.put("value",lastResult);
|
|
|
|
+ log.info("准确率:" + lastResult );
|
|
|
|
+ return jsonResult;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
* 获取当前省调的公式列表
|
|
* 获取当前省调的公式列表
|
|
*
|
|
*
|
|
- * @param provinceEnum 当前省调
|
|
|
|
- * @param type 类型(短期、超短期)
|
|
|
|
|
|
+ * @param type 类型
|
|
* @return
|
|
* @return
|
|
*/
|
|
*/
|
|
- public List<CalculationFormula> getCalculationFormulaData(String provinceEnum, String type) {
|
|
|
|
|
|
+ public List<CalculationFormula> getCalculationFormulaData(String type) {
|
|
List<CalculationFormula> calculationFormulaList = new ArrayList<>();
|
|
List<CalculationFormula> calculationFormulaList = new ArrayList<>();
|
|
- // 根据当前省调和类型(短期、超短期)从数据库中查出公式列表
|
|
|
|
- calculationFormulaList = calculationFormulaRepository.findByTypeAndProvince(provinceEnum, type);
|
|
|
|
|
|
+ // 根据类型从数据库中查出公式列表
|
|
|
|
+ calculationFormulaList = calculationFormulaRepository.findByTypeAndProvince(type);
|
|
return calculationFormulaList;
|
|
return calculationFormulaList;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -137,6 +155,9 @@ public class AccuarcyPassRateCalculateService {
|
|
case "VariateC":
|
|
case "VariateC":
|
|
variateMap.put("VariateC", calculationFormula.getFormula());
|
|
variateMap.put("VariateC", calculationFormula.getFormula());
|
|
break;
|
|
break;
|
|
|
|
+ case "VariateD":
|
|
|
|
+ variateMap.put("VariateD", calculationFormula.getFormula());
|
|
|
|
+ break;
|
|
default:
|
|
default:
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
@@ -155,16 +176,39 @@ public class AccuarcyPassRateCalculateService {
|
|
String variateA = variateMap.get("VariateA");
|
|
String variateA = variateMap.get("VariateA");
|
|
String variateB = variateMap.get("VariateB");
|
|
String variateB = variateMap.get("VariateB");
|
|
String variateC = variateMap.get("VariateC");
|
|
String variateC = variateMap.get("VariateC");
|
|
- if (variateA != null) {
|
|
|
|
|
|
+ String variateD = variateMap.get("variateD");
|
|
|
|
+ if (variateA != null && !"".equals(variateA)) {
|
|
formula = formula.replace("VariateA", variateA);
|
|
formula = formula.replace("VariateA", variateA);
|
|
}
|
|
}
|
|
- if (variateB != null) {
|
|
|
|
|
|
+ if (variateB != null && !"".equals(variateB)) {
|
|
formula = formula.replace("VariateB", variateB);
|
|
formula = formula.replace("VariateB", variateB);
|
|
}
|
|
}
|
|
- if (variateC != null) {
|
|
|
|
|
|
+ if (variateC != null && !"".equals(variateC)) {
|
|
formula = formula.replace("VariateC", variateC);
|
|
formula = formula.replace("VariateC", variateC);
|
|
}
|
|
}
|
|
|
|
+ if (variateD != null && !"".equals(variateD)) {
|
|
|
|
+ formula = formula.replace("variateD", variateD);
|
|
|
|
+ }
|
|
return formula;
|
|
return formula;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 过滤结果 <0=0 >100=100
|
|
|
|
+ * @param result 过滤前的结果
|
|
|
|
+ * @return 过滤后的结果
|
|
|
|
+ */
|
|
|
|
+ private BigDecimal filterResult(BigDecimal result){
|
|
|
|
+ //当结果为负数时,说明偏差过大,准确率为0
|
|
|
|
+ if(result.compareTo(BigDecimal.ZERO)==-1 || result.compareTo(BigDecimal.ZERO)==0){
|
|
|
|
+ result = BigDecimal.ZERO;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(result.compareTo(this.HUNDRED)==1){
|
|
|
|
+ result = this.HUNDRED;
|
|
|
|
+ }
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
+
|