|
@@ -0,0 +1,193 @@
|
|
|
+package com.syjy.calculate.service;
|
|
|
+
|
|
|
+import cn.hutool.core.bean.BeanUtil;
|
|
|
+import cn.hutool.core.collection.ListUtil;
|
|
|
+import cn.hutool.core.comparator.CompareUtil;
|
|
|
+import cn.hutool.core.util.NumberUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
+import cn.hutool.json.JSONObject;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import com.syjy.calculate.entity.*;
|
|
|
+import com.syjy.calculate.repository.CalculationFormulaRepository;
|
|
|
+import com.syjy.calculate.util.Common;
|
|
|
+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.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class ComputeService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CalculationFormulaRepository calculationFormulaRepository;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private Common common;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private AccuracyPassRateCalculateService accuracyPassRateCalculateService;
|
|
|
+ @Autowired
|
|
|
+ private AssessmentCalculateService assessmentCalculateService;
|
|
|
+
|
|
|
+ public ComputeResult calculate(ComputeRequest request) {
|
|
|
+ return calculate(request, null);
|
|
|
+ }
|
|
|
+
|
|
|
+ public ComputeResult calculate(ComputeRequest request, CalculationFormula calculationFormula) {
|
|
|
+ List<ComputeReponse> results = new ArrayList<>();
|
|
|
+ List<CalculationFormula> formulaAsms = new ArrayList<>(); // 考核公式
|
|
|
+ List<CalculationFormula> formulaAccs = new ArrayList<>(); // 准确率公式
|
|
|
+ List<CalculationFormula> formulas = new ArrayList<>();
|
|
|
+ if (null == calculationFormula) {
|
|
|
+ //按省份获取公式
|
|
|
+ List<CalculationFormula> formulaList = calculationFormulaRepository.findFormulaWithProvince(request.getProvince(), request.getElectricType());
|
|
|
+ //
|
|
|
+ formulas = formulaList.stream().map(f -> {
|
|
|
+ CalculationFormula formula = BeanUtil.toBean(f, CalculationFormula.class);
|
|
|
+ formula.setIsRate("0");
|
|
|
+ return formula;
|
|
|
+ }).filter(t -> {// 过滤,排除版本,规则和用户
|
|
|
+ boolean v = !StrUtil.equalsIgnoreCase("VERSION", t.getType());
|
|
|
+ boolean r = !StrUtil.equalsIgnoreCase("RULES", t.getType());
|
|
|
+ boolean u = !StrUtil.equalsIgnoreCase("USER", t.getType());
|
|
|
+ t.setIsRate("0");
|
|
|
+ if (v && r && u) {
|
|
|
+ if (StrUtil.startWithIgnoreCase(t.getType(), "ASSESSMENT_")) {
|
|
|
+ formulaAsms.add(t);// 考核公式
|
|
|
+ } else {
|
|
|
+ formulaAccs.add(t);// 准确率合格率公式
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return v && r && u;
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+ } else {
|
|
|
+ calculationFormula.setIsRate("0");
|
|
|
+ formulas.add(calculationFormula);
|
|
|
+ }
|
|
|
+ ComputeResult computeResult = new ComputeResult();
|
|
|
+ computeResult = compute(request, formulas, computeResult);
|
|
|
+ return computeResult;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private String compute(CalculateRequest request, CalculationFormula formula) {
|
|
|
+ CalculateResult calculateResult = accuracyPassRateCalculateService.calculate(request, formula);
|
|
|
+ log.info("准确率 :: {}", calculateResult);
|
|
|
+ return ObjectUtil.toString(calculateResult.get("data"));
|
|
|
+ }
|
|
|
+
|
|
|
+ private JSONObject compute(AssessmentRequest request) {
|
|
|
+ CalculateResult calculateResult = assessmentCalculateService.calculateAssessment(request);
|
|
|
+ log.info("考核量 ::{}", calculateResult);
|
|
|
+ return JSONUtil.parseObj(calculateResult.get("data"));
|
|
|
+ }
|
|
|
+
|
|
|
+ private BigDecimal parseDeviationPower(CalculationInfo info) {
|
|
|
+ if (null != info) {
|
|
|
+ boolean fz = CompareUtil.compare(info.getForecastAbleValue(), BigDecimal.ZERO) == 0;
|
|
|
+ boolean rz = CompareUtil.compare(info.getRealValue(), BigDecimal.ZERO) == 0;
|
|
|
+ boolean az = CompareUtil.compare(info.getAbleValue(), BigDecimal.ZERO) == 0;
|
|
|
+ return fz ? info.getRealValue() : info.getForecastAbleValue();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private ComputeResult compute(ComputeRequest request, List<CalculationFormula> formulas, ComputeResult computeResult) {
|
|
|
+ CalculateRequest calculateRequest = BeanUtil.copyProperties(request, CalculateRequest.class);
|
|
|
+ AssessmentRequest assessmentRequest = BeanUtil.copyProperties(request, AssessmentRequest.class);
|
|
|
+ ComputeResult r = request.getComputeResult();
|
|
|
+ BeanUtil.copyProperties(r, assessmentRequest);
|
|
|
+ for (CalculationFormula formula : formulas) {
|
|
|
+ switch (formula.getType()) {
|
|
|
+ case ComputeReponse.DAY_MID_ACCURACY:
|
|
|
+ String dayMidRate = compute(calculateRequest, formula);
|
|
|
+ if (NumberUtil.isNumber(dayMidRate)) {
|
|
|
+ assessmentRequest.setMidAccuracyRate(NumberUtil.toBigDecimal(dayMidRate));
|
|
|
+ }
|
|
|
+ computeResult.setDayMidAccuracyGoal(dayMidRate);
|
|
|
+ JSONObject dayMidObject = compute(assessmentRequest);
|
|
|
+ computeResult.setDayMidAccuracyRate(dayMidObject.get("midAccuracyRate", String.class));
|
|
|
+ break;
|
|
|
+ case ComputeReponse.DAY_SHORT_ACCURACY:
|
|
|
+ String dayShortRate = compute(calculateRequest, formula);
|
|
|
+ if (NumberUtil.isNumber(dayShortRate)) {
|
|
|
+ assessmentRequest.setShortAccuracyRate(NumberUtil.toBigDecimal(dayShortRate));
|
|
|
+ }
|
|
|
+ computeResult.setDayShortAccuracyGoal(dayShortRate);
|
|
|
+ JSONObject dayShortObject = compute(assessmentRequest);
|
|
|
+ computeResult.setDayShortAccuracyRate(dayShortObject.get("shortAccuracyRate", String.class));
|
|
|
+ break;
|
|
|
+ case ComputeReponse.DAY_ULTRA_SHORT_ACCURACY:
|
|
|
+ String dayUltraShortRate = compute(calculateRequest, formula);
|
|
|
+ if (NumberUtil.isNumber(dayUltraShortRate)) {
|
|
|
+ assessmentRequest.setUltraShortAccuracyRate(NumberUtil.toBigDecimal(dayUltraShortRate));
|
|
|
+ }
|
|
|
+ computeResult.setDayUltraShortAccuracyGoal(dayUltraShortRate);
|
|
|
+ JSONObject dayUltraShortObject = compute(assessmentRequest);
|
|
|
+ computeResult.setDayUltraShortAccuracyRate(dayUltraShortObject.get("ultraShortAccuracyRate", String.class));
|
|
|
+ break;
|
|
|
+ case ComputeReponse.POINT_MID_ACCURACY:
|
|
|
+ String pointMidRate = compute(calculateRequest, formula);
|
|
|
+ if (NumberUtil.isNumber(pointMidRate)) {
|
|
|
+ assessmentRequest.setMidAccuracyRate(NumberUtil.toBigDecimal(pointMidRate));
|
|
|
+ }
|
|
|
+ computeResult.setPointMidAccuracyGoal(ListUtil.toList(pointMidRate));
|
|
|
+ JSONObject pointMidObject = compute(assessmentRequest);
|
|
|
+ computeResult.setPointMidAccuracyRate(ListUtil.toList(pointMidObject.get("midAccuracyRate", String.class)));
|
|
|
+ break;
|
|
|
+ case ComputeReponse.POINT_SHORT_ACCURACY:
|
|
|
+ List<String> pointGoals = new ArrayList<>();
|
|
|
+ List<String> pointRates = new ArrayList<>();
|
|
|
+ List<CalculationInfo> infos = request.getCalculationInfoList();
|
|
|
+ AssessmentRequest pAsRequest = BeanUtil.copyProperties(request, AssessmentRequest.class);
|
|
|
+ for (CalculationInfo info : infos) {
|
|
|
+ CalculateRequest pointRequest = BeanUtil.copyProperties(request, CalculateRequest.class);
|
|
|
+ pointRequest.setCalculationInfoList(ListUtil.toList(BeanUtil.toBean(info, CalculationInfo.class)));
|
|
|
+ CalculateResult calculateResult = accuracyPassRateCalculateService.calculate(pointRequest, formula);
|
|
|
+ String pointRate = ObjectUtil.toString(calculateResult.get("data"));
|
|
|
+ if (NumberUtil.isNumber(pointRate)) {
|
|
|
+ pAsRequest.setDeviationPower(parseDeviationPower(info));
|
|
|
+ pAsRequest.setShortAccuracyRate(NumberUtil.toBigDecimal(pointRate));
|
|
|
+ }
|
|
|
+ calculateResult = assessmentCalculateService.calculateAssessment(pAsRequest);
|
|
|
+ pointGoals.add(pointRate);
|
|
|
+ JSONObject jsonObject = JSONUtil.parseObj(calculateResult.get("data"));
|
|
|
+ pointRates.add(jsonObject.get("shortAccuracyRate", String.class));
|
|
|
+ computeResult.setPointShortAccuracyGoal(pointGoals);
|
|
|
+ computeResult.setPointShortAccuracyRate(pointRates);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case ComputeReponse.POINT_ULTRA_SHORT_ACCURACY:
|
|
|
+ String pointUltraShortRate = compute(calculateRequest, formula);
|
|
|
+ if (NumberUtil.isNumber(pointUltraShortRate)) {
|
|
|
+ assessmentRequest.setUltraShortAccuracyRate(NumberUtil.toBigDecimal(pointUltraShortRate));
|
|
|
+ }
|
|
|
+ computeResult.setPointUltraShortAccuracyGoal(ListUtil.toList(pointUltraShortRate));
|
|
|
+ JSONObject pointUltraShortObject = compute(assessmentRequest);
|
|
|
+ computeResult.setPointUltraShortAccuracyRate(ListUtil.toList(pointUltraShortObject.get("ultraShortAccuracyRate", String.class)));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ JSONObject jsonObject = compute(assessmentRequest);
|
|
|
+ computeResult.setMidReportRate(jsonObject.get("midReportRate", String.class));
|
|
|
+ computeResult.setShortReportRate(jsonObject.get("shortReportRate", String.class));
|
|
|
+ computeResult.setUltraShortReportRate(jsonObject.get("ultraReportRate", String.class));
|
|
|
+ computeResult.setMidPassRate(jsonObject.get("midPassRate", String.class));
|
|
|
+ computeResult.setShortPassRate(jsonObject.get("shortPassRate", String.class));
|
|
|
+ computeResult.setUltraShortPassRate(jsonObject.get("ultraShortPassRate", String.class));
|
|
|
+ computeResult.setSingleMachinePassRate(jsonObject.get("singleMachinePassRate", String.class));
|
|
|
+ computeResult.setAblePowerAccuracyRate(jsonObject.get("ablePowerAccuracyRate", String.class));
|
|
|
+ computeResult.setTheoryPowerAccuracyRate(jsonObject.get("theoryPowerAccuracyRate", String.class));
|
|
|
+ computeResult.setAnemometerTowerAccuracyRate(jsonObject.get("anemometerTowerAccuracyRate", String.class));
|
|
|
+ computeResult.setInstalledCapacityAccuracyRate(jsonObject.get("installedCapacityAccuracyRate", String.class));
|
|
|
+ computeResult.setAvailableCapacityAccuracyRate(jsonObject.get("availableCapacityAccuracyRate", String.class));
|
|
|
+ computeResult.setTime(jsonObject.get("time", Long.class));
|
|
|
+ return computeResult;
|
|
|
+ }
|
|
|
+}
|