diff --git a/src/main/java/com/southern/power/grid/entity/DailyPowerOutageEventVO.java b/src/main/java/com/southern/power/grid/entity/DailyPowerOutageEventVO.java index bb50e67..005d596 100644 --- a/src/main/java/com/southern/power/grid/entity/DailyPowerOutageEventVO.java +++ b/src/main/java/com/southern/power/grid/entity/DailyPowerOutageEventVO.java @@ -5,7 +5,7 @@ import lombok.Data; import java.util.List; /** - * TODO + * 日停电记录VO * * @author: junzhangfm * @date: 2026/3/14 diff --git a/src/main/java/com/southern/power/grid/entity/DnerDailyPowerOutageEvent.java b/src/main/java/com/southern/power/grid/entity/DnerDailyPowerOutageEvent.java index af0ac8d..96d6ef1 100644 --- a/src/main/java/com/southern/power/grid/entity/DnerDailyPowerOutageEvent.java +++ b/src/main/java/com/southern/power/grid/entity/DnerDailyPowerOutageEvent.java @@ -63,6 +63,11 @@ public class DnerDailyPowerOutageEvent { */ private String extremeWindSpeedHourly; + /** + * 停电时长 + */ + private String powerOutageDuration; + /** * 停电影响用户总数 */ diff --git a/src/main/java/com/southern/power/grid/entity/DnerHourlyPowerOutageEvent.java b/src/main/java/com/southern/power/grid/entity/DnerHourlyPowerOutageEvent.java index 43d8d26..ee16c46 100644 --- a/src/main/java/com/southern/power/grid/entity/DnerHourlyPowerOutageEvent.java +++ b/src/main/java/com/southern/power/grid/entity/DnerHourlyPowerOutageEvent.java @@ -63,6 +63,11 @@ public class DnerHourlyPowerOutageEvent { */ private String extremeWindSpeedHourly; + /** + * 停电时长 + */ + private String powerOutageDuration; + /** * 停电影响用户总数 */ diff --git a/src/main/java/com/southern/power/grid/entity/WeatherAreaDataDTO.java b/src/main/java/com/southern/power/grid/entity/WeatherAreaDataDTO.java new file mode 100644 index 0000000..f7a53d2 --- /dev/null +++ b/src/main/java/com/southern/power/grid/entity/WeatherAreaDataDTO.java @@ -0,0 +1,30 @@ +package com.southern.power.grid.entity; + +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 站点气象数据 + * + * @author: LIUZHIMING + * @date: 2026/3/17 + **/ +@Data +public class WeatherAreaDataDTO { + String districtCode; + private LocalDateTime dataTime; + + // 平均气温 + private String temperature; + // 小时最高气温 + private String hourlyMaxTemperature; + // 小时最低气温 + private String hourlyMinTemperature; + // 小时降雨量 + private Double hourlyPrecipitation; + // 日累计降雨量 + private String dailyPrecipitation; + // 小时内极大风速 + private String extremeWindSpeedHourly; +} diff --git a/src/main/java/com/southern/power/grid/entity/WeatherDataDTO.java b/src/main/java/com/southern/power/grid/entity/WeatherDataDTO.java index 2fe8aed..8a452bc 100644 --- a/src/main/java/com/southern/power/grid/entity/WeatherDataDTO.java +++ b/src/main/java/com/southern/power/grid/entity/WeatherDataDTO.java @@ -4,16 +4,28 @@ import lombok.Data; import java.time.LocalDateTime; +/** + * 站点气象数据 + * + * @author: LIUZHIMING + * @date: 2026/3/13 + **/ @Data public class WeatherDataDTO { private String stationId; private String stationName; private LocalDateTime dataTime; + // 平均气温 private String temperature; + // 小时最高气温 private String hourlyMaxTemperature; + // 小时最低气温 private String hourlyMinTemperature; + // 小时降雨量 private Double hourlyPrecipitation; + // 日累计降雨量 private String dailyPrecipitation; + // 小时内极大风速 private String extremeWindSpeedHourly; } diff --git a/src/main/java/com/southern/power/grid/service/WeatherDataService.java b/src/main/java/com/southern/power/grid/service/WeatherDataService.java index 0e96e64..e4208fb 100644 --- a/src/main/java/com/southern/power/grid/service/WeatherDataService.java +++ b/src/main/java/com/southern/power/grid/service/WeatherDataService.java @@ -15,5 +15,5 @@ public interface WeatherDataService { /** * 从缓存(若无则查库)中获取指定 站点 + 时间点 对应的气象数据 */ - WeatherDataDTO getWeatherData(String stationId, LocalDateTime dateTime); + List getWeatherData(List stationIds, LocalDateTime dateTime); } diff --git a/src/main/java/com/southern/power/grid/service/impl/HourlyOutageExcelProcessService.java b/src/main/java/com/southern/power/grid/service/impl/HourlyOutageExcelProcessService.java index f9a30ce..95dee20 100644 --- a/src/main/java/com/southern/power/grid/service/impl/HourlyOutageExcelProcessService.java +++ b/src/main/java/com/southern/power/grid/service/impl/HourlyOutageExcelProcessService.java @@ -1,5 +1,6 @@ package com.southern.power.grid.service.impl; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.southern.power.grid.dao.DnerHourlyPowerOutageEventMapper; import com.southern.power.grid.dao.NwSiteAreaConfigurationMapper; import com.southern.power.grid.dao.WeatherSiteAreaConfigurationMapper; @@ -9,6 +10,8 @@ import com.southern.power.grid.entity.NwSiteAreaConfiguration; import com.southern.power.grid.entity.WeatherDataDTO; import com.southern.power.grid.entity.WeatherSiteAreaConfiguration; import com.southern.power.grid.service.WeatherDataService; +import lombok.extern.slf4j.Slf4j; + import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -20,6 +23,7 @@ import java.util.List; import java.util.Map; @Service +@Slf4j public class HourlyOutageExcelProcessService { @Resource private NwSiteAreaConfigurationMapper nwSiteAreaConfigurationMapper; @@ -34,14 +38,16 @@ public class HourlyOutageExcelProcessService { private DnerHourlyPowerOutageEventMapper dnerHourlyPowerOutageEventMapper; /** + * 南网区域配置 * key = nw_province + "|" + nw_city + "|" + nw_district ;value = district_code */ private final Map nwAreaMap = new HashMap<>(); /** + * 气象区域配置 * key = district_code ;value = WeatherSiteAreaConfiguration(包含 station_id/station_name) */ - private final Map weatherAreaMap = new HashMap<>(); + private final Map> weatherAreaMap = new HashMap<>(); private static final DateTimeFormatter DB_DATETIME_STR = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); @@ -63,24 +69,34 @@ public class HourlyOutageExcelProcessService { String districtCode = findDistrictCode(row.getProvince(), row.getCity(), row.getDistrict()); if (districtCode == null) { // 找不到映射,可记录日志或统计 + log.info("districtCode is null! {}, {}, {}", row.getProvince(), row.getCity(), row.getDistrict()); continue; } // 3.2 district_code → station_id - WeatherSiteAreaConfiguration weatherArea = weatherAreaMap.get(districtCode); - if (weatherArea == null || weatherArea.getStationId() == null) { + List weatherAreas = weatherAreaMap.get(districtCode); + if (weatherAreas == null) { // 找不到对应气象站 + log.info("weatherAreas is null! {}", districtCode); continue; } - String stationId = weatherArea.getStationId(); + List stationIds = new ArrayList<>(); + for (WeatherSiteAreaConfiguration weatherArea : weatherAreas) { + String stationId = weatherArea.getStationId(); + if (StringUtils.isNotEmpty(stationId) && !stationIds.contains(stationId)) { + stationIds.add(stationId); + } + } - // 3.3 通过 stationId + 时间,统一取7天气象数据(内部做缓存) + // 3.3 通过 stationId + 时间,统一取8天气象数据(内部做缓存) LocalDateTime dataTime = row.getStartTime(); - WeatherDataDTO weatherData = weatherDataService.getWeatherData(stationId, dataTime); + List weatherData = weatherDataService.getWeatherData(stationIds, dataTime); // 3.4 组装分时停电事件实体 - DnerHourlyPowerOutageEvent entity = buildHourlyEvent(row, districtCode, weatherData); - toInsert.add(entity); + for (WeatherDataDTO weatherDataDTO : weatherData) { + DnerHourlyPowerOutageEvent entity = buildHourlyEvent(row, districtCode, weatherDataDTO); + toInsert.add(entity); + } } if (!toInsert.isEmpty()) { @@ -114,7 +130,14 @@ public class HourlyOutageExcelProcessService { if (list == null) return; for (WeatherSiteAreaConfiguration cfg : list) { if (cfg.getDistrictCode() != null && !cfg.getDistrictCode().isEmpty()) { - weatherAreaMap.put(cfg.getDistrictCode(), cfg); + List weatherSiteAreaConfigurations = weatherAreaMap.get(cfg.getDistrictCode()); + if (weatherSiteAreaConfigurations == null) { + weatherSiteAreaConfigurations = new ArrayList<>(); + weatherSiteAreaConfigurations.add(cfg); + weatherAreaMap.put(cfg.getDistrictCode(), weatherSiteAreaConfigurations); + } else { + weatherSiteAreaConfigurations.add(cfg); + } } } } diff --git a/src/main/java/com/southern/power/grid/service/impl/HourlyStatisticService.java b/src/main/java/com/southern/power/grid/service/impl/HourlyStatisticService.java index a577bd7..eeef9c6 100644 --- a/src/main/java/com/southern/power/grid/service/impl/HourlyStatisticService.java +++ b/src/main/java/com/southern/power/grid/service/impl/HourlyStatisticService.java @@ -248,10 +248,10 @@ public class HourlyStatisticService { for (String stationId : stationIds) { Map stationHourly = new HashMap<>(); for (LocalDateTime hour : timePoints) { - WeatherDataDTO data = weatherDataService.getWeatherData(stationId, hour); - if (data != null) { - stationHourly.put(hour, data); - } +// WeatherDataDTO data = weatherDataService.getWeatherData(stationIds, hour); +// if (data != null) { +// stationHourly.put(hour, data); +// } } result.put(stationId, stationHourly); } diff --git a/src/main/java/com/southern/power/grid/service/impl/WeatherDataServiceImpl.java b/src/main/java/com/southern/power/grid/service/impl/WeatherDataServiceImpl.java index ea52c13..bb00527 100644 --- a/src/main/java/com/southern/power/grid/service/impl/WeatherDataServiceImpl.java +++ b/src/main/java/com/southern/power/grid/service/impl/WeatherDataServiceImpl.java @@ -8,6 +8,7 @@ import com.southern.power.grid.entity.WeatherDataDTO; import com.southern.power.grid.service.WeatherDataService; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.time.LocalDate; @@ -26,7 +27,7 @@ public class WeatherDataServiceImpl implements WeatherDataService { /** * 缓存:key = stationId + "|" + startDate(yyyy-MM-dd),value = Map */ - private final Map> cache = new HashMap<>(); + private final Map> cache = new HashMap<>(); private static final DateTimeFormatter DB_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH"); @@ -58,31 +59,24 @@ public class WeatherDataServiceImpl implements WeatherDataService { } @Override - public WeatherDataDTO getWeatherData(String stationId, LocalDateTime dateTime) { - if (stationId == null || dateTime == null) { + public List getWeatherData(List stationIds, LocalDateTime dateTime) { + if (CollectionUtils.isEmpty(stationIds) || dateTime == null) { return null; } LocalDate startDate = dateTime.toLocalDate(); - String windowKey = buildWindowKey(stationId, startDate); - - Map stationMap = cache.get(windowKey); - if (stationMap == null) { - stationMap = new HashMap<>(); - List list = query7DaysWeather(stationId, startDate); - if (list != null) { - for (WeatherDataDTO dto : list) { - if (dto.getDataTime() != null) { - stationMap.put(dto.getDataTime(), dto); - } + List result = new ArrayList<>(); + for (String stationId : stationIds) { + List stationList = cache.get(stationId); + if (stationList == null) { + stationList = query7DaysWeather(stationId, startDate); + if (stationList != null) { + result.addAll(stationList); + cache.put(stationId, stationList); } } - cache.put(windowKey, stationMap); } - return stationMap.get(dateTime); - } - private String buildWindowKey(String stationId, LocalDate startDate) { - return stationId + "|" + startDate.toString(); + return result; } private WeatherDataDTO convertFromNational(NationalWeatherStation n) { diff --git a/src/main/resources/sql/20260313-001.sql b/src/main/resources/sql/20260313-001.sql index f02fc69..a5eaf84 100644 --- a/src/main/resources/sql/20260313-001.sql +++ b/src/main/resources/sql/20260313-001.sql @@ -80,6 +80,7 @@ CREATE TABLE `dner_daily_power_outage_event` `hourly_max_temperature` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '日内最高气温', `hourly_min_temperature` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '日内最低气温', `extreme_wind_speed_hourly` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '日内极大风速', + `power_outage_duration` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '停电时长', `user_count` int(11) DEFAULT NULL COMMENT '停电影响用户总数', `star_user_count` int(11) DEFAULT NULL COMMENT '起始影响用户总数', `end_user_count` int(11) DEFAULT NULL COMMENT '结束影响用户总数', @@ -108,6 +109,7 @@ CREATE TABLE `dner_hourly_power_outage_event` `hourly_max_temperature` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '小时内最高气温', `hourly_min_temperature` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '小时内最低气温', `extreme_wind_speed_hourly` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '小时内极大风速', + `power_outage_duration` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '停电时长', `user_count` int(11) DEFAULT NULL COMMENT '停电影响用户总数', `outage_state` tinyint(4) DEFAULT NULL COMMENT '停电状态(1-待停电;2-停电中;3-已复电)', `outage_type` tinyint(4) DEFAULT NULL COMMENT '停电类型(1-故障类;2-计划类)',