From 2f65f851439a3f9e460c4391422c34bd8ddb7cb7 Mon Sep 17 00:00:00 2001 From: fsyud Date: Tue, 14 Apr 2026 15:33:14 +0800 Subject: [PATCH] =?UTF-8?q?feat(weather):=20=E6=B7=BB=E5=8A=A0=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E5=A4=A9=E6=B0=94=E6=95=B0=E6=8D=AE=E5=90=8C=E6=AD=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在定时任务中增加首次同步判断,若没有历史数据则从最早的气象站记录开始同步 - 新增获取最早气象站数据时间的方法,用于确定历史同步起点 - 添加按地区编码和时间范围批量查询气象数据的方法,优化数据获取性能 - 更新.gitignore文件,排除CLAUDE.md文件 --- .gitignore | 1 + .../grid/dao/RegionalWeatherDataMapper.java | 12 ++++++++++++ .../dao/RegionalWeatherStationMapper.java | 2 ++ .../service/IRegionalWeatherDataService.java | 8 ++++++++ .../impl/RegionalWeatherDataServiceImpl.java | 18 +++++++++++++++++- .../grid/task/WeatherDataScheduleTask.java | 19 +++++++++++++++---- .../mapper/RegionalWeatherDataMapper.xml | 13 +++++++++++++ .../mapper/RegionalWeatherStationMapper.xml | 7 +++++++ 8 files changed, 75 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 0f90e7f..322d4c7 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ **/**/target/ .fastRequest .qoder +CLAUDE.md ### IntelliJ IDEA ### .idea *.iws diff --git a/src/main/java/com/southern/power/grid/dao/RegionalWeatherDataMapper.java b/src/main/java/com/southern/power/grid/dao/RegionalWeatherDataMapper.java index 3f94d12..0cb337a 100644 --- a/src/main/java/com/southern/power/grid/dao/RegionalWeatherDataMapper.java +++ b/src/main/java/com/southern/power/grid/dao/RegionalWeatherDataMapper.java @@ -42,4 +42,16 @@ public interface RegionalWeatherDataMapper extends BaseMapper selectByCondition(Map params); + + /** + * 批量查询气象数据:根据多个地区编码和时间范围 + * @param orgCodes 地区编码列表 + * @param startTimeData 起始时间(整时格式,如 2026-04-13 10:00:00) + * @param endTimeData 结束时间(整时格式,如 2026-04-13 15:00:00) + * @return 实体列表 + */ + List selectByOrgCodesAndTimeRange( + @Param("orgCodes") List orgCodes, + @Param("startTimeData") String startTimeData, + @Param("endTimeData") String endTimeData); } diff --git a/src/main/java/com/southern/power/grid/dao/RegionalWeatherStationMapper.java b/src/main/java/com/southern/power/grid/dao/RegionalWeatherStationMapper.java index b544a85..bf53d08 100644 --- a/src/main/java/com/southern/power/grid/dao/RegionalWeatherStationMapper.java +++ b/src/main/java/com/southern/power/grid/dao/RegionalWeatherStationMapper.java @@ -22,4 +22,6 @@ public interface RegionalWeatherStationMapper extends BaseMapper getSyncData(@Param("prevHourDate") String prevHourDate); + + String getSyncOldDataStartDate(); } diff --git a/src/main/java/com/southern/power/grid/service/IRegionalWeatherDataService.java b/src/main/java/com/southern/power/grid/service/IRegionalWeatherDataService.java index 37cf74e..099cc70 100644 --- a/src/main/java/com/southern/power/grid/service/IRegionalWeatherDataService.java +++ b/src/main/java/com/southern/power/grid/service/IRegionalWeatherDataService.java @@ -16,4 +16,12 @@ public interface IRegionalWeatherDataService { * @param endDate 结束日期(yyyy-mm-dd hh:mm)整时时间 */ void syncOldWeatherData(String startDate, String endDate); + + /** + * 获取同步旧开始日期 + * + * @return 字符串 + */ + String getSyncOldStartDate(); + } diff --git a/src/main/java/com/southern/power/grid/service/impl/RegionalWeatherDataServiceImpl.java b/src/main/java/com/southern/power/grid/service/impl/RegionalWeatherDataServiceImpl.java index e2d4c0d..10dc80f 100644 --- a/src/main/java/com/southern/power/grid/service/impl/RegionalWeatherDataServiceImpl.java +++ b/src/main/java/com/southern/power/grid/service/impl/RegionalWeatherDataServiceImpl.java @@ -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 implements IRegionalWeatherDataService { - + private final RegionalWeatherStationMapper regionalWeatherStationMapper; private final BusinessThreadPoolFactory businessThreadPoolFactory; private final RegionalWeatherDataSyncService regionalWeatherDataSyncService; @@ -123,5 +126,18 @@ public class RegionalWeatherDataServiceImpl extends ServiceImpl 0) { + return null; + } + String startDate = regionalWeatherStationMapper.getSyncOldDataStartDate(); + if (StringUtils.hasLength(startDate)) { + return startDate; + } + return null; + } + } diff --git a/src/main/java/com/southern/power/grid/task/WeatherDataScheduleTask.java b/src/main/java/com/southern/power/grid/task/WeatherDataScheduleTask.java index 9beb444..a74b47d 100644 --- a/src/main/java/com/southern/power/grid/task/WeatherDataScheduleTask.java +++ b/src/main/java/com/southern/power/grid/task/WeatherDataScheduleTask.java @@ -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 prevHourDate = LocalDateTime.now().minusHours(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00")); - regionalWeatherDataService.scheduleSyncWeatherData(prevHourDate); + //第一次同步 获取历史数据的开始日期 + 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); diff --git a/src/main/resources/mapper/RegionalWeatherDataMapper.xml b/src/main/resources/mapper/RegionalWeatherDataMapper.xml index 4b84d69..c89dad1 100644 --- a/src/main/resources/mapper/RegionalWeatherDataMapper.xml +++ b/src/main/resources/mapper/RegionalWeatherDataMapper.xml @@ -82,4 +82,17 @@ ORDER BY create_time DESC + + + \ No newline at end of file diff --git a/src/main/resources/mapper/RegionalWeatherStationMapper.xml b/src/main/resources/mapper/RegionalWeatherStationMapper.xml index 04c3d1e..a72b58e 100644 --- a/src/main/resources/mapper/RegionalWeatherStationMapper.xml +++ b/src/main/resources/mapper/RegionalWeatherStationMapper.xml @@ -92,4 +92,11 @@ from regional_weather_station where data_time = #{prevHourDate} + + \ No newline at end of file