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
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;
/**
* 当前时间
*/

View File

@ -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-已复电
*/

View File

@ -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<DnerHourlyPowerOutageEvent> dataList = dnerHourlyPowerOutageEventMapper.selectListByConditions(
orgCode, startDate, endDate);
Map<String, DnerHourlyPowerOutageEvent> dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap(

View File

@ -32,35 +32,25 @@ public class DnerSiteAreaConfigurationServiceImpl
@Override
public List<AreaTreeVO> 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<DnerSiteAreaConfiguration> 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<String, AreaTreeVO> buildProvince(
List<DnerSiteAreaConfiguration> dataList, List<AreaTreeVO> result) {
Map<String, AreaTreeVO> provinceCodeAndProvinceMap = new LinkedHashMap<>();

View File

@ -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<String> strings = generateHourList("2026-03-13 22:00", "2026-03-14 01:00");
// List<String> 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");

View File

@ -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>
where 1=1
<choose>
<when test="param.advancedFilterFlag == '1'">
<when test="param.advancedFilterFlag == 1">
<if test="param.rainPastTime != null and param.rainPastTime != 0">
# 过去 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 <![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>
</when>
<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>
</choose>
</where>
</select>
<select id="selectDailyChartAreaTree" resultMap="BaseResultMap">