From bc332c4fcf656d946345405b8230d9ce992640b8 Mon Sep 17 00:00:00 2001 From: yufengshuo Date: Thu, 19 Mar 2026 17:59:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=8E=A5=E5=8F=A3-K=E5=80=BC?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E4=BB=A3=E7=A0=81=EF=BC=8C=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../power/grid/controller/DnerController.java | 16 +++ .../dao/DnerHourlyPowerOutageEventMapper.java | 5 + ...IDnerDailyPowerOutageEventSyncService.java | 10 ++ ...DnerDailyPowerOutageEventBatchService.java | 18 +-- ...rDailyPowerOutageEventSyncServiceImpl.java | 106 ++++++++---------- .../DnerHourlyPowerOutageEventMapper.xml | 14 ++- 6 files changed, 93 insertions(+), 76 deletions(-) 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 0cf5ffa..9baf03c 100644 --- a/src/main/java/com/southern/power/grid/controller/DnerController.java +++ b/src/main/java/com/southern/power/grid/controller/DnerController.java @@ -33,6 +33,9 @@ public class DnerController { @Autowired private IDnerSiteAreaConfigurationService dnerSiteAreaConfigurationService; + @Autowired + private IDnerDailyPowerOutageEventSyncService dnerDailyPowerOutageEventSyncService; + @Autowired private IRegionalWeatherDataService regionalWeatherDataService; @@ -103,4 +106,17 @@ public class DnerController { regionalWeatherDataService.syncOldWeatherData(startDate, endDate); return Result.success("success"); } + + /** + * 同步每日停电事件 + * + * @param startDate 开始日期(数据示例:2025-09-01) + * @param endDate 结束日期(数据示例:2025-09-01) + * @param setDate 设置哪个日期的同步记录状态为2 部分同步 为null则不设置(数据示例:2025-09-01) + * @return 结果 <布尔> + */ + @GetMapping("/sync/dailyPowerOutageEvent") + public Result syncDailyPowerOutageEvent(@RequestParam String startDate, @RequestParam String endDate, @RequestParam String setDate) { + return Result.success(dnerDailyPowerOutageEventSyncService.processingData(startDate, endDate, setDate)); + } } diff --git a/src/main/java/com/southern/power/grid/dao/DnerHourlyPowerOutageEventMapper.java b/src/main/java/com/southern/power/grid/dao/DnerHourlyPowerOutageEventMapper.java index 2735af2..950a4a8 100644 --- a/src/main/java/com/southern/power/grid/dao/DnerHourlyPowerOutageEventMapper.java +++ b/src/main/java/com/southern/power/grid/dao/DnerHourlyPowerOutageEventMapper.java @@ -22,6 +22,7 @@ public interface DnerHourlyPowerOutageEventMapper extends BaseMapper selectByDistrictsAndTime(@Param("districtCodes") List districtCodes, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime); + + List selectByOrgCodesAndDataTime(@Param("orgCodes") List orgCodes, + @Param("startDate") String startDate, + @Param("endDate") String endDate); } diff --git a/src/main/java/com/southern/power/grid/service/IDnerDailyPowerOutageEventSyncService.java b/src/main/java/com/southern/power/grid/service/IDnerDailyPowerOutageEventSyncService.java index e22764d..9a33d23 100644 --- a/src/main/java/com/southern/power/grid/service/IDnerDailyPowerOutageEventSyncService.java +++ b/src/main/java/com/southern/power/grid/service/IDnerDailyPowerOutageEventSyncService.java @@ -8,4 +8,14 @@ public interface IDnerDailyPowerOutageEventSyncService { * @return 布尔型 */ Boolean syncDnerDailyPowerOutageEvent(); + + /** + * 处理数据 + * + * @param startDate 开始日期 + * @param endDate 结束日期 + * @param setDate 设置哪个日期的同步记录状态为2 部分同步 为null则不设置 + * @return 布尔型 + */ + Boolean processingData(String startDate, String endDate, String setDate); } diff --git a/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventBatchService.java b/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventBatchService.java index cb94fad..5afff15 100644 --- a/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventBatchService.java +++ b/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventBatchService.java @@ -14,8 +14,6 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import org.springframework.util.ObjectUtils; -import java.time.LocalDate; -import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -51,7 +49,7 @@ public class DnerDailyPowerOutageEventBatchService { // 1. 删除dner_daily_power_outage_event表中对应日期的数据 int deleteDailyCount = dailyPowerOutageEventMapper.delete( new LambdaQueryWrapper() - .apply("DATE(data_time) = {0}", date) + .eq(DnerDailyPowerOutageEvent::getDataTime,date) ); log.info("日期 {} 删除日表 {} 条存量数据", date, deleteDailyCount); @@ -148,16 +146,15 @@ public class DnerDailyPowerOutageEventBatchService { * * @param date 同步日期 * @param errors 错误信息列表 + * @param setDate 设置哪个日期的同步记录状态为2 部分同步 为null则不设置 */ - public void saveDailySyncRecord(String date, List errors) { + public void saveDailySyncRecord(String date, List errors,String setDate) { try { DnerDailyPowerOutageEventSync record = new DnerDailyPowerOutageEventSync(); record.setDateTime(date); // 判断同步状态 - // 如果是当前日期,状态为2;否则为1 - String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - int syncStatus = today.equals(date) ? 2 : 1; + int syncStatus = setDate != null && setDate.equals(date) ? 2 : 1; // 记录错误信息 String errorMsg = null; @@ -205,12 +202,7 @@ public class DnerDailyPowerOutageEventBatchService { try { String start = date + " 00:00:00"; String end = date + " 23:59:59"; - return hourlyPowerOutageEventMapper.selectList( - new LambdaQueryWrapper() - .in(DnerHourlyPowerOutageEvent::getOrgCode, orgCodes) - .ge(DnerHourlyPowerOutageEvent::getDataTime, start) - .le(DnerHourlyPowerOutageEvent::getDataTime, end) - ); + return hourlyPowerOutageEventMapper.selectByOrgCodesAndDataTime(orgCodes,start,end); } catch (Exception e) { log.error("批量查询小时数据失败 - 日期: {}, 区域数: {}, 错误: {}", date, orgCodes.size(), e.getMessage(), e); throw new RuntimeException("批量查询小时数据失败: " + e.getMessage(), e); diff --git a/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventSyncServiceImpl.java b/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventSyncServiceImpl.java index 1d7f672..c46ce27 100644 --- a/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventSyncServiceImpl.java +++ b/src/main/java/com/southern/power/grid/service/impl/DnerDailyPowerOutageEventSyncServiceImpl.java @@ -14,6 +14,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -27,7 +28,7 @@ import java.util.stream.Collectors; * 日K线停电事件同步服务实现类 * 功能:从dner_hourly_power_outage_event表查询数据,经过处理后同步到dner_daily_power_outage_event表 * 特性:多线程处理、事务支持(通过独立事务类)、错误回滚、完善日志 - * + *

* {@code @author:} System * {@code @date:} 2026/3/17 */ @@ -41,9 +42,18 @@ public class DnerDailyPowerOutageEventSyncServiceImpl extends ServiceImpl allDates = getAllDates(startDate, endDate); @@ -78,39 +85,37 @@ public class DnerDailyPowerOutageEventSyncServiceImpl extends ServiceImpl orgCodeList) { + private boolean processDateData(ThreadPoolTaskExecutor executor, String date, List orgCodeList, String setDate) { List> orgCodeBatches = partitionList(orgCodeList, ORG_BATCH_SIZE); log.info("日期 {} 共分 {} 批进行处理", date, orgCodeBatches.size()); log.info("日期 {} 线程池状态: {}", date, ThreadPoolUtil.getThreadPoolMonitorInfo(executor)); @@ -210,7 +216,7 @@ public class DnerDailyPowerOutageEventSyncServiceImpl extends ServiceImpl q.isNotNull(DnerDailyPowerOutageEventSync::getErrorMsg) - .ne(DnerDailyPowerOutageEventSync::getErrorMsg, "") - .ne(DnerDailyPowerOutageEventSync::getErrorMsg, "[]")) + DnerDailyPowerOutageEventSync eventSync = this.lambdaQuery() + .eq(DnerDailyPowerOutageEventSync::getSyncStatus, 2) .orderByAsc(DnerDailyPowerOutageEventSync::getDateTime) .last("limit 1") .one(); - if (firstError != null) { - LocalDate candidate = LocalDate.parse(firstError.getDateTime(), f); - return maxDate(fallback, candidate).format(f); - } - - DnerDailyPowerOutageEventSync lastSuccessBeforeToday = this.lambdaQuery() - .lt(DnerDailyPowerOutageEventSync::getDateTime, today) - .and(q -> q.isNull(DnerDailyPowerOutageEventSync::getErrorMsg) - .or() - .eq(DnerDailyPowerOutageEventSync::getErrorMsg, "") - .or() - .eq(DnerDailyPowerOutageEventSync::getErrorMsg, "[]")) - .orderByDesc(DnerDailyPowerOutageEventSync::getDateTime) - .last("limit 1") - .one(); - if (lastSuccessBeforeToday != null) { - LocalDate candidate = LocalDate.parse(lastSuccessBeforeToday.getDateTime(), f).plusDays(1); - return maxDate(fallback, candidate).format(f); + if (!ObjectUtils.isEmpty(eventSync)) { + LocalDate candidate = LocalDate.parse(eventSync.getDateTime(), f); + return candidate.format(f); } return fallback.format(f); @@ -261,20 +248,15 @@ public class DnerDailyPowerOutageEventSyncServiceImpl extends ServiceImpl - select `id`, `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` @@ -50,4 +50,16 @@ #{code} + +