0918优化-单站监控-功率曲线默认显示前一小时数据按分钟分组

This commit is contained in:
2025-09-24 22:47:09 +08:00
parent 9874d6b1ea
commit 46135aa2ec
5 changed files with 95 additions and 8 deletions

View File

@ -348,4 +348,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
.toInstant() .toInstant()
); );
} }
/**
* 将时间转换为月份YYYY-MM-DD HH:mm:00
*/
public static Date timeConvertToDate(LocalDateTime time) {
String dateStr = convertToString(time);
return dateTime(YYYY_MM_DD_HH_MM_SS,dateStr);
}
} }

View File

@ -31,6 +31,13 @@ public class PowerStatisListVo {
*/ */
private BigDecimal pvPower; private BigDecimal pvPower;
public PowerStatisListVo(String statisDate, BigDecimal gridPower, BigDecimal storagePower, BigDecimal pvPower) {
this.statisDate = statisDate;
this.gridPower = gridPower;
this.storagePower = storagePower;
this.pvPower = pvPower;
}
public String getStatisDate() { public String getStatisDate() {
return statisDate; return statisDate;
} }

View File

@ -88,4 +88,5 @@ public interface EmsAmmeterDataMapper
public List<PowerStatisListVo> getPowerDataByHour(DateSearchRequest requestVo); public List<PowerStatisListVo> getPowerDataByHour(DateSearchRequest requestVo);
public List<PowerStatisListVo> getPowerDataByDay(DateSearchRequest requestVo); public List<PowerStatisListVo> getPowerDataByDay(DateSearchRequest requestVo);
public List<PowerStatisListVo> getPowerDataByMonth(DateSearchRequest requestVo); public List<PowerStatisListVo> getPowerDataByMonth(DateSearchRequest requestVo);
public List<PowerStatisListVo> getPowerDataByMinutes(DateSearchRequest requestVo);
} }

View File

@ -13,10 +13,9 @@ import org.springframework.util.CollectionUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList; import java.time.LocalDateTime;
import java.util.Date; import java.time.temporal.ChronoUnit;
import java.util.List; import java.util.*;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -316,13 +315,31 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService
public List<PowerStatisListVo> getPowerDataList(DateSearchRequest requestVo) { public List<PowerStatisListVo> getPowerDataList(DateSearchRequest requestVo) {
List<PowerStatisListVo> dataList = new ArrayList<>(); List<PowerStatisListVo> dataList = new ArrayList<>();
// 默认时间-7天
dealRequestTime(requestVo);
Date startDate = requestVo.getStartDate(); Date startDate = requestVo.getStartDate();
Date endDate = requestVo.getEndDate(); Date endDate = requestVo.getEndDate();
if (startDate == null || endDate == null) {
// 默认按分钟展示-前一个小时数据
LocalDateTime oneHourAgo = LocalDateTime.now().minusHours(1).truncatedTo(ChronoUnit.MINUTES);;
startDate = DateUtils.toDate(oneHourAgo);
requestVo.setStartDate(startDate);
requestVo.setEndDate(DateUtils.getNowDate());
dataList = emsAmmeterDataMapper.getPowerDataByMinutes(requestVo);
// 生成目标时间点列表(每分钟一个)
List<LocalDateTime> targetMinutes = new ArrayList<>(60);
LocalDateTime current = oneHourAgo;
for (int i = 0; i < 60; i++) {
targetMinutes.add(current); // 添加当前分钟
current = current.plusMinutes(1); // 递增1分钟
}
// 填充数据
if (dataList != null && dataList.size() >= 0){
dataList = fillEveryMinutesData(dataList,targetMinutes);
}
}
// 开始日期和结束日期同一天,展示 0-24 小时数据 // 开始日期和结束日期同一天,展示 0-24 小时数据
if (DateUtils.isSameDay(startDate, endDate)){ else if (DateUtils.isSameDay(startDate, endDate)){
endDate = DateUtils.addDays(endDate, 1); endDate = DateUtils.addDays(endDate, 1);
requestVo.setEndDate(endDate); requestVo.setEndDate(endDate);
dataList = emsAmmeterDataMapper.getPowerDataByHour(requestVo); dataList = emsAmmeterDataMapper.getPowerDataByHour(requestVo);
@ -341,7 +358,47 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService
// 负荷功率 // 负荷功率
dealDataPower(requestVo.getSiteId(),dataList); dealDataPower(requestVo.getSiteId(),dataList);
return dataList; return dataList.stream().sorted(Comparator.comparing(PowerStatisListVo::getStatisDate)).collect(Collectors.toList());
}
private List<PowerStatisListVo> fillEveryMinutesData(List<PowerStatisListVo> dataList, List<LocalDateTime> targetMinutes) {
List<PowerStatisListVo> powerStatisListVoList = new ArrayList<>();
if (targetMinutes == null || targetMinutes.isEmpty()) {
return dataList;
}
// 数组转化成Map便于后续获取数据
Map<String, PowerStatisListVo> dataMap = dataList.stream()
.map(data -> new PowerStatisListVo(
data.getStatisDate(),
data.getGridPower(),
data.getStoragePower(),
data.getPvPower()
)).collect(Collectors.toMap(
PowerStatisListVo::getStatisDate,
data -> data,
(existing, replacement) -> replacement
));
PowerStatisListVo lastData = null;
// 遍历时间数组
for (LocalDateTime targetMinute : targetMinutes) {
String tarteDate = DateUtils.convertToString(targetMinute);
PowerStatisListVo currentData = dataMap.get(tarteDate);
if (currentData == null && lastData != null) {
BigDecimal pvPower = lastData.getPvPower();
BigDecimal storagePower = lastData.getStoragePower();
BigDecimal gridPower = lastData.getGridPower();
currentData = new PowerStatisListVo(tarteDate.toString(),gridPower,storagePower,pvPower);
} else if (currentData == null && lastData == null){
// 开头无数据所有字段设为null
currentData = new PowerStatisListVo(tarteDate.toString(), null, null, null);
}
lastData = currentData;
powerStatisListVoList.add(currentData);
}
return powerStatisListVoList;
} }
private void dealDataPower(String siteId, List<PowerStatisListVo> dataList) { private void dealDataPower(String siteId, List<PowerStatisListVo> dataList) {

View File

@ -1022,4 +1022,18 @@
GROUP BY statisDate GROUP BY statisDate
order by statisDate desc order by statisDate desc
</select> </select>
<select id="getPowerDataByMinutes" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.PowerStatisListVo">
select latest.dateMin as statisDate,
<include refid="powerFilter"/>
from ( SELECT p.site_id, p.device_id,DATE_FORMAT(p.data_update_time, '%Y-%m-%d %H:%i:00') as dateMin,MAX(p.data_update_time) as max_update_time
FROM ems_ammeter_data p
<include refid="commonFilter"/>
GROUP BY p.site_id,p.device_id,dateMin
) latest inner join ems_ammeter_data t ON latest.site_id = t.site_id
AND latest.device_id = t.device_id
AND latest.max_update_time = t.data_update_time
GROUP BY statisDate
order by statisDate desc
</select>
</mapper> </mapper>