|
|
@@ -193,24 +193,26 @@ public class SeIndicatorServiceImpl implements SeIndicatorService {
|
|
|
*/
|
|
|
private int[] countCurrentEvents(String id, Integer type,
|
|
|
LocalDateTime start, LocalDateTime end) {
|
|
|
- LambdaQueryWrapper<FhzgSeCurrentEvent> wrapper = new LambdaQueryWrapper<FhzgSeCurrentEvent>()
|
|
|
- .ge(FhzgSeCurrentEvent::getFirstOverTime, start)
|
|
|
- .lt(FhzgSeCurrentEvent::getFirstOverTime, end)
|
|
|
- .in(FhzgSeCurrentEvent::getAlarmType, "current_heavy", "current_overload");
|
|
|
+ QueryWrapper<FhzgSeCurrentEvent> qw = new QueryWrapper<>();
|
|
|
+ qw.select("COALESCE(SUM(CASE WHEN alarm_type = 'current_heavy' THEN 1 ELSE 0 END), 0) AS heavy",
|
|
|
+ "COALESCE(SUM(CASE WHEN alarm_type = 'current_overload' THEN 1 ELSE 0 END), 0) AS overload")
|
|
|
+ .ge("first_over_time", start)
|
|
|
+ .lt("first_over_time", end);
|
|
|
if (type == 2) {
|
|
|
- wrapper.eq(FhzgSeCurrentEvent::getCountyId, id);
|
|
|
+ qw.eq("county_id", id);
|
|
|
} else if (type == 3) {
|
|
|
- wrapper.eq(FhzgSeCurrentEvent::getSubsId, id);
|
|
|
+ qw.eq("subs_id", id);
|
|
|
} else if (type == 4) {
|
|
|
- wrapper.eq(FhzgSeCurrentEvent::getFeederId, id);
|
|
|
+ qw.eq("feeder_id", id);
|
|
|
}
|
|
|
|
|
|
- List<FhzgSeCurrentEvent> events = currentEventMapper.selectList(wrapper);
|
|
|
- int heavy = 0, overload = 0;
|
|
|
- for (FhzgSeCurrentEvent e : events) {
|
|
|
- if ("current_heavy".equals(e.getAlarmType())) heavy++;
|
|
|
- else if ("current_overload".equals(e.getAlarmType())) overload++;
|
|
|
+ List<Map<String, Object>> rows = currentEventMapper.selectMaps(qw);
|
|
|
+ if (rows == null || rows.isEmpty() || rows.get(0) == null) {
|
|
|
+ return new int[]{0, 0};
|
|
|
}
|
|
|
+ Map<String, Object> row = rows.get(0);
|
|
|
+ int heavy = ((Number) row.get("heavy")).intValue();
|
|
|
+ int overload = ((Number) row.get("overload")).intValue();
|
|
|
return new int[]{heavy, overload};
|
|
|
}
|
|
|
|
|
|
@@ -401,28 +403,41 @@ public class SeIndicatorServiceImpl implements SeIndicatorService {
|
|
|
* 今日供电能力:负载率从断面明细聚合,重过载次数从事件表统计
|
|
|
*/
|
|
|
private SeCapacityDashboardVO queryCapacityToday(String id, Integer type) {
|
|
|
- LocalDate today = LocalDate.now();
|
|
|
- LocalDateTime startTime = today.atStartOfDay();
|
|
|
+ LocalDateTime startTime = LocalDate.now().atStartOfDay();
|
|
|
LocalDateTime endTime = LocalDateTime.now();
|
|
|
|
|
|
- // 1. 负载率:从断面明细聚合(保持馈线96点时序)
|
|
|
- LambdaQueryWrapper<FhzgSeSnapshotDetail> snapshotWrapper = new LambdaQueryWrapper<FhzgSeSnapshotDetail>()
|
|
|
- .eq(FhzgSeSnapshotDetail::getDeviceType, "feeder")
|
|
|
- .isNotNull(FhzgSeSnapshotDetail::getLoadRate)
|
|
|
- .ge(FhzgSeSnapshotDetail::getSnapshotTime, startTime)
|
|
|
- .le(FhzgSeSnapshotDetail::getSnapshotTime, endTime);
|
|
|
- applySnapshotFilter(snapshotWrapper, id, type);
|
|
|
- List<FhzgSeSnapshotDetail> snapshots = snapshotDetailMapper.selectList(snapshotWrapper);
|
|
|
-
|
|
|
- SeCapacityDashboardVO vo;
|
|
|
- if (snapshots.isEmpty()) {
|
|
|
- vo = SeCapacityDashboardVO.builder().build();
|
|
|
- } else {
|
|
|
- vo = aggregateSnapshots(snapshots);
|
|
|
- // 馈线 → 附加96点时序
|
|
|
- if (type == 4) {
|
|
|
- vo.setLoadRateSeries(buildFeederTimeSeries(snapshots));
|
|
|
- }
|
|
|
+ // 1. 负载率:SQL 聚合一步到位(MAX/AVG),不再全量拉明细
|
|
|
+ QueryWrapper<FhzgSeSnapshotDetail> aggWrapper = new QueryWrapper<>();
|
|
|
+ aggWrapper.select("MAX(load_rate) AS max_load_rate",
|
|
|
+ "AVG(load_rate) AS avg_load_rate")
|
|
|
+ .eq("device_type", "feeder")
|
|
|
+ .isNotNull("load_rate")
|
|
|
+ .ge("snapshot_time", startTime)
|
|
|
+ .le("snapshot_time", endTime);
|
|
|
+ applySnapshotFilter(aggWrapper, id, type);
|
|
|
+ List<Map<String, Object>> aggRows = snapshotDetailMapper.selectMaps(aggWrapper);
|
|
|
+ SeCapacityDashboardVO vo = SeCapacityDashboardVO.builder().build();
|
|
|
+ if (aggRows != null && !aggRows.isEmpty() && aggRows.get(0) != null
|
|
|
+ && aggRows.get(0).get("max_load_rate") != null) {
|
|
|
+ Map<String, Object> row = aggRows.get(0);
|
|
|
+ vo.setMaxLoadRate(new BigDecimal(row.get("max_load_rate").toString()));
|
|
|
+ vo.setAvgLoadRate(new BigDecimal(row.get("avg_load_rate").toString())
|
|
|
+ .setScale(2, RoundingMode.HALF_UP));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 馈线 → 附加96点时序(仅 type=4 需要,限制列拉取)
|
|
|
+ if (type == 4) {
|
|
|
+ LambdaQueryWrapper<FhzgSeSnapshotDetail> seriesWrapper = new LambdaQueryWrapper<FhzgSeSnapshotDetail>()
|
|
|
+ .select(FhzgSeSnapshotDetail::getSnapshotTime, FhzgSeSnapshotDetail::getLoadRate,
|
|
|
+ FhzgSeSnapshotDetail::getCurrentValue, FhzgSeSnapshotDetail::getVoltageValue,
|
|
|
+ FhzgSeSnapshotDetail::getActivePower, FhzgSeSnapshotDetail::getReactivePower)
|
|
|
+ .eq(FhzgSeSnapshotDetail::getDeviceType, "feeder")
|
|
|
+ .eq(FhzgSeSnapshotDetail::getFeederId, id)
|
|
|
+ .isNotNull(FhzgSeSnapshotDetail::getLoadRate)
|
|
|
+ .ge(FhzgSeSnapshotDetail::getSnapshotTime, startTime)
|
|
|
+ .le(FhzgSeSnapshotDetail::getSnapshotTime, endTime);
|
|
|
+ List<FhzgSeSnapshotDetail> snapshots = snapshotDetailMapper.selectList(seriesWrapper);
|
|
|
+ vo.setLoadRateSeries(buildFeederTimeSeries(snapshots));
|
|
|
}
|
|
|
|
|
|
// 2. 重过载事件次数:从事件表统计
|
|
|
@@ -552,28 +567,6 @@ public class SeIndicatorServiceImpl implements SeIndicatorService {
|
|
|
return vo;
|
|
|
}
|
|
|
|
|
|
- /**
|
|
|
- * 内存聚合断面列表 → VO(today用,只算负载率,事件次数由 queryCapacityToday 从事件表统计)
|
|
|
- */
|
|
|
- private SeCapacityDashboardVO aggregateSnapshots(List<FhzgSeSnapshotDetail> snapshots) {
|
|
|
- BigDecimal maxLoadRate = snapshots.stream()
|
|
|
- .map(FhzgSeSnapshotDetail::getLoadRate)
|
|
|
- .filter(Objects::nonNull)
|
|
|
- .reduce(BigDecimal::max)
|
|
|
- .orElse(BigDecimal.ZERO);
|
|
|
-
|
|
|
- BigDecimal avgLoadRate = snapshots.stream()
|
|
|
- .map(FhzgSeSnapshotDetail::getLoadRate)
|
|
|
- .filter(Objects::nonNull)
|
|
|
- .reduce(BigDecimal.ZERO, BigDecimal::add)
|
|
|
- .divide(BigDecimal.valueOf(snapshots.size()), 2, RoundingMode.HALF_UP);
|
|
|
-
|
|
|
- return SeCapacityDashboardVO.builder()
|
|
|
- .maxLoadRate(maxLoadRate)
|
|
|
- .avgLoadRate(avgLoadRate)
|
|
|
- .build();
|
|
|
- }
|
|
|
-
|
|
|
/**
|
|
|
* 构建馈线今日96点时序(负载率+电流+电压+有功+无功)
|
|
|
*/
|
|
|
@@ -606,13 +599,13 @@ public class SeIndicatorServiceImpl implements SeIndicatorService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void applySnapshotFilter(LambdaQueryWrapper<FhzgSeSnapshotDetail> wrapper, String id, Integer type) {
|
|
|
+ private void applySnapshotFilter(QueryWrapper<FhzgSeSnapshotDetail> wrapper, String id, Integer type) {
|
|
|
if (type == 2) {
|
|
|
- wrapper.eq(FhzgSeSnapshotDetail::getCountyId, id);
|
|
|
+ wrapper.eq("county_id", id);
|
|
|
} else if (type == 3) {
|
|
|
- wrapper.eq(FhzgSeSnapshotDetail::getSubsId, id);
|
|
|
+ wrapper.eq("subs_id", id);
|
|
|
} else if (type == 4) {
|
|
|
- wrapper.eq(FhzgSeSnapshotDetail::getFeederId, id);
|
|
|
+ wrapper.eq("feeder_id", id);
|
|
|
}
|
|
|
}
|
|
|
|