dev #2

Merged
dashixiong merged 349 commits from dev into main 2026-02-11 01:55:46 +00:00
243 changed files with 27890 additions and 1034 deletions
Showing only changes of commit d47d9150e6 - Show all commits

View File

@ -356,4 +356,20 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils
String dateStr = convertToString(time);
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;
/**
* 实时运行-储能功率数据
* 实时运行-有功无功功率数据
*
*/
public class EnergyStoragePowVo {
@ -12,7 +12,7 @@ public class EnergyStoragePowVo {
* 显示日期
*/
private Date createDate;
private String createDate;
/**
* pcs实时有功功率
@ -24,12 +24,21 @@ public class EnergyStoragePowVo {
*/
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;
}
public void setCreateDate(Date createDate) {
public void setCreateDate(String 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 {
/**
* 储能功率list
* PCS有功和无功功率
*/
private List<EnergyStoragePowVo> energyStoragePowList;
private List<PcsPowerList> pcsPowerList;
/**
* pcs平均温度list
* PCS最高温度
*/
private List<StackAveTempVo> stackAveTempList;
/**
* 电池平均soclist
* 平均soclist
*/
private List<BatteryAveSOCVo> batteryAveSOCList;
@ -27,12 +27,12 @@ public class SiteMonitorRuningInfoVo {
*/
private List<BatteryAveTempVo> batteryAveTempList;
public List<EnergyStoragePowVo> getEnergyStoragePowList() {
return energyStoragePowList;
public List<PcsPowerList> getPcsPowerList() {
return pcsPowerList;
}
public void setEnergyStoragePowList(List<EnergyStoragePowVo> energyStoragePowList) {
this.energyStoragePowList = energyStoragePowList;
public void setPcsPowerList(List<PcsPowerList> pcsPowerList) {
this.pcsPowerList = pcsPowerList;
}
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);
/**
* 实时运行-平均soc+平均温度
* @param siteId
* @param startDate
* @param endDate
* @return
*/
public List<BatteryAveSOCVo> getAveSocList(@Param("siteId")String siteId, @Param("startDate") Date startDate, @Param("endDate")Date endDate);
// 实时运行-FX平均温度
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.List;
import com.xzzn.ems.domain.EmsBatteryStack;
import com.xzzn.ems.domain.vo.DateSearchRequest;
import com.xzzn.ems.domain.vo.StackAveTempVo;
import com.xzzn.ems.domain.vo.StackPointVo;
import com.xzzn.ems.domain.vo.StackStatisListVo;
import com.xzzn.ems.domain.vo.*;
import org.apache.ibatis.annotations.Param;
/**
@ -91,4 +88,10 @@ public interface EmsBatteryStackMapper
public List<StackPointVo> getStackPointByHour(DateSearchRequest requestVo);
public List<StackPointVo> getStackPointByDay(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.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.ChronoUnit;
import java.util.*;
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 AMMETER_DEVICE_LOAD = "LOAD";
private static final String AMMETER_DEVICE_METE = "METE";
private static Map<String, BigDecimal> storageFactor = new HashMap<>();
static {
storageFactor.put("021_DDS_01", new BigDecimal("0.1"));
@ -157,7 +154,7 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
return siteMonitorRunningHeadInfoVo;
}
// 获取单站监控实时运行-储能功率数据
// 获取单站监控实时运行-PCS有功无功功率
@Override
public SiteMonitorRuningInfoVo getRunningGraphStorage(String siteId) {
SiteMonitorRuningInfoVo siteMonitorRuningInfoVo = new SiteMonitorRuningInfoVo();
@ -166,12 +163,92 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
Date today = DateUtils.getNowDate();
Date yesterday = DateUtils.addDays(today, -1);
//储能功率list
//pcs有功无功
List<PcsPowerList> pcsPowerList = new ArrayList<>();
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;
}
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平均温度
// 20250811 按小时
@Override
@ -187,7 +264,7 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
}
return siteMonitorRuningInfoVo;
}
// 获取单站监控实时运行-电池平均soc
// 获取单站监控实时运行-平均soc
@Override
public SiteMonitorRuningInfoVo getRunningGraphBatterySoc(String siteId) {
SiteMonitorRuningInfoVo siteMonitorRuningInfoVo = new SiteMonitorRuningInfoVo();
@ -196,7 +273,7 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
Date today = new Date();
Date yesterday = DateUtils.addDays(today, -1);
//电池平均soclist
List<BatteryAveSOCVo> batteryAveSOCList = emsBatteryClusterMapper.getAveSocList(siteId, yesterday, today);
List<BatteryAveSOCVo> batteryAveSOCList = emsBatteryStackMapper.getAveSocList(siteId, yesterday, today);
siteMonitorRuningInfoVo.setBatteryAveSOCList(batteryAveSOCList);
}
return siteMonitorRuningInfoVo;
@ -210,7 +287,12 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
Date today = new Date();
Date yesterday = DateUtils.addDays(today, -1);
//电池平均温度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);
}
return siteMonitorRuningInfoVo;

View File

@ -325,19 +325,6 @@
t.max_cell_temp,t.min_cell_temp
</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 t.site_id,
avg(t.avg_cell_temp) as batteryTemp,

View File

@ -345,10 +345,10 @@
</foreach>
</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,
avg(t.operating_temp) as temp,
DATE_FORMAT(t.create_time, '%Y-%m-%d %H:00:00') AS createDate
avg(t.avg_temperature) as batteryTemp,
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})
@ -491,4 +491,16 @@
GROUP BY latest.dateMonth
ORDER BY statisDate
</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>

View File

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