|
@@ -1,314 +0,0 @@
|
|
|
-package com.jiayue.ipfcst.calculate.service;
|
|
|
-
|
|
|
-import cn.hutool.core.date.DateUtil;
|
|
|
-import com.jiayue.ipfcst.common.core.integration.constant.StatusConstant;
|
|
|
-import com.jiayue.ipfcst.common.core.integration.correct.dq.IForePowerShortTermCorrect;
|
|
|
-import com.jiayue.ipfcst.common.data.entity.*;
|
|
|
-import com.jiayue.ipfcst.common.data.entity.integration.InForecastPowerShortTermHis;
|
|
|
-import com.jiayue.ipfcst.common.data.repository.*;
|
|
|
-import com.jiayue.ipfcst.console.service.SysParameterService;
|
|
|
-import com.jiayue.ipfcst.fileupload.integration.service.InForecastPowerShortTermHisService;
|
|
|
-import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-import org.springframework.stereotype.Service;
|
|
|
-
|
|
|
-import java.math.BigDecimal;
|
|
|
-import java.util.*;
|
|
|
-import java.util.stream.Collectors;
|
|
|
-
|
|
|
-/**
|
|
|
- * 甘肃省准确率
|
|
|
- * 西北监能市场
|
|
|
- * 【2018】66号文件
|
|
|
- * 按15分钟统计 00:00 - 23:45
|
|
|
- * @author yh
|
|
|
- * @version 2.0
|
|
|
- * @since 2020/7/17 9:30
|
|
|
- */
|
|
|
-@Service
|
|
|
-@Slf4j
|
|
|
-public class AccuarcyPassRateCalculateServiceE62 implements IAccuracyPassRateCalculate {
|
|
|
- private final PowerStationStatusDataRepository powerStationStatusDataRepository;
|
|
|
- private final ForecastPowerUltraShortTermHisRepository forecastPowerUltraShortTermHisRepository;
|
|
|
- private final ForecastPowerShortTermHisRepository forecastPowerShortTermHisRepository;
|
|
|
- private final SysParameterService sysParameterService;
|
|
|
- private final AccuracyPassRateRepository accuracyPassRateRepository;
|
|
|
- private final AccuracyPassRateDayRepository accuracyPassRateDayRepository;
|
|
|
- private final InForecastPowerShortTermHisService inForecastPowerShortTermHisService;
|
|
|
- private final IForePowerShortTermCorrect inForePowerShortTermCorrect;
|
|
|
-
|
|
|
- @Autowired
|
|
|
- public AccuarcyPassRateCalculateServiceE62(PowerStationStatusDataRepository powerStationStatusDataRepository,
|
|
|
- ForecastPowerUltraShortTermHisRepository forecastPowerUltraShortTermHisRepository,
|
|
|
- ForecastPowerShortTermHisRepository forecastPowerShortTermHisRepository,
|
|
|
- SysParameterService sysParameterService,
|
|
|
- AccuracyPassRateRepository accuracyPassRateRepository,
|
|
|
- AccuracyPassRateDayRepository accuracyPassRateDayRepository,
|
|
|
- InForecastPowerShortTermHisService inForecastPowerShortTermHisService,
|
|
|
- IForePowerShortTermCorrect inForePowerShortTermCorrect) {
|
|
|
- this.powerStationStatusDataRepository = powerStationStatusDataRepository;
|
|
|
- this.forecastPowerUltraShortTermHisRepository = forecastPowerUltraShortTermHisRepository;
|
|
|
- this.forecastPowerShortTermHisRepository = forecastPowerShortTermHisRepository;
|
|
|
- this.sysParameterService = sysParameterService;
|
|
|
- this.accuracyPassRateRepository = accuracyPassRateRepository;
|
|
|
- this.accuracyPassRateDayRepository = accuracyPassRateDayRepository;
|
|
|
- this.inForecastPowerShortTermHisService = inForecastPowerShortTermHisService;
|
|
|
- this.inForePowerShortTermCorrect = inForePowerShortTermCorrect;
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void generateData(ElectricField electricField) {
|
|
|
- long[] queryTime = IAccuracyPassRateCalculate.getQueryTimeSh();
|
|
|
- long moment15 = 900000L;
|
|
|
- // 获取结束时间(当前的15分钟节点的前一个节点,如当前为11:16,则结束时间为11:00)
|
|
|
- long endTime = queryTime[1]-moment15;
|
|
|
- // 设定短期结束时间(当前的15分钟节点的前两个节点,如当前为11:16,则结束时间为10:45)
|
|
|
- long dqStarTime = endTime - moment15;
|
|
|
- // 设定超短期结束时间(当日0时0分0秒)
|
|
|
- long cdqStartTime = DateUtil.beginOfDay(new Date(endTime)).getTime();
|
|
|
- // 获取容量
|
|
|
- BigDecimal capacity = electricField.getCapacity();
|
|
|
- // 设定系数
|
|
|
- BigDecimal radio = new BigDecimal("0.03");
|
|
|
- // 根据系数、容量、保留几位小数,计算对比系数
|
|
|
- BigDecimal compare = IAccuracyPassRateCalculate.compareRadio(radio, capacity, 2);
|
|
|
-
|
|
|
- AccuracyPassRate accuracyPassRate = new AccuracyPassRate();
|
|
|
- accuracyPassRate.setTime(endTime);
|
|
|
-
|
|
|
- AccuracyPassRateDay accuracyPassRateDay = new AccuracyPassRateDay();
|
|
|
- accuracyPassRateDay.setTime(endTime);
|
|
|
-
|
|
|
- /************** ***********************************计算短期准确率-start*****************************************************/
|
|
|
- // 获取短期计算准确率获取该天是提前几天预测的
|
|
|
- String sysParameter = this.sysParameterService.getSysParameter("ACCURACY_DQ_HOWLONGAGO", "1");
|
|
|
- int howLongAgoForDq = Integer.parseInt(sysParameter);
|
|
|
- // 根据提前多久、结束时间,查询短期预测功率(当前时间点最近的前一个15分钟节点的预测功率)
|
|
|
- ForecastPowerShortTermHis forecastPowerShortTermHis = this.forecastPowerShortTermHisRepository.findByForecastTimeAndForecastHowLongAgo(endTime, howLongAgoForDq);
|
|
|
- // 按时间段查询场站功率数据
|
|
|
- List<PowerStationStatusData> pssdList = this.powerStationStatusDataRepository.findByTimeBetween(new Date(dqStarTime), new Date(endTime));
|
|
|
- // 如果站场功率不为空且短期预测功率不为空
|
|
|
- if (pssdList != null && pssdList.size()>0 && forecastPowerShortTermHis != null) {
|
|
|
- // 按照时间倒序
|
|
|
- pssdList.sort(Comparator.comparing(PowerStationStatusData::getTime).reversed());
|
|
|
- // 获取时间最近的一条
|
|
|
- PowerStationStatusData powerStationStatusData = pssdList.get(0);
|
|
|
- // 获取可用功率
|
|
|
- BigDecimal availableValue = powerStationStatusData.getAbleValue();
|
|
|
- // 如果可用功率大于0
|
|
|
- if(availableValue.floatValue()>=IAccuracyPassRateCalculate.ZERO.floatValue()){
|
|
|
- // 预测功率
|
|
|
- BigDecimal forecastAvailableValue = forecastPowerShortTermHis.getAbleValue();
|
|
|
- String accuracy;
|
|
|
- //当预测功率为0时,实际功率在装机容量3%内不予考核,否者误差值为100%,也就是准确率为0
|
|
|
- if (forecastAvailableValue.floatValue() == IAccuracyPassRateCalculate.ZERO.floatValue()) {
|
|
|
- // 如果可用功率<=对比系数,不予考核,否则短期准确率为0
|
|
|
- if (availableValue.floatValue() <= compare.floatValue()) {
|
|
|
- accuracyPassRate.setShortTermAccuracy("不予考核");
|
|
|
- } else {
|
|
|
- accuracy = IAccuracyPassRateCalculate.ZERO.floatValue() + "%";
|
|
|
- accuracyPassRate.setShortTermAccuracy(accuracy);
|
|
|
- }
|
|
|
- //当实际功率为0时,预测功率在装机容量3%内不予考核,否者误差值为100%,也就是准确率为0
|
|
|
- } else if (availableValue.floatValue() == IAccuracyPassRateCalculate.ZERO.floatValue()) {
|
|
|
- // 如果预测功率<=对比系数,不予考核,否则短期准确率为0
|
|
|
- if (forecastAvailableValue.floatValue() <= compare.floatValue()) {
|
|
|
- accuracyPassRate.setShortTermAccuracy("不予考核");
|
|
|
- } else {
|
|
|
- accuracy = IAccuracyPassRateCalculate.ZERO.floatValue() + "%";
|
|
|
- accuracyPassRate.setShortTermAccuracy(accuracy);
|
|
|
- accuracyPassRateDay.setShortTermAccuracy(accuracy);
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 计算准确率
|
|
|
- try {
|
|
|
- accuracy = CalculateMethod.calculateC3(forecastAvailableValue,availableValue).toString()+"%";
|
|
|
- accuracyPassRate.setShortTermAccuracy(accuracy);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- log.error("计算短期准确率错误");
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
- // 可用功率小于0
|
|
|
- }else{
|
|
|
- accuracyPassRate.setShortTermAccuracy("无可用数据计算");
|
|
|
- accuracyPassRateDay.setShortTermAccuracy("无可用数据计算");
|
|
|
- }
|
|
|
- // 站场功率为空或短期预测功率为空
|
|
|
- } else {
|
|
|
- accuracyPassRate.setShortTermAccuracy("无可用数据计算");
|
|
|
- accuracyPassRateDay.setShortTermAccuracy("无可用数据计算");
|
|
|
- }
|
|
|
-
|
|
|
- /**************************************************计算日准确率均方根误差-start*****************************************************/
|
|
|
- // 按时间段查询场站功率数据
|
|
|
- List<PowerStationStatusData> pssdListForRootMeanSquare = this.powerStationStatusDataRepository.findByTimeBetween(new Date(cdqStartTime), new Date(endTime));
|
|
|
- // 短期数据
|
|
|
- List<Map<String, BigDecimal>> shortData = new ArrayList();
|
|
|
- // 短期功率列表
|
|
|
- List<ForecastPowerShortTermHis> forecastShortList = this.forecastPowerShortTermHisRepository.findByForecastTimeBetweenAndForecastHowLongAgo(cdqStartTime, endTime, howLongAgoForDq);
|
|
|
- // 从0时0分0秒开始,每隔15分钟,一直循环到当前时间,过滤出每15分钟的场站信息与预测功率,并组装数据
|
|
|
- for (long stepTime = cdqStartTime; stepTime <= endTime; stepTime += moment15) {
|
|
|
- long finalTime = stepTime;
|
|
|
- // 获取该时间点短期预测功率
|
|
|
- List<ForecastPowerShortTermHis> shortFilter = forecastShortList.stream().filter(u -> u.getForecastTime() == finalTime).collect(Collectors.toList());
|
|
|
- // 获取该时间点场站功率
|
|
|
- List<PowerStationStatusData> pFilter = pssdListForRootMeanSquare.stream().filter((p) -> p.getTime().getTime() == finalTime).collect(Collectors.toList());
|
|
|
-
|
|
|
- Map<String, BigDecimal> shortMapForRootMeanSquare = new HashMap();
|
|
|
- // 如果短期预测功率不为空且站场功率不为空
|
|
|
- if (shortFilter != null && shortFilter.size() > 0 && pFilter != null && pFilter.size() > 0) {
|
|
|
- shortMapForRootMeanSquare = new HashMap();
|
|
|
- // 实际功率
|
|
|
- shortMapForRootMeanSquare.put("sj", pFilter.get(0).getAbleValue());
|
|
|
- // 预测功率
|
|
|
- shortMapForRootMeanSquare.put("yc", shortFilter.get(0).getAbleValue());
|
|
|
- // 开机容量
|
|
|
- shortMapForRootMeanSquare.put("openCapacity", pFilter.get(0).getOpenCapacity());
|
|
|
- shortMapForRootMeanSquare.put("time", new BigDecimal(finalTime));
|
|
|
- shortData.add(shortMapForRootMeanSquare);
|
|
|
- }
|
|
|
- }
|
|
|
- try {
|
|
|
- String rootMeanSquareValue = "";
|
|
|
- rootMeanSquareValue = CalculateMethod.calculateC9(shortData).toString()+"%";
|
|
|
- accuracyPassRateDay.setShortTermAccuracy(rootMeanSquareValue);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- log.error("计算短期准确率均方根误差错误");
|
|
|
- }
|
|
|
- /*************************************************计算日准确率均方根误差-end*****************************************************/
|
|
|
-
|
|
|
- /*************************************************计算短期准确率-end*****************************************************/
|
|
|
-
|
|
|
- /*************************************************计算超短期准确率-start*****************************************************/
|
|
|
- // 获取超短期计算准确率获取第几个点
|
|
|
- String sysParameterCdq = this.sysParameterService.getSysParameter("ACCURACY_CDQ_HOWLONGAGO", "8");
|
|
|
- int howLongAgoForCdq = Integer.parseInt(sysParameterCdq);
|
|
|
- // 获取超短期预测功率
|
|
|
- List<ForecastPowerUltraShortTermHis> ultraList = this.forecastPowerUltraShortTermHisRepository.findByForecastTimeBetweenAndForecastHowLongAgo(cdqStartTime, endTime, howLongAgoForCdq);
|
|
|
- //获取场站功率(从当天0时0分0秒到当前时间的15分钟)
|
|
|
- List<PowerStationStatusData> psList = this.powerStationStatusDataRepository.findByTimeBetween(new Date(cdqStartTime), new Date(endTime));
|
|
|
- List<Map<String, BigDecimal>> data = new ArrayList();
|
|
|
- List<Map<String, BigDecimal>> ultraData = new ArrayList();
|
|
|
-
|
|
|
- // 从0时0分0秒开始,每隔15分钟,一直循环到当前时间
|
|
|
- for (long stepTime = cdqStartTime; stepTime <= endTime; stepTime += moment15) {
|
|
|
- long finalTime = stepTime;
|
|
|
- // 获取该时间点超短期预测功率
|
|
|
- List<ForecastPowerUltraShortTermHis> ultraFilter = ultraList.stream().filter(u -> u.getForecastTime() == finalTime).collect(Collectors.toList());
|
|
|
- // 获取该时间点场站功率
|
|
|
- List<PowerStationStatusData> pFilter = psList.stream().filter((p) -> p.getTime().getTime() == finalTime).collect(Collectors.toList());
|
|
|
- // 如果超短期预测功率不为空且站场功率不为空
|
|
|
- if (ultraFilter != null && ultraFilter.size() > 0 && pFilter != null && pFilter.size() > 0) {
|
|
|
- BigDecimal pAbleValue = pFilter.get(0).getAbleValue();
|
|
|
- BigDecimal uAbleValue = ultraFilter.get(0).getAbleValue();
|
|
|
- // 组装均方根误差数据
|
|
|
- Map<String, BigDecimal> ultraMapForRootMeanSquare = new HashMap();
|
|
|
- // 实际功率
|
|
|
- ultraMapForRootMeanSquare.put("sj", pFilter.get(0).getAbleValue());
|
|
|
- // 预测功率
|
|
|
- ultraMapForRootMeanSquare.put("yc", ultraFilter.get(0).getAbleValue());
|
|
|
- // 开机容量
|
|
|
- ultraMapForRootMeanSquare.put("openCapacity", pFilter.get(0).getOpenCapacity());
|
|
|
- // 将数据放入均方根误差
|
|
|
- ultraData.add(ultraMapForRootMeanSquare);
|
|
|
- //当实际和预测值均在装机容量3%以内时,该点不计入误差值计算
|
|
|
- if (pAbleValue.floatValue() > compare.floatValue() || uAbleValue.floatValue() > compare.floatValue()) {
|
|
|
- Map<String, BigDecimal> map = new HashMap();
|
|
|
- // 实际功率
|
|
|
- map.put("sj", pFilter.get(0).getAbleValue());
|
|
|
- // 预测功率
|
|
|
- map.put("yc", ultraFilter.get(0).getAbleValue());
|
|
|
- // 开机容量
|
|
|
- map.put("openCapacity", pFilter.get(0).getOpenCapacity());
|
|
|
- data.add(map);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (data != null && data.size() > 0) {
|
|
|
- try {
|
|
|
- String accuracyCdq = CalculateMethod.calculateC4(data).toString()+"%";
|
|
|
- accuracyPassRate.setUltraShortTermAccuracy(accuracyCdq);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- log.error("计算超短期准确率错误");
|
|
|
- }
|
|
|
- } else {
|
|
|
- accuracyPassRate.setUltraShortTermAccuracy("无可用数据计算");
|
|
|
- }
|
|
|
- /************** ***********************************计算超短期日准确率均方根误差-start*****************************************************/
|
|
|
- // 如果超短期数据不为空,计算超短期日均方根准确率
|
|
|
- if (ultraData != null && ultraData.size() > 0) {
|
|
|
- try {
|
|
|
- String rootMeanSquareValue = "";
|
|
|
- rootMeanSquareValue = CalculateMethod.calculateC9(ultraData).toString() + "%";
|
|
|
- accuracyPassRateDay.setUltraShortTermAccuracy(rootMeanSquareValue);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- log.error("计算短期准确率均方根误差错误");
|
|
|
- }
|
|
|
- } else {
|
|
|
- accuracyPassRateDay.setUltraShortTermAccuracy("无可用数据计算");
|
|
|
- }
|
|
|
- /************** ***********************************计算超短期日准确率均方根误差-end*****************************************************/
|
|
|
-
|
|
|
- /*************************************************计算超短期准确率-end*****************************************************/
|
|
|
- this.accuracyPassRateRepository.save(accuracyPassRate);
|
|
|
- this.accuracyPassRateDayRepository.save(accuracyPassRateDay);
|
|
|
-
|
|
|
-
|
|
|
- /************** ***********************************计算一体化短期准确率-start****************************************************/
|
|
|
- //一体化短期计算
|
|
|
- if (inForePowerShortTermCorrect.beanType().equals(StatusConstant.BEAN_TYPE_REAL)) {
|
|
|
- List<InForecastPowerShortTermHis> ifList = inForecastPowerShortTermHisService.findByForecastTimeAndForecastHowLongAgo(endTime, howLongAgoForDq);
|
|
|
- AccuracyPassRate iaccuracyPassRate = new AccuracyPassRate();
|
|
|
- iaccuracyPassRate.setTime(endTime);
|
|
|
- iaccuracyPassRate.setBackupA(StatusConstant.INTEGRATION_SIGN);
|
|
|
- if (pssdList != null && pssdList.size()>0 && ifList != null && ifList.size()>0) {
|
|
|
-
|
|
|
- pssdList.sort(Comparator.comparing(PowerStationStatusData::getTime).reversed());
|
|
|
- PowerStationStatusData powerStationStatusData = pssdList.get(0);
|
|
|
- BigDecimal pAbleValue = powerStationStatusData.getAbleValue();
|
|
|
- if(pAbleValue.floatValue()>=IAccuracyPassRateCalculate.ZERO.floatValue()){
|
|
|
- BigDecimal fAbleValue = ifList.get(0).getFpValue();
|
|
|
- String iaccuracy;
|
|
|
- //当预测功率为0时,实际功率在装机容量3%内不予考核,否者误差值为100%,也就是准确率为0
|
|
|
- if (fAbleValue.floatValue() == IAccuracyPassRateCalculate.ZERO.floatValue()) {
|
|
|
- if (pAbleValue.floatValue() <= compare.floatValue()) {
|
|
|
- iaccuracyPassRate.setShortTermAccuracy("不予考核");
|
|
|
- } else {
|
|
|
- iaccuracy = IAccuracyPassRateCalculate.ZERO.floatValue() + "%";
|
|
|
- iaccuracyPassRate.setShortTermAccuracy(iaccuracy);
|
|
|
- }
|
|
|
- //当实际功率为0时,预测功率在装机容量3%内不予考核,否者误差值为100%,也就是准确率为0
|
|
|
- } else if (pAbleValue.floatValue() == IAccuracyPassRateCalculate.ZERO.floatValue()) {
|
|
|
- if (fAbleValue.floatValue() <= compare.floatValue()) {
|
|
|
- iaccuracyPassRate.setShortTermAccuracy("不予考核");
|
|
|
- } else {
|
|
|
- iaccuracy = IAccuracyPassRateCalculate.ZERO.floatValue() + "%";
|
|
|
- iaccuracyPassRate.setShortTermAccuracy(iaccuracy);
|
|
|
- }
|
|
|
- } else {
|
|
|
- try {
|
|
|
- iaccuracy = CalculateMethod.calculateC3(fAbleValue,pAbleValue).toString()+"%";
|
|
|
- iaccuracyPassRate.setShortTermAccuracy(iaccuracy);
|
|
|
- } catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
- log.error("计算短期准确率错误");
|
|
|
- }
|
|
|
- }
|
|
|
- }else{
|
|
|
- iaccuracyPassRate.setShortTermAccuracy("无可用数据计算");
|
|
|
- }
|
|
|
- } else {
|
|
|
- iaccuracyPassRate.setShortTermAccuracy("无可用数据计算");
|
|
|
- }
|
|
|
- this.accuracyPassRateRepository.save(iaccuracyPassRate);
|
|
|
- }
|
|
|
- /************** ***********************************计算一体化短期准确率-end****************************************************/
|
|
|
- }
|
|
|
-
|
|
|
-}
|