初始提交:添加分时处理
This commit is contained in:
parent
b6ebfad7d4
commit
281ebf8acc
@ -18,4 +18,11 @@ public interface DnerHourlyPowerOutageEventMapper extends BaseMapper<DnerHourlyP
|
|||||||
List<DnerHourlyPowerOutageEvent> selectListByConditions(@Param("orgCode") String orgCode,
|
List<DnerHourlyPowerOutageEvent> selectListByConditions(@Param("orgCode") String orgCode,
|
||||||
@Param("startDate") String startDate,
|
@Param("startDate") String startDate,
|
||||||
@Param("endDate") String endDate);
|
@Param("endDate") String endDate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量插入事件记录
|
||||||
|
* @param list 待插入的数据列表
|
||||||
|
* @return 插入成功的条数
|
||||||
|
*/
|
||||||
|
int batchInsert(List<DnerHourlyPowerOutageEvent> list);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
import com.southern.power.grid.entity.DnerSiteAreaConfiguration;
|
import com.southern.power.grid.entity.DnerSiteAreaConfiguration;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 行政区划配置表 -- mapper类
|
* 行政区划配置表 -- mapper类
|
||||||
*
|
*
|
||||||
@ -12,5 +14,5 @@ import org.apache.ibatis.annotations.Mapper;
|
|||||||
**/
|
**/
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface DnerSiteAreaConfigurationMapper extends BaseMapper<DnerSiteAreaConfiguration> {
|
public interface DnerSiteAreaConfigurationMapper extends BaseMapper<DnerSiteAreaConfiguration> {
|
||||||
|
List<DnerSiteAreaConfiguration> selectAll();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,9 @@ package com.southern.power.grid.dao;
|
|||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.southern.power.grid.entity.NationalWeatherStation;
|
import com.southern.power.grid.entity.NationalWeatherStation;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 国家气象站 -- mapper类
|
* 国家气象站 -- mapper类
|
||||||
@ -12,4 +15,12 @@ import org.apache.ibatis.annotations.Mapper;
|
|||||||
**/
|
**/
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface NationalWeatherStationMapper extends BaseMapper<NationalWeatherStation> {
|
public interface NationalWeatherStationMapper extends BaseMapper<NationalWeatherStation> {
|
||||||
|
/**
|
||||||
|
* 按站号 + 时间范围查询(时间字符串格式:yyyy-MM-dd HH)
|
||||||
|
*/
|
||||||
|
List<NationalWeatherStation> selectByStationAndTimeRange(
|
||||||
|
@Param("stationId") String stationId,
|
||||||
|
@Param("startTime") String startTime,
|
||||||
|
@Param("endTime") String endTime
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
import com.southern.power.grid.entity.NwSiteAreaConfiguration;
|
import com.southern.power.grid.entity.NwSiteAreaConfiguration;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 南网区划配置表 Mapper接口
|
* 南网区划配置表 Mapper接口
|
||||||
*
|
*
|
||||||
@ -12,5 +14,5 @@ import org.apache.ibatis.annotations.Mapper;
|
|||||||
**/
|
**/
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface NwSiteAreaConfigurationMapper extends BaseMapper<NwSiteAreaConfiguration> {
|
public interface NwSiteAreaConfigurationMapper extends BaseMapper<NwSiteAreaConfiguration> {
|
||||||
|
List<NwSiteAreaConfiguration> selectAll();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,9 @@
|
|||||||
|
package com.southern.power.grid.dao;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
|
import com.southern.power.grid.entity.NwSiteAreaConfiguration;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface PowerGridConfigMapper extends BaseMapper<NwSiteAreaConfiguration> {
|
||||||
|
}
|
||||||
@ -3,6 +3,9 @@ package com.southern.power.grid.dao;
|
|||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.southern.power.grid.entity.RegionalWeatherStation;
|
import com.southern.power.grid.entity.RegionalWeatherStation;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 区域气象站 -- mapper类
|
* 区域气象站 -- mapper类
|
||||||
@ -12,4 +15,9 @@ import org.apache.ibatis.annotations.Mapper;
|
|||||||
**/
|
**/
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface RegionalWeatherStationMapper extends BaseMapper<RegionalWeatherStation> {
|
public interface RegionalWeatherStationMapper extends BaseMapper<RegionalWeatherStation> {
|
||||||
|
List<RegionalWeatherStation> selectByStationAndTimeRange(
|
||||||
|
@Param("stationId") String stationId,
|
||||||
|
@Param("startTime") String startTime,
|
||||||
|
@Param("endTime") String endTime
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
|||||||
import com.southern.power.grid.entity.WeatherSiteAreaConfiguration;
|
import com.southern.power.grid.entity.WeatherSiteAreaConfiguration;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 气象区划配置表 Mapper 接口
|
* 气象区划配置表 Mapper 接口
|
||||||
*
|
*
|
||||||
@ -12,5 +14,5 @@ import org.apache.ibatis.annotations.Mapper;
|
|||||||
**/
|
**/
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface WeatherSiteAreaConfigurationMapper extends BaseMapper<WeatherSiteAreaConfiguration> {
|
public interface WeatherSiteAreaConfigurationMapper extends BaseMapper<WeatherSiteAreaConfiguration> {
|
||||||
|
List<WeatherSiteAreaConfiguration> selectAll();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,6 @@ import lombok.Data;
|
|||||||
**/
|
**/
|
||||||
@Data
|
@Data
|
||||||
public class DataExcelEntity {
|
public class DataExcelEntity {
|
||||||
@ExcelProperty(index = 0, value = "省份")
|
@ExcelProperty(value = "省")
|
||||||
private String province;
|
private String province;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,25 @@
|
|||||||
|
package com.southern.power.grid.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class ExcelHourlyOutageRowDTO {
|
||||||
|
/** 资料时次,对应分时表的 data_time */
|
||||||
|
private LocalDateTime dataTime;
|
||||||
|
|
||||||
|
/** Excel 中体现的南网省/地市局/区县局(用于映射) */
|
||||||
|
private String nwProvince;
|
||||||
|
private String nwCity;
|
||||||
|
private String nwDistrict;
|
||||||
|
|
||||||
|
/** 停电影响用户数等业务字段(示例) */
|
||||||
|
private Integer userCount;
|
||||||
|
private Integer outageState;
|
||||||
|
private Integer outageType;
|
||||||
|
|
||||||
|
// ... 根据你的 Excel 列补全
|
||||||
|
|
||||||
|
// getter/setter
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
package com.southern.power.grid.entity;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class WeatherDataDTO {
|
||||||
|
private String stationId;
|
||||||
|
private String stationName;
|
||||||
|
private LocalDateTime dataTime;
|
||||||
|
|
||||||
|
private String temperature;
|
||||||
|
private String hourlyMaxTemperature;
|
||||||
|
private String hourlyMinTemperature;
|
||||||
|
private String hourlyPrecipitation;
|
||||||
|
private String dailyPrecipitation;
|
||||||
|
private String extremeWindSpeedHourly;
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
package com.southern.power.grid.service;
|
||||||
|
|
||||||
|
import com.southern.power.grid.entity.WeatherDataDTO;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface WeatherDataService {
|
||||||
|
/**
|
||||||
|
* 根据站点ID + 起始日期(从0点起,向后7天)从 DB 查询并返回 7 天气象数据
|
||||||
|
*/
|
||||||
|
List<WeatherDataDTO> query7DaysWeather(String stationId, LocalDate startDate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从缓存(若无则查库)中获取指定 站点 + 时间点 对应的气象数据
|
||||||
|
*/
|
||||||
|
WeatherDataDTO getWeatherData(String stationId, LocalDateTime dateTime);
|
||||||
|
}
|
||||||
@ -8,7 +8,9 @@ import com.southern.power.grid.service.IDnerHourlyPowerOutageEventService;
|
|||||||
import com.southern.power.grid.utils.TimeUtil;
|
import com.southern.power.grid.utils.TimeUtil;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -26,9 +28,12 @@ import java.util.stream.Collectors;
|
|||||||
public class DnerHourlyPowerOutageEventServiceImpl
|
public class DnerHourlyPowerOutageEventServiceImpl
|
||||||
extends ServiceImpl<DnerHourlyPowerOutageEventMapper, DnerHourlyPowerOutageEvent>
|
extends ServiceImpl<DnerHourlyPowerOutageEventMapper, DnerHourlyPowerOutageEvent>
|
||||||
implements IDnerHourlyPowerOutageEventService {
|
implements IDnerHourlyPowerOutageEventService {
|
||||||
@Autowired
|
@Resource
|
||||||
private DnerHourlyPowerOutageEventMapper dnerHourlyPowerOutageEventMapper;
|
private DnerHourlyPowerOutageEventMapper dnerHourlyPowerOutageEventMapper;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public HourlyPowerOutageEventChartVO queryIntradayData(String orgCode, String startDate, String endDate) {
|
public HourlyPowerOutageEventChartVO queryIntradayData(String orgCode, String startDate, String endDate) {
|
||||||
List<DnerHourlyPowerOutageEvent> dataList = dnerHourlyPowerOutageEventMapper.selectListByConditions(
|
List<DnerHourlyPowerOutageEvent> dataList = dnerHourlyPowerOutageEventMapper.selectListByConditions(
|
||||||
@ -70,4 +75,10 @@ public class DnerHourlyPowerOutageEventServiceImpl
|
|||||||
result.setWindList(windList);
|
result.setWindList(windList);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,158 @@
|
|||||||
|
package com.southern.power.grid.service.impl;
|
||||||
|
|
||||||
|
import com.southern.power.grid.dao.DnerHourlyPowerOutageEventMapper;
|
||||||
|
import com.southern.power.grid.dao.NwSiteAreaConfigurationMapper;
|
||||||
|
import com.southern.power.grid.dao.WeatherSiteAreaConfigurationMapper;
|
||||||
|
import com.southern.power.grid.entity.DnerHourlyPowerOutageEvent;
|
||||||
|
import com.southern.power.grid.entity.ExcelHourlyOutageRowDTO;
|
||||||
|
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 org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class HourlyOutageExcelProcessService {
|
||||||
|
@Resource
|
||||||
|
private NwSiteAreaConfigurationMapper nwSiteAreaConfigurationMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private WeatherSiteAreaConfigurationMapper weatherSiteAreaConfigurationMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private WeatherDataService weatherDataService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DnerHourlyPowerOutageEventMapper dnerHourlyPowerOutageEventMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* key = nw_province + "|" + nw_city + "|" + nw_district ;value = district_code
|
||||||
|
*/
|
||||||
|
private final Map<String, String> nwAreaMap = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* key = district_code ;value = WeatherSiteAreaConfiguration(包含 station_id/station_name)
|
||||||
|
*/
|
||||||
|
private final Map<String, WeatherSiteAreaConfiguration> weatherAreaMap = new HashMap<>();
|
||||||
|
|
||||||
|
private static final DateTimeFormatter DB_DATETIME_STR =
|
||||||
|
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对外主入口:处理一批 Excel 解析后的数据,按逻辑补齐气象数据并批量入库
|
||||||
|
*/
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public void process(List<ExcelHourlyOutageRowDTO> excelRows) {
|
||||||
|
// 1. 加载南网配置表
|
||||||
|
loadNwAreaConfig();
|
||||||
|
// 2. 加载气象区划配置表
|
||||||
|
loadWeatherAreaConfig();
|
||||||
|
|
||||||
|
List<DnerHourlyPowerOutageEvent> toInsert = new ArrayList<>();
|
||||||
|
|
||||||
|
// 3 & 4. 循环处理 Excel 行
|
||||||
|
for (ExcelHourlyOutageRowDTO row : excelRows) {
|
||||||
|
// 3.1 根据南网省/市/区县 → district_code
|
||||||
|
String districtCode = findDistrictCode(row.getNwProvince(), row.getNwCity(), row.getNwDistrict());
|
||||||
|
if (districtCode == null) {
|
||||||
|
// 找不到映射,可记录日志或统计
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3.2 district_code → station_id
|
||||||
|
WeatherSiteAreaConfiguration weatherArea = weatherAreaMap.get(districtCode);
|
||||||
|
if (weatherArea == null || weatherArea.getStationId() == null) {
|
||||||
|
// 找不到对应气象站
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String stationId = weatherArea.getStationId();
|
||||||
|
|
||||||
|
// 3.3 通过 stationId + 时间,统一取7天气象数据(内部做缓存)
|
||||||
|
LocalDateTime dataTime = row.getDataTime();
|
||||||
|
WeatherDataDTO weatherData = weatherDataService.getWeatherData(stationId, dataTime);
|
||||||
|
|
||||||
|
// 3.4 组装分时停电事件实体
|
||||||
|
DnerHourlyPowerOutageEvent entity = buildHourlyEvent(row, districtCode, weatherData);
|
||||||
|
toInsert.add(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!toInsert.isEmpty()) {
|
||||||
|
// 4. 批量入库
|
||||||
|
dnerHourlyPowerOutageEventMapper.batchInsert(toInsert);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadNwAreaConfig() {
|
||||||
|
nwAreaMap.clear();
|
||||||
|
List<NwSiteAreaConfiguration> list = nwSiteAreaConfigurationMapper.selectAll();
|
||||||
|
if (list == null) return;
|
||||||
|
|
||||||
|
for (NwSiteAreaConfiguration cfg : list) {
|
||||||
|
String key = buildNwKey(cfg.getNwProvince(), cfg.getNwCity(), cfg.getNwDistrict());
|
||||||
|
if (cfg.getDistrictCode() != null && !cfg.getDistrictCode().isEmpty()) {
|
||||||
|
nwAreaMap.put(key, cfg.getDistrictCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadWeatherAreaConfig() {
|
||||||
|
weatherAreaMap.clear();
|
||||||
|
List<WeatherSiteAreaConfiguration> list = weatherSiteAreaConfigurationMapper.selectAll();
|
||||||
|
if (list == null) return;
|
||||||
|
for (WeatherSiteAreaConfiguration cfg : list) {
|
||||||
|
if (cfg.getDistrictCode() != null && !cfg.getDistrictCode().isEmpty()) {
|
||||||
|
weatherAreaMap.put(cfg.getDistrictCode(), cfg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildNwKey(String province, String city, String district) {
|
||||||
|
return (province == null ? "" : province.trim()) + "|"
|
||||||
|
+ (city == null ? "" : city.trim()) + "|"
|
||||||
|
+ (district == null ? "" : district.trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
private String findDistrictCode(String nwProvince, String nwCity, String nwDistrict) {
|
||||||
|
String key = buildNwKey(nwProvince, nwCity, nwDistrict);
|
||||||
|
return nwAreaMap.get(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
private DnerHourlyPowerOutageEvent buildHourlyEvent(ExcelHourlyOutageRowDTO row,
|
||||||
|
String districtCode,
|
||||||
|
WeatherDataDTO weatherData) {
|
||||||
|
DnerHourlyPowerOutageEvent e = new DnerHourlyPowerOutageEvent();
|
||||||
|
e.setOrgCode(districtCode);
|
||||||
|
|
||||||
|
// 时间转成字符串,入库到 data_time
|
||||||
|
if (row.getDataTime() != null) {
|
||||||
|
e.setDataTime(row.getDataTime().format(DB_DATETIME_STR));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Excel 本身的业务字段
|
||||||
|
e.setUserCount(row.getUserCount());
|
||||||
|
e.setOutageState(row.getOutageState());
|
||||||
|
e.setOutageType(row.getOutageType());
|
||||||
|
|
||||||
|
// 气象字段(如不存在数据可以为 null)
|
||||||
|
if (weatherData != null) {
|
||||||
|
e.setTemperature(weatherData.getTemperature());
|
||||||
|
e.setHourlyMaxTemperature(weatherData.getHourlyMaxTemperature());
|
||||||
|
e.setHourlyMinTemperature(weatherData.getHourlyMinTemperature());
|
||||||
|
e.setHourlyPrecipitation(weatherData.getHourlyPrecipitation());
|
||||||
|
e.setDailyPrecipitation(weatherData.getDailyPrecipitation());
|
||||||
|
e.setExtremeWindSpeedHourly(weatherData.getExtremeWindSpeedHourly());
|
||||||
|
}
|
||||||
|
|
||||||
|
// create_by/update_by 可根据当前登录用户等进行填充
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,129 @@
|
|||||||
|
package com.southern.power.grid.service.impl;
|
||||||
|
|
||||||
|
import com.southern.power.grid.dao.NationalWeatherStationMapper;
|
||||||
|
import com.southern.power.grid.dao.RegionalWeatherStationMapper;
|
||||||
|
import com.southern.power.grid.entity.NationalWeatherStation;
|
||||||
|
import com.southern.power.grid.entity.RegionalWeatherStation;
|
||||||
|
import com.southern.power.grid.entity.WeatherDataDTO;
|
||||||
|
import com.southern.power.grid.service.WeatherDataService;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class WeatherDataServiceImpl implements WeatherDataService {
|
||||||
|
@Resource
|
||||||
|
private NationalWeatherStationMapper nationalWeatherStationMapper;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RegionalWeatherStationMapper regionalWeatherStationMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 缓存:key = stationId + "|" + startDate(yyyy-MM-dd),value = Map<dataTime, WeatherDataDTO>
|
||||||
|
*/
|
||||||
|
private final Map<String, Map<LocalDateTime, WeatherDataDTO>> cache = new HashMap<>();
|
||||||
|
|
||||||
|
private static final DateTimeFormatter DB_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH");
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<WeatherDataDTO> query7DaysWeather(String stationId, LocalDate startDate) {
|
||||||
|
LocalDateTime start = startDate.atStartOfDay();
|
||||||
|
LocalDateTime end = start.plusDays(7);
|
||||||
|
|
||||||
|
String startStr = start.format(DB_TIME_FORMAT);
|
||||||
|
String endStr = end.format(DB_TIME_FORMAT);
|
||||||
|
|
||||||
|
List<NationalWeatherStation> nationalList =
|
||||||
|
nationalWeatherStationMapper.selectByStationAndTimeRange(stationId, startStr, endStr);
|
||||||
|
List<RegionalWeatherStation> regionalList =
|
||||||
|
regionalWeatherStationMapper.selectByStationAndTimeRange(stationId, startStr, endStr);
|
||||||
|
|
||||||
|
List<WeatherDataDTO> result = new ArrayList<>();
|
||||||
|
if (nationalList != null) {
|
||||||
|
for (NationalWeatherStation n : nationalList) {
|
||||||
|
result.add(convertFromNational(n));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (regionalList != null) {
|
||||||
|
for (RegionalWeatherStation r : regionalList) {
|
||||||
|
result.add(convertFromRegional(r));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public WeatherDataDTO getWeatherData(String stationId, LocalDateTime dateTime) {
|
||||||
|
if (stationId == null || dateTime == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
LocalDate startDate = dateTime.toLocalDate();
|
||||||
|
String windowKey = buildWindowKey(stationId, startDate);
|
||||||
|
|
||||||
|
Map<LocalDateTime, WeatherDataDTO> stationMap = cache.get(windowKey);
|
||||||
|
if (stationMap == null) {
|
||||||
|
stationMap = new HashMap<>();
|
||||||
|
List<WeatherDataDTO> list = query7DaysWeather(stationId, startDate);
|
||||||
|
if (list != null) {
|
||||||
|
for (WeatherDataDTO dto : list) {
|
||||||
|
if (dto.getDataTime() != null) {
|
||||||
|
stationMap.put(dto.getDataTime(), dto);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cache.put(windowKey, stationMap);
|
||||||
|
}
|
||||||
|
return stationMap.get(dateTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildWindowKey(String stationId, LocalDate startDate) {
|
||||||
|
return stationId + "|" + startDate.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private WeatherDataDTO convertFromNational(NationalWeatherStation n) {
|
||||||
|
WeatherDataDTO dto = new WeatherDataDTO();
|
||||||
|
dto.setStationId(n.getStationId());
|
||||||
|
dto.setStationName(n.getStationName());
|
||||||
|
dto.setDataTime(parseDataTime(n.getDataTime()));
|
||||||
|
dto.setTemperature(n.getTemperature());
|
||||||
|
dto.setHourlyMaxTemperature(n.getHourlyMaxTemperature());
|
||||||
|
dto.setHourlyMinTemperature(n.getHourlyMinTemperature());
|
||||||
|
dto.setHourlyPrecipitation(n.getHourlyPrecipitation());
|
||||||
|
dto.setDailyPrecipitation(n.getDailyPrecipitation());
|
||||||
|
dto.setExtremeWindSpeedHourly(n.getExtremeWindSpeedHourly());
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
|
||||||
|
private WeatherDataDTO convertFromRegional(RegionalWeatherStation r) {
|
||||||
|
WeatherDataDTO dto = new WeatherDataDTO();
|
||||||
|
dto.setStationId(r.getStationId());
|
||||||
|
dto.setStationName(r.getStationName());
|
||||||
|
dto.setDataTime(parseDataTime(r.getDataTime()));
|
||||||
|
dto.setTemperature(r.getTemperature());
|
||||||
|
dto.setHourlyMaxTemperature(r.getHourlyMaxTemperature());
|
||||||
|
dto.setHourlyMinTemperature(r.getHourlyMinTemperature());
|
||||||
|
dto.setHourlyPrecipitation(r.getHourlyPrecipitation());
|
||||||
|
dto.setDailyPrecipitation(r.getDailyPrecipitation());
|
||||||
|
dto.setExtremeWindSpeedHourly(r.getExtremeWindSpeedHourly());
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
|
||||||
|
private LocalDateTime parseDataTime(String dataTime) {
|
||||||
|
if (dataTime == null || dataTime.isEmpty()) return null;
|
||||||
|
// 你实际存的是 "yyyy-MM-dd HH:mm:ss" 还是 "yyyyMMddHH" 自己调整解析格式
|
||||||
|
try {
|
||||||
|
return LocalDateTime.parse(dataTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
|
||||||
|
} catch (Exception e) {
|
||||||
|
try {
|
||||||
|
return LocalDateTime.parse(dataTime, DateTimeFormatter.ofPattern("yyyyMMddHH"));
|
||||||
|
} catch (Exception ex) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -14,4 +14,32 @@
|
|||||||
and data_time <![CDATA[ <= ]]> #{endDate}
|
and data_time <![CDATA[ <= ]]> #{endDate}
|
||||||
order by data_time asc
|
order by data_time asc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<insert id="batchInsert" parameterType="list" useGeneratedKeys="true" keyProperty="id">
|
||||||
|
INSERT INTO dner_hourly_power_outage_event (
|
||||||
|
org_code, data_time, hourly_precipitation, daily_precipitation,
|
||||||
|
temperature, hourly_max_temperature, hourly_min_temperature,
|
||||||
|
extreme_wind_speed_hourly, user_count, outage_state, outage_type,
|
||||||
|
create_by, create_time, update_by, update_time
|
||||||
|
) VALUES
|
||||||
|
<foreach collection="list" item="item" separator=",">
|
||||||
|
(
|
||||||
|
#{item.orgCode},
|
||||||
|
#{item.dataTime},
|
||||||
|
#{item.hourlyPrecipitation},
|
||||||
|
#{item.dailyPrecipitation},
|
||||||
|
#{item.temperature},
|
||||||
|
#{item.hourlyMaxTemperature},
|
||||||
|
#{item.hourlyMinTemperature},
|
||||||
|
#{item.extremeWindSpeedHourly},
|
||||||
|
#{item.userCount},
|
||||||
|
#{item.outageState},
|
||||||
|
#{item.outageType},
|
||||||
|
#{item.createBy},
|
||||||
|
NOW(), <!-- 创建时间使用数据库当前时间 -->
|
||||||
|
#{item.updateBy},
|
||||||
|
NOW() <!-- 修改时间使用数据库当前时间 -->
|
||||||
|
)
|
||||||
|
</foreach>
|
||||||
|
</insert>
|
||||||
</mapper>
|
</mapper>
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
|
<!-- namespace 必须 = Mapper 接口全类名 -->
|
||||||
|
<mapper namespace="com.southern.power.grid.dao.DnerSiteAreaConfigurationMapper">
|
||||||
|
|
||||||
|
<resultMap id="BaseResultMap" type="com.southern.power.grid.entity.DnerSiteAreaConfiguration">
|
||||||
|
<id column="id" property="id"/>
|
||||||
|
<result column="province" property="province"/>
|
||||||
|
<result column="province_code" property="provinceCode"/>
|
||||||
|
<result column="city" property="city"/>
|
||||||
|
<result column="city_code" property="cityCode"/>
|
||||||
|
<result column="district" property="district"/>
|
||||||
|
<result column="district_code" property="districtCode"/>
|
||||||
|
<result column="create_by" property="createBy"/>
|
||||||
|
<result column="create_time" property="createTime"/>
|
||||||
|
<result column="update_by" property="updateBy"/>
|
||||||
|
<result column="update_time" property="updateTime"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<select id="selectAll" resultMap="BaseResultMap">
|
||||||
|
SELECT
|
||||||
|
id, province, province_code, city, city_code, district, district_code,
|
||||||
|
create_by, create_time, update_by, update_time
|
||||||
|
FROM dner_site_area_configuration
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
68
src/main/resources/mapper/NationalWeatherStationMapper.xml
Normal file
68
src/main/resources/mapper/NationalWeatherStationMapper.xml
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
|
<!-- namespace 必须 = Mapper 接口全类名 -->
|
||||||
|
<mapper namespace="com.southern.power.grid.dao.NationalWeatherStationMapper">
|
||||||
|
|
||||||
|
<resultMap id="BaseResultMap" type="com.southern.power.grid.entity.NationalWeatherStation">
|
||||||
|
<id column="id" property="id"/>
|
||||||
|
<result column="data_time" property="dataTime"/>
|
||||||
|
<result column="station_id" property="stationId"/>
|
||||||
|
<result column="station_name" property="stationName"/>
|
||||||
|
<result column="station_pressure" property="stationPressure"/>
|
||||||
|
<result column="hourly_max_pressure" property="hourlyMaxPressure"/>
|
||||||
|
<result column="hourly_min_pressure" property="hourlyMinPressure"/>
|
||||||
|
<result column="temperature" property="temperature"/>
|
||||||
|
<result column="hourly_max_temperature" property="hourlyMaxTemperature"/>
|
||||||
|
<result column="hourly_min_temperature" property="hourlyMinTemperature"/>
|
||||||
|
<result column="dew_point_temperature" property="dewPointTemperature"/>
|
||||||
|
<result column="relative_humidity" property="relativeHumidity"/>
|
||||||
|
<result column="water_vapor_pressure" property="waterVaporPressure"/>
|
||||||
|
<result column="hourly_precipitation" property="hourlyPrecipitation"/>
|
||||||
|
<result column="daily_precipitation" property="dailyPrecipitation"/>
|
||||||
|
<result column="wind_direction_2min" property="windDirection2min"/>
|
||||||
|
<result column="wind_speed_2min" property="windSpeed2min"/>
|
||||||
|
<result column="wind_direction_10min" property="windDirection10min"/>
|
||||||
|
<result column="wind_speed_10min" property="windSpeed10min"/>
|
||||||
|
<result column="max_wind_direction_hourly" property="maxWindDirectionHourly"/>
|
||||||
|
<result column="max_wind_speed_hourly" property="maxWindSpeedHourly"/>
|
||||||
|
<result column="instantaneous_wind_direction" property="instantaneousWindDirection"/>
|
||||||
|
<result column="instantaneous_wind_speed" property="instantaneousWindSpeed"/>
|
||||||
|
<result column="extreme_wind_direction_hourly" property="extremeWindDirectionHourly"/>
|
||||||
|
<result column="extreme_wind_speed_hourly" property="extremeWindSpeedHourly"/>
|
||||||
|
<result column="extreme_wind_time_hourly" property="extremeWindTimeHourly"/>
|
||||||
|
<result column="min_visibility_hourly" property="minVisibilityHourly"/>
|
||||||
|
<result column="province" property="province"/>
|
||||||
|
<result column="city" property="city"/>
|
||||||
|
<result column="district" property="district"/>
|
||||||
|
<result column="latitude" property="latitude"/>
|
||||||
|
<result column="longitude" property="longitude"/>
|
||||||
|
<result column="altitude" property="altitude"/>
|
||||||
|
<result column="create_time" property="createTime"/>
|
||||||
|
<result column="import_time" property="importTime"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<select id="selectByStationAndTimeRange" resultMap="BaseResultMap">
|
||||||
|
SELECT
|
||||||
|
id, data_time, station_id, station_name,
|
||||||
|
station_pressure, hourly_max_pressure, hourly_min_pressure,
|
||||||
|
temperature, hourly_max_temperature, hourly_min_temperature,
|
||||||
|
dew_point_temperature, relative_humidity, water_vapor_pressure,
|
||||||
|
hourly_precipitation, daily_precipitation,
|
||||||
|
wind_direction_2min, wind_speed_2min,
|
||||||
|
wind_direction_10min, wind_speed_10min,
|
||||||
|
max_wind_direction_hourly, max_wind_speed_hourly,
|
||||||
|
instantaneous_wind_direction, instantaneous_wind_speed,
|
||||||
|
extreme_wind_direction_hourly, extreme_wind_speed_hourly, extreme_wind_time_hourly,
|
||||||
|
min_visibility_hourly,
|
||||||
|
province, city, district,
|
||||||
|
latitude, longitude, altitude,
|
||||||
|
create_time, import_time
|
||||||
|
FROM national_weather_station
|
||||||
|
WHERE station_id = #{stationId}
|
||||||
|
AND data_time >= #{startTime}
|
||||||
|
AND data_time <= #{endTime}
|
||||||
|
ORDER BY data_time
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
27
src/main/resources/mapper/NwSiteAreaConfigurationMapper.xml
Normal file
27
src/main/resources/mapper/NwSiteAreaConfigurationMapper.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
|
<!-- namespace 必须 = Mapper 接口全类名 -->
|
||||||
|
<mapper namespace="com.southern.power.grid.dao.NwSiteAreaConfigurationMapper">
|
||||||
|
|
||||||
|
<resultMap id="BaseResultMap" type="com.southern.power.grid.entity.NwSiteAreaConfiguration">
|
||||||
|
<id column="id" property="id"/>
|
||||||
|
<result column="district_code" property="districtCode"/>
|
||||||
|
<result column="nw_province" property="nwProvince"/>
|
||||||
|
<result column="nw_city" property="nwCity"/>
|
||||||
|
<result column="nw_district" property="nwDistrict"/>
|
||||||
|
<result column="create_by" property="createBy"/>
|
||||||
|
<result column="create_time" property="createTime"/>
|
||||||
|
<result column="update_by" property="updateBy"/>
|
||||||
|
<result column="update_time" property="updateTime"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<select id="selectAll" resultMap="BaseResultMap">
|
||||||
|
SELECT
|
||||||
|
id, district_code, nw_province, nw_city, nw_district,
|
||||||
|
create_by, create_time, update_by, update_time
|
||||||
|
FROM nw_site_area_configuration
|
||||||
|
</select>
|
||||||
|
|
||||||
|
</mapper>
|
||||||
68
src/main/resources/mapper/RegionalWeatherStationMapper.xml
Normal file
68
src/main/resources/mapper/RegionalWeatherStationMapper.xml
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
|
<!-- namespace 必须 = Mapper 接口全类名 -->
|
||||||
|
<mapper namespace="com.southern.power.grid.dao.RegionalWeatherStationMapper">
|
||||||
|
|
||||||
|
<resultMap id="BaseResultMap" type="com.southern.power.grid.entity.RegionalWeatherStation">
|
||||||
|
<id column="id" property="id"/>
|
||||||
|
<result column="data_time" property="dataTime"/>
|
||||||
|
<result column="station_id" property="stationId"/>
|
||||||
|
<result column="station_name" property="stationName"/>
|
||||||
|
<result column="station_pressure" property="stationPressure"/>
|
||||||
|
<result column="hourly_max_pressure" property="hourlyMaxPressure"/>
|
||||||
|
<result column="hourly_min_pressure" property="hourlyMinPressure"/>
|
||||||
|
<result column="temperature" property="temperature"/>
|
||||||
|
<result column="hourly_max_temperature" property="hourlyMaxTemperature"/>
|
||||||
|
<result column="hourly_min_temperature" property="hourlyMinTemperature"/>
|
||||||
|
<result column="dew_point_temperature" property="dewPointTemperature"/>
|
||||||
|
<result column="relative_humidity" property="relativeHumidity"/>
|
||||||
|
<result column="water_vapor_pressure" property="waterVaporPressure"/>
|
||||||
|
<result column="hourly_precipitation" property="hourlyPrecipitation"/>
|
||||||
|
<result column="daily_precipitation" property="dailyPrecipitation"/>
|
||||||
|
<result column="wind_direction_2min" property="windDirection2min"/>
|
||||||
|
<result column="wind_speed_2min" property="windSpeed2min"/>
|
||||||
|
<result column="wind_direction_10min" property="windDirection10min"/>
|
||||||
|
<result column="wind_speed_10min" property="windSpeed10min"/>
|
||||||
|
<result column="max_wind_direction_hourly" property="maxWindDirectionHourly"/>
|
||||||
|
<result column="max_wind_speed_hourly" property="maxWindSpeedHourly"/>
|
||||||
|
<result column="instantaneous_wind_direction" property="instantaneousWindDirection"/>
|
||||||
|
<result column="instantaneous_wind_speed" property="instantaneousWindSpeed"/>
|
||||||
|
<result column="extreme_wind_direction_hourly" property="extremeWindDirectionHourly"/>
|
||||||
|
<result column="extreme_wind_speed_hourly" property="extremeWindSpeedHourly"/>
|
||||||
|
<result column="extreme_wind_time_hourly" property="extremeWindTimeHourly"/>
|
||||||
|
<result column="min_visibility_hourly" property="minVisibilityHourly"/>
|
||||||
|
<result column="province" property="province"/>
|
||||||
|
<result column="city" property="city"/>
|
||||||
|
<result column="district" property="district"/>
|
||||||
|
<result column="latitude" property="latitude"/>
|
||||||
|
<result column="longitude" property="longitude"/>
|
||||||
|
<result column="altitude" property="altitude"/>
|
||||||
|
<result column="create_time" property="createTime"/>
|
||||||
|
<result column="import_time" property="importTime"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<select id="selectByStationAndTimeRange" resultMap="BaseResultMap">
|
||||||
|
SELECT
|
||||||
|
id, data_time, station_id, station_name,
|
||||||
|
station_pressure, hourly_max_pressure, hourly_min_pressure,
|
||||||
|
temperature, hourly_max_temperature, hourly_min_temperature,
|
||||||
|
dew_point_temperature, relative_humidity, water_vapor_pressure,
|
||||||
|
hourly_precipitation, daily_precipitation,
|
||||||
|
wind_direction_2min, wind_speed_2min,
|
||||||
|
wind_direction_10min, wind_speed_10min,
|
||||||
|
max_wind_direction_hourly, max_wind_speed_hourly,
|
||||||
|
instantaneous_wind_direction, instantaneous_wind_speed,
|
||||||
|
extreme_wind_direction_hourly, extreme_wind_speed_hourly, extreme_wind_time_hourly,
|
||||||
|
min_visibility_hourly,
|
||||||
|
province, city, district,
|
||||||
|
latitude, longitude, altitude,
|
||||||
|
create_time, import_time
|
||||||
|
FROM regional_weather_station
|
||||||
|
WHERE station_id = #{stationId}
|
||||||
|
AND data_time >= #{startTime}
|
||||||
|
AND data_time <= #{endTime}
|
||||||
|
ORDER BY data_time
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
|
||||||
|
<!-- namespace 必须 = Mapper 接口全类名 -->
|
||||||
|
<mapper namespace="com.southern.power.grid.dao.WeatherSiteAreaConfigurationMapper">
|
||||||
|
|
||||||
|
<resultMap id="BaseResultMap" type="com.southern.power.grid.entity.WeatherSiteAreaConfiguration">
|
||||||
|
<id column="id" property="id"/>
|
||||||
|
<result column="district_code" property="districtCode"/>
|
||||||
|
<result column="weather_province" property="weatherProvince"/>
|
||||||
|
<result column="weather_city" property="weatherCity"/>
|
||||||
|
<result column="weather_district" property="weatherDistrict"/>
|
||||||
|
<result column="station_name" property="stationName"/>
|
||||||
|
<result column="station_id" property="stationId"/>
|
||||||
|
<result column="create_by" property="createBy"/>
|
||||||
|
<result column="create_time" property="createTime"/>
|
||||||
|
<result column="update_by" property="updateBy"/>
|
||||||
|
<result column="update_time" property="updateTime"/>
|
||||||
|
</resultMap>
|
||||||
|
|
||||||
|
<select id="selectAll" resultMap="BaseResultMap">
|
||||||
|
SELECT
|
||||||
|
id, district_code, weather_province, weather_city, weather_district,
|
||||||
|
station_name, station_id,
|
||||||
|
create_by, create_time, update_by, update_time
|
||||||
|
FROM weather_site_area_configuration
|
||||||
|
</select>
|
||||||
|
</mapper>
|
||||||
Loading…
x
Reference in New Issue
Block a user