|
@@ -1,7 +1,6 @@
|
|
package com.syjy.calculate.service;
|
|
package com.syjy.calculate.service;
|
|
|
|
|
|
import com.googlecode.aviator.AviatorEvaluator;
|
|
import com.googlecode.aviator.AviatorEvaluator;
|
|
-import com.googlecode.aviator.Expression;
|
|
|
|
import com.syjy.calculate.entity.CalculateResult;
|
|
import com.syjy.calculate.entity.CalculateResult;
|
|
import com.syjy.calculate.entity.CalculationFormula;
|
|
import com.syjy.calculate.entity.CalculationFormula;
|
|
import com.syjy.calculate.entity.CalculationInfo;
|
|
import com.syjy.calculate.entity.CalculationInfo;
|
|
@@ -9,8 +8,8 @@ import com.syjy.calculate.entity.CalculateRequest;
|
|
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.cglib.beans.BeanMap;
|
|
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;
|
|
@@ -46,6 +45,10 @@ public class AccuracyPassRateCalculateService {
|
|
}
|
|
}
|
|
// 获取细则校验过的数据
|
|
// 获取细则校验过的数据
|
|
List<Map<String, Object>> checkedData = (List<Map<String, Object>>) checkedDataResult.get(CalculateResult.DATA_TAG);
|
|
List<Map<String, Object>> checkedData = (List<Map<String, Object>>) checkedDataResult.get(CalculateResult.DATA_TAG);
|
|
|
|
+ if (checkedData == null || checkedData.size() == 0) {
|
|
|
|
+ return CalculateResult.error(CalculateResult.MSG_USEFUL_CALCULATE_DATA_NULL);
|
|
|
|
+ }
|
|
|
|
+
|
|
// 根据类型从数据库中查出公式列表
|
|
// 根据类型从数据库中查出公式列表
|
|
CalculationFormula calculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.FORMULA, calculateRequest.getFormulaType(), calculateRequest.getProvince(), calculateRequest.getElectricType());
|
|
CalculationFormula calculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.FORMULA, calculateRequest.getFormulaType(), calculateRequest.getProvince(), calculateRequest.getElectricType());
|
|
if (calculationFormula == null || calculationFormula.getFormula() == null) {
|
|
if (calculationFormula == null || calculationFormula.getFormula() == null) {
|
|
@@ -57,18 +60,26 @@ public class AccuracyPassRateCalculateService {
|
|
//缓存公式名称
|
|
//缓存公式名称
|
|
String scriptName = calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.FORMULA;
|
|
String scriptName = calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.FORMULA;
|
|
// 初始化公式并缓存公式
|
|
// 初始化公式并缓存公式
|
|
- if (AviatorEvaluator.getCachedExpression(scriptName) == null) {
|
|
|
|
|
|
+ if (AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName) == null) {
|
|
AviatorEvaluator.getInstance().compile(scriptName, formula, true);
|
|
AviatorEvaluator.getInstance().compile(scriptName, formula, true);
|
|
}
|
|
}
|
|
// 上下文
|
|
// 上下文
|
|
Map<String, Object> env = new HashMap<>();
|
|
Map<String, Object> env = new HashMap<>();
|
|
// 将需要计算的list数据放入上下文
|
|
// 将需要计算的list数据放入上下文
|
|
env.put(CalculateResult.LIST, checkedData);
|
|
env.put(CalculateResult.LIST, checkedData);
|
|
- env.put(CalculateResult.RL, calculateRequest.getCap());
|
|
|
|
|
|
+ env.put(CalculateResult.CAPACITY, calculateRequest.getElectricCapacity());
|
|
|
|
+ env.put(CalculateResult.SIGN, calculateRequest.getSign());
|
|
|
|
+
|
|
|
|
+ Map<String, Object> calculateRequestMap = new HashMap<>();
|
|
|
|
+ BeanMap beanMap = BeanMap.create(calculateRequest);
|
|
|
|
+ for (Object key : calculateRequestMap.keySet()) {
|
|
|
|
+ calculateRequestMap.put(String.valueOf(key), beanMap.get(key));
|
|
|
|
+ }
|
|
|
|
+
|
|
// 执行计算并得出结果
|
|
// 执行计算并得出结果
|
|
try {
|
|
try {
|
|
// 获取计算结果
|
|
// 获取计算结果
|
|
- BigDecimal executeResult = (BigDecimal) AviatorEvaluator.getCachedExpression(scriptName).execute(env);
|
|
|
|
|
|
+ Object executeResult = AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName).execute(env);
|
|
// 过滤计算结果
|
|
// 过滤计算结果
|
|
String result = filterResult(executeResult);
|
|
String result = filterResult(executeResult);
|
|
return CalculateResult.success(CalculateResult.MSG_CALCULATE_SUCCESS, result);
|
|
return CalculateResult.success(CalculateResult.MSG_CALCULATE_SUCCESS, result);
|
|
@@ -84,21 +95,22 @@ public class AccuracyPassRateCalculateService {
|
|
* @param result 过滤前的结果
|
|
* @param result 过滤前的结果
|
|
* @return 过滤后的结果
|
|
* @return 过滤后的结果
|
|
*/
|
|
*/
|
|
- private String filterResult(BigDecimal result) {
|
|
|
|
|
|
+ private String filterResult(Object result) {
|
|
|
|
+ BigDecimal resultBig = new BigDecimal(String.valueOf(result));
|
|
//当结果为负数时,说明偏差过大,准确率为0
|
|
//当结果为负数时,说明偏差过大,准确率为0
|
|
- if (result.compareTo(BigDecimal.ZERO) == -1 || result.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
|
- result = BigDecimal.ZERO;
|
|
|
|
|
|
+ if (resultBig.compareTo(BigDecimal.ZERO) == -1 || resultBig.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
|
+ resultBig = BigDecimal.ZERO;
|
|
}
|
|
}
|
|
// 如果结果大于1,则准确率设为100
|
|
// 如果结果大于1,则准确率设为100
|
|
- if (result.compareTo(BigDecimal.ONE) == 1) {
|
|
|
|
- result = BigDecimal.ONE;
|
|
|
|
|
|
+ if (resultBig.compareTo(BigDecimal.ONE) == 1) {
|
|
|
|
+ resultBig = BigDecimal.ONE;
|
|
}
|
|
}
|
|
// 对数据*100
|
|
// 对数据*100
|
|
- result = result.multiply(new BigDecimal(CalculateResult.ONE_HUNDRED));
|
|
|
|
|
|
+ resultBig = resultBig.multiply(new BigDecimal(CalculateResult.ONE_HUNDRED));
|
|
// 对数据进行四舍五入
|
|
// 对数据进行四舍五入
|
|
- result = result.setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
|
|
|
+ resultBig = resultBig.setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
// 数据加上百分号
|
|
// 数据加上百分号
|
|
- return result + CalculateResult.PERCENT;
|
|
|
|
|
|
+ return resultBig + CalculateResult.PERCENT;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -135,15 +147,15 @@ public class AccuracyPassRateCalculateService {
|
|
}
|
|
}
|
|
// 循环判断实际功率/预测功率是否为空
|
|
// 循环判断实际功率/预测功率是否为空
|
|
for (CalculationInfo calculationInfo : calculationInfoList) {
|
|
for (CalculationInfo calculationInfo : calculationInfoList) {
|
|
- if (calculationInfo.getYc() == null || calculationInfo.getSj() == null) {
|
|
|
|
|
|
+ if (calculationInfo.getAbleValue() == null || calculationInfo.getForecastAbleValue() == null || calculationInfo.getRealValue() == null) {
|
|
return CalculateResult.error(CalculateResult.MSG_CALCULATE_DATA_NULL);
|
|
return CalculateResult.error(CalculateResult.MSG_CALCULATE_DATA_NULL);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// 如果固定功率为空
|
|
// 如果固定功率为空
|
|
- if (calculateRequest.getCap() == null) {
|
|
|
|
|
|
+ if (calculateRequest.getElectricCapacity() == null) {
|
|
// 循环判断实时功率是否为空
|
|
// 循环判断实时功率是否为空
|
|
for (CalculationInfo calculationInfo : calculationInfoList) {
|
|
for (CalculationInfo calculationInfo : calculationInfoList) {
|
|
- if (calculationInfo.getRl() == null) {
|
|
|
|
|
|
+ if (calculationInfo.getOpenCapacity() == null) {
|
|
return CalculateResult.error(CalculateResult.MSG_CAP_NULL);
|
|
return CalculateResult.error(CalculateResult.MSG_CAP_NULL);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -159,7 +171,7 @@ public class AccuracyPassRateCalculateService {
|
|
// 脚本名称
|
|
// 脚本名称
|
|
String scriptName = calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.RULES;
|
|
String scriptName = calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.RULES;
|
|
// 初始化公式并缓存公式
|
|
// 初始化公式并缓存公式
|
|
- if (AviatorEvaluator.getCachedExpression(scriptName) == null) {
|
|
|
|
|
|
+ if (AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName) == null) {
|
|
AviatorEvaluator.getInstance().compile(scriptName, rulesCalculationFormula.getFormula(), true);
|
|
AviatorEvaluator.getInstance().compile(scriptName, rulesCalculationFormula.getFormula(), true);
|
|
}
|
|
}
|
|
// 通过校验的数据
|
|
// 通过校验的数据
|
|
@@ -168,7 +180,7 @@ public class AccuracyPassRateCalculateService {
|
|
for (Map<String, Object> calculationMap : calculationInfoListMap) {
|
|
for (Map<String, Object> calculationMap : calculationInfoListMap) {
|
|
// 循环公式,对每条功率信息进行细则处理
|
|
// 循环公式,对每条功率信息进行细则处理
|
|
try {
|
|
try {
|
|
- Map<String, Object> checkResult = (HashMap<String, Object>) AviatorEvaluator.getCachedExpression(scriptName).execute(calculationMap);
|
|
|
|
|
|
+ Map<String, Object> checkResult = (HashMap<String, Object>) AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName).execute(calculationMap);
|
|
// 如果返回结果是忽略,则结束本次循环
|
|
// 如果返回结果是忽略,则结束本次循环
|
|
if (String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.IGNORE)) {
|
|
if (String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.IGNORE)) {
|
|
continue;
|
|
continue;
|
|
@@ -196,17 +208,14 @@ public class AccuracyPassRateCalculateService {
|
|
*/
|
|
*/
|
|
private List<Map<String, Object>> getCalculationInfoList(List<CalculationInfo> calculationInfoList) {
|
|
private List<Map<String, Object>> getCalculationInfoList(List<CalculationInfo> calculationInfoList) {
|
|
List<Map<String, Object>> resultList = new ArrayList<>();
|
|
List<Map<String, Object>> resultList = new ArrayList<>();
|
|
|
|
+ // 循环每条数据
|
|
for (CalculationInfo calculationInfo : calculationInfoList) {
|
|
for (CalculationInfo calculationInfo : calculationInfoList) {
|
|
|
|
+ // 将bean BeanMap
|
|
|
|
+ BeanMap beanMap = BeanMap.create(calculationInfo);
|
|
Map<String, Object> map = new HashMap<>();
|
|
Map<String, Object> map = new HashMap<>();
|
|
- map.put(CalculateResult.SJ, calculationInfo.getSj());
|
|
|
|
- map.put(CalculateResult.YC, calculationInfo.getYc());
|
|
|
|
- // 如果容量不为空,放入容量字段
|
|
|
|
- if (calculationInfo.getRl() != null) {
|
|
|
|
- map.put(CalculateResult.RL, calculationInfo.getRl());
|
|
|
|
- }
|
|
|
|
- // 如果时间不为空,放入时间字段
|
|
|
|
- if (calculationInfo.getTime() != 0) {
|
|
|
|
- map.put(CalculateResult.TIME, calculationInfo.getTime());
|
|
|
|
|
|
+ // 将beanMap转为Map
|
|
|
|
+ for (Object key : beanMap.keySet()) {
|
|
|
|
+ map.put(String.valueOf(key), beanMap.get(key));
|
|
}
|
|
}
|
|
resultList.add(map);
|
|
resultList.add(map);
|
|
}
|
|
}
|