单站监控-电表取数逻辑修改

This commit is contained in:
2025-07-04 13:51:42 +08:00
parent 4bb23a7c75
commit f42e8549b1
10 changed files with 241 additions and 117 deletions

View File

@ -5,14 +5,18 @@ package com.xzzn.common.enums;
* *
* @author xzzn * @author xzzn
*/ */
public enum AmmeterCategoryStatus public enum AmmeterCategory
{ {
TOTAL_CHARGE("1", "累计充电量"), TOTAL_DISCHARGE("2", "累计放电量"), DAILY_CHARGE("3", "日充电量"), DAILY_DISCHARGE("4", "日放电量"); CURRENT_COMB_ACTIVE("1", "当前组合有功电能"),
CURRENT_COMB_REACTIVE("2", "当前组合无功"),
A_POWER("3", "A相功率"),
B_POWER("4", "B相功率"),
C_POWER("5", "C相功率");
private final String code; private final String code;
private final String info; private final String info;
AmmeterCategoryStatus(String code, String info) AmmeterCategory(String code, String info)
{ {
this.code = code; this.code = code;
this.info = info; this.info = info;

View File

@ -0,0 +1,31 @@
package com.xzzn.ems.domain.vo;
import java.util.List;
/**
* 电表数据
*/
public class AmmeterDataResponse {
/** 总表信息 */
private AmmeterLoadDataVo ammeterLoadData;
/** 储能表信息 */
private AmmeterMeteDataVo ammeterMeteData;
public AmmeterLoadDataVo getAmmeterLoadData() {
return ammeterLoadData;
}
public void setAmmeterLoadDataVoList(AmmeterLoadDataVo ammeterLoadData) {
this.ammeterLoadData = ammeterLoadData;
}
public AmmeterMeteDataVo getAmmeterMeteData() {
return ammeterMeteData;
}
public void setAmmeterMeteDataVoList(AmmeterMeteDataVo ammeterMeteData) {
this.ammeterMeteData = ammeterMeteData;
}
}

View File

@ -6,9 +6,9 @@ import java.util.Date;
import java.util.List; import java.util.List;
/** /**
* 电表数据 * 电表-总表数据
*/ */
public class AmmeterDataVo { public class AmmeterLoadDataVo {
/** 电表名称 */ /** 电表名称 */
private String deviceName; private String deviceName;
@ -20,7 +20,8 @@ public class AmmeterDataVo {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataUpdateTime; private Date dataUpdateTime;
private List<AmmeterDataDetailInfo> ammeterDataDetailInfos; /** 总表数据信息 */
private List<LoadDataDetailInfo> loadDataDetailInfo;
public String getDeviceName() { public String getDeviceName() {
return deviceName; return deviceName;
@ -46,11 +47,11 @@ public class AmmeterDataVo {
this.dataUpdateTime = dataUpdateTime; this.dataUpdateTime = dataUpdateTime;
} }
public List<AmmeterDataDetailInfo> getAmmeterDataDetailInfos() { public List<LoadDataDetailInfo> getLoadDataDetailInfo() {
return ammeterDataDetailInfos; return loadDataDetailInfo;
} }
public void setAmmeterDataDetailInfos(List<AmmeterDataDetailInfo> ammeterDataDetailInfos) { public void setLoadDataDetailInfo(List<LoadDataDetailInfo> loadDataDetailInfo) {
this.ammeterDataDetailInfos = ammeterDataDetailInfos; this.loadDataDetailInfo = loadDataDetailInfo;
} }
} }

View File

@ -0,0 +1,57 @@
package com.xzzn.ems.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.util.List;
/**
* 电表-总表数据
*/
public class AmmeterMeteDataVo {
/** 电表名称 */
private String deviceName;
/** 通信状态 */
private String emsCommunicationStatus;
/** 数据更新时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dataUpdateTime;
/** 储能表数据信息 */
private List<MeteDataDetailInfo> meteDataDetailInfo;
public String getDeviceName() {
return deviceName;
}
public void setDeviceName(String deviceName) {
this.deviceName = deviceName;
}
public String getEmsCommunicationStatus() {
return emsCommunicationStatus;
}
public void setEmsCommunicationStatus(String emsCommunicationStatus) {
this.emsCommunicationStatus = emsCommunicationStatus;
}
public Date getDataUpdateTime() {
return dataUpdateTime;
}
public void setDataUpdateTime(Date dataUpdateTime) {
this.dataUpdateTime = dataUpdateTime;
}
public List<MeteDataDetailInfo> getMeteDataDetailInfo() {
return meteDataDetailInfo;
}
public void setMeteDataDetailInfo(List<MeteDataDetailInfo> meteDataDetailInfo) {
this.meteDataDetailInfo = meteDataDetailInfo;
}
}

View File

@ -1,12 +1,11 @@
package com.xzzn.ems.domain.vo; package com.xzzn.ems.domain.vo;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Date;
/** /**
* 电表详细数据 * 电表-总表数据展示
*/ */
public class AmmeterDataDetailInfo public class LoadDataDetailInfo
{ {
/** 类别 */ /** 类别 */
private String category; private String category;
@ -15,10 +14,10 @@ public class AmmeterDataDetailInfo
private BigDecimal totalKwh = BigDecimal.ZERO; private BigDecimal totalKwh = BigDecimal.ZERO;
/** 尖 (kWh) */ /** 尖 (kWh) */
private BigDecimal sharpKwh = BigDecimal.ZERO; private BigDecimal peakKwh = BigDecimal.ZERO;
/** 峰 (kWh) */ /** 峰 (kWh) */
private BigDecimal peakKwh = BigDecimal.ZERO; private BigDecimal highKwh = BigDecimal.ZERO;
/** 平 (kWh) */ /** 平 (kWh) */
private BigDecimal flatKwh = BigDecimal.ZERO; private BigDecimal flatKwh = BigDecimal.ZERO;
@ -26,11 +25,6 @@ public class AmmeterDataDetailInfo
/** 谷 (kWh) */ /** 谷 (kWh) */
private BigDecimal valleyKwh = BigDecimal.ZERO; private BigDecimal valleyKwh = BigDecimal.ZERO;
/** 总表设备Id */
private String deviceId;
/** 数据更新时间 */
private Date updateTime;
public BigDecimal getValleyKwh() { public BigDecimal getValleyKwh() {
return valleyKwh; return valleyKwh;
@ -56,12 +50,12 @@ public class AmmeterDataDetailInfo
this.peakKwh = peakKwh; this.peakKwh = peakKwh;
} }
public BigDecimal getSharpKwh() { public BigDecimal getHighKwh() {
return sharpKwh; return highKwh;
} }
public void setSharpKwh(BigDecimal sharpKwh) { public void setHighKwh(BigDecimal highKwh) {
this.sharpKwh = sharpKwh; this.highKwh = highKwh;
} }
public BigDecimal getTotalKwh() { public BigDecimal getTotalKwh() {
@ -79,20 +73,4 @@ public class AmmeterDataDetailInfo
public void setCategory(String category) { public void setCategory(String category) {
this.category = category; this.category = category;
} }
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
} }

View File

@ -0,0 +1,42 @@
package com.xzzn.ems.domain.vo;
import java.math.BigDecimal;
/**
* 电表-储能表数据展示
*/
public class MeteDataDetailInfo
{
/** 类别A相 B相 C相*/
private String category;
/** 有功功率 */
private BigDecimal activePower = BigDecimal.ZERO;
/** 无功功率 */
private BigDecimal reactivePower = BigDecimal.ZERO;
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public BigDecimal getActivePower() {
return activePower;
}
public void setActivePower(BigDecimal activePower) {
this.activePower = activePower;
}
public BigDecimal getReactivePower() {
return reactivePower;
}
public void setReactivePower(BigDecimal reactivePower) {
this.reactivePower = reactivePower;
}
}

View File

@ -2,8 +2,6 @@ package com.xzzn.ems.mapper;
import java.util.List; import java.util.List;
import com.xzzn.ems.domain.EmsAmmeterData; import com.xzzn.ems.domain.EmsAmmeterData;
import com.xzzn.ems.domain.vo.AmmeterDataDetailInfo;
import org.apache.ibatis.annotations.Param;
/** /**
* 总数据Mapper接口 * 总数据Mapper接口
@ -60,11 +58,4 @@ public interface EmsAmmeterDataMapper
* @return 结果 * @return 结果
*/ */
public int deleteEmsAmmeterDataByIds(Long[] ids); public int deleteEmsAmmeterDataByIds(Long[] ids);
/**
* 获取总表详细数据
* @param siteId
* @return
*/
public List<AmmeterDataDetailInfo> getAmmeterDetailInfo(@Param("siteId")String siteId, @Param("deviceId") String deviceId);
} }

View File

@ -29,5 +29,5 @@ public interface ISingleSiteService
public List<BatteryDataStatsListVo> getClusterDataInfoList(String clusterDeviceId,String siteId); public List<BatteryDataStatsListVo> getClusterDataInfoList(String clusterDeviceId,String siteId);
public List<AmmeterDataVo> getAmmeterDataList(String siteId); public AmmeterDataResponse getAmmeterDataList(String siteId);
} }

View File

@ -2,7 +2,7 @@ package com.xzzn.ems.service.impl;
import com.xzzn.common.constant.RedisKeyConstants; import com.xzzn.common.constant.RedisKeyConstants;
import com.xzzn.common.core.redis.RedisCache; import com.xzzn.common.core.redis.RedisCache;
import com.xzzn.common.enums.AmmeterCategoryStatus; import com.xzzn.common.enums.AmmeterCategory;
import com.xzzn.common.enums.DeviceCategory; import com.xzzn.common.enums.DeviceCategory;
import com.xzzn.common.utils.StringUtils; import com.xzzn.common.utils.StringUtils;
import com.xzzn.ems.domain.*; import com.xzzn.ems.domain.*;
@ -29,6 +29,10 @@ 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";
@Autowired @Autowired
private EmsPcsDataMapper emsPcsDataMapper; private EmsPcsDataMapper emsPcsDataMapper;
@Autowired @Autowired
@ -331,60 +335,96 @@ public class SingleSiteServiceImpl implements ISingleSiteService {
* @return * @return
*/ */
@Override @Override
public List<AmmeterDataVo> getAmmeterDataList(String siteId) { public AmmeterDataResponse getAmmeterDataList(String siteId) {
List<AmmeterDataVo> ammeterDataVos = new ArrayList<>(); AmmeterDataResponse ammeterResponse = new AmmeterDataResponse();
if (!StringUtils.isEmpty(siteId)) { if (!StringUtils.isEmpty(siteId)) {
// 先获取表设备 // 先获取表设备
List<Map<String, Object>> ammeterIdList = emsDevicesSettingMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.AMMETER.getCode()); List<Map<String, Object>> ammeterIdList = emsDevicesSettingMapper.getDeviceInfosBySiteIdAndCategory(siteId, DeviceCategory.AMMETER.getCode());
for (Map<String, Object> ammeterDevice : ammeterIdList) { for (Map<String, Object> ammeterDevice : ammeterIdList) {
AmmeterDataVo ammeterDataVo = new AmmeterDataVo();
ammeterDataVo.setDeviceName(ammeterDevice.get("deviceName").toString());
ammeterDataVo.setEmsCommunicationStatus(ammeterDevice.get("communicationStatus").toString());
// 从redis取总表详细数据
String ammeterId = ammeterDevice.get("id").toString(); String ammeterId = ammeterDevice.get("id").toString();
// 从redis取总表详细数据
EmsAmmeterData ammeterData = redisCache.getCacheObject(RedisKeyConstants.AMMETER + siteId + "_" +ammeterId); EmsAmmeterData ammeterData = redisCache.getCacheObject(RedisKeyConstants.AMMETER + siteId + "_" +ammeterId);
// 判断电表类型
if (AMMETER_DEVICE_LOAD.equals(ammeterId)) {
AmmeterLoadDataVo ammeterLoadDataVo = new AmmeterLoadDataVo();
ammeterLoadDataVo.setDeviceName(ammeterDevice.get("deviceName").toString());
ammeterLoadDataVo.setEmsCommunicationStatus(ammeterDevice.get("communicationStatus").toString());
// 处理总表数据
dealAmmeterLoadData(ammeterData,ammeterLoadDataVo);
ammeterResponse.setAmmeterLoadDataVoList(ammeterLoadDataVo);
} else if (AMMETER_DEVICE_METE.equals(ammeterId)) {
AmmeterMeteDataVo ammeterMeteDataVo = new AmmeterMeteDataVo();
ammeterMeteDataVo.setDeviceName(ammeterDevice.get("deviceName").toString());
ammeterMeteDataVo.setEmsCommunicationStatus(ammeterDevice.get("communicationStatus").toString());
// 处理储能表数据
dealAmmeterMeteData(ammeterData,ammeterMeteDataVo);
ammeterResponse.setAmmeterMeteDataVoList(ammeterMeteDataVo);
}
}
}
return ammeterResponse;
}
private void dealAmmeterMeteData(EmsAmmeterData ammeterData, AmmeterMeteDataVo ammeterMeteDataVo) {
if (ammeterData != null) { if (ammeterData != null) {
// 数据更新时间
ammeterMeteDataVo.setDataUpdateTime(ammeterData.getDataUpdateTime());
List<MeteDataDetailInfo> meteDataDetailInfos = new ArrayList<>();
// 拼接数据
// a相
MeteDataDetailInfo meteDataDetailInfo1 = new MeteDataDetailInfo();
meteDataDetailInfo1.setCategory(AmmeterCategory.A_POWER.getInfo());
meteDataDetailInfo1.setActivePower(ammeterData.getPhaseAActivePower());
meteDataDetailInfo1.setReactivePower(ammeterData.getPhaseAReactivePower());
meteDataDetailInfos.add(meteDataDetailInfo1);
// b相
MeteDataDetailInfo meteDataDetailInfo2 = new MeteDataDetailInfo();
meteDataDetailInfo2.setCategory(AmmeterCategory.B_POWER.getInfo());
meteDataDetailInfo2.setActivePower(ammeterData.getPhaseBActivePower());
meteDataDetailInfo2.setReactivePower(ammeterData.getPhaseBReactivePower());
meteDataDetailInfos.add(meteDataDetailInfo2);
// c相
MeteDataDetailInfo meteDataDetailInfo3 = new MeteDataDetailInfo();
meteDataDetailInfo3.setCategory(AmmeterCategory.C_POWER.getInfo());
meteDataDetailInfo3.setActivePower(ammeterData.getPhaseCActivePower());
meteDataDetailInfo3.setReactivePower(ammeterData.getPhaseCReactivePower());
meteDataDetailInfos.add(meteDataDetailInfo3);
ammeterMeteDataVo.setMeteDataDetailInfo(meteDataDetailInfos);
}
}
private void dealAmmeterLoadData(EmsAmmeterData ammeterData, AmmeterLoadDataVo ammeterDataVo) {
if (ammeterData != null) {
// 数据更新时间
ammeterDataVo.setDataUpdateTime(ammeterData.getDataUpdateTime()); ammeterDataVo.setDataUpdateTime(ammeterData.getDataUpdateTime());
// 处理类别数据
List<AmmeterDataDetailInfo> ammeterDataDetailInfos = new ArrayList<>();
dealAmmeterCategoryDataInfo(ammeterData,ammeterDataDetailInfos);
ammeterDataVo.setAmmeterDataDetailInfos(ammeterDataDetailInfos);
}
ammeterDataVos.add(ammeterDataVo); List<LoadDataDetailInfo> loadDataDetailInfos = new ArrayList<>();
} // 拼接数据
} // 组合有功
return ammeterDataVos; LoadDataDetailInfo ammeterDataDetailInfo1 = new LoadDataDetailInfo();
} ammeterDataDetailInfo1.setCategory(AmmeterCategory.CURRENT_COMB_ACTIVE.getInfo());
private void dealAmmeterCategoryDataInfo(EmsAmmeterData ammeterData, List<AmmeterDataDetailInfo> ammeterDataDetailInfos) {
// 累计放电量
AmmeterDataDetailInfo ammeterDataDetailInfo1 = new AmmeterDataDetailInfo();
ammeterDataDetailInfo1.setCategory(AmmeterCategoryStatus.TOTAL_CHARGE.getInfo());
ammeterDataDetailInfo1.setTotalKwh(ammeterData.getCurrentCombActiveTotal()); ammeterDataDetailInfo1.setTotalKwh(ammeterData.getCurrentCombActiveTotal());
ammeterDataDetailInfo1.setSharpKwh(ammeterData.getCurrentCombActivePeak()); ammeterDataDetailInfo1.setPeakKwh(ammeterData.getCurrentCombActivePeak());
ammeterDataDetailInfo1.setPeakKwh(ammeterData.getCurrentCombActiveHigh()); ammeterDataDetailInfo1.setHighKwh(ammeterData.getCurrentCombActiveHigh());
ammeterDataDetailInfo1.setFlatKwh(ammeterData.getCurrentCombActiveFlat()); ammeterDataDetailInfo1.setFlatKwh(ammeterData.getCurrentCombActiveFlat());
ammeterDataDetailInfo1.setValleyKwh(ammeterData.getCurrentCombActiveValley()); ammeterDataDetailInfo1.setValleyKwh(ammeterData.getCurrentCombActiveValley());
ammeterDataDetailInfos.add(ammeterDataDetailInfo1); loadDataDetailInfos.add(ammeterDataDetailInfo1);
// 累计放电量 // 组合无功
AmmeterDataDetailInfo ammeterDataDetailInfo2 = new AmmeterDataDetailInfo(); LoadDataDetailInfo ammeterDataDetailInfo2 = new LoadDataDetailInfo();
ammeterDataDetailInfo2.setCategory(AmmeterCategoryStatus.TOTAL_DISCHARGE.getInfo()); ammeterDataDetailInfo2.setCategory(AmmeterCategory.CURRENT_COMB_REACTIVE.getInfo());
ammeterDataDetailInfo2.setTotalKwh(ammeterData.getCurrentCombReactiveTotal()); ammeterDataDetailInfo2.setTotalKwh(ammeterData.getCurrentCombReactiveTotal());
ammeterDataDetailInfo2.setSharpKwh(ammeterData.getCurrentCombReactivePeak()); ammeterDataDetailInfo2.setPeakKwh(ammeterData.getCurrentCombReactivePeak());
ammeterDataDetailInfo2.setPeakKwh(ammeterData.getCurrentCombReactiveHigh()); ammeterDataDetailInfo2.setHighKwh(ammeterData.getCurrentCombReactiveHigh());
ammeterDataDetailInfo2.setFlatKwh(ammeterData.getCurrentCombReactiveFlat()); ammeterDataDetailInfo2.setFlatKwh(ammeterData.getCurrentCombReactiveFlat());
ammeterDataDetailInfo2.setValleyKwh(ammeterData.getCurrentCombReactiveValley()); ammeterDataDetailInfo2.setValleyKwh(ammeterData.getCurrentCombReactiveValley());
ammeterDataDetailInfos.add(ammeterDataDetailInfo2); loadDataDetailInfos.add(ammeterDataDetailInfo2);
// 日放电量
AmmeterDataDetailInfo ammeterDataDetailInfo3 = new AmmeterDataDetailInfo(); ammeterDataVo.setLoadDataDetailInfo(loadDataDetailInfos);
ammeterDataDetailInfo3.setCategory(AmmeterCategoryStatus.DAILY_CHARGE.getInfo()); }
ammeterDataDetailInfos.add(ammeterDataDetailInfo3);
// 日充电量
AmmeterDataDetailInfo ammeterDataDetailInfo4 = new AmmeterDataDetailInfo();
ammeterDataDetailInfo4.setCategory(AmmeterCategoryStatus.DAILY_DISCHARGE.getInfo());
ammeterDataDetailInfos.add(ammeterDataDetailInfo4);
} }
} }

View File

@ -549,24 +549,4 @@
</foreach> </foreach>
</delete> </delete>
<select id="getAmmeterDetailInfo" resultType="com.xzzn.ems.domain.vo.AmmeterDataDetailInfo">
SELECT t.category as category,
t.total_kwh as totalKwh,
t.sharp_kwh as sharpKwh,
t.flat_kwh as flatKwh,
t.peak_kwh as peakKwh,
t.device_id as deviceId,
t.valley_kwh as valleyKwh,
Max(t.data_update_time) as updateTime
FROM ems_ammeter_data t
INNER JOIN (
SELECT p.site_id, p.device_id,p.category,MAX(p.data_update_time) AS max_update_time
FROM ems_ammeter_data p
WHERE p.site_id = #{siteId} and p.device_id = #{deviceId}
GROUP BY p.site_id,p.device_id,p.category
) latest on t.device_id = latest.device_id and t.data_update_time = latest.max_update_time
WHERE t.site_id = #{siteId} and t.device_id = #{deviceId}
group by t.category,t.total_kwh,t.sharp_kwh,t.flat_kwh,t.peak_kwh,t.valley_kwh,t.device_id
order by updateTime desc
</select>
</mapper> </mapper>