|
@@ -6,12 +6,12 @@ import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
|
|
import com.cpp.web.domain.enums.DataSourcesEnum;
|
|
import com.cpp.web.domain.enums.DataSourcesEnum;
|
|
import com.cpp.web.domain.enums.ForecastTypeEnum;
|
|
import com.cpp.web.domain.enums.ForecastTypeEnum;
|
|
import com.cpp.web.domain.station.ElectricField;
|
|
import com.cpp.web.domain.station.ElectricField;
|
|
|
|
+import com.cpp.web.domain.station.ForecastPowerShortTermStation;
|
|
import com.cpp.web.domain.station.PowerStationStatusData;
|
|
import com.cpp.web.domain.station.PowerStationStatusData;
|
|
import com.cpp.web.service.accuracy.CalculateInterface;
|
|
import com.cpp.web.service.accuracy.CalculateInterface;
|
|
import com.cpp.web.service.cloud.ForecastPowerShortTermCloudService;
|
|
import com.cpp.web.service.cloud.ForecastPowerShortTermCloudService;
|
|
import com.syjy.calculate.entity.CalculateRequest;
|
|
import com.syjy.calculate.entity.CalculateRequest;
|
|
import com.syjy.calculate.entity.CalculateResult;
|
|
import com.syjy.calculate.entity.CalculateResult;
|
|
-import com.syjy.calculate.entity.CalculationFormula;
|
|
|
|
import com.syjy.calculate.entity.CalculationInfo;
|
|
import com.syjy.calculate.entity.CalculationInfo;
|
|
import com.syjy.calculate.service.AccuracyPassRateCalculateService;
|
|
import com.syjy.calculate.service.AccuracyPassRateCalculateService;
|
|
import lombok.RequiredArgsConstructor;
|
|
import lombok.RequiredArgsConstructor;
|
|
@@ -31,7 +31,7 @@ public class CalculateForecastPowerShortTermCloudImpl implements CalculateInterf
|
|
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public List<AccuracyPassRate> calc(Date startTime,Date endTime,List<PowerStationStatusData> powerStationStatusDataList, List<ElectricField> electricFieldList, List<String> formulaTypes, String province){
|
|
|
|
|
|
+ public List<AccuracyPassRate> calc(Date startTime, Date endTime, List<PowerStationStatusData> powerStationStatusDataList, List<ElectricField> electricFieldList, List<String> formulaTypes, String province) {
|
|
|
|
|
|
List<AccuracyPassRate> accuracyPassRates = new ArrayList<>();
|
|
List<AccuracyPassRate> accuracyPassRates = new ArrayList<>();
|
|
|
|
|
|
@@ -59,7 +59,7 @@ public class CalculateForecastPowerShortTermCloudImpl implements CalculateInterf
|
|
accuracyPassRate.setForecastModel(forecastModel);
|
|
accuracyPassRate.setForecastModel(forecastModel);
|
|
accuracyPassRate.setForecastType(ForecastTypeEnum.dq);
|
|
accuracyPassRate.setForecastType(ForecastTypeEnum.dq);
|
|
accuracyPassRate.setForecastHowLongAgo(ago);
|
|
accuracyPassRate.setForecastHowLongAgo(ago);
|
|
- List<CalculationInfo> calculationInfoList = new ArrayList<>();
|
|
|
|
|
|
+ accuracyPassRate.setStationCode(electricField.getStationCode());
|
|
|
|
|
|
// 获取实际功率
|
|
// 获取实际功率
|
|
Map<Date, List<ForecastPowerShortTermCloud>> dateForecastListMap = forecastPowerShortTermCloudList.stream().filter(p -> p.getStationCode().equals(stationCode)).collect(Collectors.groupingBy(ForecastPowerShortTermCloud::getTime, Collectors.toList()));
|
|
Map<Date, List<ForecastPowerShortTermCloud>> dateForecastListMap = forecastPowerShortTermCloudList.stream().filter(p -> p.getStationCode().equals(stationCode)).collect(Collectors.groupingBy(ForecastPowerShortTermCloud::getTime, Collectors.toList()));
|
|
@@ -69,7 +69,7 @@ public class CalculateForecastPowerShortTermCloudImpl implements CalculateInterf
|
|
BigDecimal cap = electricField.getCapacity();
|
|
BigDecimal cap = electricField.getCapacity();
|
|
|
|
|
|
if (formulaTypes.contains("DAY_SHORT_ACCURACY")) {//准确率计算
|
|
if (formulaTypes.contains("DAY_SHORT_ACCURACY")) {//准确率计算
|
|
-
|
|
|
|
|
|
+ List<CalculationInfo> calculationInfoList = new ArrayList<>();
|
|
// 从开始时间,每隔15分钟,一直循环到当前时间
|
|
// 从开始时间,每隔15分钟,一直循环到当前时间
|
|
for (long stepTime = startTime.getTime(); stepTime <= endTime.getTime(); stepTime += 900000L) {
|
|
for (long stepTime = startTime.getTime(); stepTime <= endTime.getTime(); stepTime += 900000L) {
|
|
Date finalTime = new Date(stepTime);
|
|
Date finalTime = new Date(stepTime);
|
|
@@ -77,21 +77,27 @@ public class CalculateForecastPowerShortTermCloudImpl implements CalculateInterf
|
|
CalculationInfo calculationInfo = new CalculationInfo();
|
|
CalculationInfo calculationInfo = new CalculationInfo();
|
|
// 如果短期预测功率不为空且站场功率不为空
|
|
// 如果短期预测功率不为空且站场功率不为空
|
|
if (dateForecastListMap.containsKey(finalTime) && datePowerListMap.containsKey(finalTime)) {
|
|
if (dateForecastListMap.containsKey(finalTime) && datePowerListMap.containsKey(finalTime)) {
|
|
- ForecastPowerShortTermCloud forecastPowerShortTermCloud = dateForecastListMap.get(finalTime).get(0);
|
|
|
|
- // 短期预测功率
|
|
|
|
- calculationInfo.setTime(stepTime);
|
|
|
|
- calculationInfo.setForecastAbleValue(forecastPowerShortTermCloud.getFpValue());
|
|
|
|
- calculationInfo.setForecastTheoryValue(forecastPowerShortTermCloud.getFpValue());
|
|
|
|
- calculationInfo.setForecastCapacity(cap);
|
|
|
|
- calculationInfo.setForecastSuCapacity(cap);
|
|
|
|
|
|
|
|
PowerStationStatusData powerStationStatusData = datePowerListMap.get(finalTime).get(0);
|
|
PowerStationStatusData powerStationStatusData = datePowerListMap.get(finalTime).get(0);
|
|
- //实际
|
|
|
|
- calculationInfo.setCapacity(cap);
|
|
|
|
- calculationInfo.setOpenCapacity(cap);
|
|
|
|
- calculationInfo.setAbleValue(powerStationStatusData.getAbleValue());
|
|
|
|
- calculationInfo.setRealValue(powerStationStatusData.getRealValue());
|
|
|
|
- calculationInfo.setTheoryValue(powerStationStatusData.getTheoryValue());
|
|
|
|
|
|
+ //限电时不参与考核,抛去
|
|
|
|
+ if (!powerStationStatusData.getPowerRationing().equals(1)) {
|
|
|
|
+ ForecastPowerShortTermCloud forecastPowerShortTermCloud = dateForecastListMap.get(finalTime).get(0);
|
|
|
|
+ // 短期预测功率
|
|
|
|
+ calculationInfo.setTime(stepTime);
|
|
|
|
+ calculationInfo.setForecastAbleValue(forecastPowerShortTermCloud.getFpValue());
|
|
|
|
+ calculationInfo.setForecastTheoryValue(forecastPowerShortTermCloud.getFpValue());
|
|
|
|
+ calculationInfo.setForecastCapacity(cap);
|
|
|
|
+ calculationInfo.setForecastSuCapacity(cap);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ //实际
|
|
|
|
+ calculationInfo.setCapacity(cap);
|
|
|
|
+ calculationInfo.setOpenCapacity(cap);
|
|
|
|
+ calculationInfo.setAbleValue(powerStationStatusData.getAbleValue());
|
|
|
|
+ calculationInfo.setRealValue(powerStationStatusData.getRealValue());
|
|
|
|
+ calculationInfo.setTheoryValue(powerStationStatusData.getTheoryValue());
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
// 预测功率或实际功率为空的时候,不放入result中
|
|
// 预测功率或实际功率为空的时候,不放入result中
|
|
@@ -103,7 +109,7 @@ public class CalculateForecastPowerShortTermCloudImpl implements CalculateInterf
|
|
|
|
|
|
if (calculationInfoList == null || calculationInfoList.size() == 0) {
|
|
if (calculationInfoList == null || calculationInfoList.size() == 0) {
|
|
accuracyPassRate.setAccuracy("无可用数据计算");
|
|
accuracyPassRate.setAccuracy("无可用数据计算");
|
|
- }else {
|
|
|
|
|
|
+ } else {
|
|
// 获取计算基础数据
|
|
// 获取计算基础数据
|
|
CalculateRequest calculateRequest = new CalculateRequest();
|
|
CalculateRequest calculateRequest = new CalculateRequest();
|
|
calculateRequest.setCalculationInfoList(calculationInfoList);
|
|
calculateRequest.setCalculationInfoList(calculationInfoList);
|
|
@@ -130,71 +136,33 @@ public class CalculateForecastPowerShortTermCloudImpl implements CalculateInterf
|
|
|
|
|
|
}
|
|
}
|
|
if (formulaTypes.contains("POINT_SHORT_ACCURACY")) {//单点偏差计算
|
|
if (formulaTypes.contains("POINT_SHORT_ACCURACY")) {//单点偏差计算
|
|
- List<String> results = new ArrayList<>();
|
|
|
|
|
|
+
|
|
|
|
+ BigDecimal sum = BigDecimal.ZERO;
|
|
|
|
+ Boolean b = false;
|
|
|
|
|
|
for (long stepTime = startTime.getTime(); stepTime <= endTime.getTime(); stepTime += 900000L) {
|
|
for (long stepTime = startTime.getTime(); stepTime <= endTime.getTime(); stepTime += 900000L) {
|
|
Date finalTime = new Date(stepTime);
|
|
Date finalTime = new Date(stepTime);
|
|
- // 组装数据
|
|
|
|
- CalculationInfo calculationInfo = new CalculationInfo();
|
|
|
|
- // 如果短期预测功率不为空且站场功率不为空
|
|
|
|
|
|
+
|
|
if (dateForecastListMap.containsKey(finalTime) && datePowerListMap.containsKey(finalTime)) {
|
|
if (dateForecastListMap.containsKey(finalTime) && datePowerListMap.containsKey(finalTime)) {
|
|
- ForecastPowerShortTermCloud forecastPowerShortTermCloud = dateForecastListMap.get(finalTime).get(0);
|
|
|
|
- // 短期预测功率
|
|
|
|
- calculationInfo.setTime(stepTime);
|
|
|
|
- calculationInfo.setForecastAbleValue(forecastPowerShortTermCloud.getFpValue());
|
|
|
|
- calculationInfo.setForecastTheoryValue(forecastPowerShortTermCloud.getFpValue());
|
|
|
|
- calculationInfo.setForecastCapacity(cap);
|
|
|
|
- calculationInfo.setForecastSuCapacity(cap);
|
|
|
|
|
|
|
|
|
|
+ ForecastPowerShortTermCloud forecastPowerShortTermCloud = dateForecastListMap.get(finalTime).get(0);
|
|
PowerStationStatusData powerStationStatusData = datePowerListMap.get(finalTime).get(0);
|
|
PowerStationStatusData powerStationStatusData = datePowerListMap.get(finalTime).get(0);
|
|
- //实际
|
|
|
|
- calculationInfo.setCapacity(cap);
|
|
|
|
- calculationInfo.setOpenCapacity(cap);
|
|
|
|
- calculationInfo.setAbleValue(powerStationStatusData.getAbleValue());
|
|
|
|
- calculationInfo.setRealValue(powerStationStatusData.getRealValue());
|
|
|
|
- calculationInfo.setTheoryValue(powerStationStatusData.getTheoryValue());
|
|
|
|
- }
|
|
|
|
|
|
|
|
- // 预测功率或实际功率为空的时候,不放入result中
|
|
|
|
- if (calculationInfo.getRealValue() != null && calculationInfo.getAbleValue() != null && calculationInfo.getForecastAbleValue() != null) {
|
|
|
|
- // 获取计算基础数据
|
|
|
|
- CalculateRequest calculateRequest = new CalculateRequest();
|
|
|
|
- calculateRequest.setCalculationInfoList(calculationInfoList);
|
|
|
|
- calculateRequest.setElectricCapacity(capacity);
|
|
|
|
- calculateRequest.setProvince(province);
|
|
|
|
- calculateRequest.setStationCode(stationCode);
|
|
|
|
- calculateRequest.setFormulaType("POINT_SHORT_ACCURACY");
|
|
|
|
- calculateRequest.setElectricType(electricType);
|
|
|
|
- calculateRequest.setSign(electricField.getStationCode());
|
|
|
|
- calculateRequest.setStationStatus("无");
|
|
|
|
- calculateRequest.setStationCode(electricField.getStationCode());
|
|
|
|
- CalculateResult resultMap = SpringUtils.getBean(AccuracyPassRateCalculateService.class).calculate(calculateRequest);
|
|
|
|
- // 如果计算成功,从结果中获取value
|
|
|
|
- if (String.valueOf(resultMap.get(CalculateResult.CODE_TAG)).
|
|
|
|
- equals(CalculateResult.Type.SUCCESS.value())) {
|
|
|
|
- results.add(String.valueOf(resultMap.get(CalculateResult.DATA_TAG)));
|
|
|
|
- }
|
|
|
|
- // 如果不成功,data不为空,则返回data中数据,否则返回msg
|
|
|
|
- if (resultMap.get(CalculateResult.DATA_TAG) != null) {
|
|
|
|
- results.add(String.valueOf(resultMap.get(CalculateResult.DATA_TAG)));
|
|
|
|
- }
|
|
|
|
- results.add(String.valueOf(resultMap.get(CalculateResult.MSG_TAG)));
|
|
|
|
|
|
+
|
|
|
|
+ BigDecimal subtractAbs = powerStationStatusData.getRealValue().subtract(forecastPowerShortTermCloud.getFpValue()).abs();
|
|
|
|
+ BigDecimal value = subtractAbs.divide(electricField.getCapacity(), 4, BigDecimal.ROUND_DOWN);
|
|
|
|
+ sum = sum.add(value);
|
|
|
|
+ b = true;
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
- if (results.isEmpty()) {
|
|
|
|
- accuracyPassRate.setDeviationSum("无可用数据计算");
|
|
|
|
|
|
+ if (b) {
|
|
|
|
+ accuracyPassRate.setDeviationSum(sum.doubleValue()*100 + "%");
|
|
} else {
|
|
} else {
|
|
- double sum = 0d;
|
|
|
|
- for (String result : results) {
|
|
|
|
- if (result.indexOf("%") > -1 && result.length() < 7) {
|
|
|
|
- sum += Double.parseDouble(result.replace("%", ""));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- if (accuracyPassRate.getDeviationSum() == null) {
|
|
|
|
- accuracyPassRate.setDeviationSum(BigDecimal.valueOf(sum / 100).setScale(2, BigDecimal.ROUND_HALF_UP) + "");
|
|
|
|
- }
|
|
|
|
|
|
+ accuracyPassRate.setDeviationSum("无可用数据计算");
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
accuracyPassRates.add(accuracyPassRate);
|
|
accuracyPassRates.add(accuracyPassRate);
|
|
}
|
|
}
|