From e7b3a21c6d29dcae1ca40790fb8b6171852bdfea Mon Sep 17 00:00:00 2001 From: mashili Date: Thu, 26 Jun 2025 14:43:38 +0800 Subject: [PATCH] =?UTF-8?q?BMS=E6=80=BB=E8=A7=88+=E7=94=B5=E6=B1=A0?= =?UTF-8?q?=E7=B0=87=E5=88=97=E8=A1=A8=E5=8F=96=E6=95=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xzzn/ems/domain/EmsBatteryData.java | 17 ++- .../domain/vo/BMSBatteryClusterDataList.java | 12 +- .../ems/domain/vo/BMSBatteryDataList.java | 6 + .../domain/vo/BatteryClusterDataDetailVo.java | 130 ++++++++++++++++++ .../ems/mapper/EmsBatteryClusterMapper.java | 10 ++ .../xzzn/ems/mapper/EmsBatteryDataMapper.java | 20 +++ .../service/impl/SingleSiteServiceImpl.java | 76 ++++++++-- 7 files changed, 255 insertions(+), 16 deletions(-) create mode 100644 ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryClusterDataDetailVo.java diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryData.java index 3fd72dd..8faf4fc 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryData.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsBatteryData.java @@ -12,7 +12,7 @@ import com.xzzn.common.annotation.Excel; * 单体电池实时数据对象 ems_battery_data * * @author xzzn - * @date 2025-06-19 + * @date 2025-06-25 */ public class EmsBatteryData extends BaseEntity { @@ -62,6 +62,10 @@ public class EmsBatteryData extends BaseEntity @Excel(name = "设备唯一标识符") private Long deviceId; + /** 簇设备id */ + @Excel(name = "簇设备id") + private Long clusterDeviceId; + public void setId(Long id) { this.id = id; @@ -172,6 +176,16 @@ public class EmsBatteryData extends BaseEntity return deviceId; } + public void setClusterDeviceId(Long clusterDeviceId) + { + this.clusterDeviceId = clusterDeviceId; + } + + public Long getClusterDeviceId() + { + return clusterDeviceId; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -191,6 +205,7 @@ public class EmsBatteryData extends BaseEntity .append("remark", getRemark()) .append("siteId", getSiteId()) .append("deviceId", getDeviceId()) + .append("clusterDeviceId", getClusterDeviceId()) .toString(); } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterDataList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterDataList.java index 0561fc8..edeb022 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterDataList.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryClusterDataList.java @@ -18,13 +18,13 @@ public class BMSBatteryClusterDataList { private BigDecimal minData; /** 单体最小值ID */ - private BigDecimal minDataID; + private Long minDataID; /** 单体最大值 */ private BigDecimal maxData; /** 单体最大值ID */ - private BigDecimal maxDataID; + private Long maxDataID; public String getDataName() { return dataName; @@ -50,11 +50,11 @@ public class BMSBatteryClusterDataList { this.minData = minData; } - public BigDecimal getMinDataID() { + public Long getMinDataID() { return minDataID; } - public void setMinDataID(BigDecimal minDataID) { + public void setMinDataID(Long minDataID) { this.minDataID = minDataID; } @@ -66,11 +66,11 @@ public class BMSBatteryClusterDataList { this.maxData = maxData; } - public BigDecimal getMaxDataID() { + public Long getMaxDataID() { return maxDataID; } - public void setMaxDataID(BigDecimal maxDataID) { + public void setMaxDataID(Long maxDataID) { this.maxDataID = maxDataID; } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryDataList.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryDataList.java index 7a926b0..1ef444c 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryDataList.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BMSBatteryDataList.java @@ -32,6 +32,12 @@ public class BMSBatteryDataList { /** 单体最低温度 (℃) */ private BigDecimal minTemperature; + /** 换电站id */ + private Long siteId; + + /** 堆id */ + private Long stackDeviceId; + public Long getClusterId() { return clusterId; } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryClusterDataDetailVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryClusterDataDetailVo.java new file mode 100644 index 0000000..45e40e1 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/BatteryClusterDataDetailVo.java @@ -0,0 +1,130 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * BMS电池簇-电池单体数据 + */ +public class BatteryClusterDataDetailVo { + + /** 设备id */ + private Long siteId; + + /** 电池簇id */ + private Long clusterId; + + /** 电压平均值 */ + private BigDecimal avgVoltage; + + /** 电压最大值 */ + private BigDecimal maxVoltage; + + /** 电压最小值 */ + private BigDecimal minVoltage; + + /** 温度平均值 */ + private BigDecimal avgTemp; + + /** 温度最大值 */ + private BigDecimal maxTemp; + + /** 温度最小值 */ + private BigDecimal minTemp; + + /** soc平均值 */ + private BigDecimal avgSoc; + + /** soc最大值 */ + private BigDecimal maxSoc; + + /** soc最小值 */ + private BigDecimal minSoc; + + public Long getSiteId() { + return siteId; + } + + public void setSiteId(Long siteId) { + this.siteId = siteId; + } + + public Long getClusterId() { + return clusterId; + } + + public void setClusterId(Long clusterId) { + this.clusterId = clusterId; + } + + public BigDecimal getAvgVoltage() { + return avgVoltage; + } + + public void setAvgVoltage(BigDecimal avgVoltage) { + this.avgVoltage = avgVoltage; + } + + public BigDecimal getMaxVoltage() { + return maxVoltage; + } + + public void setMaxVoltage(BigDecimal maxVoltage) { + this.maxVoltage = maxVoltage; + } + + public BigDecimal getMinVoltage() { + return minVoltage; + } + + public void setMinVoltage(BigDecimal minVoltage) { + this.minVoltage = minVoltage; + } + + public BigDecimal getAvgTemp() { + return avgTemp; + } + + public void setAvgTemp(BigDecimal avgTemp) { + this.avgTemp = avgTemp; + } + + public BigDecimal getMaxTemp() { + return maxTemp; + } + + public void setMaxTemp(BigDecimal maxTemp) { + this.maxTemp = maxTemp; + } + + public BigDecimal getMinTemp() { + return minTemp; + } + + public void setMinTemp(BigDecimal minTemp) { + this.minTemp = minTemp; + } + + public BigDecimal getAvgSoc() { + return avgSoc; + } + + public void setAvgSoc(BigDecimal avgSoc) { + this.avgSoc = avgSoc; + } + + public BigDecimal getMaxSoc() { + return maxSoc; + } + + public void setMaxSoc(BigDecimal maxSoc) { + this.maxSoc = maxSoc; + } + + public BigDecimal getMinSoc() { + return minSoc; + } + + public void setMinSoc(BigDecimal minSoc) { + this.minSoc = minSoc; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java index a7c54cd..f98b7ce 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryClusterMapper.java @@ -3,6 +3,8 @@ package com.xzzn.ems.mapper; import java.util.List; import com.xzzn.ems.domain.EmsBatteryCluster; import com.xzzn.ems.domain.vo.BMSBatteryClusterVo; +import com.xzzn.ems.domain.vo.BMSBatteryDataList; +import org.apache.ibatis.annotations.Param; /** * 电池簇数据Mapper接口 @@ -66,4 +68,12 @@ public interface EmsBatteryClusterMapper * @return */ public List getBMSBatteryCluster(Long siteId); + + /** + * 根据site_di和堆id获取簇数据和单体数据 + * @param siteId + * @param stackDeviceId + * @return + */ + public List getBmsBatteryData(@Param("siteId")Long siteId, @Param("stackDeviceId")Long stackDeviceId); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMapper.java index 4eae06d..7862183 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsBatteryDataMapper.java @@ -1,8 +1,13 @@ package com.xzzn.ems.mapper; import java.util.List; +import java.util.Map; + import com.xzzn.ems.domain.EmsBatteryData; +import com.xzzn.ems.domain.vo.BMSBatteryClusterDataList; +import com.xzzn.ems.domain.vo.BatteryClusterDataDetailVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; /** * 单体电池实时数据Mapper接口 @@ -66,4 +71,19 @@ public interface EmsBatteryDataMapper * @return */ public EmsBatteryData getBatteryDataBySiteId(Long siteId); + + /** + * 根据siteId和簇id获取单体数据 + * @param siteId + * @param clusterDeviceId + * @return + */ + public BatteryClusterDataDetailVo getBatteryDataByClusterId(@Param("siteId")Long siteId, @Param("clusterDeviceId")Long clusterDeviceId); + + /** + * 获取最大最小的单体id + * @param dataVo + * @return + */ + public List> getDataIdsMap(BatteryClusterDataDetailVo dataVo); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java index 0fe2e29..922c81e 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/SingleSiteServiceImpl.java @@ -11,9 +11,9 @@ import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.List; +import java.math.RoundingMode; +import java.util.*; +import java.util.stream.Collectors; /** * 单点监控 服务层实现 @@ -21,6 +21,12 @@ import java.util.List; @Service public class SingleSiteServiceImpl implements ISingleSiteService { + private static final String CLUSTER_DATA_TEP = "温度"; + + private static final String CLUSTER_DATA_VOLTAGE = "电压"; + + private static final String CLUSTER_DATA_SOC = "SOC"; + @Autowired private EmsPcsDataMapper emsPcsDataMapper; @Autowired @@ -161,9 +167,10 @@ public class SingleSiteServiceImpl implements ISingleSiteService { if (!CollectionUtils.isEmpty(bmsOverViewVoList)) { for (BMSOverViewVo bmsOverViewVo : bmsOverViewVoList) { // 获取单体电池数据-待确认 - Long deviceId = bmsOverViewVo.getDeviceId(); - if (deviceId != null) { - List batteryDataList = new ArrayList(); + Long stackDeviceId = bmsOverViewVo.getDeviceId(); + if (stackDeviceId != null) { + List batteryDataList = new ArrayList<>(); + batteryDataList = emsBatteryClusterMapper.getBmsBatteryData(siteId,stackDeviceId); bmsOverViewVo.setBatteryDataList(batteryDataList); } } @@ -181,12 +188,63 @@ public class SingleSiteServiceImpl implements ISingleSiteService { bmsBatteryClusterVoList = emsBatteryClusterMapper.getBMSBatteryCluster(siteId); if (!CollectionUtils.isEmpty(bmsBatteryClusterVoList)) { for (BMSBatteryClusterVo bmsBatteryClusterVo : bmsBatteryClusterVoList) { - // 获取单体电池数据 - Long deviceId = bmsBatteryClusterVo.getDeviceId(); + + Long clusterDeviceId = bmsBatteryClusterVo.getDeviceId(); + List clusterDataList = new ArrayList<>(); + if (clusterDeviceId != null) { + // 获取单体电池数据-平均/最大/最小 + BatteryClusterDataDetailVo batteryClusterDataDetailVo = emsBatteryDataMapper.getBatteryDataByClusterId(siteId,clusterDeviceId); + // 处理数据 + if (batteryClusterDataDetailVo != null) { + BMSBatteryClusterDataList voltageData = new BMSBatteryClusterDataList(); + BMSBatteryClusterDataList tempData = new BMSBatteryClusterDataList(); + BMSBatteryClusterDataList socData = new BMSBatteryClusterDataList(); + // 设值 + voltageData.setDataName(CLUSTER_DATA_VOLTAGE); + voltageData.setAvgData(batteryClusterDataDetailVo.getAvgVoltage()); + voltageData.setMaxData(batteryClusterDataDetailVo.getMaxVoltage()); + voltageData.setMinData(batteryClusterDataDetailVo.getMinVoltage()); + tempData.setDataName(CLUSTER_DATA_TEP); + tempData.setAvgData(batteryClusterDataDetailVo.getAvgTemp()); + tempData.setMaxData(batteryClusterDataDetailVo.getMaxTemp()); + tempData.setMinData(batteryClusterDataDetailVo.getMinTemp()); + socData.setDataName(CLUSTER_DATA_SOC); + socData.setAvgData(batteryClusterDataDetailVo.getAvgSoc()); + socData.setMaxData(batteryClusterDataDetailVo.getMaxSoc()); + socData.setMinData(batteryClusterDataDetailVo.getMinSoc()); + + // 设置对应单体id + List> dataIdMapList = emsBatteryDataMapper.getDataIdsMap(batteryClusterDataDetailVo); + Map resultIdMap = new HashMap<>(); + if (!CollectionUtils.isEmpty(dataIdMapList)) { + resultIdMap = dataIdMapList.stream() + .filter(map -> map.containsKey("type") && map.containsKey("device_id")) // 过滤无效数据 + .filter(map -> map.get("type") instanceof String && map.get("device_id") instanceof Number) // 确保类型正确 + .collect(Collectors.toMap( + map -> (String) map.get("type"), // 键:type 字段 + map -> ((Number) map.get("device_id")).longValue(), // 值:device_id 转为 int + (existing, replacement) -> existing // 处理键冲突的策略 + )); + + // 电压 + voltageData.setMaxDataID(resultIdMap.get("maxVoltageId")); + voltageData.setMaxDataID(resultIdMap.get("maxVoltageId")); + // 温度 + tempData.setMaxDataID(resultIdMap.get("maxTempId")); + tempData.setMinDataID(resultIdMap.get("minTempId")); + // soc + socData.setMaxDataID(resultIdMap.get("maxSocId")); + socData.setMinDataID(resultIdMap.get("minSocId")); + } + clusterDataList.add(voltageData); + clusterDataList.add(tempData); + clusterDataList.add(socData); + } + bmsBatteryClusterVo.setBatteryDataList(clusterDataList); + } } } } - return bmsBatteryClusterVoList; }