feat(dner): 支持省市多级区域数据聚合查询

This commit is contained in:
fsyud 2026-04-16 17:17:15 +08:00
parent d36ffdff2a
commit 21cfc6020c
8 changed files with 212 additions and 81 deletions

View File

@ -43,36 +43,46 @@ public class DnerController {
/** /**
* 分时图数据查询 * 分时图数据查询
* *
* @param province
* @param city 城市
* @param orgCode 地区编码 * @param orgCode 地区编码
* @param startDate 开始时间 * @param startDate 开始时间 格式 yyyy-MM-dd hh:mm:ss
* @param endDate 结束时间 * @param endDate 结束时间 格式 yyyy-MM-dd hh:mm:ss
* @param eventId 事件ID
* @return 返回结果 * @return 返回结果
*/ */
@GetMapping("/intraday/query") @GetMapping("/intraday/query")
public Result<HourlyPowerOutageEventChartVO> queryIntradayData(@RequestParam String orgCode, public Result<HourlyPowerOutageEventChartVO> queryIntradayData(@RequestParam String province,
@RequestParam String city,
@RequestParam String orgCode,
@RequestParam String startDate, @RequestParam String startDate,
@RequestParam String endDate, @RequestParam String endDate,
@RequestParam String eventId) { @RequestParam String eventId) {
return Result.success(dnerHourlyPowerOutageEventService.queryIntradayData( return Result.success(dnerHourlyPowerOutageEventService.queryIntradayData(
orgCode, startDate, endDate, eventId)); province, city, orgCode, startDate, endDate, eventId));
} }
/** /**
* K线数据查询 * K线数据查询
* *
* @param province
* @param city 城市
* @param orgCode 地区编码 * @param orgCode 地区编码
* @param startDate 开始时间 * @param startDate 开始时间 格式 yyyy-MM-dd
* @param endDate 结束时间 * @param endDate 结束时间 格式 yyyy-MM-dd
* @param eventId 事件ID
* @return 返回结果 * @return 返回结果
*/ */
@GetMapping("/kline/query") @GetMapping("/kline/query")
public Result<DailyPowerOutageEventVO> queryKlineData(@RequestParam String orgCode, public Result<DailyPowerOutageEventVO> queryKlineData(@RequestParam String province,
@RequestParam String city,
@RequestParam String orgCode,
@RequestParam String startDate, @RequestParam String startDate,
@RequestParam String endDate, @RequestParam String endDate,
@RequestParam String eventId) { @RequestParam String eventId) {
return Result.success(dnerDailyPowerOutageEventService.queryKlineData( return Result.success(dnerDailyPowerOutageEventService.queryKlineData(
orgCode, startDate, endDate, eventId)); province, city, orgCode, startDate, endDate, eventId));
} }
/** /**

View File

@ -14,11 +14,13 @@ public interface IDnerDailyPowerOutageEventService extends IService<DnerDailyPow
/** /**
* 查询K线图数据 * 查询K线图数据
* *
* @param province 省份
* @param city 城市
* @param orgCode 地区编码 * @param orgCode 地区编码
* @param startDate 开始时间 * @param startDate 开始时间
* @param endDate 结束时间 * @param endDate 结束时间
* @param eventId 事件ID * @param eventId 事件ID
* @return 返回结果 * @return 返回结果
*/ */
DailyPowerOutageEventVO queryKlineData(String orgCode, String startDate, String endDate, String eventId); DailyPowerOutageEventVO queryKlineData(String province, String city, String orgCode, String startDate, String endDate, String eventId);
} }

View File

@ -14,13 +14,15 @@ public interface IDnerHourlyPowerOutageEventService extends IService<DnerHourlyP
/** /**
* 查询分时图数据 * 查询分时图数据
* *
* @param province 省份
* @param city 城市
* @param orgCode 地区编码 * @param orgCode 地区编码
* @param startDate 开始时间 * @param startDate 开始时间
* @param endDate 结束时间 * @param endDate 结束时间
* @param eventId 事件ID * @param eventId 事件ID
* @return 返回结果 * @return 返回结果
*/ */
HourlyPowerOutageEventChartVO queryIntradayData(String orgCode, String startDate, String endDate, String eventId); HourlyPowerOutageEventChartVO queryIntradayData(String province, String city, String orgCode, String startDate, String endDate, String eventId);
/** /**
* 停电开始时间超过7天自动归为已复电 * 停电开始时间超过7天自动归为已复电

View File

@ -13,11 +13,10 @@ import com.southern.power.grid.utils.ToolUtils;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* 日K线停电事件 -- service实现类 * 日K线停电事件 -- service实现类
@ -33,22 +32,23 @@ public class DnerDailyPowerOutageEventServiceImpl
private DnerDailyPowerOutageEventMapper dnerDailyPowerOutageEventMapper; private DnerDailyPowerOutageEventMapper dnerDailyPowerOutageEventMapper;
@Override @Override
public DailyPowerOutageEventVO queryKlineData(String orgCode, String startDate, String endDate, String eventId) { public DailyPowerOutageEventVO queryKlineData(String province, String city, String orgCode, String startDate, String endDate, String eventId) {
// 为了计算ma5/10/20/30查询起始日期往前推29天的记录 // 为了计算ma5/10/20/30查询起始日期往前推29天的记录
String beforeNumDays = TimeUtil.getBeforeNumDays(startDate, 29); // 获取前29天的日期 String beforeNumDays = TimeUtil.getBeforeNumDays(startDate, 29); // 获取前29天的日期
String code = getCode(province, city, orgCode);
List<DnerDailyPowerOutageEvent> dataList = dnerDailyPowerOutageEventMapper.selectListByConditions( List<DnerDailyPowerOutageEvent> dataList = dnerDailyPowerOutageEventMapper.selectListByConditions(
orgCode, beforeNumDays, endDate, eventId); code, beforeNumDays, endDate, eventId);
Map<String, DnerDailyPowerOutageEvent> dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap( Map<String, List<DnerDailyPowerOutageEvent>> dateTimeAndEntityMap = dataList.stream()
DnerDailyPowerOutageEvent::getDataTime, Function.identity(), (k1, k2) -> k1)); .collect(Collectors.groupingBy(DnerDailyPowerOutageEvent::getDataTime));
DailyPowerOutageEventVO result = new DailyPowerOutageEventVO(); DailyPowerOutageEventVO result = new DailyPowerOutageEventVO();
result.initList(); result.initList();
List<String> dateTimeList = TimeUtil.getBetweenDates(startDate, endDate); // 获取开始时间到结束时间每一天的数组 List<String> dateTimeList = TimeUtil.getBetweenDates(startDate, endDate); // 获取开始时间到结束时间每一天的数组
dateTimeList.forEach(e -> { // 遍历开始时间和结束时间的日期 dateTimeList.forEach(e -> { // 遍历开始时间和结束时间的日期
DnerDailyPowerOutageEvent event = dateTimeAndEntityMap.get(e); List<DnerDailyPowerOutageEvent> events = dateTimeAndEntityMap.get(e);
if (Objects.isNull(event)) { // 数据为空全部默认为0值 if (CollectionUtil.isEmpty(events)) { // 数据为空全部默认为0值
setZeroData(result, dateTimeAndEntityMap, e); setZeroData(result, dateTimeAndEntityMap, e);
} else { // 数据不为空正常赋值 } else { // 数据不为空正常赋值
setDailyData(event, result, dateTimeAndEntityMap); setDailyData(e,events, result, dateTimeAndEntityMap);
} }
}); });
result.setFullDates(dateTimeList.stream().map( result.setFullDates(dateTimeList.stream().map(
@ -60,6 +60,19 @@ public class DnerDailyPowerOutageEventServiceImpl
return result; return result;
} }
private String getCode(String province, String city, String orgCode) {
if (StringUtils.hasLength(orgCode)) {
return orgCode;
}
if (StringUtils.hasLength(city)) {
return city.length() >= 4 ? city.substring(0, 4) : city;
}
if (StringUtils.hasLength(province)) {
return province.length() >= 2 ? province.substring(0, 2) : province;
}
return null;
}
private static void handleYScaleRule(DailyPowerOutageEventVO result) { private static void handleYScaleRule(DailyPowerOutageEventVO result) {
List<Integer> kLineList = new ArrayList<>(); List<Integer> kLineList = new ArrayList<>();
result.getUserKline().getKline().forEach(kLineList::addAll); result.getUserKline().getKline().forEach(kLineList::addAll);
@ -149,43 +162,85 @@ public class DnerDailyPowerOutageEventServiceImpl
return collectVOList; return collectVOList;
} }
private static void setDailyData(DnerDailyPowerOutageEvent event, DailyPowerOutageEventVO result, private static void setDailyData(String dataTime, List<DnerDailyPowerOutageEvent> events, DailyPowerOutageEventVO result,
Map<String, DnerDailyPowerOutageEvent> dateTimeAndEntityMap) { Map<String, List<DnerDailyPowerOutageEvent>> dateTimeAndEntityMap) {
result.getCumulativeRain().add(Double.valueOf(event.getDailyPrecipitation())); // 聚合天气数据 - 取平均值
result.getAvgRain().add(Double.valueOf(event.getHourlyPrecipitation())); double dailyPrecipitationSum = events.stream()
result.getAvgTemp().add(Double.valueOf(event.getTemperature())); .mapToDouble(e -> Double.parseDouble(e.getDailyPrecipitation()))
result.getMaxTemp().add(Double.valueOf(event.getHourlyMaxTemperature())); .average().orElse(0.0);
result.getMinTemp().add(Double.valueOf(event.getHourlyMinTemperature())); double hourlyPrecipitationSum = events.stream()
.mapToDouble(e -> Double.parseDouble(e.getHourlyPrecipitation()))
.average().orElse(0.0);
double temperatureSum = events.stream()
.mapToDouble(e -> Double.parseDouble(e.getTemperature()))
.average().orElse(0.0);
double hourlyMaxTemp = events.stream()
.mapToDouble(e -> Double.parseDouble(e.getHourlyMaxTemperature()))
.average().orElse(0.0);
double hourlyMinTemp = events.stream()
.mapToDouble(e -> Double.parseDouble(e.getHourlyMinTemperature()))
.average().orElse(0.0);
double extremeWindSpeed = events.stream()
.mapToDouble(e -> Double.parseDouble(e.getExtremeWindSpeedHourly()))
.average().orElse(0.0);
result.getCumulativeRain().add(dailyPrecipitationSum);
result.getAvgRain().add(hourlyPrecipitationSum);
result.getAvgTemp().add(temperatureSum);
result.getMaxTemp().add(hourlyMaxTemp);
result.getMinTemp().add(hourlyMinTemp);
result.getWindSpeed().add(extremeWindSpeed);
// 聚合用户数数据 - 求和
int userCountSum = events.stream().mapToInt(DnerDailyPowerOutageEvent::getUserCount).sum();
int faultUserCountSum = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultUserCount).sum();
int scheduledUserCountSum = events.stream().mapToInt(DnerDailyPowerOutageEvent::getScheduledUserCount).sum();
result.getUserCounts().add(userCountSum);
result.getFaultUserCountList().add(faultUserCountSum);
result.getScheduledUserCountList().add(scheduledUserCountSum);
// 聚合K线数据 - OHLC (Open, High, Low, Close)
// 总的 // 总的
result.getUserKline().getKline().add(Arrays.asList(event.getStarUserCount(), event.getEndUserCount(), int starUserCountOpen = events.stream().mapToInt(DnerDailyPowerOutageEvent::getStarUserCount).sum();
event.getMinUserCount(), event.getMaxUserCount())); int endUserCountClose = events.stream().mapToInt(DnerDailyPowerOutageEvent::getEndUserCount).sum();
result.getUserKline().getMa5().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 5, 0)); int minUserCountLow = events.stream().mapToInt(DnerDailyPowerOutageEvent::getMinUserCount).sum();
result.getUserKline().getMa10().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 10, 0)); int maxUserCountHigh = events.stream().mapToInt(DnerDailyPowerOutageEvent::getMaxUserCount).sum();
result.getUserKline().getMa20().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 20, 0)); result.getUserKline().getKline().add(Arrays.asList(starUserCountOpen, endUserCountClose,
result.getUserKline().getMa30().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 30, 0)); minUserCountLow, maxUserCountHigh));
result.getUserKline().getMa5().add(getMa(dataTime, dateTimeAndEntityMap, 5, 0));
result.getUserKline().getMa10().add(getMa(dataTime, dateTimeAndEntityMap, 10, 0));
result.getUserKline().getMa20().add(getMa(dataTime, dateTimeAndEntityMap, 20, 0));
result.getUserKline().getMa30().add(getMa(dataTime, dateTimeAndEntityMap, 30, 0));
// 计划 // 计划
result.getFaultUserKline().getKline().add(Arrays.asList(event.getFaultStarUserCount(), int faultStarUserCountOpen = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultStarUserCount).sum();
event.getFaultEndUserCount(), event.getFaultMinUserCount(), event.getFaultMaxUserCount())); int faultEndUserCountClose = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultEndUserCount).sum();
result.getFaultUserKline().getMa5().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 5, 1)); int faultMinUserCountLow = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultMinUserCount).sum();
result.getFaultUserKline().getMa10().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 10, 1)); int faultMaxUserCountHigh = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultMaxUserCount).sum();
result.getFaultUserKline().getMa20().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 20, 1)); result.getFaultUserKline().getKline().add(Arrays.asList(faultStarUserCountOpen,
result.getFaultUserKline().getMa30().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 30, 1)); faultEndUserCountClose, faultMinUserCountLow, faultMaxUserCountHigh));
result.getFaultUserKline().getMa5().add(getMa(dataTime, dateTimeAndEntityMap, 5, 1));
result.getFaultUserKline().getMa10().add(getMa(dataTime, dateTimeAndEntityMap, 10, 1));
result.getFaultUserKline().getMa20().add(getMa(dataTime, dateTimeAndEntityMap, 20, 1));
result.getFaultUserKline().getMa30().add(getMa(dataTime, dateTimeAndEntityMap, 30, 1));
// 故障 // 故障
int scheduledStarUserCountOpen = events.stream().mapToInt(DnerDailyPowerOutageEvent::getScheduledStarUserCount).sum();
int scheduledEndUserCountClose = events.stream().mapToInt(DnerDailyPowerOutageEvent::getScheduledEndUserCount).sum();
int scheduledMinUserCountLow = events.stream().mapToInt(DnerDailyPowerOutageEvent::getScheduledMinUserCount).sum();
int scheduledMaxUserCountHigh = events.stream().mapToInt(DnerDailyPowerOutageEvent::getScheduledMaxUserCount).sum();
result.getScheduledUserKline().getKline().add(Arrays.asList( result.getScheduledUserKline().getKline().add(Arrays.asList(
event.getScheduledStarUserCount(), event.getScheduledEndUserCount(), scheduledStarUserCountOpen, scheduledEndUserCountClose,
event.getScheduledMinUserCount(), event.getScheduledMaxUserCount())); scheduledMinUserCountLow, scheduledMaxUserCountHigh));
result.getScheduledUserKline().getMa5().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 5, 2)); result.getScheduledUserKline().getMa5().add(getMa(dataTime, dateTimeAndEntityMap, 5, 2));
result.getScheduledUserKline().getMa10().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 10, 2)); result.getScheduledUserKline().getMa10().add(getMa(dataTime, dateTimeAndEntityMap, 10, 2));
result.getScheduledUserKline().getMa20().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 20, 2)); result.getScheduledUserKline().getMa20().add(getMa(dataTime, dateTimeAndEntityMap, 20, 2));
result.getScheduledUserKline().getMa30().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 30, 2)); result.getScheduledUserKline().getMa30().add(getMa(dataTime, dateTimeAndEntityMap, 30, 2));
result.getWindSpeed().add(Double.valueOf(event.getExtremeWindSpeedHourly()));
result.getUserCounts().add(event.getUserCount());
result.getFaultUserCountList().add(event.getFaultUserCount());
result.getScheduledUserCountList().add(event.getScheduledUserCount());
} }
private static void setZeroData(DailyPowerOutageEventVO result, private static void setZeroData(DailyPowerOutageEventVO result,
Map<String,DnerDailyPowerOutageEvent> dateTimeAndEntityMap, Map<String, List<DnerDailyPowerOutageEvent>> dateTimeAndEntityMap,
String dataTime) { String dataTime) {
List<Integer> klineE = Arrays.asList(0, 0, 0, 0); List<Integer> klineE = Arrays.asList(0, 0, 0, 0);
result.getCumulativeRain().add(0.0); result.getCumulativeRain().add(0.0);
@ -218,34 +273,46 @@ public class DnerDailyPowerOutageEventServiceImpl
} }
private static int getMa(String dataTime, private static int getMa(String dataTime,
Map<String, DnerDailyPowerOutageEvent> dateTimeAndEntityMap, Map<String, List<DnerDailyPowerOutageEvent>> dateTimeAndEntityMap,
int maNum, int maType) { int maNum, int maType) {
int userCount = 0; int userCount = 0;
List<String> maDateList = TimeUtil.getBetweenDates( List<String> maDateList = TimeUtil.getBetweenDates(
TimeUtil.getBeforeNumDays(dataTime, maNum - 1), dataTime); TimeUtil.getBeforeNumDays(dataTime, maNum - 1), dataTime);
if (1 == maType) { // 故障类 if (1 == maType) { // 故障类
for (String date : maDateList) { for (String date : maDateList) {
DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date); List<DnerDailyPowerOutageEvent> outageEvents = dateTimeAndEntityMap.get(date);
if (!Objects.isNull(outageEvent)) { if (!CollectionUtil.isEmpty(outageEvents)) {
userCount += outageEvent.getFaultEndUserCount(); // 对每日的故障用户数求和
int dailyFaultUserCount = outageEvents.stream()
.mapToInt(DnerDailyPowerOutageEvent::getFaultEndUserCount)
.sum();
userCount += dailyFaultUserCount;
} }
} }
return (userCount + maNum - 1)/maNum; // 向上取整 return (userCount + maNum - 1)/maNum; // 向上取整
} }
if (2 == maType) { // 计划类 if (2 == maType) { // 计划类
for (String date : maDateList) { for (String date : maDateList) {
DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date); List<DnerDailyPowerOutageEvent> outageEvents = dateTimeAndEntityMap.get(date);
if (!Objects.isNull(outageEvent)) { if (!CollectionUtil.isEmpty(outageEvents)) {
userCount += outageEvent.getScheduledEndUserCount(); // 对每日的计划用户数求和
int dailyScheduledUserCount = outageEvents.stream()
.mapToInt(DnerDailyPowerOutageEvent::getScheduledEndUserCount)
.sum();
userCount += dailyScheduledUserCount;
} }
} }
return (userCount + maNum - 1)/maNum; return (userCount + maNum - 1)/maNum;
} }
// 总的 // 总的
for (String date : maDateList) { for (String date : maDateList) {
DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date); List<DnerDailyPowerOutageEvent> outageEvents = dateTimeAndEntityMap.get(date);
if (!Objects.isNull(outageEvent)) { if (!CollectionUtil.isEmpty(outageEvents)) {
userCount += outageEvent.getEndUserCount(); // 对每日的总用户数求和
int dailyUserCount = outageEvents.stream()
.mapToInt(DnerDailyPowerOutageEvent::getEndUserCount)
.sum();
userCount += dailyUserCount;
} }
} }
return (userCount + maNum - 1)/maNum; return (userCount + maNum - 1)/maNum;

View File

@ -12,12 +12,15 @@ import com.southern.power.grid.utils.ToolUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.ArrayList;
import java.util.function.Function; import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -35,23 +38,24 @@ public class DnerHourlyPowerOutageEventServiceImpl
private DnerHourlyPowerOutageEventMapper dnerHourlyPowerOutageEventMapper; private DnerHourlyPowerOutageEventMapper dnerHourlyPowerOutageEventMapper;
@Override @Override
public HourlyPowerOutageEventChartVO queryIntradayData(String orgCode, String startDate, String endDate, String eventId) { public HourlyPowerOutageEventChartVO queryIntradayData(String province, String city, String orgCode, String startDate, String endDate, String eventId) {
startDate = startDate.substring(0, 13) + ":00"; startDate = startDate.substring(0, 13) + ":00";
endDate = endDate.substring(0, 13) + ":00"; endDate = endDate.substring(0, 13) + ":00";
String code = getCode(province, city, orgCode);
List<DnerHourlyPowerOutageEvent> dataList = dnerHourlyPowerOutageEventMapper.selectListByConditions( List<DnerHourlyPowerOutageEvent> dataList = dnerHourlyPowerOutageEventMapper.selectListByConditions(
orgCode, startDate, endDate, eventId); code, startDate, endDate, eventId);
Map<String, DnerHourlyPowerOutageEvent> dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap( Map<String, List<DnerHourlyPowerOutageEvent>> dateTimeAndEntityMap = dataList.stream()
DnerHourlyPowerOutageEvent::getDataTime, Function.identity(), (k1, k2) -> k1)); .collect(Collectors.groupingBy(DnerHourlyPowerOutageEvent::getDataTime));
HourlyPowerOutageEventChartVO result = new HourlyPowerOutageEventChartVO(); HourlyPowerOutageEventChartVO result = new HourlyPowerOutageEventChartVO();
result.initList(); result.initList();
List<String> dateTimeList = TimeUtil.generateHourListAll(startDate, endDate); // 获取开始时间到结束时间的小时数组 List<String> dateTimeList = TimeUtil.generateHourListAll(startDate, endDate); // 获取开始时间到结束时间的小时数组
dateTimeList.forEach(e -> { dateTimeList.forEach(e -> {
e = e + ":00"; e = e + ":00";
DnerHourlyPowerOutageEvent event = dateTimeAndEntityMap.get(e); List<DnerHourlyPowerOutageEvent> events = dateTimeAndEntityMap.get(e);
if (Objects.isNull(event)) { // 数据为空全部默认为0值 if (CollectionUtil.isEmpty(events)) { // 数据为空全部默认为0值
setZeroData(result); setZeroData(result);
} else { } else {
setHourlyData(result, event); setHourlyData(result, events);
} }
}); });
result.setDateList(TimeUtil.generateHourList(startDate, endDate)); // 日期列表 result.setDateList(TimeUtil.generateHourList(startDate, endDate)); // 日期列表
@ -71,6 +75,27 @@ public class DnerHourlyPowerOutageEventServiceImpl
return result; return result;
} }
/**
* 获取组织代码
*
* @param province
* @param city 城市
* @param orgCode 组织代码
* @return 字符串列表
*/
private String getCode(String province, String city, String orgCode) {
if (StringUtils.hasLength(orgCode)) {
return orgCode;
}
if (StringUtils.hasLength(city)) {
return city.length() >= 4 ? city.substring(0, 4) : city;
}
if (StringUtils.hasLength(province)) {
return province.length() >= 2 ? province.substring(0, 2) : province;
}
return null;
}
private void handleYScaleRule(HourlyPowerOutageEventChartVO result) { private void handleYScaleRule(HourlyPowerOutageEventChartVO result) {
if (!CollectionUtil.isEmpty(result.getPowerOutageUserCountList())) { if (!CollectionUtil.isEmpty(result.getPowerOutageUserCountList())) {
result.getHourlyChartYScaleRuleCollect().setUserCountRule( result.getHourlyChartYScaleRuleCollect().setUserCountRule(
@ -106,15 +131,36 @@ public class DnerHourlyPowerOutageEventServiceImpl
} }
} }
private static void setHourlyData(HourlyPowerOutageEventChartVO result, DnerHourlyPowerOutageEvent event) { private static void setHourlyData(HourlyPowerOutageEventChartVO result, List<DnerHourlyPowerOutageEvent> events) {
result.getPowerOutageUserCountList().add(event.getUserCount()); // 停电影响用户总数 // Aggregate values by summing user counts and averaging weather data
result.getFaultUserCountList().add(event.getFaultUserCount()); // 故障停电影响用户总数 int totalUserCount = events.stream().mapToInt(DnerHourlyPowerOutageEvent::getUserCount).sum();
result.getScheduledUserCountList().add(event.getScheduledUserCount()); // 计划停电影响用户总数 int totalFaultUserCount = events.stream().mapToInt(DnerHourlyPowerOutageEvent::getFaultUserCount).sum();
result.getAvgTemList().add(Double.valueOf(event.getTemperature())); // 平均气温 int totalScheduledUserCount = events.stream().mapToInt(DnerHourlyPowerOutageEvent::getScheduledUserCount).sum();
result.getMaxTemList().add(Double.valueOf(event.getHourlyMaxTemperature())); // 小时最大气温
result.getMinTemList().add(Double.valueOf(event.getHourlyMinTemperature())); // 小时最低气温 double avgTemperature = events.stream()
result.getPrecList().add(Double.valueOf(event.getHourlyPrecipitation())); // 小时降雨量 .mapToDouble(e -> Double.parseDouble(e.getTemperature()))
result.getWindList().add(Double.valueOf(event.getExtremeWindSpeedHourly())); // 小时极大风速 .average().orElse(0.0);
double avgMaxTemperature = events.stream()
.mapToDouble(e -> Double.parseDouble(e.getHourlyMaxTemperature()))
.average().orElse(0.0);
double avgMinTemperature = events.stream()
.mapToDouble(e -> Double.parseDouble(e.getHourlyMinTemperature()))
.average().orElse(0.0);
double avgPrecipitation = events.stream()
.mapToDouble(e -> Double.parseDouble(e.getHourlyPrecipitation()))
.average().orElse(0.0);
double avgMaxWindSpeed = events.stream()
.mapToDouble(e -> Double.parseDouble(e.getExtremeWindSpeedHourly()))
.average().orElse(0.0);
result.getPowerOutageUserCountList().add(totalUserCount); // 停电影响用户总数
result.getFaultUserCountList().add(totalFaultUserCount); // 故障停电影响用户总数
result.getScheduledUserCountList().add(totalScheduledUserCount); // 计划停电影响用户总数
result.getAvgTemList().add(avgTemperature); // 平均气温
result.getMaxTemList().add(avgMaxTemperature); // 小时最大气温
result.getMinTemList().add(avgMinTemperature); // 小时最低气温
result.getPrecList().add(avgPrecipitation); // 小时降雨量
result.getWindList().add(avgMaxWindSpeed); // 小时极大风速
} }
private static void setZeroData(HourlyPowerOutageEventChartVO result) { private static void setZeroData(HourlyPowerOutageEventChartVO result) {

View File

@ -13,7 +13,7 @@
`scheduled_end_user_count`,`scheduled_min_user_count`,`scheduled_max_user_count`, `scheduled_end_user_count`,`scheduled_min_user_count`,`scheduled_max_user_count`,
`create_by`, `create_time`, `update_by`, `update_time`, `fault_user_count`, `scheduled_user_count` `create_by`, `create_time`, `update_by`, `update_time`, `fault_user_count`, `scheduled_user_count`
from dner_daily_power_outage_event from dner_daily_power_outage_event
where org_code = #{orgCode} where org_code LIKE CONCAT(#{orgCode}, '%')
and data_time >= #{startDate} and data_time >= #{startDate}
and data_time <![CDATA[ <= ]]> #{endDate} and data_time <![CDATA[ <= ]]> #{endDate}
and event_id = #{eventId} and event_id = #{eventId}

View File

@ -10,7 +10,7 @@
`outage_state`, `outage_type`, `create_by`, `create_time`, `update_by`, `update_time`, `outage_state`, `outage_type`, `create_by`, `create_time`, `update_by`, `update_time`,
`fault_user_count`, `scheduled_user_count` `fault_user_count`, `scheduled_user_count`
from dner_hourly_power_outage_event from dner_hourly_power_outage_event
where org_code = #{orgCode} where org_code LIKE CONCAT(#{orgCode}, '%')
and data_time >= #{startDate} and data_time >= #{startDate}
and data_time <![CDATA[ <= ]]> #{endDate} and data_time <![CDATA[ <= ]]> #{endDate}
and event_id = #{eventId} and event_id = #{eventId}

View File

@ -10,3 +10,7 @@ create index regional_weather_data_1_index
create index dner_hourly_power_outage_event_1_index create index dner_hourly_power_outage_event_1_index
on dner_hourly_power_outage_event (event_id, org_code, data_time); on dner_hourly_power_outage_event (event_id, org_code, data_time);
create index dner_daily_power_outage_event_1_index
on dner_daily_power_outage_event (event_id, org_code, data_time);