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