2026-03-18提交:分时图高级筛选

This commit is contained in:
junzhangfm 2026-03-19 11:14:33 +08:00
parent 8ab7eeb801
commit 25033e5735
6 changed files with 130 additions and 45 deletions

View File

@ -13,17 +13,12 @@ import javax.validation.constraints.NotBlank;
@Data @Data
public class AreaTreeReq { public class AreaTreeReq {
/** /**
* daily-日K图 * DAILY-日K图
* hourly-分时图 * HOURLY-分时图
*/ */
@NotBlank(message = "查询类型不能为空") @NotBlank(message = "查询类型不能为空")
String queryType; String queryType;
/**
* 是否开启高级筛选 0-未开启 1-开启
*/
String advancedFilterFlag;
// ================= 用于高级筛选的属性 ==================== // ================= 用于高级筛选的属性 ====================
/** /**
* 过去XX小时/ * 过去XX小时/
@ -61,9 +56,9 @@ public class AreaTreeReq {
Integer powerOutageTimePastTime; Integer powerOutageTimePastTime;
/** /**
* 过去XX小时/天的停电时长超过的小时数 * 过去XX小时/天的停电时长超过的小时数/
*/ */
Double pastTimePowerOutageHourCount; Double pastTimePowerOutageTimeCount;
/** /**
* 过去XX小时/ * 过去XX小时/
@ -86,6 +81,11 @@ public class AreaTreeReq {
Double pastTimePowerOutageRatioCount; Double pastTimePowerOutageRatioCount;
// ============== 其他属性 ============ // ============== 其他属性 ============
/**
* 是否开启高级筛选 0-未开启 1-开启
*/
String advancedFilterFlag;
/** /**
* 当前时间 * 当前时间
*/ */

View File

@ -73,6 +73,26 @@ public class DnerHourlyPowerOutageEvent {
*/ */
private Integer userCount; private Integer userCount;
/**
* 已复电停电影响用户数
*/
private Integer restoredUserCount;
/**
* 未复电停电影响用户数
*/
private Integer notRestoredUserCount;
/**
* 故障停电影响用户总数
*/
private Integer faultUserCount;
/**
* 计划停电影响用户数
*/
private Integer scheduledUserCount;
/** /**
* 停电状态1-待停电2-停电中3-已复电 * 停电状态1-待停电2-停电中3-已复电
*/ */

View File

@ -36,6 +36,8 @@ public class DnerHourlyPowerOutageEventServiceImpl
@Override @Override
public HourlyPowerOutageEventChartVO queryIntradayData(String orgCode, String startDate, String endDate) { public HourlyPowerOutageEventChartVO queryIntradayData(String orgCode, String startDate, String endDate) {
startDate = startDate.substring(0, 13) + ":00";
endDate = endDate.substring(0, 13) + ":00";
List<DnerHourlyPowerOutageEvent> dataList = dnerHourlyPowerOutageEventMapper.selectListByConditions( List<DnerHourlyPowerOutageEvent> dataList = dnerHourlyPowerOutageEventMapper.selectListByConditions(
orgCode, startDate, endDate); orgCode, startDate, endDate);
Map<String, DnerHourlyPowerOutageEvent> dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap( Map<String, DnerHourlyPowerOutageEvent> dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap(

View File

@ -32,35 +32,25 @@ public class DnerSiteAreaConfigurationServiceImpl
@Override @Override
public List<AreaTreeVO> queryAreaTree(AreaTreeReq req) { public List<AreaTreeVO> queryAreaTree(AreaTreeReq req) {
// 判断是否开启高级筛选 // 判断是否开启高级筛选
String advancedFilterFlag ="0";
if ((!Objects.isNull(req.getRainPastTime()) && req.getRainPastTime() != 0) if ((!Objects.isNull(req.getRainPastTime()) && req.getRainPastTime() != 0)
|| (!Objects.isNull(req.getAvgTempPastTime()) && req.getAvgTempPastTime() != 0) || (!Objects.isNull(req.getAvgTempPastTime()) && req.getAvgTempPastTime() != 0)
|| (!Objects.isNull(req.getMaxWindPastTime()) && req.getMaxWindPastTime() != 0) || (!Objects.isNull(req.getMaxWindPastTime()) && req.getMaxWindPastTime() != 0)
|| (!Objects.isNull(req.getPowerOutageTimePastTime()) && req.getPowerOutageTimePastTime() != 0) || (!Objects.isNull(req.getPowerOutageTimePastTime()) && req.getPowerOutageTimePastTime() != 0)
|| (!Objects.isNull(req.getPowerOutageUserPastTime()) && req.getPowerOutageUserPastTime() != 0) || (!Objects.isNull(req.getPowerOutageUserPastTime()) && req.getPowerOutageUserPastTime() != 0)
|| (!Objects.isNull(req.getPowerOutageRatioPastTime()) && req.getPowerOutageRatioPastTime() != 0)) { || (!Objects.isNull(req.getPowerOutageRatioPastTime()) && req.getPowerOutageRatioPastTime() != 0)) {
advancedFilterFlag = "1"; // 开启高级筛选 req.setAdvancedFilterFlag("1");// 开启高级筛选
} }
req.setAdvancedFilterFlag(advancedFilterFlag);
// 查询出所有的省市区 // 查询出所有的省市区
List<DnerSiteAreaConfiguration> dataList; List<DnerSiteAreaConfiguration> dataList;
if (ChartQueryTypeEnum.HOURLY_CHART.getCode().equals(req.getQueryType())) { if (ChartQueryTypeEnum.HOURLY_CHART.getCode().equals(req.getQueryType())) {
// 分时图 // 分时图
if ("1".equals(advancedFilterFlag)) { handleAdvancedFilter(req); // 分时图高级筛选处理
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()));
}
}
dataList = dnerSiteAreaConfigurationMapper.selectHourlyChartAreaTree(req); dataList = dnerSiteAreaConfigurationMapper.selectHourlyChartAreaTree(req);
} else { } else {
// 日K图 // 日K图
if ("1".equals(advancedFilterFlag)) { if ("1".equals(req.getAdvancedFilterFlag())) {
req.setCurrentDateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))); req.setCurrentDateTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// TODO 日K图高级筛选待完善
} }
dataList = dnerSiteAreaConfigurationMapper.selectDailyChartAreaTree(req); dataList = dnerSiteAreaConfigurationMapper.selectDailyChartAreaTree(req);
} }
@ -75,6 +65,40 @@ public class DnerSiteAreaConfigurationServiceImpl
return result; 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<String, AreaTreeVO> buildProvince( private static @NonNull Map<String, AreaTreeVO> buildProvince(
List<DnerSiteAreaConfiguration> dataList, List<AreaTreeVO> result) { List<DnerSiteAreaConfiguration> dataList, List<AreaTreeVO> result) {
Map<String, AreaTreeVO> provinceCodeAndProvinceMap = new LinkedHashMap<>(); Map<String, AreaTreeVO> provinceCodeAndProvinceMap = new LinkedHashMap<>();

View File

@ -118,19 +118,6 @@ public class TimeUtil {
return beforeDay.format(formatter); 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个小时的时间 * 获取前n个小时的时间
* *
@ -156,8 +143,9 @@ public class TimeUtil {
// List<String> strings = generateHourList("2026-03-13 22:00", "2026-03-14 01:00"); // List<String> strings = generateHourList("2026-03-13 22:00", "2026-03-14 01:00");
// List<String> strings = getBetweenDates("2026-03-10", "2026-03-14"); // List<String> strings = getBetweenDates("2026-03-10", "2026-03-14");
// String strings = getBeforeNumDays("2026-03-15", 5); // String strings = getBeforeNumDays("2026-03-15", 5);
String beforeHourTime = getBeforeHourTime("2026-03-17 11:00", 2); // String beforeHourTime = getBeforeHourTime("2026-03-17 11:00", 2);
System.out.println(beforeHourTime); // 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"); private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

View File

@ -31,24 +31,75 @@
t1.id, t1.province, t1.province_code, t1.city, t1.city_code, t1.district, t1.district_code, 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 t1.create_by, t1.create_time, t1.update_by, t1.update_time
FROM dner_site_area_configuration t1 FROM dner_site_area_configuration t1
<where> where 1=1
<choose> <choose>
<when test="param.advancedFilterFlag == '1'"> <when test="param.advancedFilterFlag == 1">
<if test="param.rainPastTime != null and param.rainPastTime != 0"> <if test="param.rainPastTime != null and param.rainPastTime != 0">
# 过去 X 小时累计降雨量超过 Y mm # 过去 X 小时累计降雨量超过 Y mm
EXISTS ( AND EXISTS (
select 1 select 1
from dner_hourly_power_outage_event t2 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 <![CDATA[ < ]]> #{param.currentDateTime}
having sum(t2.hourly_precipitation) > #{param.pastTimeRainCount})
</if>
<if test="param.avgTempPastTime != null and param.avgTempPastTime != 0">
# 过去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 <![CDATA[ < ]]> #{param.currentDateTime}
and t2.temperature > #{param.pastTimeAvgTempCount})
</if>
<if test="param.maxWindPastTime != null and param.maxWindPastTime != 0">
# 过去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 <![CDATA[ < ]]> #{param.currentDateTime}
and t2.extreme_wind_speed_hourly > #{param.pastTimeMaxWindCount})
</if>
<if test="param.powerOutageTimePastTime != null and param.powerOutageTimePastTime != 0">
# 过去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 <![CDATA[ < ]]> #{param.currentDateTime}
having sum(t2.power_outage_duration) > #{param.pastTimePowerOutageTimeCount})
</if>
<if test="param.powerOutageUserPastTime != null and param.powerOutageUserPastTime != 0">
# 过去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 <![CDATA[ < ]]> #{param.currentDateTime}
having sum(t2.user_count) > #{param.pastTimePowerOutageUserCount})
</if>
<if test="param.powerOutageRatioPastTime != null and param.powerOutageRatioPastTime != 0">
# 未复电用户数占总停电用户数的比例大于 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 <![CDATA[ < ]]> #{param.currentDateTime}
and (t2.not_restored_user_count/(t2.restored_user_count + t2.not_restored_user_count)) > #{param.pastTimePowerOutageRatioCount})
</if> </if>
</when> </when>
<otherwise> <otherwise>
# 过滤得到已存在数据的分时图 # 过滤得到已存在数据的分时图
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)
</otherwise> </otherwise>
</choose> </choose>
</where>
</select> </select>
<select id="selectDailyChartAreaTree" resultMap="BaseResultMap"> <select id="selectDailyChartAreaTree" resultMap="BaseResultMap">