|
@@ -7,6 +7,7 @@ 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;
|
|
|
import java.util.HashMap;
|
|
@@ -25,6 +26,7 @@ import java.util.Map;
|
|
|
public class AccuracyPassRateCalculateService {
|
|
|
BigDecimal ZERO = new BigDecimal("0");
|
|
|
BigDecimal HUNDRED = new BigDecimal("100");
|
|
|
+ String PASS = "PASS";
|
|
|
@Autowired
|
|
|
private CalculationFormulaRepository calculationFormulaRepository;
|
|
|
|
|
@@ -33,14 +35,14 @@ public class AccuracyPassRateCalculateService {
|
|
|
* @param rl 容量
|
|
|
* @param provinceEnum 省调
|
|
|
* @param type 短期、超短期
|
|
|
+ * @param compare 通过率对比系数
|
|
|
* @return 返回Json result:fail/success value: 99% msg:失败及原因
|
|
|
*/
|
|
|
- public JSONObject calculate(List<Map<String, Object>> powerData, BigDecimal rl, String provinceEnum, String type) {
|
|
|
+ public JSONObject calculate(List<Map<String, Object>> powerData, BigDecimal rl, String provinceEnum, String type, BigDecimal compare) {
|
|
|
JSONObject jsonResult = new JSONObject();
|
|
|
- String lastResult = "";
|
|
|
jsonResult.put("result", "fail");
|
|
|
// 获取公式
|
|
|
- List<CalculationFormula> calculationFormulaList = getCalculationFormulaData(type,provinceEnum);
|
|
|
+ List<CalculationFormula> calculationFormulaList = getCalculationFormulaData(type, provinceEnum);
|
|
|
if (calculationFormulaList == null || calculationFormulaList.size() == 0) {
|
|
|
jsonResult.put("msg", "计算失败,未匹配到公式");
|
|
|
return jsonResult;
|
|
@@ -67,8 +69,23 @@ public class AccuracyPassRateCalculateService {
|
|
|
dataMap.put("rl", rl);
|
|
|
dataMap.put("count", count);
|
|
|
try {
|
|
|
+ BigDecimal thisResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute(formula, dataMap)));
|
|
|
+ // 如果是通过率计算
|
|
|
+ if (this.PASS.equals(type)) {
|
|
|
+ // 如果对比系数是0,返回计算失败
|
|
|
+ if (compare.compareTo(this.ZERO) == 0) {
|
|
|
+ jsonResult.put("msg", "计算失败,通过率计算,对比系数不可为0");
|
|
|
+ return jsonResult;
|
|
|
+ }
|
|
|
+ // 计算结果>=对比系数,则为100,否则为0
|
|
|
+ if (thisResult.compareTo(compare) > -1) {
|
|
|
+ thisResult = this.HUNDRED;
|
|
|
+ } else {
|
|
|
+ thisResult = this.ZERO;
|
|
|
+ }
|
|
|
+ }
|
|
|
// 求和计算 AviatorEvaluator.execute(公式,公式中的参数及值(以Map形式存放))
|
|
|
- formulaResult = formulaResult.add(new BigDecimal(String.valueOf(AviatorEvaluator.execute(formula, dataMap))));
|
|
|
+ formulaResult = formulaResult.add(thisResult);
|
|
|
} catch (Exception e) {
|
|
|
e.printStackTrace();
|
|
|
log.error("计算公式:" + formula + "错误:" + e.toString());
|
|
@@ -76,7 +93,7 @@ public class AccuracyPassRateCalculateService {
|
|
|
return jsonResult;
|
|
|
}
|
|
|
}
|
|
|
- // 非求和计算
|
|
|
+ // 非求和计算
|
|
|
} else {
|
|
|
if (powerData.size() > 0) {
|
|
|
// 获取数据
|
|
@@ -101,7 +118,7 @@ public class AccuracyPassRateCalculateService {
|
|
|
log.info("result" + calculationFormula.getOrder() + ":" + formulaResult);
|
|
|
}
|
|
|
// 获取最后一个公式计算的结果
|
|
|
- lastResult = String.valueOf(resultMap.get("result" + calculationFormulaList.size()));
|
|
|
+ String lastResult = String.valueOf(resultMap.get("result" + calculationFormulaList.size()));
|
|
|
if (lastResult == null) {
|
|
|
jsonResult.put("msg", "计算失败,结果为空");
|
|
|
return jsonResult;
|
|
@@ -124,10 +141,10 @@ public class AccuracyPassRateCalculateService {
|
|
|
* @param type 类型
|
|
|
* @return
|
|
|
*/
|
|
|
- public List<CalculationFormula> getCalculationFormulaData(String type,String provinceEnum) {
|
|
|
+ public List<CalculationFormula> getCalculationFormulaData(String type, String provinceEnum) {
|
|
|
List<CalculationFormula> calculationFormulaList = new ArrayList<>();
|
|
|
// 根据类型从数据库中查出公式列表
|
|
|
- calculationFormulaList = calculationFormulaRepository.findByTypeAndProvince(type,provinceEnum);
|
|
|
+ calculationFormulaList = calculationFormulaRepository.findByTypeAndProvince(type, provinceEnum);
|
|
|
return calculationFormulaList;
|
|
|
}
|
|
|
|