2026-03-18提交:分时图高级筛选
This commit is contained in:
parent
8ab7eeb801
commit
25033e5735
@ -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;
|
||||
|
||||
/**
|
||||
* 当前时间
|
||||
*/
|
||||
|
||||
@ -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-已复电)
|
||||
*/
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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<>();
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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">
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user