diff --git a/src/main/java/com/southern/power/grid/entity/AreaTreeReq.java b/src/main/java/com/southern/power/grid/entity/AreaTreeReq.java index 4a3764e..b6b0bb3 100644 --- a/src/main/java/com/southern/power/grid/entity/AreaTreeReq.java +++ b/src/main/java/com/southern/power/grid/entity/AreaTreeReq.java @@ -13,17 +13,12 @@ import javax.validation.constraints.NotBlank; @Data public class AreaTreeReq { /** - * daily-日K图 - * hourly-分时图 + * DAILY-日K图 + * HOURLY-分时图 */ @NotBlank(message = "查询类型不能为空") String queryType; - /** - * 是否开启高级筛选 0-未开启 1-开启 - */ - String advancedFilterFlag; - // ================= 用于高级筛选的属性 ==================== /** * 过去XX小时/天 @@ -61,9 +56,9 @@ public class AreaTreeReq { Integer powerOutageTimePastTime; /** - * 过去XX小时/天的停电时长超过的小时数 + * 过去XX小时/天的停电时长超过的小时数/天 */ - Double pastTimePowerOutageHourCount; + Double pastTimePowerOutageTimeCount; /** * 过去XX小时/天 @@ -86,6 +81,11 @@ public class AreaTreeReq { Double pastTimePowerOutageRatioCount; // ============== 其他属性 ============ + /** + * 是否开启高级筛选 0-未开启 1-开启 + */ + String advancedFilterFlag; + /** * 当前时间 */ 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 ee16c46..ef23c18 100644 --- a/src/main/java/com/southern/power/grid/entity/DnerHourlyPowerOutageEvent.java +++ b/src/main/java/com/southern/power/grid/entity/DnerHourlyPowerOutageEvent.java @@ -73,6 +73,26 @@ public class DnerHourlyPowerOutageEvent { */ private Integer userCount; + /** + * 已复电停电影响用户数 + */ + private Integer restoredUserCount; + + /** + * 未复电停电影响用户数 + */ + private Integer notRestoredUserCount; + + /** + * 故障停电影响用户总数 + */ + private Integer faultUserCount; + + /** + * 计划停电影响用户数 + */ + private Integer scheduledUserCount; + /** * 停电状态(1-待停电;2-停电中;3-已复电) */ diff --git a/src/main/java/com/southern/power/grid/service/impl/DnerHourlyPowerOutageEventServiceImpl.java b/src/main/java/com/southern/power/grid/service/impl/DnerHourlyPowerOutageEventServiceImpl.java index 7ef2cd0..ff56a60 100644 --- a/src/main/java/com/southern/power/grid/service/impl/DnerHourlyPowerOutageEventServiceImpl.java +++ b/src/main/java/com/southern/power/grid/service/impl/DnerHourlyPowerOutageEventServiceImpl.java @@ -36,6 +36,8 @@ public class DnerHourlyPowerOutageEventServiceImpl @Override public HourlyPowerOutageEventChartVO queryIntradayData(String orgCode, String startDate, String endDate) { + startDate = startDate.substring(0, 13) + ":00"; + endDate = endDate.substring(0, 13) + ":00"; List dataList = dnerHourlyPowerOutageEventMapper.selectListByConditions( orgCode, startDate, endDate); Map dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap( diff --git a/src/main/java/com/southern/power/grid/service/impl/DnerSiteAreaConfigurationServiceImpl.java b/src/main/java/com/southern/power/grid/service/impl/DnerSiteAreaConfigurationServiceImpl.java index 8307b90..47a7a80 100644 --- a/src/main/java/com/southern/power/grid/service/impl/DnerSiteAreaConfigurationServiceImpl.java +++ b/src/main/java/com/southern/power/grid/service/impl/DnerSiteAreaConfigurationServiceImpl.java @@ -32,35 +32,25 @@ public class DnerSiteAreaConfigurationServiceImpl @Override public List queryAreaTree(AreaTreeReq req) { // 判断是否开启高级筛选 - String advancedFilterFlag ="0"; if ((!Objects.isNull(req.getRainPastTime()) && req.getRainPastTime() != 0) || (!Objects.isNull(req.getAvgTempPastTime()) && req.getAvgTempPastTime() != 0) || (!Objects.isNull(req.getMaxWindPastTime()) && req.getMaxWindPastTime() != 0) || (!Objects.isNull(req.getPowerOutageTimePastTime()) && req.getPowerOutageTimePastTime() != 0) || (!Objects.isNull(req.getPowerOutageUserPastTime()) && req.getPowerOutageUserPastTime() != 0) || (!Objects.isNull(req.getPowerOutageRatioPastTime()) && req.getPowerOutageRatioPastTime() != 0)) { - advancedFilterFlag = "1"; // 开启高级筛选 + req.setAdvancedFilterFlag("1");// 开启高级筛选 } - req.setAdvancedFilterFlag(advancedFilterFlag); // 查询出所有的省市区 List dataList; if (ChartQueryTypeEnum.HOURLY_CHART.getCode().equals(req.getQueryType())) { // 分时图 - if ("1".equals(advancedFilterFlag)) { - String currentDateTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00")); - req.setCurrentDateTime(currentDateTime); - if (!Objects.isNull(req.getRainPastTime()) && req.getRainPastTime() != 0) { - req.setRainStartDateTime(TimeUtil.getBeforeHourTime(currentDateTime, req.getRainPastTime())); - } - if (!Objects.isNull(req.getAvgTempPastTime()) && req.getAvgTempPastTime() != 0) { - req.setAvgTempStartDateTime(TimeUtil.getBeforeHourTime(currentDateTime, req.getAvgTempPastTime())); - } - } + handleAdvancedFilter(req); // 分时图高级筛选处理 dataList = dnerSiteAreaConfigurationMapper.selectHourlyChartAreaTree(req); } else { // 日K图 - if ("1".equals(advancedFilterFlag)) { + if ("1".equals(req.getAdvancedFilterFlag())) { req.setCurrentDateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); + // TODO 日K图高级筛选待完善 } dataList = dnerSiteAreaConfigurationMapper.selectDailyChartAreaTree(req); } @@ -75,6 +65,40 @@ public class DnerSiteAreaConfigurationServiceImpl return result; } + private static void handleAdvancedFilter(AreaTreeReq req) { + if ("1".equals(req.getAdvancedFilterFlag())) { + String currentDateTime = LocalDateTime.now() // 获取当前时间 + .withMinute(0) // 分钟设置为0 + .withSecond(0) // 秒设置为0 + .withNano(0) // 毫秒设置为0 + .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00")); // 转换为字符串 + req.setCurrentDateTime(currentDateTime); + if (!Objects.isNull(req.getRainPastTime()) && req.getRainPastTime() != 0) { + req.setRainStartDateTime(TimeUtil.getBeforeHourTime(currentDateTime, req.getRainPastTime())); + } + if (!Objects.isNull(req.getAvgTempPastTime()) && req.getAvgTempPastTime() != 0) { + req.setAvgTempStartDateTime(TimeUtil.getBeforeHourTime(currentDateTime, req.getAvgTempPastTime())); + } + if (!Objects.isNull(req.getMaxWindPastTime()) && req.getMaxWindPastTime() != 0) { + req.setMaxWindStartDateTime(TimeUtil.getBeforeHourTime(currentDateTime, req.getMaxWindPastTime())); + } + if (!Objects.isNull(req.getPowerOutageTimePastTime()) && req.getPowerOutageTimePastTime() != 0) { + req.setPowerOutageTimeStartDateTime( + TimeUtil.getBeforeHourTime(currentDateTime, req.getPowerOutageTimePastTime())); + req.setPastTimePowerOutageTimeCount(Math.round( + req.getPastTimePowerOutageTimeCount() * 60 * 100) / 100.00); // 小时转分钟,四舍五入,取小数点后两位 + } + if (!Objects.isNull(req.getPowerOutageUserPastTime()) && req.getPowerOutageUserPastTime() != 0) { + req.setPowerOutageUserStartDateTime( + TimeUtil.getBeforeHourTime(currentDateTime, req.getPowerOutageUserPastTime())); + } + if (!Objects.isNull(req.getPowerOutageRatioPastTime()) && req.getPowerOutageRatioPastTime() != 0) { + req.setPowerOutageRatioStartDateTime( + TimeUtil.getBeforeHourTime(currentDateTime, req.getPowerOutageRatioPastTime())); + } + } + } + private static @NonNull Map buildProvince( List dataList, List result) { Map provinceCodeAndProvinceMap = new LinkedHashMap<>(); diff --git a/src/main/java/com/southern/power/grid/utils/TimeUtil.java b/src/main/java/com/southern/power/grid/utils/TimeUtil.java index d5cc15d..8209368 100644 --- a/src/main/java/com/southern/power/grid/utils/TimeUtil.java +++ b/src/main/java/com/southern/power/grid/utils/TimeUtil.java @@ -118,19 +118,6 @@ public class TimeUtil { return beforeDay.format(formatter); } - /** - * 获取当前时间,精确到小时,比如2026-03-17 11:00 - * - * @return 字符串结果 - */ - public static String getCurrentHourTime() { - return LocalDateTime.now() // 获取当前时间 - .withMinute(0) // 分钟设置为0 - .withSecond(0) // 秒设置为0 - .withNano(0) // 毫秒设置为0 - .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00")); // 转换为字符串 - } - /** * 获取前n个小时的时间 * @@ -156,8 +143,9 @@ public class TimeUtil { // List strings = generateHourList("2026-03-13 22:00", "2026-03-14 01:00"); // List strings = getBetweenDates("2026-03-10", "2026-03-14"); // String strings = getBeforeNumDays("2026-03-15", 5); - String beforeHourTime = getBeforeHourTime("2026-03-17 11:00", 2); - System.out.println(beforeHourTime); +// String beforeHourTime = getBeforeHourTime("2026-03-17 11:00", 2); +// System.out.println(beforeHourTime); + System.out.println(Math.round(123.1278 * 1000) / 1000.0); } private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); diff --git a/src/main/resources/mapper/DnerSiteAreaConfigurationMapper.xml b/src/main/resources/mapper/DnerSiteAreaConfigurationMapper.xml index 205a732..7563f36 100644 --- a/src/main/resources/mapper/DnerSiteAreaConfigurationMapper.xml +++ b/src/main/resources/mapper/DnerSiteAreaConfigurationMapper.xml @@ -31,24 +31,75 @@ t1.id, t1.province, t1.province_code, t1.city, t1.city_code, t1.district, t1.district_code, t1.create_by, t1.create_time, t1.update_by, t1.update_time FROM dner_site_area_configuration t1 - + where 1=1 - - + # 过去 X 小时累计降雨量超过 Y mm - EXISTS ( + AND EXISTS ( select 1 from dner_hourly_power_outage_event t2 - where t1.district_code = t2.org_code and ) + where t1.district_code = t2.org_code + and t2.data_time >= #{param.rainStartDateTime} + and t2.data_time #{param.currentDateTime} + having sum(t2.hourly_precipitation) > #{param.pastTimeRainCount}) + + + # 过去X小时/X天的平均气温超过 Y ℃ + AND EXISTS ( + select 1 + from dner_hourly_power_outage_event t2 + where t1.district_code = t2.org_code + and t2.data_time >= #{param.avgTempStartDateTime} + and t2.data_time #{param.currentDateTime} + and t2.temperature > #{param.pastTimeAvgTempCount}) + + + # 过去X分钟的平均风速超过Y m/s + AND EXISTS ( + select 1 + from dner_hourly_power_outage_event t2 + where t1.district_code = t2.org_code + and t2.data_time >= #{param.maxWindStartDateTime} + and t2.data_time #{param.currentDateTime} + and t2.extreme_wind_speed_hourly > #{param.pastTimeMaxWindCount}) + + + # 过去X小时的停电时长超Y小时 + AND EXISTS ( + select 1 + from dner_hourly_power_outage_event t2 + where t1.district_code = t2.org_code + and t2.data_time >= #{param.powerOutageTimeStartDateTime} + and t2.data_time #{param.currentDateTime} + having sum(t2.power_outage_duration) > #{param.pastTimePowerOutageTimeCount}) + + + # 过去X小时的停电用户数超过Y户 + AND EXISTS ( + select 1 + from dner_hourly_power_outage_event t2 + where t1.district_code = t2.org_code + and t2.data_time >= #{param.powerOutageUserStartDateTime} + and t2.data_time #{param.currentDateTime} + having sum(t2.user_count) > #{param.pastTimePowerOutageUserCount}) + + + # 未复电用户数占总停电用户数的比例大于 X % + AND EXISTS ( + select 1 + from dner_hourly_power_outage_event t2 + where t1.district_code = t2.org_code + and t2.data_time >= #{param.powerOutageRatioStartDateTime} + and t2.data_time #{param.currentDateTime} + and (t2.not_restored_user_count/(t2.restored_user_count + t2.not_restored_user_count)) > #{param.pastTimePowerOutageRatioCount}) # 过滤得到已存在数据的分时图 - EXISTS (select 1 from dner_hourly_power_outage_event t2 where t1.district_code = t2.org_code) + AND EXISTS (select 1 from dner_hourly_power_outage_event t2 where t1.district_code = t2.org_code) -