Parcourir la source

修改实际功率业务逻辑

xusl il y a 3 ans
Parent
commit
e8659d2902

+ 0 - 2
ipfcst-common/ipfcst-common-data/src/main/java/com/jiayue/ipfcst/common/data/repository/PowerStationStatusDataRepository.java

@@ -30,6 +30,4 @@ public interface PowerStationStatusDataRepository extends BaseRepository<PowerSt
 	 * @return 结果集
 	 */
 	PowerStationStatusData findByTime(Date queryTime);
-
-	List<PowerStationStatusData> findByTimeBetween(Date startTime, Date endTime);
 }

+ 41 - 25
ipfcst-console/src/main/java/com/jiayue/ipfcst/console/service/ForecastPowerUltraShortTermService.java

@@ -218,23 +218,23 @@ public class ForecastPowerUltraShortTermService extends BaseService {
         String stationCode = electricField.getStationCode();
         // 根据场站类型执行相应超短期预测
         try {
-          String cdqUpMin = super.getSysParameter("CDQ_UP_MIN", "0", stationCode);
-          Long currentTime = System.currentTimeMillis() + (long) Integer.parseInt(cdqUpMin) * 1000 * 60;
-          String llcdq_point = sysParameterService.getSysParameter("FILE_LLCDQ_POINT", "16", stationCode);
-          int forecastPoints = Integer.parseInt(llcdq_point);
-          int forecastMinutes = forecastPoints * 15;
-
-          // 超短期提前N分钟生成文件
-          Long startTime = DateMomentUtil.getMomentTime(currentTime, 1, 15 * 60 * 1000L);
+          // 获取查询时间,从当前时间所处时间点标记时间开始查询,截至到96个时间点对应的标记时间
+          String cdqUpMin = super.getSysParameter("CDQ_UP_MIN", "0",stationCode);
+          Long calTime = DateMomentUtil.getMomentTime(System.currentTimeMillis() + Integer.parseInt(cdqUpMin) * 1000 * 60, 1, 15 * 60 * 1000L);
+          Long startTime = calTime + 15 * 1000 * 60L;
+          String llcdq_point = sysParameterService.getSysParameter("FILE_LLCDQ_POINT", "16",stationCode);
+          Integer forecastPoints = Integer.parseInt(llcdq_point);
+          Integer forecastMinutes = forecastPoints * 15;
           // 结束时间增加15分钟为了防止文件先生成,实时表中最后一个时间点没有点位的问题
           Long endTime = DateUtils.addMinutes(new Date(startTime), forecastMinutes).getTime() + 1000 * 60 * 15L;
+
           // 查询该时间段内的短期预测功率
-          List<ForecastPowerShortTerm> forecastPowerShortTermList = this.forecastPowerShortTermRepository.findByForecastTimeBetweenAndStationCode(startTime, endTime, stationCode);
+          List<ForecastPowerShortTerm> forecastPowerShortTermList = this.forecastPowerShortTermRepository.findByForecastTimeBetweenAndStationCode(startTime, endTime,stationCode);
           Map<Long, List<ForecastPowerShortTerm>> forecastPowerShortTermsMap =
             forecastPowerShortTermList.stream().collect(Collectors.groupingBy(ForecastPowerShortTerm::getForecastTime));
           Map<Long, BigDecimal> openCapacityMap = null;
           try {
-            openCapacityMap =  super.queryOpenCapacity(startTime, endTime, electricField.getCapacity(), stationCode);
+            openCapacityMap = super.queryOpenCapacity(startTime, endTime, electricField.getCapacity(),stationCode);
           } catch (BusinessException e) {
             log.error("预测数据生成获取开机容量出错:" + CommonUtil.printStackTraceToString(e));
           }
@@ -243,11 +243,11 @@ public class ForecastPowerUltraShortTermService extends BaseService {
           for (Long tempTime = startTime; tempTime <= endTime; tempTime = tempTime + 15 * 60 * 1000L) {
             if (forecastPowerShortTermsMap.get(tempTime) == null) {
               // 缺失时间点
-              ForecastPowerShortTerm forecastPowerShortTerms;
+              ForecastPowerShortTerm forecastPowerShortTerms = null;
               if (ElectricFieldTypeEnum.E1.compareTo(electricField.getElectricFieldTypeEnum()) == 0) {
-                forecastPowerShortTerms = forecastPowerShortTermService.generateSolarPowerShortTerm(tempTime, openCapacityMap != null ? openCapacityMap.get(tempTime) : electricField.getCapacity(), electricField);
+                forecastPowerShortTerms = forecastPowerShortTermService.generateSolarPowerShortTerm(tempTime, openCapacityMap.get(tempTime), electricField);
               } else {
-                forecastPowerShortTerms = forecastPowerShortTermService.generateWindPowerShortTerm(tempTime, openCapacityMap != null ? openCapacityMap.get(tempTime) : electricField.getCapacity(), stationCode);
+                forecastPowerShortTerms = forecastPowerShortTermService.generateWindPowerShortTerm(tempTime, openCapacityMap.get(tempTime),stationCode);
               }
               addForecastPowerShortTermList.add(forecastPowerShortTerms);
             }
@@ -262,10 +262,10 @@ public class ForecastPowerUltraShortTermService extends BaseService {
 
           if (ElectricFieldTypeEnum.E1.compareTo(electricField.getElectricFieldTypeEnum()) == 0) {
             // 光伏电站
-            this.executeForecastForlight(forecastPowerShortTermList, electricField.getCapacity(), stationCode);
+            this.executeForecastForlight(forecastPowerShortTermList, electricField.getCapacity(),stationCode);
           } else if (ElectricFieldTypeEnum.E2.compareTo(electricField.getElectricFieldTypeEnum()) == 0) {
             // 风力电场
-            this.executeForecastForWind(forecastPowerShortTermList, electricField.getCapacity(), stationCode);
+            this.executeForecastForWind(forecastPowerShortTermList, electricField.getCapacity(),stationCode);
           } else {
             log.error("场站类型非法!");
           }
@@ -292,13 +292,10 @@ public class ForecastPowerUltraShortTermService extends BaseService {
     String cdqjsfs = electricFieldService.getSysParameter("cdqjsfs", "1", stationCode);
     log.info("参数cdqjsfs值为:" + cdqjsfs + ",超短期计算方式,0为默认乘系数的方式,1为根据可用功率计算的方式。");
     BigDecimal stPower, ustPower, ustPowers;
-    // 判断查询可用功率结果是否为空,如果不为空根据平均可用功率与短期预测结果的偏差值进行计算超短期结果,否则超短期=短期*随机系数
-    // 查询当前时间点标记时间前10分钟的可用功率
-    ForecastPowerShortTerm currentForecastPowerShortTerm = forecastPowerShortTermList.get(0);
-    Date currentTime = new Date(currentForecastPowerShortTerm.getForecastTime());
+    Date currentTime = new Date(System.currentTimeMillis());
     Date startTime = DateUtils.addMinutes(currentTime, -10);
     Date endTime = DateUtils.addMinutes(currentTime, 1);
-    List<PowerStationStatusData> powerStationStatusDataList = this.powerStationStatusDataRepository.findByTimeBetweenAndStationCode(startTime, endTime, stationCode);
+    List<PowerStationStatusData> powerStationStatusDataList = this.powerStationStatusDataRepository.findByTimeBetweenAndStationCode(startTime, endTime,stationCode);
     List<PowerStationStatusData> filterList = powerStationStatusDataList.stream().filter(t -> t.getAbleValue().compareTo(new BigDecimal("-1")) > 0).collect(Collectors.toList());
     String coe = super.getSysParameter("CDQ_COE", "1.05", stationCode);
 
@@ -308,13 +305,32 @@ public class ForecastPowerUltraShortTermService extends BaseService {
     } catch (Exception e) {
       log.error("获取当前时刻错误", e);
     }
+    String llcdq_point = sysParameterService.getSysParameter("FILE_LLCDQ_POINT", "16",stationCode);
+    Integer forecastPoints = Integer.parseInt(llcdq_point);
     if (filterList.size() > 0) {
+      // 获取当前时刻对应的短期
+      List<ForecastPowerShortTerm> currentForecastPowerShortTermList;
+      BigDecimal currentForecastPowerValue = BigDecimal.ZERO;
+      try {
+        Long currentMoment = DateMomentUtil.getMomentTime(currentTime.getTime(), 1, 15 * 60 * 1000L);
+        currentForecastPowerShortTermList = this.forecastPowerShortTermRepository.findByForecastTimeBetweenAndStationCode(currentMoment, currentMoment,stationCode);
+        if (currentForecastPowerShortTermList.size()<=0){
+          currentForecastPowerValue = currentForecastPowerShortTermList.get(0).getFpValue();
+        }
+        else{
+          // 当前时间没有对应的短期,用实际功率最近的一个替换
+          filterList.sort(Comparator.comparing(PowerStationStatusData::getTime).reversed());
+          currentForecastPowerValue = filterList.get(0).getAbleValue();
+        }
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
       BigDecimal sumAbleValue = filterList.stream().map(PowerStationStatusData::getAbleValue)
         .reduce(BigDecimal.ZERO, BigDecimal::add);
       BigDecimal averageAbleValue = sumAbleValue.divide(new BigDecimal(filterList.size()), 2, RoundingMode.HALF_UP);
       //可用-短期差值
-      BigDecimal deviationValue = averageAbleValue.subtract(currentForecastPowerShortTerm.getFpValue());
-      for (int i = 1; i < forecastPowerShortTermList.size(); i++) {
+      BigDecimal deviationValue = averageAbleValue.subtract(currentForecastPowerValue);
+      for (int i = 0; i < forecastPoints; i++) {
         forecastPowerUltraShortTerm = new ForecastPowerUltraShortTerm();
         forecastPowerUltraShortTerm.setForecastTime(forecastPowerShortTermList.get(i).getForecastTime());
         forecastPowerUltraShortTerm.setGenDate(new Date(monentTime));
@@ -357,10 +373,10 @@ public class ForecastPowerUltraShortTermService extends BaseService {
         forecastPowerUltraShortTermList.add(forecastPowerUltraShortTerm);
       }
     } else {
-      log.info("库中没有可用,本次可用计算数据采用短期*系数的方式生成数据");
+      log.info(stationCode+"库中没有可用,本次可用计算数据采用短期*系数的方式生成数据");
 
       // 短期乘以系数
-      for (int i = 1; i < forecastPowerShortTermList.size(); i++) {
+      for (int i = 1; i < forecastPoints; i++) {
         stPower = forecastPowerShortTermList.get(i).getFpValue();
         ustPower = stPower.multiply(new BigDecimal(coe)).setScale(2, RoundingMode.HALF_UP);
         forecastPowerUltraShortTerm = new ForecastPowerUltraShortTerm();
@@ -375,7 +391,7 @@ public class ForecastPowerUltraShortTermService extends BaseService {
       }
     }
     // 保存超短期预测结果
-    this.forecastPowerUltraShortTermRepository.deleteByForecastTimeBetweenAndStationCode(forecastPowerShortTermList.get(1).getForecastTime(), forecastPowerShortTermList.get(forecastPowerShortTermList.size() - 1).getForecastTime(), stationCode);
+    this.forecastPowerUltraShortTermRepository.deleteByForecastTimeBetweenAndStationCode(forecastPowerUltraShortTermList.get(0).getForecastTime(), forecastPowerUltraShortTermList.get(forecastPoints - 1).getForecastTime(), stationCode);
     this.forecastPowerUltraShortTermRepository.saveAll(forecastPowerUltraShortTermList);
 
   }