feat(dner): 支持省市多级区域数据聚合查询
This commit is contained in:
parent
d36ffdff2a
commit
21cfc6020c
@ -43,36 +43,46 @@ public class DnerController {
|
||||
/**
|
||||
* 分时图数据查询
|
||||
*
|
||||
* @param province 省
|
||||
* @param city 城市
|
||||
* @param orgCode 地区编码
|
||||
* @param startDate 开始时间
|
||||
* @param endDate 结束时间
|
||||
* @param startDate 开始时间 格式 yyyy-MM-dd hh:mm:ss
|
||||
* @param endDate 结束时间 格式 yyyy-MM-dd hh:mm:ss
|
||||
* @param eventId 事件ID
|
||||
* @return 返回结果
|
||||
*/
|
||||
@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 endDate,
|
||||
@RequestParam String eventId) {
|
||||
return Result.success(dnerHourlyPowerOutageEventService.queryIntradayData(
|
||||
orgCode, startDate, endDate, eventId));
|
||||
province, city, orgCode, startDate, endDate, eventId));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* K线数据查询
|
||||
*
|
||||
* @param province 省
|
||||
* @param city 城市
|
||||
* @param orgCode 地区编码
|
||||
* @param startDate 开始时间
|
||||
* @param endDate 结束时间
|
||||
* @param startDate 开始时间 格式 yyyy-MM-dd
|
||||
* @param endDate 结束时间 格式 yyyy-MM-dd
|
||||
* @param eventId 事件ID
|
||||
* @return 返回结果
|
||||
*/
|
||||
@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 endDate,
|
||||
@RequestParam String eventId) {
|
||||
return Result.success(dnerDailyPowerOutageEventService.queryKlineData(
|
||||
orgCode, startDate, endDate, eventId));
|
||||
province, city, orgCode, startDate, endDate, eventId));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -98,6 +108,6 @@ public class DnerController {
|
||||
*/
|
||||
@GetMapping("/sync/dailyPowerOutageEvent")
|
||||
public Result<Boolean> syncDailyPowerOutageEvent(@RequestParam String startDate, @RequestParam String endDate, @RequestParam Long eventId) {
|
||||
return Result.success(dnerDailyPowerOutageEventSyncService.processingData(startDate, endDate,eventId));
|
||||
return Result.success(dnerDailyPowerOutageEventSyncService.processingData(startDate, endDate, eventId));
|
||||
}
|
||||
}
|
||||
|
||||
@ -14,11 +14,13 @@ public interface IDnerDailyPowerOutageEventService extends IService<DnerDailyPow
|
||||
/**
|
||||
* 查询K线图数据
|
||||
*
|
||||
* @param province 省份
|
||||
* @param city 城市
|
||||
* @param orgCode 地区编码
|
||||
* @param startDate 开始时间
|
||||
* @param endDate 结束时间
|
||||
* @param eventId 事件ID
|
||||
* @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);
|
||||
}
|
||||
|
||||
@ -14,13 +14,15 @@ public interface IDnerHourlyPowerOutageEventService extends IService<DnerHourlyP
|
||||
/**
|
||||
* 查询分时图数据
|
||||
*
|
||||
* @param province 省份
|
||||
* @param city 城市
|
||||
* @param orgCode 地区编码
|
||||
* @param startDate 开始时间
|
||||
* @param endDate 结束时间
|
||||
* @param eventId 事件ID
|
||||
* @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天自动归为已复电
|
||||
|
||||
@ -13,11 +13,10 @@ import com.southern.power.grid.utils.ToolUtils;
|
||||
import lombok.NonNull;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* 日K线停电事件 -- service实现类
|
||||
@ -33,22 +32,23 @@ public class DnerDailyPowerOutageEventServiceImpl
|
||||
private DnerDailyPowerOutageEventMapper dnerDailyPowerOutageEventMapper;
|
||||
|
||||
@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天的记录
|
||||
String beforeNumDays = TimeUtil.getBeforeNumDays(startDate, 29); // 获取前29天的日期
|
||||
String code = getCode(province, city, orgCode);
|
||||
List<DnerDailyPowerOutageEvent> dataList = dnerDailyPowerOutageEventMapper.selectListByConditions(
|
||||
orgCode, beforeNumDays, endDate, eventId);
|
||||
Map<String, DnerDailyPowerOutageEvent> dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap(
|
||||
DnerDailyPowerOutageEvent::getDataTime, Function.identity(), (k1, k2) -> k1));
|
||||
code, beforeNumDays, endDate, eventId);
|
||||
Map<String, List<DnerDailyPowerOutageEvent>> dateTimeAndEntityMap = dataList.stream()
|
||||
.collect(Collectors.groupingBy(DnerDailyPowerOutageEvent::getDataTime));
|
||||
DailyPowerOutageEventVO result = new DailyPowerOutageEventVO();
|
||||
result.initList();
|
||||
List<String> dateTimeList = TimeUtil.getBetweenDates(startDate, endDate); // 获取开始时间到结束时间每一天的数组
|
||||
dateTimeList.forEach(e -> { // 遍历开始时间和结束时间的日期
|
||||
DnerDailyPowerOutageEvent event = dateTimeAndEntityMap.get(e);
|
||||
if (Objects.isNull(event)) { // 数据为空,全部默认为0值
|
||||
List<DnerDailyPowerOutageEvent> events = dateTimeAndEntityMap.get(e);
|
||||
if (CollectionUtil.isEmpty(events)) { // 数据为空,全部默认为0值
|
||||
setZeroData(result, dateTimeAndEntityMap, e);
|
||||
} else { // 数据不为空,正常赋值
|
||||
setDailyData(event, result, dateTimeAndEntityMap);
|
||||
setDailyData(e,events, result, dateTimeAndEntityMap);
|
||||
}
|
||||
});
|
||||
result.setFullDates(dateTimeList.stream().map(
|
||||
@ -60,6 +60,19 @@ public class DnerDailyPowerOutageEventServiceImpl
|
||||
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) {
|
||||
List<Integer> kLineList = new ArrayList<>();
|
||||
result.getUserKline().getKline().forEach(kLineList::addAll);
|
||||
@ -149,43 +162,85 @@ public class DnerDailyPowerOutageEventServiceImpl
|
||||
return collectVOList;
|
||||
}
|
||||
|
||||
private static void setDailyData(DnerDailyPowerOutageEvent event, DailyPowerOutageEventVO result,
|
||||
Map<String, DnerDailyPowerOutageEvent> dateTimeAndEntityMap) {
|
||||
result.getCumulativeRain().add(Double.valueOf(event.getDailyPrecipitation()));
|
||||
result.getAvgRain().add(Double.valueOf(event.getHourlyPrecipitation()));
|
||||
result.getAvgTemp().add(Double.valueOf(event.getTemperature()));
|
||||
result.getMaxTemp().add(Double.valueOf(event.getHourlyMaxTemperature()));
|
||||
result.getMinTemp().add(Double.valueOf(event.getHourlyMinTemperature()));
|
||||
private static void setDailyData(String dataTime, List<DnerDailyPowerOutageEvent> events, DailyPowerOutageEventVO result,
|
||||
Map<String, List<DnerDailyPowerOutageEvent>> dateTimeAndEntityMap) {
|
||||
// 聚合天气数据 - 取平均值
|
||||
double dailyPrecipitationSum = events.stream()
|
||||
.mapToDouble(e -> Double.parseDouble(e.getDailyPrecipitation()))
|
||||
.average().orElse(0.0);
|
||||
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(),
|
||||
event.getMinUserCount(), event.getMaxUserCount()));
|
||||
result.getUserKline().getMa5().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 5, 0));
|
||||
result.getUserKline().getMa10().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 10, 0));
|
||||
result.getUserKline().getMa20().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 20, 0));
|
||||
result.getUserKline().getMa30().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 30, 0));
|
||||
int starUserCountOpen = events.stream().mapToInt(DnerDailyPowerOutageEvent::getStarUserCount).sum();
|
||||
int endUserCountClose = events.stream().mapToInt(DnerDailyPowerOutageEvent::getEndUserCount).sum();
|
||||
int minUserCountLow = events.stream().mapToInt(DnerDailyPowerOutageEvent::getMinUserCount).sum();
|
||||
int maxUserCountHigh = events.stream().mapToInt(DnerDailyPowerOutageEvent::getMaxUserCount).sum();
|
||||
result.getUserKline().getKline().add(Arrays.asList(starUserCountOpen, endUserCountClose,
|
||||
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(),
|
||||
event.getFaultEndUserCount(), event.getFaultMinUserCount(), event.getFaultMaxUserCount()));
|
||||
result.getFaultUserKline().getMa5().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 5, 1));
|
||||
result.getFaultUserKline().getMa10().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 10, 1));
|
||||
result.getFaultUserKline().getMa20().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 20, 1));
|
||||
result.getFaultUserKline().getMa30().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 30, 1));
|
||||
int faultStarUserCountOpen = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultStarUserCount).sum();
|
||||
int faultEndUserCountClose = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultEndUserCount).sum();
|
||||
int faultMinUserCountLow = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultMinUserCount).sum();
|
||||
int faultMaxUserCountHigh = events.stream().mapToInt(DnerDailyPowerOutageEvent::getFaultMaxUserCount).sum();
|
||||
result.getFaultUserKline().getKline().add(Arrays.asList(faultStarUserCountOpen,
|
||||
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(
|
||||
event.getScheduledStarUserCount(), event.getScheduledEndUserCount(),
|
||||
event.getScheduledMinUserCount(), event.getScheduledMaxUserCount()));
|
||||
result.getScheduledUserKline().getMa5().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 5, 2));
|
||||
result.getScheduledUserKline().getMa10().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 10, 2));
|
||||
result.getScheduledUserKline().getMa20().add(getMa(event.getDataTime(), dateTimeAndEntityMap, 20, 2));
|
||||
result.getScheduledUserKline().getMa30().add(getMa(event.getDataTime(), 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());
|
||||
scheduledStarUserCountOpen, scheduledEndUserCountClose,
|
||||
scheduledMinUserCountLow, scheduledMaxUserCountHigh));
|
||||
result.getScheduledUserKline().getMa5().add(getMa(dataTime, dateTimeAndEntityMap, 5, 2));
|
||||
result.getScheduledUserKline().getMa10().add(getMa(dataTime, dateTimeAndEntityMap, 10, 2));
|
||||
result.getScheduledUserKline().getMa20().add(getMa(dataTime, dateTimeAndEntityMap, 20, 2));
|
||||
result.getScheduledUserKline().getMa30().add(getMa(dataTime, dateTimeAndEntityMap, 30, 2));
|
||||
}
|
||||
|
||||
private static void setZeroData(DailyPowerOutageEventVO result,
|
||||
Map<String,DnerDailyPowerOutageEvent> dateTimeAndEntityMap,
|
||||
Map<String, List<DnerDailyPowerOutageEvent>> dateTimeAndEntityMap,
|
||||
String dataTime) {
|
||||
List<Integer> klineE = Arrays.asList(0, 0, 0, 0);
|
||||
result.getCumulativeRain().add(0.0);
|
||||
@ -218,34 +273,46 @@ public class DnerDailyPowerOutageEventServiceImpl
|
||||
}
|
||||
|
||||
private static int getMa(String dataTime,
|
||||
Map<String, DnerDailyPowerOutageEvent> dateTimeAndEntityMap,
|
||||
Map<String, List<DnerDailyPowerOutageEvent>> dateTimeAndEntityMap,
|
||||
int maNum, int maType) {
|
||||
int userCount = 0;
|
||||
List<String> maDateList = TimeUtil.getBetweenDates(
|
||||
TimeUtil.getBeforeNumDays(dataTime, maNum - 1), dataTime);
|
||||
if (1 == maType) { // 故障类
|
||||
for (String date : maDateList) {
|
||||
DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date);
|
||||
if (!Objects.isNull(outageEvent)) {
|
||||
userCount += outageEvent.getFaultEndUserCount();
|
||||
List<DnerDailyPowerOutageEvent> outageEvents = dateTimeAndEntityMap.get(date);
|
||||
if (!CollectionUtil.isEmpty(outageEvents)) {
|
||||
// 对每日的故障用户数求和
|
||||
int dailyFaultUserCount = outageEvents.stream()
|
||||
.mapToInt(DnerDailyPowerOutageEvent::getFaultEndUserCount)
|
||||
.sum();
|
||||
userCount += dailyFaultUserCount;
|
||||
}
|
||||
}
|
||||
return (userCount + maNum - 1)/maNum; // 向上取整
|
||||
}
|
||||
if (2 == maType) { // 计划类
|
||||
for (String date : maDateList) {
|
||||
DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date);
|
||||
if (!Objects.isNull(outageEvent)) {
|
||||
userCount += outageEvent.getScheduledEndUserCount();
|
||||
List<DnerDailyPowerOutageEvent> outageEvents = dateTimeAndEntityMap.get(date);
|
||||
if (!CollectionUtil.isEmpty(outageEvents)) {
|
||||
// 对每日的计划用户数求和
|
||||
int dailyScheduledUserCount = outageEvents.stream()
|
||||
.mapToInt(DnerDailyPowerOutageEvent::getScheduledEndUserCount)
|
||||
.sum();
|
||||
userCount += dailyScheduledUserCount;
|
||||
}
|
||||
}
|
||||
return (userCount + maNum - 1)/maNum;
|
||||
}
|
||||
// 总的
|
||||
for (String date : maDateList) {
|
||||
DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date);
|
||||
if (!Objects.isNull(outageEvent)) {
|
||||
userCount += outageEvent.getEndUserCount();
|
||||
List<DnerDailyPowerOutageEvent> outageEvents = dateTimeAndEntityMap.get(date);
|
||||
if (!CollectionUtil.isEmpty(outageEvents)) {
|
||||
// 对每日的总用户数求和
|
||||
int dailyUserCount = outageEvents.stream()
|
||||
.mapToInt(DnerDailyPowerOutageEvent::getEndUserCount)
|
||||
.sum();
|
||||
userCount += dailyUserCount;
|
||||
}
|
||||
}
|
||||
return (userCount + maNum - 1)/maNum;
|
||||
|
||||
@ -12,12 +12,15 @@ import com.southern.power.grid.utils.ToolUtils;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@ -35,23 +38,24 @@ public class DnerHourlyPowerOutageEventServiceImpl
|
||||
private DnerHourlyPowerOutageEventMapper dnerHourlyPowerOutageEventMapper;
|
||||
|
||||
@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";
|
||||
endDate = endDate.substring(0, 13) + ":00";
|
||||
String code = getCode(province, city, orgCode);
|
||||
List<DnerHourlyPowerOutageEvent> dataList = dnerHourlyPowerOutageEventMapper.selectListByConditions(
|
||||
orgCode, startDate, endDate, eventId);
|
||||
Map<String, DnerHourlyPowerOutageEvent> dateTimeAndEntityMap = dataList.stream().collect(Collectors.toMap(
|
||||
DnerHourlyPowerOutageEvent::getDataTime, Function.identity(), (k1, k2) -> k1));
|
||||
code, startDate, endDate, eventId);
|
||||
Map<String, List<DnerHourlyPowerOutageEvent>> dateTimeAndEntityMap = dataList.stream()
|
||||
.collect(Collectors.groupingBy(DnerHourlyPowerOutageEvent::getDataTime));
|
||||
HourlyPowerOutageEventChartVO result = new HourlyPowerOutageEventChartVO();
|
||||
result.initList();
|
||||
List<String> dateTimeList = TimeUtil.generateHourListAll(startDate, endDate); // 获取开始时间到结束时间的小时数组
|
||||
dateTimeList.forEach(e -> {
|
||||
e = e + ":00";
|
||||
DnerHourlyPowerOutageEvent event = dateTimeAndEntityMap.get(e);
|
||||
if (Objects.isNull(event)) { // 数据为空,全部默认为0值
|
||||
List<DnerHourlyPowerOutageEvent> events = dateTimeAndEntityMap.get(e);
|
||||
if (CollectionUtil.isEmpty(events)) { // 数据为空,全部默认为0值
|
||||
setZeroData(result);
|
||||
} else {
|
||||
setHourlyData(result, event);
|
||||
setHourlyData(result, events);
|
||||
}
|
||||
});
|
||||
result.setDateList(TimeUtil.generateHourList(startDate, endDate)); // 日期列表
|
||||
@ -71,6 +75,27 @@ public class DnerHourlyPowerOutageEventServiceImpl
|
||||
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) {
|
||||
if (!CollectionUtil.isEmpty(result.getPowerOutageUserCountList())) {
|
||||
result.getHourlyChartYScaleRuleCollect().setUserCountRule(
|
||||
@ -106,15 +131,36 @@ public class DnerHourlyPowerOutageEventServiceImpl
|
||||
}
|
||||
}
|
||||
|
||||
private static void setHourlyData(HourlyPowerOutageEventChartVO result, DnerHourlyPowerOutageEvent event) {
|
||||
result.getPowerOutageUserCountList().add(event.getUserCount()); // 停电影响用户总数
|
||||
result.getFaultUserCountList().add(event.getFaultUserCount()); // 故障停电影响用户总数
|
||||
result.getScheduledUserCountList().add(event.getScheduledUserCount()); // 计划停电影响用户总数
|
||||
result.getAvgTemList().add(Double.valueOf(event.getTemperature())); // 平均气温
|
||||
result.getMaxTemList().add(Double.valueOf(event.getHourlyMaxTemperature())); // 小时最大气温
|
||||
result.getMinTemList().add(Double.valueOf(event.getHourlyMinTemperature())); // 小时最低气温
|
||||
result.getPrecList().add(Double.valueOf(event.getHourlyPrecipitation())); // 小时降雨量
|
||||
result.getWindList().add(Double.valueOf(event.getExtremeWindSpeedHourly())); // 小时极大风速
|
||||
private static void setHourlyData(HourlyPowerOutageEventChartVO result, List<DnerHourlyPowerOutageEvent> events) {
|
||||
// Aggregate values by summing user counts and averaging weather data
|
||||
int totalUserCount = events.stream().mapToInt(DnerHourlyPowerOutageEvent::getUserCount).sum();
|
||||
int totalFaultUserCount = events.stream().mapToInt(DnerHourlyPowerOutageEvent::getFaultUserCount).sum();
|
||||
int totalScheduledUserCount = events.stream().mapToInt(DnerHourlyPowerOutageEvent::getScheduledUserCount).sum();
|
||||
|
||||
double avgTemperature = events.stream()
|
||||
.mapToDouble(e -> Double.parseDouble(e.getTemperature()))
|
||||
.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) {
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
`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`
|
||||
from dner_daily_power_outage_event
|
||||
where org_code = #{orgCode}
|
||||
where org_code LIKE CONCAT(#{orgCode}, '%')
|
||||
and data_time >= #{startDate}
|
||||
and data_time <![CDATA[ <= ]]> #{endDate}
|
||||
and event_id = #{eventId}
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
`outage_state`, `outage_type`, `create_by`, `create_time`, `update_by`, `update_time`,
|
||||
`fault_user_count`, `scheduled_user_count`
|
||||
from dner_hourly_power_outage_event
|
||||
where org_code = #{orgCode}
|
||||
where org_code LIKE CONCAT(#{orgCode}, '%')
|
||||
and data_time >= #{startDate}
|
||||
and data_time <![CDATA[ <= ]]> #{endDate}
|
||||
and event_id = #{eventId}
|
||||
|
||||
@ -10,3 +10,7 @@ create index regional_weather_data_1_index
|
||||
|
||||
create index dner_hourly_power_outage_event_1_index
|
||||
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);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user