|
|
@@ -178,8 +178,9 @@ public class VppBaselineServiceImpl implements VppBaselineService {
|
|
|
/**
|
|
|
* 查询站点响应申报容量和预估响应容量。
|
|
|
*
|
|
|
- * <p>公式:响应时段内同时间段历史负荷均值 × 修正系数 K × 执行时段小时数 / 2。</p>
|
|
|
- * <p>典型历史日、修正系数 K 计算规则与基线管理一致;历史均值仅取响应开始至结束时段。</p>
|
|
|
+ * <p>公式:响应时段内同时间段历史负荷均值 × 执行时段小时数 / 2。</p>
|
|
|
+ * <p>典型历史日选取规则(工作日 5 天 / 非工作日 3 天),剔除响应当日、历史响应日(vpp_dr_event 已结束)
|
|
|
+ * 及响应日 >= 今日。</p>
|
|
|
*/
|
|
|
@Override
|
|
|
public SiteDeclaredCapacityVO getSiteDeclaredCapacity(Long siteId,
|
|
|
@@ -201,7 +202,7 @@ public class VppBaselineServiceImpl implements VppBaselineService {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- Set<LocalDate> excludeDates = loadResponseHistoryDates();
|
|
|
+ Set<LocalDate> excludeDates = loadDeclaredCapacityExcludeDates();
|
|
|
boolean workday = VppBaselineHelper.isWorkdayResponse(responseDate);
|
|
|
result.setResponseDayType(VppWorkdayHelper.resolveDayType(responseDate));
|
|
|
result.setResponseDayTypeLabel(VppWorkdayHelper.resolveDayTypeLabel(responseDate));
|
|
|
@@ -209,26 +210,18 @@ public class VppBaselineServiceImpl implements VppBaselineService {
|
|
|
? VppBaselineHelper.WEEKDAY_REFERENCE_COUNT
|
|
|
: VppBaselineHelper.NON_WEEKDAY_REFERENCE_COUNT;
|
|
|
List<LocalDate> referenceDates = VppBaselineHelper.selectReferenceDates(
|
|
|
- responseDate, workday, excludeDates, requiredCount);
|
|
|
+ responseDate, workday, excludeDates, requiredCount, LocalDate.now());
|
|
|
result.setReferenceDates(referenceDates.stream()
|
|
|
.map(VppBaselineHelper::formatDate)
|
|
|
.collect(Collectors.toList()));
|
|
|
+ if (referenceDates.isEmpty()) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
|
|
|
- LocalDateTime correctionWindowStart = startTime.minusHours(VppBaselineHelper.CORRECTION_HOURS);
|
|
|
- Map<String, BigDecimal> correctionBaselineByTime = vppTsdbQueryService.queryBaselineAvgByTimePoint(
|
|
|
- deviceUuids,
|
|
|
- referenceDates,
|
|
|
- correctionWindowStart.toLocalTime(),
|
|
|
- startTime.toLocalTime(),
|
|
|
- VppBaselineHelper.POWER_METRICS,
|
|
|
- VppBaselineHelper.INTERVAL_MINUTES,
|
|
|
- null);
|
|
|
Map<String, BigDecimal> todayActualByTime = VppBaselineHelper.buildActualLoadByTimePoint(
|
|
|
vppTsdbQueryService.queryDeviceMetricHistory(
|
|
|
- deviceUuids, responseDate.atStartOfDay(), startTime, VppBaselineHelper.POWER_METRICS),
|
|
|
+ deviceUuids, responseDate.atStartOfDay(), endTime, VppBaselineHelper.POWER_METRICS),
|
|
|
VppBaselineHelper.INTERVAL_MINUTES);
|
|
|
- BigDecimal correctionFactorK = VppBaselineHelper.calculateCorrectionFactor(
|
|
|
- startTime, todayActualByTime, correctionBaselineByTime);
|
|
|
|
|
|
Map<String, BigDecimal> historicalAvgByTime = vppTsdbQueryService.queryBaselineAvgByTimePoint(
|
|
|
deviceUuids,
|
|
|
@@ -242,12 +235,12 @@ public class VppBaselineServiceImpl implements VppBaselineService {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
- result.setCorrectionFactorK(correctionFactorK);
|
|
|
result.setDeclaredCapacityKw(VppBaselineHelper.calculateDeclaredCapacityKw(
|
|
|
- historicalAvgByTime, startTime, endTime, correctionFactorK));
|
|
|
- result.setEstimatedResponseCapacityKw(VppBaselineHelper.calculateEstimatedResponseCapacityKw(todayActualByTime, startTime, endTime));
|
|
|
+ historicalAvgByTime, startTime, endTime));
|
|
|
+ result.setEstimatedResponseCapacityKw(VppBaselineHelper.calculateEstimatedResponseCapacityKw(
|
|
|
+ todayActualByTime, startTime, endTime));
|
|
|
result.setPoints(VppBaselineHelper.buildDeclaredCapacityPoints(
|
|
|
- historicalAvgByTime, startTime, endTime, correctionFactorK));
|
|
|
+ historicalAvgByTime, startTime, endTime));
|
|
|
result.setDataSource("tsdb");
|
|
|
return result;
|
|
|
}
|
|
|
@@ -257,15 +250,13 @@ public class VppBaselineServiceImpl implements VppBaselineService {
|
|
|
LocalDate responseDate,
|
|
|
LocalDateTime startTime,
|
|
|
LocalDateTime endTime) {
|
|
|
- BigDecimal correctionFactorK = VppBaselineHelper.mockCorrectionFactor(siteId, responseDate);
|
|
|
result.setReferenceDates(new ArrayList<>());
|
|
|
result.setResponseDayType(VppWorkdayHelper.resolveDayType(responseDate));
|
|
|
result.setResponseDayTypeLabel(VppWorkdayHelper.resolveDayTypeLabel(responseDate));
|
|
|
- result.setCorrectionFactorK(correctionFactorK);
|
|
|
result.setDeclaredCapacityKw(VppBaselineHelper.mockDeclaredCapacityKw(
|
|
|
- siteId, responseDate, startTime, endTime, correctionFactorK));
|
|
|
+ siteId, responseDate, startTime, endTime));
|
|
|
result.setPoints(VppBaselineHelper.buildMockDeclaredCapacityPoints(
|
|
|
- siteId, responseDate, startTime, endTime, correctionFactorK));
|
|
|
+ siteId, responseDate, startTime, endTime));
|
|
|
result.setDataSource("mock");
|
|
|
return result;
|
|
|
}
|
|
|
@@ -325,17 +316,27 @@ public class VppBaselineServiceImpl implements VppBaselineService {
|
|
|
}
|
|
|
|
|
|
private Set<LocalDate> loadResponseHistoryDates() {
|
|
|
+ return new HashSet<>(loadCompleteResponseDates());
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 申报容量参考日剔除:历史响应日(vpp_dr_event 已结束)。 */
|
|
|
+ private Set<LocalDate> loadDeclaredCapacityExcludeDates() {
|
|
|
+ return loadResponseHistoryDates();
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 已结束需求响应事件的起始日期(历史完整响应日)。 */
|
|
|
+ private List<LocalDate> loadCompleteResponseDates() {
|
|
|
List<VppDrEvent> events = drEventMapper.selectList(
|
|
|
new LambdaQueryWrapper<VppDrEvent>()
|
|
|
.eq(VppDrEvent::getEventStatus, EVENT_STATUS_ENDED)
|
|
|
.eq(VppDrEvent::getDeleteFlag, VppAuditHelper.NOT_DELETED));
|
|
|
- Set<LocalDate> dates = new HashSet<>();
|
|
|
+ Set<LocalDate> dates = new LinkedHashSet<>();
|
|
|
for (VppDrEvent event : events) {
|
|
|
if (event.getStartTime() != null) {
|
|
|
dates.add(event.getStartTime().toLocalDate());
|
|
|
}
|
|
|
}
|
|
|
- return dates;
|
|
|
+ return new ArrayList<>(dates);
|
|
|
}
|
|
|
|
|
|
private VppSite resolveSite(Long siteId) {
|