|
@@ -3,12 +3,13 @@ package com.syjy.calculate.service;
|
|
|
import com.googlecode.aviator.AviatorEvaluator;
|
|
|
import com.googlecode.aviator.Expression;
|
|
|
import com.syjy.calculate.entity.CalculateResult;
|
|
|
+import com.syjy.calculate.entity.CalculationFormula;
|
|
|
import com.syjy.calculate.entity.CalculationInfo;
|
|
|
import com.syjy.calculate.entity.CalculateRequest;
|
|
|
+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.io.File;
|
|
|
-import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
@@ -26,6 +27,9 @@ import java.util.Map;
|
|
|
@Slf4j
|
|
|
public class AccuracyPassRateCalculateService {
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private CalculationFormulaRepository calculationFormulaRepository;
|
|
|
+
|
|
|
/**
|
|
|
* 计算准确率、合格率
|
|
|
*
|
|
@@ -41,25 +45,18 @@ public class AccuracyPassRateCalculateService {
|
|
|
}
|
|
|
// 获取细则校验过的数据
|
|
|
List<Map<String, Object>> checkedData = (List<Map<String, Object>>) checkedDataResult.get(CalculateResult.DATA_TAG);
|
|
|
- // 获取jar包所在路径
|
|
|
- String classPath = System.getProperty(CalculateResult.USER_DIR);
|
|
|
- // 获取文件路径
|
|
|
- String fileUrl = classPath + CalculateResult.SLASH + CalculateResult.EXAMPLES + CalculateResult.SLASH + calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.FORMULA + CalculateResult.AV;
|
|
|
- // 初始化公式并缓存公式
|
|
|
-
|
|
|
- File file = new File(fileUrl);
|
|
|
- // 判断公式文件是否存在
|
|
|
- if (!file.exists()) {
|
|
|
- // 未匹配到公式文件
|
|
|
- return CalculateResult.error(CalculateResult.MSG_NO_FORMULA + fileUrl);
|
|
|
- }
|
|
|
- Expression exp = null;
|
|
|
- // 初始化公式文件
|
|
|
- try {
|
|
|
- exp = AviatorEvaluator.getInstance().compileScript(fileUrl, true);
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
+ // 根据类型从数据库中查出公式列表
|
|
|
+ CalculationFormula calculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.FORMULA, calculateRequest.getFormulaType(), calculateRequest.getProvince(), calculateRequest.getElectricType());
|
|
|
+ if (calculationFormula == null || calculationFormula.getFormula() == null) {
|
|
|
+ // 未匹配到公式
|
|
|
+ return CalculateResult.error(CalculateResult.MSG_NO_FORMULA);
|
|
|
}
|
|
|
+ // 获取公式
|
|
|
+ String formula = calculationFormula.getFormula();
|
|
|
+ //缓存公式名称
|
|
|
+ String scriptName = calculateRequest.getProvince() + calculateRequest.getFormulaType() + calculateRequest.getElectricType() + CalculateResult.FORMULA;
|
|
|
+ // 初始化公式并缓存公式
|
|
|
+ Expression expression = AviatorEvaluator.getInstance().compile(formula);
|
|
|
// 上下文
|
|
|
Map<String, Object> env = new HashMap<>();
|
|
|
// 将需要计算的list数据放入上下文
|
|
@@ -68,9 +65,14 @@ public class AccuracyPassRateCalculateService {
|
|
|
// 执行计算并得出结果
|
|
|
try {
|
|
|
// 获取计算结果
|
|
|
- BigDecimal executeResult = new BigDecimal(String.valueOf(exp.execute(env)));
|
|
|
+ Map<String, Object> executeResult = (Map<String, Object>) expression.execute(env);
|
|
|
+ // 如果计算失败,返回失败内容
|
|
|
+ if (String.valueOf(executeResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.ERROR)) {
|
|
|
+ String resultValue = String.valueOf(executeResult.get(CalculateResult.MSG_TAG));
|
|
|
+ return CalculateResult.error(String.valueOf(executeResult.get(CalculateResult.MSG_TAG)), resultValue);
|
|
|
+ }
|
|
|
// 过滤计算结果
|
|
|
- String result = filterResult(executeResult);
|
|
|
+ String result = filterResult(executeResult.get(CalculateResult.DATA_TAG));
|
|
|
return CalculateResult.success(CalculateResult.MSG_CALCULATE_SUCCESS, result);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
@@ -84,21 +86,22 @@ public class AccuracyPassRateCalculateService {
|
|
|
* @param result 过滤前的结果
|
|
|
* @return 过滤后的结果
|
|
|
*/
|
|
|
- private String filterResult(BigDecimal result) {
|
|
|
+ private String filterResult(Object result) {
|
|
|
+ BigDecimal resultBig = (BigDecimal) result;
|
|
|
//当结果为负数时,说明偏差过大,准确率为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
|
|
|
- if (result.compareTo(BigDecimal.ONE) == 1) {
|
|
|
- result = BigDecimal.ONE;
|
|
|
+ if (resultBig.compareTo(BigDecimal.ONE) == 1) {
|
|
|
+ resultBig = BigDecimal.ONE;
|
|
|
}
|
|
|
// 对数据*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;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -133,43 +136,36 @@ public class AccuracyPassRateCalculateService {
|
|
|
if (calculationInfoList == null || calculationInfoList.size() == 0) {
|
|
|
return CalculateResult.error(CalculateResult.MSG_CALCULATE_DATA_NULL);
|
|
|
}
|
|
|
- // 获取jar包所在路径
|
|
|
- String classPath = System.getProperty(CalculateResult.USER_DIR);
|
|
|
- // 获取文件路径
|
|
|
- String fileUrl = classPath + CalculateResult.SLASH + CalculateResult.EXAMPLES + CalculateResult.SLASH + calculateRequest.getProvince() + CalculateResult.UNDERLINE + calculateRequest.getFormulaType() + CalculateResult.UNDERLINE + calculateRequest.getElectricType() + CalculateResult.UNDERLINE + CalculateResult.RULES + CalculateResult.AV;
|
|
|
- // 获取文件
|
|
|
- File file = new File(fileUrl);
|
|
|
+ // 循环判断实际功率/预测功率是否为空
|
|
|
+ for (CalculationInfo calculationInfo : calculationInfoList) {
|
|
|
+ if (calculationInfo.getYc() == null || calculationInfo.getSj() == null) {
|
|
|
+ return CalculateResult.error(CalculateResult.MSG_CALCULATE_DATA_NULL);
|
|
|
+ }
|
|
|
+ }
|
|
|
// 将数据转为List Map 格式
|
|
|
List<Map<String, Object>> calculationInfoListMap = getCalculationInfoList(calculationInfoList);
|
|
|
- // 判断公式文件是否存在
|
|
|
- if (!file.exists()) {
|
|
|
+ // 获取细则公式
|
|
|
+ CalculationFormula rulesCalculationFormula = calculationFormulaRepository.findByTypeAndProvince(CalculateResult.RULES, formulaType, province, electricType);
|
|
|
+ if (rulesCalculationFormula == null || rulesCalculationFormula.getFormula() == null) {
|
|
|
// 未匹配到细则文件,则不进行细则校验,返回数据
|
|
|
return CalculateResult.success(calculationInfoListMap);
|
|
|
}
|
|
|
+ // 初始化公式并缓存公式
|
|
|
+ Expression expression = AviatorEvaluator.getInstance().compile(rulesCalculationFormula.getFormula());
|
|
|
+ // 通过校验的数据
|
|
|
List<Map<String, Object>> passList = new ArrayList<>();
|
|
|
- // 初始化细则校验文件
|
|
|
- Expression exp = null;
|
|
|
- try {
|
|
|
- exp = AviatorEvaluator.getInstance().compileScript(fileUrl, true);
|
|
|
- } catch (IOException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
// 循环数据,对数据进行校验
|
|
|
for (Map<String, Object> calculationMap : calculationInfoListMap) {
|
|
|
// 循环公式,对每条功率信息进行细则处理
|
|
|
try {
|
|
|
- Map<String,Object> checkResult = (HashMap<String, Object>) exp.execute(calculationMap);
|
|
|
- switch (String.valueOf(checkResult.get(CalculateResult.CODE_TAG))){
|
|
|
- case CalculateResult.IGNORE :
|
|
|
- break;
|
|
|
- case CalculateResult.ERROR :
|
|
|
- String resultValue = String.valueOf(checkResult.get(CalculateResult.MSG_TAG));
|
|
|
- return CalculateResult.error(CalculateResult.MSG_DATA_CHECK_ERROR,resultValue);
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- if (String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.Type.SUCCESS.value())) {
|
|
|
- break;
|
|
|
+ Map<String, Object> checkResult = (HashMap<String, Object>) expression.execute(calculationMap);
|
|
|
+ // 如果返回结果是忽略,则结束本次循环
|
|
|
+ if (String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.IGNORE)) {
|
|
|
+ continue;
|
|
|
+ // 如果返回错误,直接返回结果
|
|
|
+ } else if (String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.ERROR)) {
|
|
|
+ String resultValue = String.valueOf(checkResult.get(CalculateResult.MSG_TAG));
|
|
|
+ return CalculateResult.error(CalculateResult.MSG_DATA_CHECK_ERROR, resultValue);
|
|
|
}
|
|
|
// 校验成功,将通过的数据放入passList
|
|
|
passList.add(calculationMap);
|
|
@@ -205,6 +201,5 @@ public class AccuracyPassRateCalculateService {
|
|
|
}
|
|
|
return resultList;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|