2026-04-13提交:分时图和K线图的Y轴规则

This commit is contained in:
junzhangfm 2026-04-13 16:56:34 +08:00
parent 6d60db333b
commit 95bff13881
8 changed files with 302 additions and 33 deletions

View File

@ -0,0 +1,33 @@
package com.southern.power.grid.entity;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 图表Y轴规则
*
* @Author junzhangfm
* @Date 2026-04-13
*/
@Data
@Accessors(chain = true)
public class ChartYScaleRuleVO implements Serializable {
private static final long serialVersionUID = 5346512918646769812L;
/**
* 最小值
*/
Integer min;
/**
* 最大值
*/
Integer max;
/**
* 刻度
*/
Double interval;
}

View File

@ -0,0 +1,43 @@
package com.southern.power.grid.entity;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 日K图表Y轴规则汇总
*
* @Author junzhangfm
* @Date 2026-04-13
*/
@Data
@Accessors(chain = true)
public class DailyChartYScaleRuleCollectVO implements Serializable {
private static final long serialVersionUID = -905304104974547434L;
/**
* 全部停电 ma规则
*/
private ChartYScaleRuleVO maRule;
/**
* 停电影响用户总数
*/
private ChartYScaleRuleVO userCountRule;
/**
* 日累计降水量
*/
private ChartYScaleRuleVO dailyPrecipitationRule;
/**
* 气温
*/
private ChartYScaleRuleVO temperatureRule;
/**
* 日极大风速
*/
private ChartYScaleRuleVO extremeWindSpeedRule;
}

View File

@ -81,7 +81,12 @@ public class DailyPowerOutageEventVO {
/**
* 汇总集合
*/
List<DailyChartCollectVO> collectVOList;
private List<DailyChartCollectVO> collectVOList;
/**
* 日K图Y轴规则汇总
*/
private DailyChartYScaleRuleCollectVO dailyChartYScaleRuleCollect;
public void initList() {
userCounts = new ArrayList<>();
@ -99,6 +104,9 @@ public class DailyPowerOutageEventVO {
.setMa20(new ArrayList<>()).setMa30(new ArrayList<>());
scheduledUserKline = new KLineVO().setKline(new ArrayList<>()).setMa5(new ArrayList<>()).setMa10(new ArrayList<>())
.setMa20(new ArrayList<>()).setMa30(new ArrayList<>());
ChartYScaleRuleVO chartYScaleRuleVO = new ChartYScaleRuleVO().setMin(0).setMax(100).setInterval(10.0);
dailyChartYScaleRuleCollect = new DailyChartYScaleRuleCollectVO().setMaRule(chartYScaleRuleVO)
.setUserCountRule(chartYScaleRuleVO).setDailyPrecipitationRule(chartYScaleRuleVO)
.setTemperatureRule(chartYScaleRuleVO).setExtremeWindSpeedRule(chartYScaleRuleVO);
}
}

View File

@ -0,0 +1,54 @@
package com.southern.power.grid.entity;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
/**
* 分时图表Y轴规则汇总
*
* @Author junzhangfm
* @Date 2026-04-13
*/
@Data
@Accessors(chain = true)
public class HourlyChartYScaleRuleCollectVO implements Serializable {
private static final long serialVersionUID = -6099537585608567152L;
/**
* 小时故障停电用户数
*/
private ChartYScaleRuleVO faultUserCountRule;
/**
* 小时计划停电用户数
*/
private ChartYScaleRuleVO scheduledUserCountRule;
/**
* 小时降雨量
*/
private ChartYScaleRuleVO precRule;
/**
* 平均气温
*/
private ChartYScaleRuleVO avgTemRule;
/**
* 小时最大气温
*/
private ChartYScaleRuleVO maxTemRule;
/**
* 小时最低气温
*/
private ChartYScaleRuleVO minTemRule;
/**
* 小时极大风速
*/
private ChartYScaleRuleVO windRule;
}

View File

@ -63,6 +63,11 @@ public class HourlyPowerOutageEventChartVO {
*/
private List<HourlyChartCollectVO> collectVOList;
/**
* Y轴规则汇总
*/
private HourlyChartYScaleRuleCollectVO hourlyChartYScaleRuleCollect;
public void initList() {
powerOutageUserCountList = new ArrayList<>();
faultUserCountList = new ArrayList<>();
@ -72,5 +77,10 @@ public class HourlyPowerOutageEventChartVO {
minTemList = new ArrayList<>();
precList = new ArrayList<>();
windList = new ArrayList<>();
ChartYScaleRuleVO chartYScaleRuleVO = new ChartYScaleRuleVO().setMin(0).setMax(100).setInterval(10.0);
hourlyChartYScaleRuleCollect = new HourlyChartYScaleRuleCollectVO().setPrecRule(chartYScaleRuleVO)
.setAvgTemRule(chartYScaleRuleVO).setMaxTemRule(chartYScaleRuleVO).setMinTemRule(chartYScaleRuleVO)
.setWindRule(chartYScaleRuleVO).setScheduledUserCountRule(chartYScaleRuleVO)
.setFaultUserCountRule(chartYScaleRuleVO);
}
}

View File

@ -1,5 +1,6 @@
package com.southern.power.grid.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.southern.power.grid.dao.DnerDailyPowerOutageEventMapper;
import com.southern.power.grid.entity.DailyChartCollectVO;
@ -8,6 +9,7 @@ import com.southern.power.grid.entity.DnerDailyPowerOutageEvent;
import com.southern.power.grid.entity.KLineSingleVO;
import com.southern.power.grid.service.IDnerDailyPowerOutageEventService;
import com.southern.power.grid.utils.TimeUtil;
import com.southern.power.grid.utils.ToolUtils;
import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -15,6 +17,7 @@ import org.springframework.stereotype.Service;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 日K线停电事件 -- service实现类
@ -43,17 +46,63 @@ public class DnerDailyPowerOutageEventServiceImpl
dateTimeList.forEach(e -> { // 遍历开始时间和结束时间的日期
DnerDailyPowerOutageEvent event = dateTimeAndEntityMap.get(e);
if (Objects.isNull(event)) { // 数据为空全部默认为0值
setZeroData(result);
setZeroData(result, dateTimeAndEntityMap, e);
} else { // 数据不为空正常赋值
setDailyData(event, result, dateTimeAndEntityMap);
}
});
result.setFullDates(dateTimeList.stream().map(
e -> e.replace("-", "/")).collect(Collectors.toList())); // 日期列表
// 汇总单个节点数据
result.setCollectVOList(getCollectVOList(result));
// 汇总日K图Y轴规则
handleYScaleRule(result);
return result;
}
private static void handleYScaleRule(DailyPowerOutageEventVO result) {
List<Integer> kLineList = new ArrayList<>();
result.getUserKline().getKline().forEach(kLineList::addAll);
kLineList.addAll(result.getUserKline().getMa5());
kLineList.addAll(result.getUserKline().getMa10());
kLineList.addAll(result.getUserKline().getMa20());
kLineList.addAll(result.getUserKline().getMa30());
result.getFaultUserKline().getKline().forEach(kLineList::addAll);
kLineList.addAll(result.getFaultUserKline().getMa5());
kLineList.addAll(result.getFaultUserKline().getMa10());
kLineList.addAll(result.getFaultUserKline().getMa20());
kLineList.addAll(result.getFaultUserKline().getMa30());
result.getScheduledUserKline().getKline().forEach(kLineList::addAll);
kLineList.addAll(result.getScheduledUserKline().getMa5());
kLineList.addAll(result.getScheduledUserKline().getMa10());
kLineList.addAll(result.getScheduledUserKline().getMa20());
kLineList.addAll(result.getScheduledUserKline().getMa30());
if (!CollectionUtil.isEmpty(kLineList)) {
result.getDailyChartYScaleRuleCollect().setMaRule(ToolUtils.getRule(kLineList));
}
List<Integer> userCountList = new ArrayList<>();
userCountList.addAll(result.getUserCounts());
userCountList.addAll(result.getFaultUserCountList());
userCountList.addAll(result.getScheduledUserCountList());
if (!CollectionUtil.isEmpty(userCountList)) {
result.getDailyChartYScaleRuleCollect().setUserCountRule(ToolUtils.getRule(userCountList));
}
if (!CollectionUtil.isEmpty(result.getCumulativeRain())) {
result.getDailyChartYScaleRuleCollect().setDailyPrecipitationRule(
ToolUtils.getRule(result.getCumulativeRain()));
}
List<Double> tempList = new ArrayList<>();
tempList.addAll(result.getAvgTemp());
tempList.addAll(result.getMaxTemp());
tempList.addAll(result.getMinTemp());
if (!CollectionUtil.isEmpty(tempList)) {
result.getDailyChartYScaleRuleCollect().setDailyPrecipitationRule(ToolUtils.getRule(tempList));
}
if (!CollectionUtil.isEmpty(result.getWindSpeed())) {
result.getDailyChartYScaleRuleCollect().setExtremeWindSpeedRule(ToolUtils.getRule(result.getWindSpeed()));
}
}
private static @NonNull List<DailyChartCollectVO> getCollectVOList(DailyPowerOutageEventVO result) {
List<DailyChartCollectVO> collectVOList = new ArrayList<>();
for (int i = 0; i < result.getUserCounts().size(); i++) {
@ -96,32 +145,34 @@ public class DnerDailyPowerOutageEventServiceImpl
// 总的
result.getUserKline().getKline().add(Arrays.asList(event.getStarUserCount(), event.getEndUserCount(),
event.getMinUserCount(), event.getMaxUserCount()));
result.getUserKline().getMa5().add(getMa(event, dateTimeAndEntityMap, 5, 0));
result.getUserKline().getMa10().add(getMa(event, dateTimeAndEntityMap, 10, 0));
result.getUserKline().getMa20().add(getMa(event, dateTimeAndEntityMap, 20, 0));
result.getUserKline().getMa30().add(getMa(event, dateTimeAndEntityMap, 30, 0));
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));
// 计划
result.getFaultUserKline().getKline().add(Arrays.asList(event.getFaultStarUserCount(),
event.getFaultEndUserCount(), event.getFaultMinUserCount(), event.getFaultMaxUserCount()));
result.getFaultUserKline().getMa5().add(getMa(event, dateTimeAndEntityMap, 5, 1));
result.getFaultUserKline().getMa10().add(getMa(event, dateTimeAndEntityMap, 10, 1));
result.getFaultUserKline().getMa20().add(getMa(event, dateTimeAndEntityMap, 20, 1));
result.getFaultUserKline().getMa30().add(getMa(event, dateTimeAndEntityMap, 30, 1));
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));
// 故障
result.getScheduledUserKline().getKline().add(Arrays.asList(
event.getScheduledStarUserCount(), event.getScheduledEndUserCount(),
event.getScheduledMinUserCount(), event.getScheduledMaxUserCount()));
result.getScheduledUserKline().getMa5().add(getMa(event, dateTimeAndEntityMap, 5, 2));
result.getScheduledUserKline().getMa10().add(getMa(event, dateTimeAndEntityMap, 10, 2));
result.getScheduledUserKline().getMa20().add(getMa(event, dateTimeAndEntityMap, 20, 2));
result.getScheduledUserKline().getMa30().add(getMa(event, dateTimeAndEntityMap, 30, 2));
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());
}
private static void setZeroData(DailyPowerOutageEventVO result) {
private static void setZeroData(DailyPowerOutageEventVO result,
Map<String,DnerDailyPowerOutageEvent> dateTimeAndEntityMap,
String dataTime) {
List<Integer> klineE = Arrays.asList(0, 0, 0, 0);
result.getCumulativeRain().add(0.0);
result.getAvgRain().add(0.0);
@ -130,34 +181,34 @@ public class DnerDailyPowerOutageEventServiceImpl
result.getMinTemp().add(0.0);
// 总的
result.getUserKline().getKline().add(klineE);
result.getUserKline().getMa5().add(0);
result.getUserKline().getMa10().add(0);
result.getUserKline().getMa20().add(0);
result.getUserKline().getMa30().add(0);
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(klineE);
result.getFaultUserKline().getMa5().add(0);
result.getFaultUserKline().getMa10().add(0);
result.getFaultUserKline().getMa20().add(0);
result.getFaultUserKline().getMa30().add(0);
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));
// 故障
result.getScheduledUserKline().getKline().add(klineE);
result.getScheduledUserKline().getMa5().add(0);
result.getScheduledUserKline().getMa10().add(0);
result.getScheduledUserKline().getMa20().add(0);
result.getScheduledUserKline().getMa30().add(0);
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));
result.getWindSpeed().add(0.0);
result.getUserCounts().add(0);
result.getFaultUserCountList().add(0);
result.getScheduledUserCountList().add(0);
}
private static int getMa(DnerDailyPowerOutageEvent event,
private static int getMa(String dataTime,
Map<String, DnerDailyPowerOutageEvent> dateTimeAndEntityMap,
int maNum, int maType) {
int userCount = 0;
List<String> maDateList = TimeUtil.getBetweenDates(
TimeUtil.getBeforeNumDays(event.getDataTime(), maNum - 1), event.getDataTime());
TimeUtil.getBeforeNumDays(dataTime, maNum - 1), dataTime);
if (1 == maType) { // 故障类
for (String date : maDateList) {
DnerDailyPowerOutageEvent outageEvent = dateTimeAndEntityMap.get(date);
@ -165,7 +216,7 @@ public class DnerDailyPowerOutageEventServiceImpl
userCount += outageEvent.getFaultEndUserCount();
}
}
return userCount/maNum;
return (userCount + maNum - 1)/maNum; // 向上取整
}
if (2 == maType) { // 计划类
for (String date : maDateList) {
@ -174,7 +225,7 @@ public class DnerDailyPowerOutageEventServiceImpl
userCount += outageEvent.getScheduledEndUserCount();
}
}
return userCount/maNum;
return (userCount + maNum - 1)/maNum;
}
// 总的
for (String date : maDateList) {
@ -183,6 +234,6 @@ public class DnerDailyPowerOutageEventServiceImpl
userCount += outageEvent.getEndUserCount();
}
}
return userCount/maNum;
return (userCount + maNum - 1)/maNum;
}
}

View File

@ -1,5 +1,6 @@
package com.southern.power.grid.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.southern.power.grid.dao.DnerHourlyPowerOutageEventMapper;
import com.southern.power.grid.entity.DnerHourlyPowerOutageEvent;
@ -7,6 +8,7 @@ import com.southern.power.grid.entity.HourlyChartCollectVO;
import com.southern.power.grid.entity.HourlyPowerOutageEventChartVO;
import com.southern.power.grid.service.IDnerHourlyPowerOutageEventService;
import com.southern.power.grid.utils.TimeUtil;
import com.southern.power.grid.utils.ToolUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -53,6 +55,7 @@ public class DnerHourlyPowerOutageEventServiceImpl
}
});
result.setDateList(TimeUtil.generateHourList(startDate, endDate)); // 日期列表
// 汇总单个节点数据
List<HourlyChartCollectVO> collectVOList = new ArrayList<>();
for (int i = 0; i < result.getPowerOutageUserCountList().size(); i++) {
collectVOList.add(new HourlyChartCollectVO()
@ -63,9 +66,42 @@ public class DnerHourlyPowerOutageEventServiceImpl
.setScheduledUserCount(result.getScheduledUserCountList().get(i)));
}
result.setCollectVOList(collectVOList);
// 汇总分时图Y轴规则
handleYScaleRule(result);
return result;
}
private void handleYScaleRule(HourlyPowerOutageEventChartVO result) {
if (!CollectionUtil.isEmpty(result.getFaultUserCountList())) {
result.getHourlyChartYScaleRuleCollect().setFaultUserCountRule(
ToolUtils.getRule(result.getFaultUserCountList()));
}
if (!CollectionUtil.isEmpty(result.getScheduledUserCountList())) {
result.getHourlyChartYScaleRuleCollect().setScheduledUserCountRule(
ToolUtils.getRule(result.getScheduledUserCountList()));
}
if (!CollectionUtil.isEmpty(result.getPrecList())) {
result.getHourlyChartYScaleRuleCollect().setPrecRule(
ToolUtils.getRule(result.getPrecList()));
}
if (!CollectionUtil.isEmpty(result.getAvgTemList())) {
result.getHourlyChartYScaleRuleCollect().setAvgTemRule(
ToolUtils.getRule(result.getAvgTemList()));
}
if (!CollectionUtil.isEmpty(result.getMaxTemList())) {
result.getHourlyChartYScaleRuleCollect().setMaxTemRule(
ToolUtils.getRule(result.getMaxTemList()));
}
if (!CollectionUtil.isEmpty(result.getMinTemList())) {
result.getHourlyChartYScaleRuleCollect().setMinTemRule(
ToolUtils.getRule(result.getMinTemList()));
}
if (!CollectionUtil.isEmpty(result.getWindList())) {
result.getHourlyChartYScaleRuleCollect().setWindRule(
ToolUtils.getRule(result.getWindList()));
}
}
private static void setHourlyData(HourlyPowerOutageEventChartVO result, DnerHourlyPowerOutageEvent event) {
result.getPowerOutageUserCountList().add(event.getUserCount()); // 停电影响用户总数
result.getFaultUserCountList().add(event.getFaultUserCount()); // 故障停电影响用户总数

View File

@ -0,0 +1,34 @@
package com.southern.power.grid.utils;
import com.southern.power.grid.entity.ChartYScaleRuleVO;
import java.util.List;
/**
* 工具类
*
* @Author junzhangfm
* @Date 2026-04-13
*/
public class ToolUtils {
public static ChartYScaleRuleVO getRule(List<? extends Number> list) {
Number first = list.get(0);
if (first instanceof Integer) {
int min = list.stream().mapToInt(Number::intValue).min().orElse(0);
int max = list.stream().mapToInt(Number::intValue).max().orElse(0);
max = max == 0 ? 100 : max;
double interval = Math.round((double) (max - min) / 10 * 10) / 10.0;
return new ChartYScaleRuleVO().setMin(min).setMax(max).setInterval(interval);
} else if (first instanceof Double) {
double min = list.stream().mapToDouble(Number::doubleValue).min().orElse(0);
int floorMin = (int) Math.floor(min);
double max = list.stream().mapToDouble(Number::doubleValue).max().orElse(0);
int ceilMax = (int) Math.ceil(max);
ceilMax = ceilMax == 0 ? 100 : ceilMax;
double interval = Math.round((double) (ceilMax - floorMin) / 10 * 10) / 10.0;
return new ChartYScaleRuleVO().setMin(floorMin).setMax(ceilMax).setInterval(interval);
} else {
throw new RuntimeException("Only supports the data types of Integer and Double!");
}
}
}