diff --git a/src/main/java/com/southern/power/grid/controller/DnerController.java b/src/main/java/com/southern/power/grid/controller/DnerController.java index f64fa3a..faa50fc 100644 --- a/src/main/java/com/southern/power/grid/controller/DnerController.java +++ b/src/main/java/com/southern/power/grid/controller/DnerController.java @@ -43,36 +43,46 @@ public class DnerController { /** * 分时图数据查询 * + * @param province 省 + * @param city 城市 * @param orgCode 地区编码 - * @param startDate 开始时间 - * @param endDate 结束时间 + * @param startDate 开始时间 格式 yyyy-MM-dd hh:mm:ss + * @param endDate 结束时间 格式 yyyy-MM-dd hh:mm:ss + * @param eventId 事件ID * @return 返回结果 */ @GetMapping("/intraday/query") - public Result queryIntradayData(@RequestParam String orgCode, + public Result queryIntradayData(@RequestParam String province, + @RequestParam String city, + @RequestParam String orgCode, @RequestParam String startDate, @RequestParam String endDate, @RequestParam String eventId) { return Result.success(dnerHourlyPowerOutageEventService.queryIntradayData( - orgCode, startDate, endDate, eventId)); + province, city, orgCode, startDate, endDate, eventId)); } /** * K线数据查询 * + * @param province 省 + * @param city 城市 * @param orgCode 地区编码 - * @param startDate 开始时间 - * @param endDate 结束时间 + * @param startDate 开始时间 格式 yyyy-MM-dd + * @param endDate 结束时间 格式 yyyy-MM-dd + * @param eventId 事件ID * @return 返回结果 */ @GetMapping("/kline/query") - public Result queryKlineData(@RequestParam String orgCode, + public Result queryKlineData(@RequestParam String province, + @RequestParam String city, + @RequestParam String orgCode, @RequestParam String startDate, @RequestParam String endDate, @RequestParam String eventId) { return Result.success(dnerDailyPowerOutageEventService.queryKlineData( - orgCode, startDate, endDate, eventId)); + province, city, orgCode, startDate, endDate, eventId)); } /** @@ -98,6 +108,6 @@ public class DnerController { */ @GetMapping("/sync/dailyPowerOutageEvent") public Result syncDailyPowerOutageEvent(@RequestParam String startDate, @RequestParam String endDate, @RequestParam Long eventId) { - return Result.success(dnerDailyPowerOutageEventSyncService.processingData(startDate, endDate,eventId)); + return Result.success(dnerDailyPowerOutageEventSyncService.processingData(startDate, endDate, eventId)); } } diff --git a/src/main/java/com/southern/power/grid/service/IDnerDailyPowerOutageEventService.java b/src/main/java/com/southern/power/grid/service/IDnerDailyPowerOutageEventService.java index ee24465..6d2a26f 100644 --- a/src/main/java/com/southern/power/grid/service/IDnerDailyPowerOutageEventService.java +++ b/src/main/java/com/southern/power/grid/service/IDnerDailyPowerOutageEventService.java @@ -14,11 +14,13 @@ public interface IDnerDailyPowerOutageEventService extends IService dataList = dnerDailyPowerOutageEventMapper.selectListByConditions( - orgCode, beforeNumDays, endDate, eventId); - Map dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap( - DnerDailyPowerOutageEvent::getDataTime, Function.identity(), (k1, k2) -> k1)); + code, beforeNumDays, endDate, eventId); + Map> dateTimeAndEntityMap = dataList.stream() + .collect(Collectors.groupingBy(DnerDailyPowerOutageEvent::getDataTime)); DailyPowerOutageEventVO result = new DailyPowerOutageEventVO(); result.initList(); List dateTimeList = TimeUtil.getBetweenDates(startDate, endDate); // 获取开始时间到结束时间每一天的数组 dateTimeList.forEach(e -> { // 遍历开始时间和结束时间的日期 - DnerDailyPowerOutageEvent event = dateTimeAndEntityMap.get(e); - if (Objects.isNull(event)) { // 数据为空,全部默认为0值 + List events = dateTimeAndEntityMap.get(e); + if (CollectionUtil.isEmpty(events)) { // 数据为空,全部默认为0值 setZeroData(result, dateTimeAndEntityMap, e); } else { // 数据不为空,正常赋值 - setDailyData(event, result, dateTimeAndEntityMap); + setDailyData(e,events, result, dateTimeAndEntityMap); } }); result.setFullDates(dateTimeList.stream().map( @@ -60,6 +60,19 @@ public class DnerDailyPowerOutageEventServiceImpl return result; } + private String getCode(String province, String city, String orgCode) { + if (StringUtils.hasLength(orgCode)) { + return orgCode; + } + if (StringUtils.hasLength(city)) { + return city.length() >= 4 ? city.substring(0, 4) : city; + } + if (StringUtils.hasLength(province)) { + return province.length() >= 2 ? province.substring(0, 2) : province; + } + return null; + } + private static void handleYScaleRule(DailyPowerOutageEventVO result) { List kLineList = new ArrayList<>(); result.getUserKline().getKline().forEach(kLineList::addAll); @@ -149,43 +162,85 @@ public class DnerDailyPowerOutageEventServiceImpl return collectVOList; } - private static void setDailyData(DnerDailyPowerOutageEvent event, DailyPowerOutageEventVO result, - Map dateTimeAndEntityMap) { - result.getCumulativeRain().add(Double.valueOf(event.getDailyPrecipitation())); - result.getAvgRain().add(Double.valueOf(event.getHourlyPrecipitation())); - result.getAvgTemp().add(Double.valueOf(event.getTemperature())); - result.getMaxTemp().add(Double.valueOf(event.getHourlyMaxTemperature())); - result.getMinTemp().add(Double.valueOf(event.getHourlyMinTemperature())); + private static void setDailyData(String dataTime, List events, DailyPowerOutageEventVO result, + Map> dateTimeAndEntityMap) { + // 聚合天气数据 - 取平均值 + double dailyPrecipitationSum = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getDailyPrecipitation())) + .average().orElse(0.0); + double hourlyPrecipitationSum = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getHourlyPrecipitation())) + .average().orElse(0.0); + double temperatureSum = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getTemperature())) + .average().orElse(0.0); + double hourlyMaxTemp = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getHourlyMaxTemperature())) + .average().orElse(0.0); + double hourlyMinTemp = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getHourlyMinTemperature())) + .average().orElse(0.0); + double extremeWindSpeed = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getExtremeWindSpeedHourly())) + .average().orElse(0.0); + + result.getCumulativeRain().add(dailyPrecipitationSum); + result.getAvgRain().add(hourlyPrecipitationSum); + result.getAvgTemp().add(temperatureSum); + result.getMaxTemp().add(hourlyMaxTemp); + result.getMinTemp().add(hourlyMinTemp); + result.getWindSpeed().add(extremeWindSpeed); + + // 聚合用户数数据 - 求和 + int userCountSum = events.stream().mapToInt(DnerDailyPowerOutageEvent::getUserCount).sum(); + int faultUserCountSum = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultUserCount).sum(); + int scheduledUserCountSum = events.stream().mapToInt(DnerDailyPowerOutageEvent::getScheduledUserCount).sum(); + + result.getUserCounts().add(userCountSum); + result.getFaultUserCountList().add(faultUserCountSum); + result.getScheduledUserCountList().add(scheduledUserCountSum); + + // 聚合K线数据 - OHLC (Open, High, Low, Close) // 总的 - result.getUserKline().getKline().add(Arrays.asList(event.getStarUserCount(), event.getEndUserCount(), - event.getMinUserCount(), event.getMaxUserCount())); - result.getUserKline().getMa5().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 5, 0)); - result.getUserKline().getMa10().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 10, 0)); - result.getUserKline().getMa20().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 20, 0)); - result.getUserKline().getMa30().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 30, 0)); + int starUserCountOpen = events.stream().mapToInt(DnerDailyPowerOutageEvent::getStarUserCount).sum(); + int endUserCountClose = events.stream().mapToInt(DnerDailyPowerOutageEvent::getEndUserCount).sum(); + int minUserCountLow = events.stream().mapToInt(DnerDailyPowerOutageEvent::getMinUserCount).sum(); + int maxUserCountHigh = events.stream().mapToInt(DnerDailyPowerOutageEvent::getMaxUserCount).sum(); + result.getUserKline().getKline().add(Arrays.asList(starUserCountOpen, endUserCountClose, + minUserCountLow, maxUserCountHigh)); + result.getUserKline().getMa5().add(getMa(dataTime, dateTimeAndEntityMap, 5, 0)); + result.getUserKline().getMa10().add(getMa(dataTime, dateTimeAndEntityMap, 10, 0)); + result.getUserKline().getMa20().add(getMa(dataTime, dateTimeAndEntityMap, 20, 0)); + result.getUserKline().getMa30().add(getMa(dataTime, dateTimeAndEntityMap, 30, 0)); + // 计划 - result.getFaultUserKline().getKline().add(Arrays.asList(event.getFaultStarUserCount(), - event.getFaultEndUserCount(), event.getFaultMinUserCount(), event.getFaultMaxUserCount())); - result.getFaultUserKline().getMa5().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 5, 1)); - result.getFaultUserKline().getMa10().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 10, 1)); - result.getFaultUserKline().getMa20().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 20, 1)); - result.getFaultUserKline().getMa30().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 30, 1)); + int faultStarUserCountOpen = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultStarUserCount).sum(); + int faultEndUserCountClose = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultEndUserCount).sum(); + int faultMinUserCountLow = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultMinUserCount).sum(); + int faultMaxUserCountHigh = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultMaxUserCount).sum(); + result.getFaultUserKline().getKline().add(Arrays.asList(faultStarUserCountOpen, + faultEndUserCountClose, faultMinUserCountLow, faultMaxUserCountHigh)); + result.getFaultUserKline().getMa5().add(getMa(dataTime, dateTimeAndEntityMap, 5, 1)); + result.getFaultUserKline().getMa10().add(getMa(dataTime, dateTimeAndEntityMap, 10, 1)); + result.getFaultUserKline().getMa20().add(getMa(dataTime, dateTimeAndEntityMap, 20, 1)); + result.getFaultUserKline().getMa30().add(getMa(dataTime, dateTimeAndEntityMap, 30, 1)); + // 故障 + int scheduledStarUserCountOpen = events.stream().mapToInt(DnerDailyPowerOutageEvent::getScheduledStarUserCount).sum(); + int scheduledEndUserCountClose = events.stream().mapToInt(DnerDailyPowerOutageEvent::getScheduledEndUserCount).sum(); + int scheduledMinUserCountLow = events.stream().mapToInt(DnerDailyPowerOutageEvent::getScheduledMinUserCount).sum(); + int scheduledMaxUserCountHigh = events.stream().mapToInt(DnerDailyPowerOutageEvent::getScheduledMaxUserCount).sum(); result.getScheduledUserKline().getKline().add(Arrays.asList( - event.getScheduledStarUserCount(), event.getScheduledEndUserCount(), - event.getScheduledMinUserCount(), event.getScheduledMaxUserCount())); - result.getScheduledUserKline().getMa5().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 5, 2)); - result.getScheduledUserKline().getMa10().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 10, 2)); - result.getScheduledUserKline().getMa20().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 20, 2)); - result.getScheduledUserKline().getMa30().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 30, 2)); - result.getWindSpeed().add(Double.valueOf(event.getExtremeWindSpeedHourly())); - result.getUserCounts().add(event.getUserCount()); - result.getFaultUserCountList().add(event.getFaultUserCount()); - result.getScheduledUserCountList().add(event.getScheduledUserCount()); + scheduledStarUserCountOpen, scheduledEndUserCountClose, + scheduledMinUserCountLow, scheduledMaxUserCountHigh)); + result.getScheduledUserKline().getMa5().add(getMa(dataTime, dateTimeAndEntityMap, 5, 2)); + result.getScheduledUserKline().getMa10().add(getMa(dataTime, dateTimeAndEntityMap, 10, 2)); + result.getScheduledUserKline().getMa20().add(getMa(dataTime, dateTimeAndEntityMap, 20, 2)); + result.getScheduledUserKline().getMa30().add(getMa(dataTime, dateTimeAndEntityMap, 30, 2)); } private static void setZeroData(DailyPowerOutageEventVO result, - Map dateTimeAndEntityMap, + Map> dateTimeAndEntityMap, String dataTime) { List klineE = Arrays.asList(0, 0, 0, 0); result.getCumulativeRain().add(0.0); @@ -218,34 +273,46 @@ public class DnerDailyPowerOutageEventServiceImpl } private static int getMa(String dataTime, - Map dateTimeAndEntityMap, + Map> dateTimeAndEntityMap, int maNum, int maType) { int userCount = 0; List maDateList = TimeUtil.getBetweenDates( TimeUtil.getBeforeNumDays(dataTime, maNum - 1), dataTime); if (1 == maType) { // 故障类 for (String date : maDateList) { - DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date); - if (!Objects.isNull(outageEvent)) { - userCount += outageEvent.getFaultEndUserCount(); + List outageEvents = dateTimeAndEntityMap.get(date); + if (!CollectionUtil.isEmpty(outageEvents)) { + // 对每日的故障用户数求和 + int dailyFaultUserCount = outageEvents.stream() + .mapToInt(DnerDailyPowerOutageEvent::getFaultEndUserCount) + .sum(); + userCount += dailyFaultUserCount; } } return (userCount + maNum - 1)/maNum; // 向上取整 } if (2 == maType) { // 计划类 for (String date : maDateList) { - DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date); - if (!Objects.isNull(outageEvent)) { - userCount += outageEvent.getScheduledEndUserCount(); + List outageEvents = dateTimeAndEntityMap.get(date); + if (!CollectionUtil.isEmpty(outageEvents)) { + // 对每日的计划用户数求和 + int dailyScheduledUserCount = outageEvents.stream() + .mapToInt(DnerDailyPowerOutageEvent::getScheduledEndUserCount) + .sum(); + userCount += dailyScheduledUserCount; } } return (userCount + maNum - 1)/maNum; } // 总的 for (String date : maDateList) { - DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date); - if (!Objects.isNull(outageEvent)) { - userCount += outageEvent.getEndUserCount(); + List outageEvents = dateTimeAndEntityMap.get(date); + if (!CollectionUtil.isEmpty(outageEvents)) { + // 对每日的总用户数求和 + int dailyUserCount = outageEvents.stream() + .mapToInt(DnerDailyPowerOutageEvent::getEndUserCount) + .sum(); + userCount += dailyUserCount; } } return (userCount + maNum - 1)/maNum; diff --git a/src/main/java/com/southern/power/grid/service/impl/DnerHourlyPowerOutageEventServiceImpl.java b/src/main/java/com/southern/power/grid/service/impl/DnerHourlyPowerOutageEventServiceImpl.java index cfc4067..21c2f00 100644 --- a/src/main/java/com/southern/power/grid/service/impl/DnerHourlyPowerOutageEventServiceImpl.java +++ b/src/main/java/com/southern/power/grid/service/impl/DnerHourlyPowerOutageEventServiceImpl.java @@ -12,12 +12,15 @@ import com.southern.power.grid.utils.ToolUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.function.Function; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -35,23 +38,24 @@ public class DnerHourlyPowerOutageEventServiceImpl private DnerHourlyPowerOutageEventMapper dnerHourlyPowerOutageEventMapper; @Override - public HourlyPowerOutageEventChartVO queryIntradayData(String orgCode, String startDate, String endDate, String eventId) { + public HourlyPowerOutageEventChartVO queryIntradayData(String province, String city, String orgCode, String startDate, String endDate, String eventId) { startDate = startDate.substring(0, 13) + ":00"; endDate = endDate.substring(0, 13) + ":00"; + String code = getCode(province, city, orgCode); List dataList = dnerHourlyPowerOutageEventMapper.selectListByConditions( - orgCode, startDate, endDate, eventId); - Map dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap( - DnerHourlyPowerOutageEvent::getDataTime, Function.identity(), (k1, k2) -> k1)); + code, startDate, endDate, eventId); + Map> dateTimeAndEntityMap = dataList.stream() + .collect(Collectors.groupingBy(DnerHourlyPowerOutageEvent::getDataTime)); HourlyPowerOutageEventChartVO result = new HourlyPowerOutageEventChartVO(); result.initList(); List dateTimeList = TimeUtil.generateHourListAll(startDate, endDate); // 获取开始时间到结束时间的小时数组 dateTimeList.forEach(e -> { e = e + ":00"; - DnerHourlyPowerOutageEvent event = dateTimeAndEntityMap.get(e); - if (Objects.isNull(event)) { // 数据为空,全部默认为0值 + List events = dateTimeAndEntityMap.get(e); + if (CollectionUtil.isEmpty(events)) { // 数据为空,全部默认为0值 setZeroData(result); } else { - setHourlyData(result, event); + setHourlyData(result, events); } }); result.setDateList(TimeUtil.generateHourList(startDate, endDate)); // 日期列表 @@ -71,6 +75,27 @@ public class DnerHourlyPowerOutageEventServiceImpl return result; } + /** + * 获取组织代码 + * + * @param province 省 + * @param city 城市 + * @param orgCode 组织代码 + * @return 字符串列表 + */ + private String getCode(String province, String city, String orgCode) { + if (StringUtils.hasLength(orgCode)) { + return orgCode; + } + if (StringUtils.hasLength(city)) { + return city.length() >= 4 ? city.substring(0, 4) : city; + } + if (StringUtils.hasLength(province)) { + return province.length() >= 2 ? province.substring(0, 2) : province; + } + return null; + } + private void handleYScaleRule(HourlyPowerOutageEventChartVO result) { if (!CollectionUtil.isEmpty(result.getPowerOutageUserCountList())) { result.getHourlyChartYScaleRuleCollect().setUserCountRule( @@ -106,15 +131,36 @@ public class DnerHourlyPowerOutageEventServiceImpl } } - private static void setHourlyData(HourlyPowerOutageEventChartVO result, DnerHourlyPowerOutageEvent event) { - result.getPowerOutageUserCountList().add(event.getUserCount()); // 停电影响用户总数 - result.getFaultUserCountList().add(event.getFaultUserCount()); // 故障停电影响用户总数 - result.getScheduledUserCountList().add(event.getScheduledUserCount()); // 计划停电影响用户总数 - result.getAvgTemList().add(Double.valueOf(event.getTemperature())); // 平均气温 - result.getMaxTemList().add(Double.valueOf(event.getHourlyMaxTemperature())); // 小时最大气温 - result.getMinTemList().add(Double.valueOf(event.getHourlyMinTemperature())); // 小时最低气温 - result.getPrecList().add(Double.valueOf(event.getHourlyPrecipitation())); // 小时降雨量 - result.getWindList().add(Double.valueOf(event.getExtremeWindSpeedHourly())); // 小时极大风速 + private static void setHourlyData(HourlyPowerOutageEventChartVO result, List events) { + // Aggregate values by summing user counts and averaging weather data + int totalUserCount = events.stream().mapToInt(DnerHourlyPowerOutageEvent::getUserCount).sum(); + int totalFaultUserCount = events.stream().mapToInt(DnerHourlyPowerOutageEvent::getFaultUserCount).sum(); + int totalScheduledUserCount = events.stream().mapToInt(DnerHourlyPowerOutageEvent::getScheduledUserCount).sum(); + + double avgTemperature = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getTemperature())) + .average().orElse(0.0); + double avgMaxTemperature = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getHourlyMaxTemperature())) + .average().orElse(0.0); + double avgMinTemperature = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getHourlyMinTemperature())) + .average().orElse(0.0); + double avgPrecipitation = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getHourlyPrecipitation())) + .average().orElse(0.0); + double avgMaxWindSpeed = events.stream() + .mapToDouble(e -> Double.parseDouble(e.getExtremeWindSpeedHourly())) + .average().orElse(0.0); + + result.getPowerOutageUserCountList().add(totalUserCount); // 停电影响用户总数 + result.getFaultUserCountList().add(totalFaultUserCount); // 故障停电影响用户总数 + result.getScheduledUserCountList().add(totalScheduledUserCount); // 计划停电影响用户总数 + result.getAvgTemList().add(avgTemperature); // 平均气温 + result.getMaxTemList().add(avgMaxTemperature); // 小时最大气温 + result.getMinTemList().add(avgMinTemperature); // 小时最低气温 + result.getPrecList().add(avgPrecipitation); // 小时降雨量 + result.getWindList().add(avgMaxWindSpeed); // 小时极大风速 } private static void setZeroData(HourlyPowerOutageEventChartVO result) { diff --git a/src/main/resources/mapper/DnerDailyPowerOutageEventMapper.xml b/src/main/resources/mapper/DnerDailyPowerOutageEventMapper.xml index 9829b16..c85b565 100644 --- a/src/main/resources/mapper/DnerDailyPowerOutageEventMapper.xml +++ b/src/main/resources/mapper/DnerDailyPowerOutageEventMapper.xml @@ -13,7 +13,7 @@ `scheduled_end_user_count`,`scheduled_min_user_count`,`scheduled_max_user_count`, `create_by`, `create_time`, `update_by`, `update_time`, `fault_user_count`, `scheduled_user_count` from dner_daily_power_outage_event - where org_code = #{orgCode} + where org_code LIKE CONCAT(#{orgCode}, '%') and data_time >= #{startDate} and data_time #{endDate} and event_id = #{eventId} diff --git a/src/main/resources/mapper/DnerHourlyPowerOutageEventMapper.xml b/src/main/resources/mapper/DnerHourlyPowerOutageEventMapper.xml index 5cf55ae..481cffd 100644 --- a/src/main/resources/mapper/DnerHourlyPowerOutageEventMapper.xml +++ b/src/main/resources/mapper/DnerHourlyPowerOutageEventMapper.xml @@ -10,7 +10,7 @@ `outage_state`, `outage_type`, `create_by`, `create_time`, `update_by`, `update_time`, `fault_user_count`, `scheduled_user_count` from dner_hourly_power_outage_event - where org_code = #{orgCode} + where org_code LIKE CONCAT(#{orgCode}, '%') and data_time >= #{startDate} and data_time #{endDate} and event_id = #{eventId} diff --git a/src/main/resources/sql/20260313-DDL-002.sql b/src/main/resources/sql/20260313-DDL-002.sql index fee023f..299255e 100644 --- a/src/main/resources/sql/20260313-DDL-002.sql +++ b/src/main/resources/sql/20260313-DDL-002.sql @@ -9,4 +9,8 @@ create index regional_weather_data_1_index on regional_weather_data (org_code, data_time); create index dner_hourly_power_outage_event_1_index - on dner_hourly_power_outage_event (event_id, org_code, data_time); \ No newline at end of file + on dner_hourly_power_outage_event (event_id, org_code, data_time); + +create index dner_daily_power_outage_event_1_index + on dner_daily_power_outage_event (event_id, org_code, data_time); +