0918优化-单站监控-实时运行曲线图取值

This commit is contained in:
2025-09-25 14:53:17 +08:00
parent 46135aa2ec
commit d47d9150e6
10 changed files with 188 additions and 55 deletions

View File

@ -356,4 +356,20 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
String dateStr = convertToString(time); String dateStr = convertToString(time);
return dateTime(YYYY_MM_DD_HH_MM_SS,dateStr); return dateTime(YYYY_MM_DD_HH_MM_SS,dateStr);
} }
/**
* 增加 Date ==> LocalDateTime
*/
public static LocalDateTime toLocalDateTime(Date date)
{
if (date == null) {
return null;
}
// 1. Date → LocalDateTime保留原始时间
LocalDateTime dateTime = date.toInstant()
.atZone(TimeZone.getDefault().toZoneId()) // 关联时区
.toLocalDateTime();
return dateTime;
}
} }

View File

@ -4,7 +4,7 @@ import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
/** /**
* 实时运行-储能功率数据 * 实时运行-有功无功功率数据
* *
*/ */
public class EnergyStoragePowVo { public class EnergyStoragePowVo {
@ -12,7 +12,7 @@ public class EnergyStoragePowVo {
* 显示日期 * 显示日期
*/ */
private Date createDate; private String createDate;
/** /**
* pcs实时有功功率 * pcs实时有功功率
@ -24,12 +24,21 @@ public class EnergyStoragePowVo {
*/ */
private BigDecimal pcsTotalReactivePower; private BigDecimal pcsTotalReactivePower;
private String deviceId;
public Date getCreateDate() { public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getCreateDate() {
return createDate; return createDate;
} }
public void setCreateDate(Date createDate) { public void setCreateDate(String createDate) {
this.createDate = createDate; this.createDate = createDate;
} }

View File

@ -0,0 +1,32 @@
package com.xzzn.ems.domain.vo;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 实时运行-PCS数据list
*
*/
public class PcsPowerList {
private String deviceId;
// 有功和无功功率数据
private List<EnergyStoragePowVo> energyStoragePowList;
public List<EnergyStoragePowVo> getEnergyStoragePowList() {
return energyStoragePowList;
}
public void setEnergyStoragePowList(List<EnergyStoragePowVo> energyStoragePowList) {
this.energyStoragePowList = energyStoragePowList;
}
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
}

View File

@ -8,17 +8,17 @@ import java.util.List;
*/ */
public class SiteMonitorRuningInfoVo { public class SiteMonitorRuningInfoVo {
/** /**
* 储能功率list * PCS有功和无功功率
*/ */
private List<EnergyStoragePowVo> energyStoragePowList; private List<PcsPowerList> pcsPowerList;
/** /**
* pcs平均温度list * PCS最高温度
*/ */
private List<StackAveTempVo> stackAveTempList; private List<StackAveTempVo> stackAveTempList;
/** /**
* 电池平均soclist * 平均soclist
*/ */
private List<BatteryAveSOCVo> batteryAveSOCList; private List<BatteryAveSOCVo> batteryAveSOCList;
@ -27,12 +27,12 @@ public class SiteMonitorRuningInfoVo {
*/ */
private List<BatteryAveTempVo> batteryAveTempList; private List<BatteryAveTempVo> batteryAveTempList;
public List<EnergyStoragePowVo> getEnergyStoragePowList() { public List<PcsPowerList> getPcsPowerList() {
return energyStoragePowList; return pcsPowerList;
} }
public void setEnergyStoragePowList(List<EnergyStoragePowVo> energyStoragePowList) { public void setPcsPowerList(List<PcsPowerList> pcsPowerList) {
this.energyStoragePowList = energyStoragePowList; this.pcsPowerList = pcsPowerList;
} }
public List<StackAveTempVo> getStackAveTempList() { public List<StackAveTempVo> getStackAveTempList() {

View File

@ -73,15 +73,7 @@ public interface EmsBatteryClusterMapper
*/ */
public List<BMSBatteryDataList> getBmsBatteryData(@Param("siteId")String siteId, @Param("stackDeviceId")String stackDeviceId); public List<BMSBatteryDataList> getBmsBatteryData(@Param("siteId")String siteId, @Param("stackDeviceId")String stackDeviceId);
/** // 实时运行-FX平均温度
* 实时运行-平均soc+平均温度
* @param siteId
* @param startDate
* @param endDate
* @return
*/
public List<BatteryAveSOCVo> getAveSocList(@Param("siteId")String siteId, @Param("startDate") Date startDate, @Param("endDate")Date endDate);
public List<BatteryAveTempVo> getBatteryAveTempList(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate); public List<BatteryAveTempVo> getBatteryAveTempList(@Param("siteId")String siteId, @Param("startDate")Date startDate, @Param("endDate")Date endDate);
/** 堆电池温度数据-获取当天每小时簇 */ /** 堆电池温度数据-获取当天每小时簇 */

View File

@ -3,10 +3,7 @@ package com.xzzn.ems.mapper;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import com.xzzn.ems.domain.EmsBatteryStack; import com.xzzn.ems.domain.EmsBatteryStack;
import com.xzzn.ems.domain.vo.DateSearchRequest; import com.xzzn.ems.domain.vo.*;
import com.xzzn.ems.domain.vo.StackAveTempVo;
import com.xzzn.ems.domain.vo.StackPointVo;
import com.xzzn.ems.domain.vo.StackStatisListVo;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
/** /**
@ -91,4 +88,10 @@ public interface EmsBatteryStackMapper
public List<StackPointVo> getStackPointByHour(DateSearchRequest requestVo); public List<StackPointVo> getStackPointByHour(DateSearchRequest requestVo);
public List<StackPointVo> getStackPointByDay(DateSearchRequest requestVo); public List<StackPointVo> getStackPointByDay(DateSearchRequest requestVo);
public List<StackPointVo> getStackPointByMonth(DateSearchRequest requestVo); public List<StackPointVo> getStackPointByMonth(DateSearchRequest requestVo);
// 实时运行-平均soc
public List<BatteryAveSOCVo> getAveSocList(@Param("siteId") String siteId, @Param("startDate") Date startDate, @Param("endDate") Date endDate);
// 实时运行-DDS平均温度
public List<BatteryAveTempVo> getBatteryAveTempList(@Param("siteId")String siteId, @Param("startDate")Date yesterday, @Param("endDate") Date today);
} }

View File

@ -21,6 +21,7 @@ import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime; import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -36,10 +37,6 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
private static final String CLUSTER_DATA_SOC = "SOC"; private static final String CLUSTER_DATA_SOC = "SOC";
private static final String AMMETER_DEVICE_LOAD = "LOAD";
private static final String AMMETER_DEVICE_METE = "METE";
private static Map<String, BigDecimal> storageFactor = new HashMap<>(); private static Map<String, BigDecimal> storageFactor = new HashMap<>();
static { static {
storageFactor.put("021_DDS_01", new BigDecimal("0.1")); storageFactor.put("021_DDS_01", new BigDecimal("0.1"));
@ -157,7 +154,7 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
return siteMonitorRunningHeadInfoVo; return siteMonitorRunningHeadInfoVo;
} }
// 获取单站监控实时运行-储能功率数据 // 获取单站监控实时运行-PCS有功无功功率
@Override @Override
public SiteMonitorRuningInfoVo getRunningGraphStorage(String siteId) { public SiteMonitorRuningInfoVo getRunningGraphStorage(String siteId) {
SiteMonitorRuningInfoVo siteMonitorRuningInfoVo = new SiteMonitorRuningInfoVo(); SiteMonitorRuningInfoVo siteMonitorRuningInfoVo = new SiteMonitorRuningInfoVo();
@ -166,12 +163,92 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
Date today = DateUtils.getNowDate(); Date today = DateUtils.getNowDate();
Date yesterday = DateUtils.addDays(today, -1); Date yesterday = DateUtils.addDays(today, -1);
//储能功率list //pcs有功无功
List<PcsPowerList> pcsPowerList = new ArrayList<>();
List<EnergyStoragePowVo> energyStoragePowList = emsPcsDataMapper.getStoragePowerList(siteId, yesterday, today); List<EnergyStoragePowVo> energyStoragePowList = emsPcsDataMapper.getStoragePowerList(siteId, yesterday, today);
siteMonitorRuningInfoVo.setEnergyStoragePowList(energyStoragePowList);
// 生成时间列表(每分钟一个)
List<LocalDateTime> targetMinutes = new ArrayList<>(60);
LocalDateTime startDate = DateUtils.toLocalDateTime(yesterday).truncatedTo(ChronoUnit.DAYS);
LocalDateTime endDate = DateUtils.toLocalDateTime(today);
while (startDate.isBefore(endDate)) {
targetMinutes.add(startDate);
startDate = startDate.plusMinutes(1); // 递增1分钟
}
// 数据格式转换
if (!CollectionUtils.isEmpty(energyStoragePowList) && !CollectionUtils.isEmpty(targetMinutes)) {
Map<String, List<EnergyStoragePowVo>> dataMap = energyStoragePowList.stream()
.collect(Collectors.groupingBy(
EnergyStoragePowVo::getDeviceId,
Collectors.toList()));
pcsPowerList = dataMap.entrySet().stream()
.map(entry -> {
PcsPowerList pcdData = new PcsPowerList();
pcdData.setDeviceId(entry.getKey());
pcdData.setEnergyStoragePowList(entry.getValue());
return pcdData;
}).collect(Collectors.toList());
// 根据时间列表填充数据
pcsPowerList = fullFillData(pcsPowerList,targetMinutes);
}
siteMonitorRuningInfoVo.setPcsPowerList(pcsPowerList);
} }
return siteMonitorRuningInfoVo; return siteMonitorRuningInfoVo;
} }
private List<PcsPowerList> fullFillData(List<PcsPowerList> pcsPowerList, List<LocalDateTime> targetMinutes) {
List<PcsPowerList> resultList = new ArrayList<>();
for (PcsPowerList pcsPower : pcsPowerList) {
Map<String, EnergyStoragePowVo> dataMap = new HashMap<>();
PcsPowerList pcsResultPower = new PcsPowerList();
String deviceId = pcsPower.getDeviceId();
List<EnergyStoragePowVo> powerList = pcsPower.getEnergyStoragePowList();
if (CollectionUtils.isEmpty(powerList)) {
continue;
}
// 将数据转Map便于后续根据时间获取
dataMap = powerList.stream().collect(
Collectors.toMap(
data -> data.getCreateDate(),
data -> data,
(existing, replacement) -> replacement
));
// 按时间列表遍历
List<EnergyStoragePowVo> resultPowerList = new ArrayList<>();
EnergyStoragePowVo lastData = null;
for(LocalDateTime targetMinute : targetMinutes) {
String currentDate = DateUtils.convertToString(targetMinute);
EnergyStoragePowVo currentData = dataMap.get(currentDate);
if (currentData == null && lastData != null) {
BigDecimal pcsTotalActPower = lastData.getPcsTotalActPower();
BigDecimal pcsTotalReactivePower = lastData.getPcsTotalReactivePower();
currentData = new EnergyStoragePowVo();
currentData.setPcsTotalActPower(pcsTotalActPower);
currentData.setPcsTotalReactivePower(pcsTotalReactivePower);
currentData.setDeviceId(deviceId);
} else if (currentData == null && lastData == null){
// 开头无数据所有字段设为null
currentData = new EnergyStoragePowVo();
currentData.setDeviceId(deviceId);
}
lastData = currentData;
currentData.setCreateDate(currentDate.substring(11));
resultPowerList.add(currentData);
}
pcsResultPower.setDeviceId(deviceId);
pcsResultPower.setEnergyStoragePowList(resultPowerList);
resultList.add(pcsResultPower);
}
return resultList;
}
// 获取单站监控实时运行-stack平均温度 // 获取单站监控实时运行-stack平均温度
// 20250811 按小时 // 20250811 按小时
@Override @Override
@ -187,7 +264,7 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
} }
return siteMonitorRuningInfoVo; return siteMonitorRuningInfoVo;
} }
// 获取单站监控实时运行-电池平均soc // 获取单站监控实时运行-平均soc
@Override @Override
public SiteMonitorRuningInfoVo getRunningGraphBatterySoc(String siteId) { public SiteMonitorRuningInfoVo getRunningGraphBatterySoc(String siteId) {
SiteMonitorRuningInfoVo siteMonitorRuningInfoVo = new SiteMonitorRuningInfoVo(); SiteMonitorRuningInfoVo siteMonitorRuningInfoVo = new SiteMonitorRuningInfoVo();
@ -196,7 +273,7 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
Date today = new Date(); Date today = new Date();
Date yesterday = DateUtils.addDays(today, -1); Date yesterday = DateUtils.addDays(today, -1);
//电池平均soclist //电池平均soclist
List<BatteryAveSOCVo> batteryAveSOCList = emsBatteryClusterMapper.getAveSocList(siteId, yesterday, today); List<BatteryAveSOCVo> batteryAveSOCList = emsBatteryStackMapper.getAveSocList(siteId, yesterday, today);
siteMonitorRuningInfoVo.setBatteryAveSOCList(batteryAveSOCList); siteMonitorRuningInfoVo.setBatteryAveSOCList(batteryAveSOCList);
} }
return siteMonitorRuningInfoVo; return siteMonitorRuningInfoVo;
@ -210,7 +287,12 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
Date today = new Date(); Date today = new Date();
Date yesterday = DateUtils.addDays(today, -1); Date yesterday = DateUtils.addDays(today, -1);
//电池平均温度list //电池平均温度list
List<BatteryAveTempVo> batteryAveTempList = emsBatteryClusterMapper.getBatteryAveTempList(siteId, yesterday, today); List<BatteryAveTempVo> batteryAveTempList = new ArrayList<>();
if (SiteEnum.FX.getCode().equals(siteId)) {
batteryAveTempList = emsBatteryClusterMapper.getBatteryAveTempList(siteId, yesterday, today);
} else if (SiteEnum.DDS.getCode().equals(siteId)) {
batteryAveTempList = emsBatteryStackMapper.getBatteryAveTempList(siteId, yesterday, today);
}
siteMonitorRuningInfoVo.setBatteryAveTempList(batteryAveTempList); siteMonitorRuningInfoVo.setBatteryAveTempList(batteryAveTempList);
} }
return siteMonitorRuningInfoVo; return siteMonitorRuningInfoVo;

View File

@ -325,19 +325,6 @@
t.max_cell_temp,t.min_cell_temp t.max_cell_temp,t.min_cell_temp
</select> </select>
<select id="getAveSocList" resultType="com.xzzn.ems.domain.vo.BatteryAveSOCVo">
select t.site_id,
avg(t.battery_pack_soc) as batterySOC,
DATE_FORMAT(t.create_time, '%Y-%m-%d %H:%i:00') AS createDate
from ems_battery_cluster t
where t.site_id = #{siteId}
AND t.create_time &gt;= Date(#{startDate})
AND t.create_time &lt;= #{endDate}
GROUP BY t.site_id,DATE_FORMAT(t.create_time, '%Y-%m-%d %H:%i:00')
order by createDate
</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, select t.site_id,
avg(t.avg_cell_temp) as batteryTemp, avg(t.avg_cell_temp) as batteryTemp,

View File

@ -345,10 +345,10 @@
</foreach> </foreach>
</delete> </delete>
<select id="getStackAveTempList" resultType="com.xzzn.ems.domain.vo.StackAveTempVo"> <select id="getBatteryAveTempList" resultType="com.xzzn.ems.domain.vo.BatteryAveTempVo">
select t.site_id, select t.site_id,
avg(t.operating_temp) as temp, avg(t.avg_temperature) as batteryTemp,
DATE_FORMAT(t.create_time, '%Y-%m-%d %H:00:00') AS createDate DATE_FORMAT(t.create_time, '%Y-%m-%d %H:%i:00') AS createDate
from ems_battery_stack t from ems_battery_stack t
where t.site_id = #{siteId} where t.site_id = #{siteId}
AND t.create_time &gt;= Date(#{startDate}) AND t.create_time &gt;= Date(#{startDate})
@ -491,4 +491,16 @@
GROUP BY latest.dateMonth GROUP BY latest.dateMonth
ORDER BY statisDate ORDER BY statisDate
</select> </select>
<select id="getAveSocList" resultType="com.xzzn.ems.domain.vo.BatteryAveSOCVo">
select t.site_id,
avg(t.stack_soc) as batterySOC,
DATE_FORMAT(t.create_time, '%Y-%m-%d %H:%i:00') AS createDate
from ems_battery_stack t
where t.site_id = #{siteId}
AND t.create_time &gt;= Date(#{startDate})
AND t.create_time &lt;= #{endDate}
GROUP BY t.site_id,DATE_FORMAT(t.create_time, '%Y-%m-%d %H:%i:00')
order by createDate
</select>
</mapper> </mapper>

View File

@ -424,15 +424,15 @@
</select> </select>
<select id="getStoragePowerList" resultType="com.xzzn.ems.domain.vo.EnergyStoragePowVo"> <select id="getStoragePowerList" resultType="com.xzzn.ems.domain.vo.EnergyStoragePowVo">
SELECT t.site_id, SELECT t.site_id,t.device_id as deviceId,
SUM(t.total_active_power) AS pcsTotalActPower, t.total_active_power AS pcsTotalActPower,
SUM(t.total_reactive_power) AS pcsTotalReactivePower, t.total_reactive_power AS pcsTotalReactivePower,
DATE_FORMAT(t.data_update_time, '%Y-%m-%d %H:%i:00') AS createDate DATE_FORMAT(t.data_update_time, '%Y-%m-%d %H:%i:00') AS createDate
FROM ems_pcs_data t FROM ems_pcs_data t
WHERE t.site_id = #{siteId} WHERE t.site_id = #{siteId}
AND t.data_update_time &gt;= Date(#{startDate}) AND t.data_update_time &gt;= Date(#{startDate})
AND t.data_update_time &lt;= #{endDate} AND t.data_update_time &lt;= #{endDate}
GROUP BY t.site_id, DATE_FORMAT(t.data_update_time, '%Y-%m-%d %H:%i:00') GROUP BY t.site_id, deviceId,pcsTotalActPower,pcsTotalReactivePower,createDate
ORDER BY createDate ORDER BY createDate
</select> </select>