| | |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.StringUtils; |
| | | |
| | | import java.time.LocalDate; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | |
| | | throw new ServiceException("统计维度无效,支持 hour/day/month/quarter/year"); |
| | | } |
| | | |
| | | if ("day".equals(dimension)) { |
| | | return getDayDimensionSummary(startTime, endTime); |
| | | } |
| | | |
| | | List<StatisticEleRecordVo> detailRecords = aggregateFromHour(dimension, startTime, endTime, true); |
| | | List<StatisticEleRecordVo> chartRecords = aggregateFromHour(dimension, startTime, endTime, false); |
| | | return buildSummary(detailRecords, chartRecords); |
| | | } |
| | | |
| | | /** |
| | | * 天维度汇总:单日用小时级数据计算均值/极值并展示 24 小时趋势;多日按日桶对比。 |
| | | */ |
| | | private StatisticEleSummaryVo getDayDimensionSummary(String startTime, String endTime) { |
| | | HourRange range = StatisticEleAggregateUtil.toHourQueryRange("day", startTime, endTime); |
| | | List<StatisticEleRecordVo> hourRecords = queryHourRecords(range.startTime(), range.endTime()); |
| | | List<StatisticEleRecordVo> detailRecords = StatisticEleAggregateUtil.aggregateHourPerMeter( |
| | | hourRecords, StatisticEleAggregateUtil.HOUR_TO_DAY); |
| | | |
| | | boolean singleDay = startTime.equals(endTime); |
| | | List<StatisticEleRecordVo> chartRecords = singleDay |
| | | ? StatisticEleAggregateUtil.aggregateHourToBuckets(hourRecords, StatisticEleAggregateUtil.HOUR_TO_HOUR) |
| | | : StatisticEleAggregateUtil.aggregateHourToBuckets(hourRecords, StatisticEleAggregateUtil.HOUR_TO_DAY); |
| | | |
| | | return buildSummary(detailRecords, chartRecords); |
| | | } |
| | | |
| | |
| | | |
| | | @Override |
| | | public StatisticEleSummaryVo getYesterdaySummary() { |
| | | HourRange range = StatisticEleAggregateUtil.yesterdayHourRange(); |
| | | List<StatisticEleRecordVo> records = queryHourRecords(range.startTime(), range.endTime()); |
| | | List<StatisticEleRecordVo> chartRecords = StatisticEleAggregateUtil.aggregateHourToBuckets( |
| | | records, StatisticEleAggregateUtil.HOUR_TO_HOUR); |
| | | StatisticEleSummaryVo summary = buildSummary(records, chartRecords); |
| | | summary.setTotalConsumption(round(StatisticEleAggregateUtil.sumRecordsTotal(records))); |
| | | return summary; |
| | | } |
| | | |
| | | private static double round(double value) { |
| | | return Math.round(value * 100.0) / 100.0; |
| | | String day = LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern("yyyyMMdd")); |
| | | return getDayDimensionSummary(day, day); |
| | | } |
| | | |
| | | @Override |
| | |
| | | private List<StatisticEleRecordVo> queryHourRecords(String startTime, String endTime) { |
| | | String normalizedStart = StatisticEleAggregateUtil.normalizeQueryStartTimeKey(startTime); |
| | | String normalizedEnd = StatisticEleAggregateUtil.normalizeQueryEndTimeKey(endTime); |
| | | return eleRecordMapper.selectRecordList(DATA_DIMENSIONS, normalizedStart, normalizedEnd); |
| | | List<StatisticEleRecordVo> records = eleRecordMapper.selectRecordList(DATA_DIMENSIONS, normalizedStart, normalizedEnd); |
| | | StatisticEleAggregateUtil.normalizeConsumptions(records); |
| | | return records; |
| | | } |
| | | |
| | | private List<StatisticEleRecordVo> aggregateFromHour( |