feat(weather): 添加历史天气数据同步逻辑
- 在定时任务中增加首次同步判断,若没有历史数据则从最早的气象站记录开始同步 - 新增获取最早气象站数据时间的方法,用于确定历史同步起点 - 添加按地区编码和时间范围批量查询气象数据的方法,优化数据获取性能 - 更新.gitignore文件,排除CLAUDE.md文件
This commit is contained in:
parent
ee27a7130b
commit
2f65f85143
1
.gitignore
vendored
1
.gitignore
vendored
@ -8,6 +8,7 @@
|
||||
**/**/target/
|
||||
.fastRequest
|
||||
.qoder
|
||||
CLAUDE.md
|
||||
### IntelliJ IDEA ###
|
||||
.idea
|
||||
*.iws
|
||||
|
||||
@ -42,4 +42,16 @@ public interface RegionalWeatherDataMapper extends BaseMapper<RegionalWeatherDat
|
||||
* @return 实体列表
|
||||
*/
|
||||
List<RegionalWeatherData> selectByCondition(Map<String, Object> params);
|
||||
|
||||
/**
|
||||
* 批量查询气象数据:根据多个地区编码和时间范围
|
||||
* @param orgCodes 地区编码列表
|
||||
* @param startTimeData 起始时间(整时格式,如 2026-04-13 10:00:00)
|
||||
* @param endTimeData 结束时间(整时格式,如 2026-04-13 15:00:00)
|
||||
* @return 实体列表
|
||||
*/
|
||||
List<RegionalWeatherData> selectByOrgCodesAndTimeRange(
|
||||
@Param("orgCodes") List<String> orgCodes,
|
||||
@Param("startTimeData") String startTimeData,
|
||||
@Param("endTimeData") String endTimeData);
|
||||
}
|
||||
|
||||
@ -22,4 +22,6 @@ public interface RegionalWeatherStationMapper extends BaseMapper<RegionalWeather
|
||||
);
|
||||
|
||||
List<RegionalWeatherStation> getSyncData(@Param("prevHourDate") String prevHourDate);
|
||||
|
||||
String getSyncOldDataStartDate();
|
||||
}
|
||||
|
||||
@ -16,4 +16,12 @@ public interface IRegionalWeatherDataService {
|
||||
* @param endDate 结束日期(yyyy-mm-dd hh:mm)整时时间
|
||||
*/
|
||||
void syncOldWeatherData(String startDate, String endDate);
|
||||
|
||||
/**
|
||||
* 获取同步旧开始日期
|
||||
*
|
||||
* @return 字符串
|
||||
*/
|
||||
String getSyncOldStartDate();
|
||||
|
||||
}
|
||||
|
||||
@ -3,17 +3,20 @@ package com.southern.power.grid.service.impl;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.southern.power.grid.config.BusinessThreadPoolFactory;
|
||||
import com.southern.power.grid.dao.RegionalWeatherDataMapper;
|
||||
import com.southern.power.grid.dao.RegionalWeatherStationMapper;
|
||||
import com.southern.power.grid.entity.RegionalWeatherData;
|
||||
import com.southern.power.grid.service.IRegionalWeatherDataService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
import java.util.concurrent.Semaphore;
|
||||
@ -24,7 +27,7 @@ import java.util.concurrent.Semaphore;
|
||||
public class RegionalWeatherDataServiceImpl extends ServiceImpl<RegionalWeatherDataMapper, RegionalWeatherData>
|
||||
implements IRegionalWeatherDataService {
|
||||
|
||||
|
||||
private final RegionalWeatherStationMapper regionalWeatherStationMapper;
|
||||
private final BusinessThreadPoolFactory businessThreadPoolFactory;
|
||||
private final RegionalWeatherDataSyncService regionalWeatherDataSyncService;
|
||||
|
||||
@ -123,5 +126,18 @@ public class RegionalWeatherDataServiceImpl extends ServiceImpl<RegionalWeatherD
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getSyncOldStartDate() {
|
||||
Long count = this.lambdaQuery().count();
|
||||
if (!Objects.isNull(count) && count > 0) {
|
||||
return null;
|
||||
}
|
||||
String startDate = regionalWeatherStationMapper.getSyncOldDataStartDate();
|
||||
if (StringUtils.hasLength(startDate)) {
|
||||
return startDate;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import com.southern.power.grid.service.IRegionalWeatherDataService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
@ -34,14 +35,24 @@ public class WeatherDataScheduleTask {
|
||||
*/
|
||||
private void execute() {
|
||||
if (!running.compareAndSet(false, true)) {
|
||||
log.warn("任务正在执行,跳过本次触发");
|
||||
log.warn("【区域天气数据同步任务】任务正在执行,跳过本次触发");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
//第一次同步 获取历史数据的开始日期
|
||||
String startDate = regionalWeatherDataService.getSyncOldStartDate();
|
||||
|
||||
if (StringUtils.hasLength(startDate)) {
|
||||
log.info("【区域天气数据同步任务】不存在同步数据,开始同步历史数据,历史数据开始日期:{}", startDate);
|
||||
//同步所有的历史数据
|
||||
regionalWeatherDataService.syncOldWeatherData(startDate, LocalDateTime.now().minusHours(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00")));
|
||||
} else {
|
||||
//获取当前时间前一个整点时间
|
||||
String prevHourDate = LocalDateTime.now().minusHours(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00"));
|
||||
log.info("【区域天气数据同步任务】:存在同步数据,开始同步上一小时数据:{}", prevHourDate);
|
||||
regionalWeatherDataService.scheduleSyncWeatherData(prevHourDate);
|
||||
}
|
||||
log.info("【区域天气数据同步任务】定时触发--结束");
|
||||
} catch (Exception e) {
|
||||
log.error("【区域天气数据同步任务】执行异常", e);
|
||||
|
||||
@ -82,4 +82,17 @@
|
||||
</where>
|
||||
ORDER BY create_time DESC
|
||||
</select>
|
||||
|
||||
<!-- 批量查询气象数据:根据多个地区编码和时间范围,只查映射所需字段 -->
|
||||
<select id="selectByOrgCodesAndTimeRange" resultMap="BaseResultMap">
|
||||
SELECT org_code, data_time, hourly_precipitation, daily_precipitation,
|
||||
temperature, hourly_max_temperature, hourly_min_temperature, extreme_wind_speed_hourly
|
||||
FROM regional_weather_data
|
||||
WHERE org_code IN
|
||||
<foreach collection="orgCodes" item="code" open="(" separator="," close=")">
|
||||
#{code}
|
||||
</foreach>
|
||||
AND data_time BETWEEN #{startTimeData, jdbcType=VARCHAR} AND #{endTimeData, jdbcType=VARCHAR}
|
||||
ORDER BY org_code, data_time ASC
|
||||
</select>
|
||||
</mapper>
|
||||
@ -92,4 +92,11 @@
|
||||
from regional_weather_station
|
||||
where data_time = #{prevHourDate}
|
||||
</select>
|
||||
|
||||
<select id="getSyncOldDataStartDate" resultType="java.lang.String">
|
||||
SELECT data_time
|
||||
FROM regional_weather_station
|
||||
ORDER BY data_time
|
||||
LIMIT 1
|
||||
</select>
|
||||
</mapper>
|
||||
Loading…
x
Reference in New Issue
Block a user