Compare commits

..

4 Commits

Author SHA1 Message Date
zq
b3f7ca7a81 设备监控-实时运行页面曲线按照每分钟展示 2026-01-23 19:11:13 +08:00
zq
5eccb35568 修改 2026-01-23 17:38:26 +08:00
zq
c007016224 告警消息按时间倒序查询 2026-01-23 15:30:07 +08:00
zq
768dd0bead 电表设备详情其他类型展示值查询 2026-01-23 15:29:44 +08:00
7 changed files with 159 additions and 68 deletions

View File

@ -1,7 +1,6 @@
package com.xzzn.ems.domain.vo; package com.xzzn.ems.domain.vo;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
/** /**
* 实时运行-有功无功功率数据 * 实时运行-有功无功功率数据
@ -31,6 +30,8 @@ public class EnergyStoragePowVo {
private String deviceId; private String deviceId;
private String groupTime;
public String getDeviceId() { public String getDeviceId() {
return deviceId; return deviceId;
} }
@ -67,6 +68,14 @@ public class EnergyStoragePowVo {
this.dateDay = dateDay; this.dateDay = dateDay;
} }
public String getGroupTime() {
return groupTime;
}
public void setGroupTime(String groupTime) {
this.groupTime = groupTime;
}
public void setPcsTotalReactivePower(BigDecimal pcsTotalReactivePower) { public void setPcsTotalReactivePower(BigDecimal pcsTotalReactivePower) {
this.pcsTotalReactivePower = pcsTotalReactivePower; this.pcsTotalReactivePower = pcsTotalReactivePower;
} }

View File

@ -140,4 +140,6 @@ public interface EmsPcsDataMapper
public List<PcsMaxTempVo> getFXMaxTemp(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); public List<PcsMaxTempVo> getFXMaxTemp(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate);
// 实时运行-dds-pcs最高温度 // 实时运行-dds-pcs最高温度
public List<PcsMaxTempVo> getDDSMaxTemp(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); public List<PcsMaxTempVo> getDDSMaxTemp(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate);
List<PcsMaxTempVo> getPcsMaxTemp(@Param("siteId") String siteId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
} }

View File

@ -238,13 +238,13 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
return pcdData; return pcdData;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
// // 生成时间列表(每分钟一个) // // 生成时间列表(每5分钟一个)
// List<LocalDateTime> targetMinutes = new ArrayList<>(60); // List<LocalDateTime> targetMinutes = new ArrayList<>(12);
// LocalDateTime startDate = DateUtils.toLocalDateTime(yesterday).truncatedTo(ChronoUnit.DAYS); // LocalDateTime startLocalDate = DateUtils.toLocalDateTime(startDate).truncatedTo(ChronoUnit.DAYS);
// LocalDateTime endDate = DateUtils.toLocalDateTime(today); // LocalDateTime endLocalDate = DateUtils.toLocalDateTime(endDate).with(LocalDateTime.now().toLocalTime());
// while (startDate.isBefore(endDate)) { // while (startLocalDate.isBefore(endLocalDate)) {
// targetMinutes.add(startDate); // targetMinutes.add(startLocalDate);
// startDate = startDate.plusMinutes(1); // 递增1分钟 // startLocalDate = startLocalDate.plusMinutes(5); // 递增5分钟
// } // }
// // 根据时间列表填充数据 // // 根据时间列表填充数据
// pcsPowerList = fullFillData(pcsPowerList, targetMinutes); // pcsPowerList = fullFillData(pcsPowerList, targetMinutes);
@ -254,6 +254,7 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
return siteMonitorRuningInfoVo; return siteMonitorRuningInfoVo;
} }
private List<PcsPowerList> fullFillData(List<PcsPowerList> pcsPowerList, List<LocalDateTime> targetMinutes) { private List<PcsPowerList> fullFillData(List<PcsPowerList> pcsPowerList, List<LocalDateTime> targetMinutes) {
List<PcsPowerList> resultList = new ArrayList<>(); List<PcsPowerList> resultList = new ArrayList<>();
@ -269,7 +270,7 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
// 将数据转Map便于后续根据时间获取 // 将数据转Map便于后续根据时间获取
dataMap = powerList.stream().collect( dataMap = powerList.stream().collect(
Collectors.toMap( Collectors.toMap(
data -> data.getCreateDate(), data -> data.getGroupTime(),
data -> data, data -> data,
(existing, replacement) -> replacement (existing, replacement) -> replacement
)); ));
@ -293,7 +294,8 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
currentData.setDeviceId(deviceId); currentData.setDeviceId(deviceId);
} }
lastData = currentData; lastData = currentData;
currentData.setCreateDate(currentDate.substring(11)); // currentData.setCreateDate(currentDate.substring(11));
currentData.setCreateDate(currentData.getCreateDate());
resultPowerList.add(currentData); resultPowerList.add(currentData);
} }
pcsResultPower.setDeviceId(deviceId); pcsResultPower.setDeviceId(deviceId);
@ -316,12 +318,12 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
Date startDate = request.getStartDate(); Date startDate = request.getStartDate();
Date endDate = request.getEndDate(); Date endDate = request.getEndDate();
//PCS最高温度list //PCS最高温度list
List<PcsMaxTempVo> pcsMaxTempVos = new ArrayList<>(); List<PcsMaxTempVo> pcsMaxTempVos = emsPcsDataMapper.getPcsMaxTemp(siteId, startDate, endDate);
if (SiteEnum.FX.getCode().equals(siteId)) { // if (SiteEnum.FX.getCode().equals(siteId)) {
pcsMaxTempVos = emsPcsDataMapper.getFXMaxTemp(siteId, startDate, endDate); // pcsMaxTempVos = emsPcsDataMapper.getFXMaxTemp(siteId, startDate, endDate);
} else if (SiteEnum.DDS.getCode().equals(siteId)) { // } else if (SiteEnum.DDS.getCode().equals(siteId)) {
pcsMaxTempVos = emsPcsDataMapper.getDDSMaxTemp(siteId, startDate, endDate); // pcsMaxTempVos = emsPcsDataMapper.getDDSMaxTemp(siteId, startDate, endDate);
} // }
// List<PcsMaxTempVo> -> 按pcs的deviceId分组转成List<PcsMaxTempList> // List<PcsMaxTempVo> -> 按pcs的deviceId分组转成List<PcsMaxTempList>
if (!CollectionUtils.isEmpty(pcsMaxTempVos)) { if (!CollectionUtils.isEmpty(pcsMaxTempVos)) {
@ -427,13 +429,18 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
String siteId = request.getSiteId(); String siteId = request.getSiteId();
Date startDate = request.getStartDate(); Date startDate = request.getStartDate();
Date endDate = request.getEndDate(); Date endDate = request.getEndDate();
//电池平均温度list //电池平均温度list,优先从电池堆取,电池堆没有的话再从电池簇取
List<BatteryAveTempVo> batteryAveTempList = new ArrayList<>(); List<BatteryAveTempVo> batteryAveTempList = new ArrayList<>();
if (SiteEnum.FX.getCode().equals(siteId)) {
batteryAveTempList = emsBatteryClusterMapper.getBatteryAveTempList(siteId, startDate, endDate);
} else if (SiteEnum.DDS.getCode().equals(siteId)) {
batteryAveTempList = emsBatteryStackMapper.getBatteryAveTempList(siteId, startDate, endDate); batteryAveTempList = emsBatteryStackMapper.getBatteryAveTempList(siteId, startDate, endDate);
// 电池堆暂无数据,从电池簇取
if (CollectionUtils.isEmpty(batteryAveTempList)) {
batteryAveTempList = emsBatteryClusterMapper.getBatteryAveTempList(siteId, startDate, endDate);
} }
// if (SiteEnum.FX.getCode().equals(siteId)) {
// batteryAveTempList = emsBatteryClusterMapper.getBatteryAveTempList(siteId, startDate, endDate);
// } else if (SiteEnum.DDS.getCode().equals(siteId)) {
// batteryAveTempList = emsBatteryStackMapper.getBatteryAveTempList(siteId, startDate, endDate);
// }
siteMonitorRuningInfoVo.setBatteryAveTempList(batteryAveTempList); siteMonitorRuningInfoVo.setBatteryAveTempList(batteryAveTempList);
// if (!StringUtils.isEmpty(siteId)) { // if (!StringUtils.isEmpty(siteId)) {
// // 时间暂定今日+昨日 // // 时间暂定今日+昨日
@ -746,7 +753,7 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
private void dealAmmeterData(EmsAmmeterData ammeterData, AmmeterDataVo ammeterDataVo) { private void dealAmmeterData(EmsAmmeterData ammeterData, AmmeterDataVo ammeterDataVo) {
if (ammeterData != null) { if (ammeterData != null) {
ammeterDataVo.setActivePower(ammeterData.getTotalActivePower()); ammeterDataVo.setActivePower(ammeterData.getTotalActivePower() == null ? ammeterData.getPower() : ammeterData.getTotalActivePower());
ammeterDataVo.setReactivePower(ammeterData.getTotalReactivePower()); ammeterDataVo.setReactivePower(ammeterData.getTotalReactivePower());
ammeterDataVo.setForwardActive(ammeterData.getCurrentForwardActiveTotal()); ammeterDataVo.setForwardActive(ammeterData.getCurrentForwardActiveTotal());
ammeterDataVo.setForwardReactive(ammeterData.getCurrentForwardReactiveTotal()); ammeterDataVo.setForwardReactive(ammeterData.getCurrentForwardReactiveTotal());

View File

@ -176,6 +176,7 @@
AND (date_format(t.alarm_start_time,'%Y%m%d') BETWEEN date_format(#{alarmStartTime},'%Y%m%d') and date_format(#{alarmEndTime},'%Y%m%d') AND (date_format(t.alarm_start_time,'%Y%m%d') BETWEEN date_format(#{alarmStartTime},'%Y%m%d') and date_format(#{alarmEndTime},'%Y%m%d')
or date_format(t.alarm_end_time,'%Y%m%d') BETWEEN date_format(#{alarmStartTime},'%Y%m%d') and date_format(#{alarmEndTime},'%Y%m%d') ) or date_format(t.alarm_end_time,'%Y%m%d') BETWEEN date_format(#{alarmStartTime},'%Y%m%d') and date_format(#{alarmEndTime},'%Y%m%d') )
</if> </if>
order by t.alarm_start_time desc
</select> </select>
<select id="getDeviceAlarmNum" resultType="java.lang.Integer"> <select id="getDeviceAlarmNum" resultType="java.lang.Integer">

View File

@ -331,18 +331,27 @@
</select> </select>
<select id="getBatteryAveTempList" resultType="com.xzzn.ems.domain.vo.BatteryAveTempVo"> <select id="getBatteryAveTempList" resultType="com.xzzn.ems.domain.vo.BatteryAveTempVo">
select t.site_id, WITH ranked AS (
round(avg(t.avg_cell_temp)) as batteryTemp, SELECT
DATE_FORMAT(t.create_time, '%Y-%m-%d') AS dateDay, *,
DATE_FORMAT(t.create_time, '%H:00:00') AS createDate date_format(create_time, '%Y-%m-%d %H:00:00') + INTERVAL FLOOR(MINUTE(create_time) / 5) * 5 MINUTE AS group_time,
from ems_battery_cluster t ROW_NUMBER() OVER (PARTITION BY date_format(create_time, '%Y-%m-%d %H:00:00'), FLOOR(MINUTE(create_time) / 5) ORDER BY create_time) as rn
WHERE t.site_id = #{siteId} FROM
AND t.create_time &gt;= #{startDate} ems_battery_cluster
AND t.create_time &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY) where site_id = #{siteId}
GROUP BY t.site_id, and create_time &gt;= #{startDate}
DATE_FORMAT(t.create_time, '%Y-%m-%d'), and create_time &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY)
DATE_FORMAT(t.create_time, '%H:00:00') and avg_cell_temp is not null
ORDER BY dateDay, createDate )
SELECT
site_id,
round(avg(avg_cell_temp)) as batteryTemp,
DATE_FORMAT(group_time, '%Y-%m-%d') as dateDay,
DATE_FORMAT(group_time, '%H:%i:00') as createDate,
group_time as groupTime
FROM
ranked
GROUP BY site_id,groupTime
</select> </select>

View File

@ -351,18 +351,27 @@
</delete> </delete>
<select id="getBatteryAveTempList" resultType="com.xzzn.ems.domain.vo.BatteryAveTempVo"> <select id="getBatteryAveTempList" resultType="com.xzzn.ems.domain.vo.BatteryAveTempVo">
select t.site_id, WITH ranked AS (
round(avg(t.avg_temperature)) as batteryTemp, SELECT
DATE_FORMAT(t.create_time, '%Y-%m-%d') AS dateDay, *,
DATE_FORMAT(t.create_time, '%H:00:00') AS createDate date_format(create_time, '%Y-%m-%d %H:00:00') + INTERVAL FLOOR(MINUTE(create_time) / 5) * 5 MINUTE AS group_time,
from ems_battery_stack t ROW_NUMBER() OVER (PARTITION BY date_format(create_time, '%Y-%m-%d %H:00:00'), FLOOR(MINUTE(create_time) / 5) ORDER BY create_time) as rn
WHERE t.site_id = #{siteId} FROM
AND t.create_time &gt;= #{startDate} ems_battery_stack
AND t.create_time &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY) where site_id = #{siteId}
GROUP BY t.site_id, and create_time &gt;= #{startDate}
DATE_FORMAT(t.create_time, '%Y-%m-%d'), and create_time &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY)
DATE_FORMAT(t.create_time, '%H:00:00') and avg_temperature is not null
ORDER BY dateDay, createDate )
SELECT
site_id,
round(avg(avg_temperature)) as batteryTemp,
DATE_FORMAT(group_time, '%Y-%m-%d') as dateDay,
DATE_FORMAT(group_time, '%H:%i:00') as createDate,
group_time as groupTime
FROM
ranked
GROUP BY site_id,groupTime
</select> </select>
<sql id="statisCommonFilter"> <sql id="statisCommonFilter">
@ -501,15 +510,25 @@
</select> </select>
<select id="getAveSocList" resultType="com.xzzn.ems.domain.vo.BatteryAveSOCVo"> <select id="getAveSocList" resultType="com.xzzn.ems.domain.vo.BatteryAveSOCVo">
select t.site_id, WITH ranked AS (
round(avg(t.stack_soc)) as batterySOC, SELECT
DATE_FORMAT(t.create_time, '%Y-%m-%d') AS dateDay, *,
DATE_FORMAT(t.create_time, '%H:00:00') AS createDate date_format(create_time, '%Y-%m-%d %H:00:00') + INTERVAL FLOOR(MINUTE(create_time) / 5) * 5 MINUTE AS group_time,
from ems_battery_stack t ROW_NUMBER() OVER (PARTITION BY date_format(create_time, '%Y-%m-%d %H:00:00'), FLOOR(MINUTE(create_time) / 5) ORDER BY create_time) as rn
where t.site_id = #{siteId} FROM
AND t.create_time &gt;= #{startDate} ems_battery_stack
AND t.create_time &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY) where site_id = #{siteId}
GROUP BY t.site_id,dateDay,createDate and create_time &gt;= #{startDate}
order by dateDay,createDate and create_time &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY)
)
SELECT
site_id,
round(avg(stack_soc)) as batterySOC,
DATE_FORMAT(group_time, '%Y-%m-%d') as dateDay,
DATE_FORMAT(group_time, '%H:%i:00') as createDate,
group_time as groupTime
FROM
ranked
GROUP BY site_id,groupTime
</select> </select>
</mapper> </mapper>

View File

@ -469,19 +469,30 @@
order by ammeterDate desc order by ammeterDate desc
</select> </select>
<select id="getStoragePowerList" resultType="com.xzzn.ems.domain.vo.EnergyStoragePowVo"> <select id="getStoragePowerList" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.EnergyStoragePowVo">
SELECT t.site_id,t.device_id as deviceId, WITH ranked AS (
t.total_active_power AS pcsTotalActPower, SELECT
t.total_reactive_power AS pcsTotalReactivePower, *,
DATE_FORMAT(t.create_time, '%Y-%m-%d') AS dateDay, date_format(data_update_time, '%Y-%m-%d %H:00:00') + INTERVAL FLOOR(MINUTE(data_update_time) / 5) * 5 MINUTE AS group_time,
DATE_FORMAT(t.data_update_time, '%H:%i:00') AS createDate ROW_NUMBER() OVER (PARTITION BY device_id, date_format(data_update_time, '%Y-%m-%d %H:00:00'), FLOOR(MINUTE(data_update_time) / 5) ORDER BY data_update_time) as rn
FROM ems_pcs_data t FROM
WHERE t.site_id = #{siteId} ems_pcs_data
AND t.data_update_time &gt;= #{startDate} where site_id = #{siteId}
AND t.data_update_time &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY) and data_update_time &gt;= #{startDate}
AND minute(t.data_update_time) = 0 and data_update_time &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY)
GROUP BY t.site_id, deviceId,pcsTotalActPower,pcsTotalReactivePower,dateDay,createDate )
ORDER BY dateDay,createDate SELECT
site_id,
device_id as deviceId,
total_active_power as pcsTotalActPower,
total_reactive_power as pcsTotalReactivePower,
DATE_FORMAT(group_time, '%Y-%m-%d') as dateDay,
DATE_FORMAT(group_time, '%H:%i:00') as createDate,
group_time as groupTime
FROM
ranked
WHERE
rn = 1
</select> </select>
<select id="getPcsDataByMonth" resultType="com.xzzn.ems.domain.vo.SiteMonitorDataVo"> <select id="getPcsDataByMonth" resultType="com.xzzn.ems.domain.vo.SiteMonitorDataVo">
@ -634,4 +645,37 @@
group by deviceId,dateDay,createDate,temp group by deviceId,dateDay,createDate,temp
order by dateDay,createDate order by dateDay,createDate
</select> </select>
<select id="getPcsMaxTemp" parameterType="com.xzzn.ems.domain.vo.DateSearchRequest" resultType="com.xzzn.ems.domain.vo.PcsMaxTempVo">
WITH ranked AS (
SELECT
*,
date_format(data_update_time, '%Y-%m-%d %H:00:00') + INTERVAL FLOOR(MINUTE(data_update_time) / 5) * 5 MINUTE AS group_time,
ROW_NUMBER() OVER (PARTITION BY device_id, date_format(data_update_time, '%Y-%m-%d %H:00:00'), FLOOR(MINUTE(data_update_time) / 5) ORDER BY data_update_time) as rn
FROM
ems_pcs_data
where site_id = #{siteId}
and data_update_time &gt;= #{startDate}
and data_update_time &lt; DATE_ADD(#{endDate}, INTERVAL 1 DAY)
)
SELECT
site_id,
device_id as deviceId,
GREATEST(
COALESCE(u_temperature, -999),
COALESCE(v_temperature, -999),
COALESCE(w_temperature, -999),
COALESCE(module1_temp, -999),
COALESCE(module2_temp, -999),
COALESCE(module3_temp, -999),
COALESCE(module4_temp, -999)
) AS temp,
DATE_FORMAT(group_time, '%Y-%m-%d') as dateDay,
DATE_FORMAT(group_time, '%H:%i:00') as createDate,
group_time as groupTime
FROM
ranked
WHERE
rn = 1
</select>
</mapper> </mapper>