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 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -98,6 +108,6 @@ public class DnerController {
|
|||||||
*/
|
*/
|
||||||
@GetMapping("/sync/dailyPowerOutageEvent")
|
@GetMapping("/sync/dailyPowerOutageEvent")
|
||||||
public Result<Boolean> syncDailyPowerOutageEvent(@RequestParam String startDate, @RequestParam String endDate, @RequestParam Long eventId) {
|
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线图数据
|
* 查询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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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天自动归为已复电
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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) {
|
||||||
|
|||||||
@ -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}
|
||||||
|
|||||||
@ -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}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user