From 3735c4f4d8d7c8283699e5def95d1d99b651f446 Mon Sep 17 00:00:00 2001 From: zq Date: Fri, 5 Dec 2025 08:46:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E4=BF=AE=E6=94=B9=E6=84=8F?= =?UTF-8?q?=E8=A7=8120251120-=E8=AE=BE=E5=A4=87=E7=82=B9=E4=BD=8D=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E8=A7=A3=E6=9E=90=EF=BC=9B=E4=B8=8A=E4=BC=A0=E7=82=B9?= =?UTF-8?q?=E4=BD=8D=E6=B8=85=E5=8D=95=E4=BF=AE=E6=94=B9=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ems/EmsStatisticalReportController.java | 11 + .../controller/ems/MqttMessageController.java | 89 +- .../common/constant/RedisKeyConstants.java | 5 + .../java/com/xzzn/common/enums/PointType.java | 45 + .../com/xzzn/common/enums/SiteDevice.java | 57 + .../xzzn/common/enums/TopicHandleType.java | 39 + .../xzzn/ems/domain/EmsMqttTopicConfig.java | 4 +- .../com/xzzn/ems/domain/EmsPointMatch.java | 16 +- .../domain/vo/AmmeterRevenueStatisListVo.java | 131 ++ .../ems/domain/vo/DevicePointMatchVo.java | 13 + .../ems/domain/vo/ImportPointDataRequest.java | 11 - .../xzzn/ems/domain/vo/PointDataRequest.java | 10 + .../ems/domain/vo/PointQueryResponse.java | 2 +- .../com/xzzn/ems/enums/DeviceMatchTable.java | 17 +- .../mapper/EmsEnergyPriceConfigMapper.java | 4 + .../ems/mapper/EmsMqttTopicConfigMapper.java | 2 + .../xzzn/ems/mapper/EmsPointMatchMapper.java | 10 +- .../service/IDeviceDataProcessService.java | 8 + .../ems/service/IEmsStatsReportService.java | 2 + .../impl/DeviceDataProcessServiceImpl.java | 1604 +++++++++++++++++ .../impl/EmsDeviceSettingServiceImpl.java | 18 +- .../impl/EmsPointMatchServiceImpl.java | 26 +- .../impl/EmsStatsReportServiceImpl.java | 39 + .../impl/FXXDataProcessServiceImpl.java | 662 +++---- .../utils/DevicePointMatchDataProcessor.java | 31 +- .../mapper/ems/EmsEnergyPriceConfigMapper.xml | 14 + .../mapper/ems/EmsMqttTopicConfigMapper.xml | 5 + .../mapper/ems/EmsPointMatchMapper.xml | 18 +- 28 files changed, 2441 insertions(+), 452 deletions(-) create mode 100644 ems-common/src/main/java/com/xzzn/common/enums/PointType.java create mode 100644 ems-common/src/main/java/com/xzzn/common/enums/SiteDevice.java create mode 100644 ems-common/src/main/java/com/xzzn/common/enums/TopicHandleType.java create mode 100644 ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterRevenueStatisListVo.java create mode 100644 ems-system/src/main/java/com/xzzn/ems/service/IDeviceDataProcessService.java create mode 100644 ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStatisticalReportController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStatisticalReportController.java index 230b980..5930831 100644 --- a/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStatisticalReportController.java +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/EmsStatisticalReportController.java @@ -118,6 +118,17 @@ public class EmsStatisticalReportController extends BaseController return getDataTable(dataList); } + /** + * 概率统计-电表收益报表 + */ + @GetMapping("/getAmmeterRevenueData") + public TableDataInfo getAmmeterRevenueData(StatisAmmeterDateRequest requestVo) + { + startPage(); + List dataList = ieEmsStatsReportService.getAmmeterRevenueDataResult(requestVo); + return getDataTable(dataList); + } + /** * 概率统计-功率曲线 */ diff --git a/ems-admin/src/main/java/com/xzzn/web/controller/ems/MqttMessageController.java b/ems-admin/src/main/java/com/xzzn/web/controller/ems/MqttMessageController.java index afdaf19..cf7c641 100644 --- a/ems-admin/src/main/java/com/xzzn/web/controller/ems/MqttMessageController.java +++ b/ems-admin/src/main/java/com/xzzn/web/controller/ems/MqttMessageController.java @@ -1,6 +1,9 @@ package com.xzzn.web.controller.ems; import com.alibaba.fastjson2.JSON; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.TopicHandleType; import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.EmsMqttTopicConfig; import com.xzzn.ems.domain.MqttSyncLog; @@ -39,6 +42,9 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { @Autowired private IDDSDataProcessService dDSDataProcessService; + @Autowired + private IDeviceDataProcessService deviceDataProcessService; + @Autowired private IFXXAlarmDataProcessService fXXAlarmDataProcessService; @Autowired @@ -48,6 +54,9 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { @Autowired private IMqttSyncLogService iMqttSyncLogService; + @Autowired + private RedisCache redisCache; + @Autowired public MqttMessageController(MqttLifecycleManager mqttLifecycleManager) { this.mqttLifecycleManager = mqttLifecycleManager; @@ -75,7 +84,7 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { qos = 1; } - IMqttMessageListener listener = getMqttListenerByTopic(topic, topicConfig.getId()); + IMqttMessageListener listener = getMqttListenerByTopic(topic, topicConfig.getHandleType()); subscribe(topic, qos, listener); } // 订阅奉贤系统状态主题 @@ -93,23 +102,28 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { } - private IMqttMessageListener getMqttListenerByTopic(String topic, Long id) { - if (topic.contains("ALARM_UP")) { - return this::handleAlarmData; - } else if (topic.endsWith("_01")) { - return this::handleSystemStatus; - } else if (topic.contains("STRATEGY")) { - return this::handleStrategyData; - } else if (topic.equals("FAULT_PROTECTION_PLAN_UP")) { - return this::handleFaultProtPlanData; - } else if (topic.equals("FAULT_ALARM_RECORD_UP")) { - return this::handleFaultAlarmData; - } else if (topic.equals("FAULT_PLAN_ISSUE_UP")) { - return this::handleFaultPlanIssueData; - } else if (topic.equals("DEVICE_CHANGE_LOG_UP")) { - return this::handleDeviceChangeLogData; - } else { - return this::handleDeviceData; + private IMqttMessageListener getMqttListenerByTopic(String topic, String handleType) { + TopicHandleType topicHandleType = TopicHandleType.getEnumByCode(handleType); + switch (topicHandleType) { + case DEVICE: + return this::handleDeviceData; + case DEVICE_ALARM: + return this::handleAlarmData; + case STRATEGY: + if (topic.equals("FAULT_PROTECTION_PLAN_UP")) { + return this::handleFaultProtPlanData; + } else if (topic.equals("FAULT_ALARM_RECORD_UP")) { + return this::handleFaultAlarmData; + } else if (topic.equals("FAULT_PLAN_ISSUE_UP")) { + return this::handleFaultPlanIssueData; + } else if (topic.equals("DEVICE_CHANGE_LOG_UP")) { + return this::handleDeviceChangeLogData; + } else { + return this::handleStrategyData; + } + default: + log.warn("Unknown handle type: " + handleType + ", using default handler"); + return this::handleSystemStatus; } } @@ -129,18 +143,19 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { // 处理设备数据 private void handleDeviceData(String topic, MqttMessage message) { String payload = new String(message.getPayload()); - System.out.println("[DEVICE] data: " + payload); + log.info("[DEVICE] data: " + payload); try { // 业务处理逻辑 - if (topic.startsWith("021_DDS")) { - dDSDataProcessService.handleDdsData(payload); - } else if (topic.startsWith("021_FXX")) { - fXXDataProcessService.handleFxData(payload); - } +// if (topic.startsWith("021_DDS")) { +// dDSDataProcessService.handleDdsData(payload); +// } else if (topic.startsWith("021_FXX")) { +// fXXDataProcessService.handleFxData(payload); +// } + deviceDataProcessService.handleDeviceData(payload, getSiteIdByTopic(topic)); - emsMqttMessageService.insertMqttOriginalMessage(topic,payload); + emsMqttMessageService.insertMqttOriginalMessage(topic, payload); } catch (Exception e) { - log.error("Failed to process system status message: " + e.getMessage(), e); + log.error("Failed to process device data message: " + e.getMessage(), e); } } @@ -151,17 +166,29 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { System.out.println("[DEVICE] data: " + payload); try { // 业务处理逻辑 - if (topic.startsWith("021_FXX")) { - fXXAlarmDataProcessService.handleFxAlarmData(payload); - } +// if (topic.startsWith("021_FXX")) { +// fXXAlarmDataProcessService.handleFxAlarmData(payload); +// } + deviceDataProcessService.handleAlarmData(payload, getSiteIdByTopic(topic)); - emsMqttMessageService.insertMqttOriginalMessage(topic,payload); + emsMqttMessageService.insertMqttOriginalMessage(topic, payload); } catch (Exception e) { - log.error("Failed to process alarm data message: " + e.getMessage(), e); + log.error("Failed to process device alarm data message: " + e.getMessage(), e); } } + private String getSiteIdByTopic(String topic) { + String siteId = redisCache.getCacheObject(RedisKeyConstants.SITE_ID + topic); + if (StringUtils.isEmpty(siteId)) { + EmsMqttTopicConfig topicConfig = emsMqttTopicConfigMapper.selectOneByTopic(topic); + siteId = topicConfig.getSiteId(); + redisCache.setCacheObject(RedisKeyConstants.SITE_ID + topic, siteId); + } + log.info("当前处理数据站点:" + siteId + ",topic: " + topic); + return siteId; + } + // 处理运行策略数据:云端-本地 private void handleStrategyData(String topic, MqttMessage message) { String payload = new String(message.getPayload()); diff --git a/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java b/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java index dc83d4f..78b682a 100644 --- a/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java +++ b/ems-common/src/main/java/com/xzzn/common/constant/RedisKeyConstants.java @@ -67,6 +67,11 @@ public class RedisKeyConstants */ public static final String POINT_MATCH = "POINT_MATCH_"; + /** + * topic对应站点ID redis key + */ + public static final String SITE_ID = "SITE_ID_"; + /** * 存放单个设备同步过来的原始数据-最晚一次数据 */ diff --git a/ems-common/src/main/java/com/xzzn/common/enums/PointType.java b/ems-common/src/main/java/com/xzzn/common/enums/PointType.java new file mode 100644 index 0000000..fe6da19 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/PointType.java @@ -0,0 +1,45 @@ +package com.xzzn.common.enums; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * 设备点位类型 + */ +public enum PointType +{ + YES(1, "是"), + NO(0, "否"); + + private final Integer code; + private final String info; + + private static final Map CODE_NAME_MAP = new HashMap<>(PointType.values().length); + + static { + Arrays.stream(PointType.values()).forEach(record -> { + CODE_NAME_MAP.put(record.code, record.info); + }); + } + + PointType(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public String getInfoByCode(Integer code) { + return CODE_NAME_MAP.get(code); + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/SiteDevice.java b/ems-common/src/main/java/com/xzzn/common/enums/SiteDevice.java new file mode 100644 index 0000000..3725068 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/SiteDevice.java @@ -0,0 +1,57 @@ +package com.xzzn.common.enums; + +/** + * + */ +public enum SiteDevice +{ + /** + * 电池堆 + */ + BMSD, + + /** + * 电池簇 + */ + BMSC, + + /** + * PCS设备 + */ + PCS, + + /** + * 电表-总表 + */ + LOAD, + + /** + * 电表-光伏电表 + */ + METEGF, + + /** + * 电表-储能电表 + */ + METE, + + /** + * 电表-储能电表 + */ + METE0, + + /** + * 动环 + */ + donghuan, + + /** + * 动环 + */ + DH, + + /** + * 中水冷却 + */ + ZSLQ +} diff --git a/ems-common/src/main/java/com/xzzn/common/enums/TopicHandleType.java b/ems-common/src/main/java/com/xzzn/common/enums/TopicHandleType.java new file mode 100644 index 0000000..deedc64 --- /dev/null +++ b/ems-common/src/main/java/com/xzzn/common/enums/TopicHandleType.java @@ -0,0 +1,39 @@ +package com.xzzn.common.enums; + +/** + * MQTT主题处理类型未知类型 + */ +public enum TopicHandleType { + DEVICE("DEVICE", "设备数据"), + DEVICE_ALARM("DEVICE_ALARM", "设备告警数据"), + STRATEGY("STRATEGY", "策略数据"), + SYSTEM("SYSTEM", "系统数据"), + ; + + private final String code; + private final String info; + + TopicHandleType(String code, String info) { + this.code = code; + this.info = info; + } + + public String getName() { + return code; + } + + public String getInfo() { + return info; + } + + // 根据名称查找枚举 + public static TopicHandleType getEnumByCode(String code) { + for (TopicHandleType type : values()) { + if (type.getName().equals(code)) { + return type; + } + } + // 默认返回SYSTEM + return SYSTEM; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsMqttTopicConfig.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsMqttTopicConfig.java index 33b36a2..db6a9bb 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsMqttTopicConfig.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsMqttTopicConfig.java @@ -33,8 +33,8 @@ public class EmsMqttTopicConfig extends BaseEntity @Excel(name = "对应方法") private String handleMethod; - /** 处理器类型:(device=设备数据,system=系统状态,alarm=告警数据等) */ - @Excel(name = "处理器类型:(device=设备数据,system=系统状态,alarm=告警数据等)") + /** 处理器类型:(DEVICE=设备数据,SYSTEM=系统状态,ALARM=告警数据等) */ + @Excel(name = "处理器类型:(DEVICE=设备数据,SYSTEM=系统状态,ALARM=告警数据等)") private String handleType; /** 站点id */ diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointMatch.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointMatch.java index 1abe5e0..bca5c30 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointMatch.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPointMatch.java @@ -70,9 +70,9 @@ public class EmsPointMatch extends BaseEntity @Excel(name = "点位是否需要区分多设备:0-不需要 1-需要") private Long needDiffDeviceId; - /** 设备唯一标识符 */ - @Excel(name = "设备唯一标识符") - private String deviceId; + /** 是否告警点位 */ + @Excel(name = "是否告警点位", readConverterExp = "0=否,1=是") + private Integer isAlarm; public void setId(Long id) { @@ -212,12 +212,12 @@ public class EmsPointMatch extends BaseEntity return needDiffDeviceId; } - public String getDeviceId() { - return deviceId; + public Integer getIsAlarm() { + return isAlarm; } - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; + public void setIsAlarm(Integer isAlarm) { + this.isAlarm = isAlarm; } @Override @@ -242,7 +242,7 @@ public class EmsPointMatch extends BaseEntity .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) - .append("deviceId", getDeviceId()) + .append("isAlarm", getIsAlarm()) .toString(); } } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterRevenueStatisListVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterRevenueStatisListVo.java new file mode 100644 index 0000000..614f5a7 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/AmmeterRevenueStatisListVo.java @@ -0,0 +1,131 @@ +package com.xzzn.ems.domain.vo; + +import java.math.BigDecimal; + +/** + * 电表收益数据 + */ +public class AmmeterRevenueStatisListVo { + + + /** 类别 */ + private String dataTime; + + /** 组合有功-总 */ + private BigDecimal activeTotalPrice = BigDecimal.ZERO; + + /** 组合有功-尖 */ + private BigDecimal activePeakPrice = BigDecimal.ZERO; + + /** 组合有功-峰 */ + private BigDecimal activeHighPrice = BigDecimal.ZERO; + + /** 组合有功-平 */ + private BigDecimal activeFlatPrice = BigDecimal.ZERO; + + /** 组合有功-谷 */ + private BigDecimal activeValleyPrice = BigDecimal.ZERO; + + /** 组合无功-总 */ + private BigDecimal reActiveTotalPrice = BigDecimal.ZERO; + + /** 组合无功-尖 */ + private BigDecimal reActivePeakPrice = BigDecimal.ZERO; + + /** 组合无功-峰 */ + private BigDecimal reActiveHighPrice = BigDecimal.ZERO; + + /** 组合无功-平 */ + private BigDecimal reActiveFlatPrice = BigDecimal.ZERO; + + /** 组合无功-谷 */ + private BigDecimal reActiveValleyPrice = BigDecimal.ZERO; + + public String getDataTime() { + return dataTime; + } + + public void setDataTime(String dataTime) { + this.dataTime = dataTime; + } + + public BigDecimal getActiveTotalPrice() { + return activeTotalPrice; + } + + public void setActiveTotalPrice(BigDecimal activeTotalPrice) { + this.activeTotalPrice = activeTotalPrice; + } + + public BigDecimal getActivePeakPrice() { + return activePeakPrice; + } + + public void setActivePeakPrice(BigDecimal activePeakPrice) { + this.activePeakPrice = activePeakPrice; + } + + public BigDecimal getActiveHighPrice() { + return activeHighPrice; + } + + public void setActiveHighPrice(BigDecimal activeHighPrice) { + this.activeHighPrice = activeHighPrice; + } + + public BigDecimal getActiveFlatPrice() { + return activeFlatPrice; + } + + public void setActiveFlatPrice(BigDecimal activeFlatPrice) { + this.activeFlatPrice = activeFlatPrice; + } + + public BigDecimal getActiveValleyPrice() { + return activeValleyPrice; + } + + public void setActiveValleyPrice(BigDecimal activeValleyPrice) { + this.activeValleyPrice = activeValleyPrice; + } + + public BigDecimal getReActiveTotalPrice() { + return reActiveTotalPrice; + } + + public void setReActiveTotalPrice(BigDecimal reActiveTotalPrice) { + this.reActiveTotalPrice = reActiveTotalPrice; + } + + public BigDecimal getReActivePeakPrice() { + return reActivePeakPrice; + } + + public void setReActivePeakPrice(BigDecimal reActivePeakPrice) { + this.reActivePeakPrice = reActivePeakPrice; + } + + public BigDecimal getReActiveHighPrice() { + return reActiveHighPrice; + } + + public void setReActiveHighPrice(BigDecimal reActiveHighPrice) { + this.reActiveHighPrice = reActiveHighPrice; + } + + public BigDecimal getReActiveFlatPrice() { + return reActiveFlatPrice; + } + + public void setReActiveFlatPrice(BigDecimal reActiveFlatPrice) { + this.reActiveFlatPrice = reActiveFlatPrice; + } + + public BigDecimal getReActiveValleyPrice() { + return reActiveValleyPrice; + } + + public void setReActiveValleyPrice(BigDecimal reActiveValleyPrice) { + this.reActiveValleyPrice = reActiveValleyPrice; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java index d8903d7..b69fdb7 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/DevicePointMatchVo.java @@ -25,6 +25,10 @@ public class DevicePointMatchVo implements Serializable { /** 数据单位 */ @Excel(name = "数据单位") private String dataUnit; + + /** 是否告警点位 */ + @Excel(name = "是否告警点位", readConverterExp = "0=否,1=是") + private String isAlarm; // // /** 数据点位来源设备 */ // @Excel(name = "数据点位来源设备") @@ -78,6 +82,15 @@ public class DevicePointMatchVo implements Serializable { // this.dataDevice = dataDevice; // } + + public String getIsAlarm() { + return isAlarm; + } + + public void setIsAlarm(String isAlarm) { + this.isAlarm = isAlarm; + } + public String getIpAddress() { return ipAddress; } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/ImportPointDataRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ImportPointDataRequest.java index d5a6416..3406156 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/ImportPointDataRequest.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/ImportPointDataRequest.java @@ -17,9 +17,6 @@ public class ImportPointDataRequest { /** 站点id */ @NotBlank(message = "站点ID不能为空") private String siteId; - /** 设备id */ - @NotBlank(message = "设备ID不能为空") - private String deviceId; /** 设备类型 */ @NotBlank(message = "设备类型不能为空") private String deviceCategory; @@ -35,14 +32,6 @@ public class ImportPointDataRequest { this.siteId = siteId; } - public String getDeviceId() { - return deviceId; - } - - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; - } - public String getDeviceCategory() { return deviceCategory; } diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java index 994b54a..dcfffc4 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointDataRequest.java @@ -35,6 +35,16 @@ public class PointDataRequest { private String ipAddress; /** modbus端口 */ private Integer ipPort; + /** 是否告警点位 */ + private Integer isAlarm; + + public Integer getIsAlarm() { + return isAlarm; + } + + public void setIsAlarm(Integer isAlarm) { + this.isAlarm = isAlarm; + } public String getIpAddress() { return ipAddress; diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointQueryResponse.java b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointQueryResponse.java index 18e72e2..ec8b249 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointQueryResponse.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/vo/PointQueryResponse.java @@ -43,7 +43,7 @@ public class PointQueryResponse private String dataUnit; /** 地址 */ - @Excel(name = "地址") + @Excel(name = "寄存器地址") private String ipAddress; /** 端口 */ diff --git a/ems-system/src/main/java/com/xzzn/ems/enums/DeviceMatchTable.java b/ems-system/src/main/java/com/xzzn/ems/enums/DeviceMatchTable.java index 835a8ca..1f2164b 100644 --- a/ems-system/src/main/java/com/xzzn/ems/enums/DeviceMatchTable.java +++ b/ems-system/src/main/java/com/xzzn/ems/enums/DeviceMatchTable.java @@ -5,10 +5,14 @@ import com.xzzn.ems.domain.EmsBatteryCluster; import com.xzzn.ems.domain.EmsBatteryData; import com.xzzn.ems.domain.EmsBatteryGroup; import com.xzzn.ems.domain.EmsBatteryStack; +import com.xzzn.ems.domain.EmsClusterAlarmData; +import com.xzzn.ems.domain.EmsCoolingAlarmData; import com.xzzn.ems.domain.EmsCoolingData; import com.xzzn.ems.domain.EmsDhData; +import com.xzzn.ems.domain.EmsPcsAlarmData; import com.xzzn.ems.domain.EmsPcsBranchData; import com.xzzn.ems.domain.EmsPcsData; +import com.xzzn.ems.domain.EmsStackAlarmData; import com.xzzn.ems.domain.EmsXfData; import java.util.HashMap; @@ -28,7 +32,14 @@ public enum DeviceMatchTable COOLING("COOLING", "ems_cooling_data", EmsCoolingData.class), DH("DH", "ems_dh_data", EmsDhData.class), XF("XF", "ems_xf_data", EmsXfData.class), - BATTERY_GROUP("BATTERY_GROUP", "ems_battery_group", EmsBatteryGroup.class); + BATTERY_GROUP("BATTERY_GROUP", "ems_battery_group", EmsBatteryGroup.class), + + /** 告警点位 */ + COOLING_ALARM("COOLING_ALARM", "ems_cooling_alarm_data", EmsCoolingAlarmData.class), + STACK_ALARM("STACK_ALARM", "ems_stack_alarm_data", EmsStackAlarmData.class), + CLUSTER_ALARM("CLUSTER_ALARM", "ems_cluster_alarm_data", EmsClusterAlarmData.class), + PCS_ALARM("PCS_ALARM", "ems_pcs_alarm_data", EmsPcsAlarmData.class), + ; private final String code; private final String matchTable; @@ -80,4 +91,8 @@ public enum DeviceMatchTable return TABLE_TO_CLASS_MAP.get(matchTable); // 从缓存中直接获取,效率高 } + public static String getAlarmMatchTableByCode(String code) { + return DEVICE_MATCH_TABLE_MAP.get(code + "_ALARM"); // 从缓存中直接获取,效率高 + } + } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java index 4e80ad0..2dfbe86 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsEnergyPriceConfigMapper.java @@ -76,4 +76,8 @@ public interface EmsEnergyPriceConfigMapper // 获取所有有效站点的电价配置 public List getAllSitePriceConfig( @Param("currentYear")int currentYear, @Param("currentMonth")int currentMonth); + // 查询指定时间范围的电价配置列表 + public List getConfigListByTimeFrame(@Param("siteId")String siteId, + @Param("startTime")String startTime, + @Param("endTime")String endTime); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsMqttTopicConfigMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsMqttTopicConfigMapper.java index 10a9fa0..4128555 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsMqttTopicConfigMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsMqttTopicConfigMapper.java @@ -61,4 +61,6 @@ public interface EmsMqttTopicConfigMapper // 判断topic是否存在 public String checkTopicIsExist(String strategyTopic); + + EmsMqttTopicConfig selectOneByTopic(String topic); } diff --git a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointMatchMapper.java b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointMatchMapper.java index 433589f..077bc8f 100644 --- a/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointMatchMapper.java +++ b/ems-system/src/main/java/com/xzzn/ems/mapper/EmsPointMatchMapper.java @@ -127,7 +127,8 @@ public interface EmsPointMatchMapper @Param("pointName")String pointName, @Param("dataPoint")String dataPoint, @Param("ipAddress")String ipAddress, - @Param("ipPort")Integer ipPort); + @Param("ipPort")Integer ipPort, + @Param("isAlarm")Integer isAlarm); // 单个站点单个设备点位查询-电池簇使用 public List getClusterDevicePoints(@Param("siteId")String siteId, @Param("deviceId")String deviceId, @@ -136,12 +137,13 @@ public interface EmsPointMatchMapper @Param("pointName")String pointName, @Param("dataPoint")String dataPoint, @Param("ipAddress")String ipAddress, - @Param("ipPort")Integer ipPort); + @Param("ipPort")Integer ipPort, + @Param("isAlarm")Integer isAlarm); // 根据站点,设备类别,点位,获取唯一数据 public EmsPointMatch getUniquePoint(@Param("siteId")String siteId, @Param("deviceCategory")String deviceCategory, @Param("dataPoint")String dataPoint); - EmsPointMatch getOnePointMatch(@Param("siteId") String siteId, @Param("deviceId") String deviceId, @Param("deviceCategory") String deviceCategory, @Param("dataPoint") String dataPoint); + EmsPointMatch getOnePointMatch(@Param("siteId") String siteId, @Param("deviceCategory") String deviceCategory, @Param("dataPoint") String dataPoint); - List getDevicePointMatchList(@Param("siteId") String siteId, @Param("deviceId") String deviceId, @Param("deviceCategory") String deviceCategory); + List getDevicePointMatchList(@Param("siteId") String siteId, @Param("deviceCategory") String deviceCategory); } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IDeviceDataProcessService.java b/ems-system/src/main/java/com/xzzn/ems/service/IDeviceDataProcessService.java new file mode 100644 index 0000000..2c07bd8 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IDeviceDataProcessService.java @@ -0,0 +1,8 @@ +package com.xzzn.ems.service; + +public interface IDeviceDataProcessService { + + public void handleDeviceData(String message, String siteId); + + public void handleAlarmData(String message, String siteId); +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsStatsReportService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStatsReportService.java index bb5bc8e..db3e010 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/IEmsStatsReportService.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsStatsReportService.java @@ -26,6 +26,8 @@ public interface IEmsStatsReportService public List getAmmeterDataResult(StatisAmmeterDateRequest requestVo); + List getAmmeterRevenueDataResult(StatisAmmeterDateRequest requestVo); + public List getPowerDataList(DateSearchRequest requestVo); public List getSingleBatteryData(DateSearchRequest requestVo); diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java new file mode 100644 index 0000000..7ca6ba2 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java @@ -0,0 +1,1604 @@ +package com.xzzn.ems.service.impl; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.TypeReference; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.xzzn.common.constant.Constants; +import com.xzzn.common.constant.RedisKeyConstants; +import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.AlarmLevelStatus; +import com.xzzn.common.enums.AlarmStatus; +import com.xzzn.common.enums.BranchStatus; +import com.xzzn.common.enums.ChargeStatus; +import com.xzzn.common.enums.CommunicationStatus; +import com.xzzn.common.enums.ControlModeStatus; +import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.common.enums.DeviceRunningStatus; +import com.xzzn.common.enums.DeviceType; +import com.xzzn.common.enums.GridStatus; +import com.xzzn.common.enums.SiteDevice; +import com.xzzn.common.enums.SiteEnum; +import com.xzzn.common.enums.SwitchStatus; +import com.xzzn.common.enums.WorkStatus; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.MapUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.*; +import com.xzzn.ems.domain.vo.EnergyPriceTimeRange; +import com.xzzn.ems.domain.vo.EnergyPriceVo; +import com.xzzn.ems.enums.DeviceMatchTable; +import com.xzzn.ems.mapper.EmsAmmeterDataMapper; +import com.xzzn.ems.mapper.EmsBatteryClusterMapper; +import com.xzzn.ems.mapper.EmsBatteryDataMapper; +import com.xzzn.ems.mapper.EmsBatteryDataMinutesMapper; +import com.xzzn.ems.mapper.EmsBatteryGroupMapper; +import com.xzzn.ems.mapper.EmsBatteryStackMapper; +import com.xzzn.ems.mapper.EmsClusterAlarmDataMapper; +import com.xzzn.ems.mapper.EmsCoolingAlarmDataMapper; +import com.xzzn.ems.mapper.EmsCoolingDataMapper; +import com.xzzn.ems.mapper.EmsDailyChargeDataMapper; +import com.xzzn.ems.mapper.EmsDailyEnergyDataMapper; +import com.xzzn.ems.mapper.EmsDevicesSettingMapper; +import com.xzzn.ems.mapper.EmsDhDataMapper; +import com.xzzn.ems.mapper.EmsEnergyPriceConfigMapper; +import com.xzzn.ems.mapper.EmsPcsAlarmDataMapper; +import com.xzzn.ems.mapper.EmsPcsBranchDataMapper; +import com.xzzn.ems.mapper.EmsPcsDataMapper; +import com.xzzn.ems.mapper.EmsStackAlarmDataMapper; +import com.xzzn.ems.mapper.EmsXfDataMapper; +import com.xzzn.ems.service.IDeviceDataProcessService; +import com.xzzn.ems.service.IEmsAlarmRecordsService; +import com.xzzn.ems.service.IEmsDeviceSettingService; +import com.xzzn.ems.service.IEmsEnergyPriceConfigService; +import com.xzzn.ems.service.IFXXDataProcessService; +import com.xzzn.ems.utils.AbstractBatteryDataProcessor; +import com.xzzn.ems.utils.DevicePointMatchDataProcessor; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor implements IDeviceDataProcessService { + private static final Log log = LogFactory.getLog(DeviceDataProcessServiceImpl.class); + + private static final Pattern PATTERN = Pattern.compile("(BMSD\\d{2})(ZT|SOC|SOH|DL|DY|BDSC)"); + // 匹配DTDC+数字格式的正则(提取序号) + private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)"); + + @Autowired + private EmsBatteryClusterMapper emsBatteryClusterMapper; + @Autowired + private EmsBatteryStackMapper emsBatteryStackMapper; + @Autowired + private EmsBatteryDataMapper emsBatteryDataMapper; + @Autowired + private EmsPcsDataMapper emsPcsDataMapper; + @Autowired + private EmsPcsBranchDataMapper emsPcsBranchDataMapper; + @Autowired + private EmsAmmeterDataMapper emsAmmeterDataMapper; + @Autowired + private EmsDevicesSettingMapper emsDevicesSettingMapper; + @Autowired + private EmsBatteryDataMinutesMapper emsBatteryDataMinutesMapper; + @Autowired + private EmsDailyChargeDataMapper emsDailyChargeDataMapper; + @Autowired + private EmsXfDataMapper emsXfDataMapper; + @Autowired + private EmsDhDataMapper emsDhDataMapper; + @Autowired + private EmsCoolingDataMapper emsCoolingDataMapper; + @Autowired + private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper; + @Autowired + private EmsBatteryGroupMapper emsBatteryGroupMapper; + + @Autowired + private EmsCoolingAlarmDataMapper emsCoolingAlarmDataMapper; + @Autowired + private EmsStackAlarmDataMapper emsStackAlarmDataMapper; + @Autowired + private EmsClusterAlarmDataMapper emsClusterAlarmDataMapper; + @Autowired + private EmsPcsAlarmDataMapper emsPcsAlarmDataMapper; + + @Autowired + private EmsBatteryDailyLatestServiceImpl emsBatteryDailyLatestServiceImpl; + @Autowired + private IEmsAlarmRecordsService iEmsAlarmRecordsService; + @Autowired + private IEmsEnergyPriceConfigService emsEnergyPriceConfigService; + @Autowired + private IEmsEnergyPriceConfigService iEmsEnergyPriceConfigService; + @Autowired + private IEmsDeviceSettingService iEmsDeviceSettingService; + @Autowired + private DevicePointMatchDataProcessor devicePointMatchDataProcessor; + + @Autowired + private RedisCache redisCache; + + // 构造方法(调用父类构造) + public DeviceDataProcessServiceImpl(ObjectMapper objectMapper) { + super(objectMapper); + } + + @Override + public void handleDeviceData(String message, String siteId) { + JSONArray arraylist = JSONArray.parseArray(message); + + for (int i = 0; i < arraylist.size(); i++) { + JSONObject obj = JSONObject.parseObject(arraylist.get(i).toString()); + + String deviceId = obj.getString("Device"); + String jsonData = obj.getString("Data"); + Long timestamp = obj.getLong("timestamp"); + Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp); + + log.info("deviceId:" + deviceId); + boolean isEmpty = checkJsonDataEmpty(jsonData); + if (isEmpty) { + // 添加设备告警 + iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId); + return; + } + + // 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据 + redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId, obj); + // 存放每次同步数据,失效时间(同同步时间)-用于判断是否正常同步数据 + redisCache.setCacheObject(RedisKeyConstants.SYNC_DATA + siteId + "_" + deviceId, obj, 1, TimeUnit.MINUTES); + + if (deviceId.contains(SiteDevice.BMSD.name())) { + batteryStackDataProcess(siteId, deviceId, jsonData); + batteryGroupDataProcess(siteId, deviceId, jsonData); + batteryDataProcessFromBmsd(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.BMSC.name())) { + batteryClusterDataProcess(siteId, deviceId, jsonData); + batteryDataProcessFromBmsc(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.PCS.name())) { + pcsDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + pcsBranchDataProcess(siteId, deviceId, jsonData); + batteryClusterDataProcess(siteId, jsonData); + } else if (deviceId.contains(SiteDevice.LOAD.name())) { + loadDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.METEGF.name()) + || deviceId.contains(SiteDevice.METE.name()) + || deviceId.contains(SiteDevice.METE0.name())) { + meteDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains("XF")) { + meteXFProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.DH.name()) || deviceId.contains(SiteDevice.donghuan.name())) { + dhDataProcess(siteId, deviceId, jsonData); + } else if (deviceId.contains(SiteDevice.ZSLQ.name())) { + coolingDataProcess(siteId, deviceId, jsonData); + } + } + } + + private void coolingDataProcess(String siteId, String deviceId, String jsonData) { + //中水冷却 + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.COOLING.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理中水冷却数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + EmsCoolingData coolingData = new EmsCoolingData(); + + saveDeviceData(pointMatchList, obj, coolingData); + + coolingData.setCreateBy("system"); + coolingData.setCreateTime(DateUtils.getNowDate()); + coolingData.setUpdateBy("system"); + coolingData.setUpdateTime(DateUtils.getNowDate()); + coolingData.setSiteId(siteId); + coolingData.setDeviceId(deviceId); + + emsCoolingDataMapper.insertEmsCoolingData(coolingData); + + redisCache.setCacheObject(RedisKeyConstants.COOLING + siteId + "_" + deviceId, coolingData); + + } + + private void meteXFProcess(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + //消防 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.XF.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理动环数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + // 暂时只更新设备表的设备状态 ZDYBYDCZT-主电源备用电池状态 + // 数据存表 + EmsXfData xfData = new EmsXfData(); + xfData.setDataTimestamp(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, xfData); + + xfData.setCreateBy("system"); + xfData.setCreateTime(DateUtils.getNowDate()); + xfData.setUpdateBy("system"); + xfData.setUpdateTime(DateUtils.getNowDate()); + xfData.setSiteId(siteId); + xfData.setDeviceId(deviceId); + emsXfDataMapper.insertEmsXfData(xfData); + + redisCache.setCacheObject(RedisKeyConstants.XF + siteId + "_" + deviceId, xfData); + // 状态枚举还没有提供 + EmsDevicesSetting emsDevicesSetting = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); + emsDevicesSetting.setCommunicationStatus(StringUtils.getString(xfData.getDczt())); + emsDevicesSetting.setUpdatedAt(DateUtils.getNowDate()); + emsDevicesSettingMapper.updateEmsDevicesSetting(emsDevicesSetting); + } + + private void dhDataProcess(String siteId, String deviceId, String dataJson) { + //动环 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.DH.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理动环数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + //DH + EmsDhData dhData = new EmsDhData(); + + saveDeviceData(pointMatchList, obj, dhData); + + dhData.setCreateBy("system"); + dhData.setCreateTime(DateUtils.getNowDate()); + dhData.setUpdateBy("system"); + dhData.setUpdateTime(DateUtils.getNowDate()); + dhData.setSiteId(siteId); + dhData.setDeviceId(deviceId); + emsDhDataMapper.insertEmsDhData(dhData); + + redisCache.setCacheObject(RedisKeyConstants.DH + siteId + "_" + deviceId, dhData); + + } + + private void batteryStackDataProcess(String siteId, String deviceId, String dataJson) { + + //电池堆 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + // 将原始数据存一下方便后面簇数据使用 + redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_BMSD + siteId + "_" + deviceId, obj); + + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.STACK.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理电池堆数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + //BMS 电池簇 + EmsBatteryStack dataStack = new EmsBatteryStack(); + + // 其他非 BigDecimal 字段 + dataStack.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + dataStack.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + dataStack.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + + saveDeviceData(pointMatchList, obj, dataStack); + + dataStack.setCreateBy("system"); + dataStack.setCreateTime(DateUtils.getNowDate()); + dataStack.setUpdateBy("system"); + dataStack.setUpdateTime(DateUtils.getNowDate()); + dataStack.setSiteId(siteId); + dataStack.setDeviceId(deviceId); + + emsBatteryStackMapper.insertEmsBatteryStack(dataStack); + + redisCache.setCacheObject(RedisKeyConstants.STACK + siteId + "_" + deviceId, dataStack); + + } + + private void batteryGroupDataProcess(String siteId, String deviceId, String jsonData) { + if (!SiteEnum.DDS.getCode().equals(siteId)) { + return; + } + //电池组 + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + Map groupMap = new HashMap<>(); + for (Map.Entry entry : obj.entrySet()) { + String key = entry.getKey(); + // 跳过空键 + if (key == null || key.trim().isEmpty()) { + continue; + } + Matcher matcher = PATTERN.matcher(key); + if (matcher.matches()) { + String groupDeviceId = matcher.group(1); + String property = matcher.group(2); + EmsBatteryGroup dataGroup = groupMap.getOrDefault(groupDeviceId, new EmsBatteryGroup()); + dataGroup.setDeviceId(groupDeviceId); + dataGroup.setSiteId(siteId); + dataGroup.setCreateBy("system"); + dataGroup.setCreateTime(DateUtils.getNowDate()); + dataGroup.setUpdateBy("system"); + dataGroup.setUpdateTime(DateUtils.getNowDate()); + + setPropertyValue(dataGroup, property, entry.getValue()); + groupMap.put(groupDeviceId, dataGroup); + } + } + + // 批量插入数据库 + if (org.apache.commons.collections4.MapUtils.isNotEmpty(groupMap)) { + List batteryGroupList = new ArrayList<>(groupMap.values()); + emsBatteryGroupMapper.batchInsertGroupData(batteryGroupList); + redisCache.setCacheObject(RedisKeyConstants.GROUP + siteId + "_" + deviceId, batteryGroupList); + } + + } + + private void batteryDataProcessFromBmsd(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + if (!SiteEnum.DDS.getCode().equals(siteId)) { + return; + } + //电池组 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + List dataList = new ArrayList<>(); + + // 前一个小时 + LocalDateTime oneHourAgo = LocalDateTime.now().minus(1, ChronoUnit.HOURS); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String oneHourAgoStr = oneHourAgo.format(formatter); + + Map dataMap = new HashMap<>(); + Map dailyMap = new HashMap<>(); + Map minutesMap = new HashMap<>(); + + String clusterId = getClusterDeviceIdByParentDeviceId(siteId, deviceId); + for (Map.Entry entry : obj.entrySet()) { + String key = entry.getKey(); + + if (key.startsWith("DTDC")) { + Matcher matcher = DTDC_PATTERN.matcher(key); + if (matcher.matches()) { + String batteryCellId = matcher.group(1); + String property = matcher.group(2); + + EmsBatteryData data = dataMap.getOrDefault(batteryCellId, new EmsBatteryData()); + if (StringUtils.isNotEmpty(batteryCellId)) { + data.setDataTimestamp(dataUpdateTime); + data.setBatteryPack(deviceId); + data.setBatteryCluster(clusterId); + data.setClusterDeviceId(clusterId); + data.setBatteryCellId(batteryCellId); + data.setSiteId(siteId); + data.setDeviceId(batteryCellId); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + } + // 根据后缀设置对应属性 + setDTDCPropertyValue(data, property, entry.getValue()); + dataMap.put(batteryCellId, data); + + // 每日最新数据:按batteryCellId去重 + EmsBatteryDataDailyLatest daily = dailyMap.getOrDefault(batteryCellId, new EmsBatteryDataDailyLatest()); + BeanUtils.copyProperties(data, daily); + daily.setDateDay(DateUtils.getNowDate()); + dailyMap.put(batteryCellId, daily); + + // 分钟级的表,上报的数据直接存入,数据上限是 1 个小时 + EmsBatteryDataMinutes minutes = minutesMap.getOrDefault(batteryCellId, new EmsBatteryDataMinutes()); + BeanUtils.copyProperties(data, minutes); + minutesMap.put(batteryCellId, minutes); + } + } + } + if (!CollectionUtils.sizeIsEmpty(dataMap)) { + dataList = new ArrayList<>(dataMap.values()); + emsBatteryDataMapper.insertEmsBatteryDataList(new ArrayList<>(dataList)); + + redisCache.deleteList(RedisKeyConstants.BATTERY + siteId + "_" + clusterId); + redisCache.setCacheList(RedisKeyConstants.BATTERY + siteId + "_" + clusterId, dataList); + } + // 批量处理每日最新数据 + List dailyList = new ArrayList<>(dailyMap.values()); + if (!dailyList.isEmpty()) { + dailyList = new ArrayList<>(dailyMap.values()); + emsBatteryDailyLatestServiceImpl.batchProcessBatteryData(dailyList); + } + + // 实时插入每分钟数据 + List minutesList = new ArrayList<>(minutesMap.values()); + if (!minutesList.isEmpty()) { + emsBatteryDataMinutesMapper.insertMinutesBatteryDataList(minutesList); + } + // 清理分钟级表里一小时前数据 + emsBatteryDataMinutesMapper.deleteByTimeBeforeOneHour(oneHourAgoStr); + + // 分片处理时级,天级,月级数据 + if (CollectionUtils.isNotEmpty(dataList)) { + super.processBatch(dataList); + } + } + + private String getClusterDeviceIdByParentDeviceId(String siteId, String deviceId) { + String clusterId = "BMSC01"; + Map> map = redisCache.getCacheObject(RedisKeyConstants.INIT_DEVICE_INFO); + if (map == null || map.isEmpty()) { + map = iEmsDeviceSettingService.initDeviceInfo(); + } + // 不为空,则查找子类的簇id + if (map != null && !map.isEmpty()) { + List list = map.get(siteId); + if (CollectionUtils.isNotEmpty(list)) { + for (EmsDevicesSetting emsDevicesSetting : list) { + if (deviceId.equals(emsDevicesSetting.getParentId())) { + clusterId = emsDevicesSetting.getDeviceId(); + } + } + } + } + return clusterId; + } + + private void setDTDCPropertyValue(EmsBatteryData data, String property, Object value) { + BigDecimal numberValue = null; + if (value instanceof Number) { + numberValue = new BigDecimal(value.toString()); + } + switch (property) { + case "DY": + data.setVoltage(numberValue); + break; + case "WD": + data.setTemperature(numberValue); + break; + case "NZ": + data.setInterResistance(numberValue); + break; + } + } + + //根据属性名设置对应的值 + private static void setPropertyValue(EmsBatteryGroup groupData, String property, Object value) { + BigDecimal numberValue = null; + if (value instanceof Number) { + numberValue = new BigDecimal(value.toString()); + } + + switch (property) { + case "ZT": + if (numberValue != null) { + groupData.setStatus(numberValue.toString()); + } + break; + case "SOC": + groupData.setSoc(numberValue); + break; + case "SOH": + groupData.setSoh(numberValue); + break; + case "DL": + groupData.setCurrent(numberValue); + break; + case "DY": + groupData.setVoltage(numberValue); + break; + case "BDSC": + groupData.setEstimatedBackupDuration(numberValue); + break; + } + } + + private void saveDeviceData(List pointMatchList, Map obj, Object entity) { + Map pointMatchMap = pointMatchList.stream() + .collect(Collectors.toMap( + data -> StringUtils.toCamelCase(data.getMatchField()), + EmsPointMatch::getDataPoint, + (existing, replacement) -> replacement)); + Field[] fields = entity.getClass().getDeclaredFields(); + for (Field field : fields) { + if (pointMatchMap.containsKey(field.getName())) { + field.setAccessible(true); + try { + Object matchValue = obj.get(pointMatchMap.get(field.getName())); + Class fieldType = field.getType(); + if (String.class.equals(fieldType)) { + matchValue = StringUtils.getString(matchValue); + } else if (Long.class.equals(fieldType)) { + matchValue = StringUtils.getLong(matchValue); + } else if (BigDecimal.class.equals(fieldType)) { + matchValue = StringUtils.getBigDecimal(matchValue); + } else if (Integer.class.equals(fieldType)) { + matchValue = MapUtils.getInteger(obj, pointMatchMap.get(field.getName())); + } + field.set(entity, matchValue); + } catch (IllegalAccessException e) { + log.warn("deviceDataProcess 设置字段值时出错", e); + } + } + } + } + + private void batteryClusterDataProcess(String siteId, String deviceId, String dataJson) { + + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.CLUSTER.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理电池簇数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + String stackDeviceId = getStackDeviceId(deviceId); + //BMS 电池簇 + EmsBatteryCluster data = new EmsBatteryCluster(); + + saveDeviceData(pointMatchList, obj, data); + + data.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + data.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + data.setSiteId(siteId); + data.setDeviceId(deviceId); + if (StringUtils.isNotBlank(stackDeviceId)) { + data.setStackDeviceId(stackDeviceId); + } else { + data.setStackDeviceId("1"); + } + emsBatteryClusterMapper.insertEmsBatteryCluster(data); + + redisCache.setCacheObject(RedisKeyConstants.CLUSTER + siteId + "_" + deviceId, data); + + } + + private String getStackDeviceId(String deviceId) { + EmsDevicesSetting joken = new EmsDevicesSetting(); + joken.setDeviceId(deviceId); + List up = emsDevicesSettingMapper.selectEmsDevicesSettingList(joken); + String stackDeviceId = ""; + if (CollectionUtils.isNotEmpty(up)) { + stackDeviceId = up.get(0).getParentId(); + if (StringUtils.isNotEmpty(stackDeviceId)) { + stackDeviceId = "1"; + } + } + + return stackDeviceId; + } + + private void batteryDataProcessFromBmsc(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + + //单体电池 + Map> records = processData(JSON.parseObject(dataJson, new TypeReference>() { + })); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.BATTERY.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理单体电池数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + List list = new ArrayList<>(); + List dailyList = new ArrayList<>(); + List minutesList = new ArrayList<>(); + // 前一个小时 + LocalDateTime oneHourAgo = LocalDateTime.now().minus(1, ChronoUnit.HOURS); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String oneHourAgoStr = oneHourAgo.format(formatter); + //单体电池 + for (Map.Entry> record : records.entrySet()) { + String recordId = record.getKey(); + Map fields = record.getValue(); + + EmsBatteryData batteryData = new EmsBatteryData(); + batteryData.setDeviceId(recordId); + batteryData.setBatteryCellId(recordId); + + saveDeviceData(pointMatchList, fields, batteryData); + + batteryData.setBatteryCluster(deviceId); + batteryData.setBatteryPack(getStackDeviceId(deviceId)); + + // 时间戳 + batteryData.setDataTimestamp(dataUpdateTime); + // 系统管理字段 + batteryData.setCreateBy("system"); + batteryData.setCreateTime(DateUtils.getNowDate()); + batteryData.setUpdateBy("system"); + batteryData.setUpdateTime(DateUtils.getNowDate()); + // ID字段 + batteryData.setSiteId(siteId); + batteryData.setClusterDeviceId(deviceId); + list.add(batteryData); + + // 每日最新数据 + EmsBatteryDataDailyLatest daily = new EmsBatteryDataDailyLatest(); + BeanUtils.copyProperties(batteryData, daily); + daily.setDateDay(DateUtils.getNowDate()); + dailyList.add(daily); + + // 分钟级的表,上报的数据直接存入,数据上限是 1 个小时 + EmsBatteryDataMinutes minutes = new EmsBatteryDataMinutes(); + BeanUtils.copyProperties(batteryData, minutes); + minutesList.add(minutes); + } + + if (CollectionUtils.isNotEmpty(list)) { + emsBatteryDataMapper.insertEmsBatteryDataList(list); + + redisCache.deleteList(RedisKeyConstants.BATTERY + siteId + "_" + deviceId); + redisCache.setCacheList(RedisKeyConstants.BATTERY + siteId + "_" + deviceId, list); + + } + + // 批量处理每日最新数据 + if (CollectionUtils.isNotEmpty(dailyList)) { + emsBatteryDailyLatestServiceImpl.batchProcessBatteryData(dailyList); + } + // 实时插入每分钟数据 + if (CollectionUtils.isNotEmpty(minutesList)) { + emsBatteryDataMinutesMapper.insertMinutesBatteryDataList(minutesList); + } + // 清理分钟级表里一小时前数据 + emsBatteryDataMinutesMapper.deleteByTimeBeforeOneHour(oneHourAgoStr); + + // 分片处理时级,天级,月级数据 + if (CollectionUtils.isNotEmpty(list)) { + super.processBatch(list); + } + } + + private void pcsDataProcess(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.PCS.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理PCS数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + //pcs + EmsPcsData pcsData = new EmsPcsData(); + + saveDeviceData(pointMatchList, obj, pcsData); + + // 状态指示类 + pcsData.setBranchStatus(BranchStatus.NORMAL.getCode()); + pcsData.setDischargeStatus(ChargeStatus.CHARGING.getCode()); + pcsData.setAcSwitchStatus(SwitchStatus.CLOSED.getCode()); + pcsData.setDcSwitchStatus(SwitchStatus.CLOSED.getCode()); + pcsData.setRemoteControlStatus(ControlModeStatus.REMOTE.getCode()); + + // 时间与状态类字段 + pcsData.setDataUpdateTime(dataUpdateTime); + pcsData.setWorkStatus(WorkStatus.NORMAL.getCode()); + pcsData.setGridStatus(GridStatus.GRID.getCode()); + pcsData.setDeviceStatus(DeviceRunningStatus.RUNNING.getCode()); + pcsData.setControlMode(ControlModeStatus.REMOTE.getCode()); + + // 系统管理字段 + pcsData.setCreateBy("system"); + pcsData.setCreateTime(DateUtils.getNowDate()); + pcsData.setUpdateBy("system"); + pcsData.setUpdateTime(DateUtils.getNowDate()); + pcsData.setSiteId(siteId); + pcsData.setDeviceId(deviceId); + pcsData.setDateMonth(DateUtils.getNowMonthLong()); + pcsData.setDateDay(DateUtils.getNowDayLong()); + + emsPcsDataMapper.insertEmsPcsData(pcsData); + redisCache.setCacheObject(RedisKeyConstants.PCS + siteId + "_" + deviceId, pcsData); + + if (SiteEnum.FX.getCode().equals(siteId)) { + //更新每日充放电数据 + dealFXXDailyChargeDate(siteId, deviceId, pcsData); + } + } + + private void pcsBranchDataProcess(String siteId, String deviceId, String dataJson) { + + Map> records = processDataPrefix(JSON.parseObject(dataJson, new TypeReference>() { + })); + List list = new ArrayList<>(); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.BRANCH.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理PCS支路数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + //PCS支路 + for (Map.Entry> record : records.entrySet()) { + String recordId = record.getKey(); + Map fields = record.getValue(); + + EmsPcsBranchData data = new EmsPcsBranchData(); + data.setDeviceId(deviceId); + data.setSiteId(siteId); + data.setGridStatus(GridStatus.GRID.getCode()); + + saveDeviceData(pointMatchList, fields, data); + + data.setBranchId(recordId); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + list.add(data); + } + if (CollectionUtils.isNotEmpty(list)) { + emsPcsBranchDataMapper.insertPcsBranchDataList(list); + + redisCache.setCacheObject(RedisKeyConstants.BRANCH + siteId + "_" + deviceId, list); + + } + + } + + private void loadDataProcess(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + + //总表 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.AMMETER.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理LOAD总表数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + EmsAmmeterData dataLoad = new EmsAmmeterData(); + // 更新时间 + dataLoad.setDataUpdateTime(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, dataLoad); + + dataLoad.setCreateBy("system"); + dataLoad.setCreateTime(DateUtils.getNowDate()); + dataLoad.setUpdateBy("system"); + dataLoad.setUpdateTime(DateUtils.getNowDate()); + dataLoad.setSiteId(siteId); + dataLoad.setDeviceId(deviceId); + + emsAmmeterDataMapper.insertEmsAmmeterData(dataLoad); + + redisCache.setCacheObject(RedisKeyConstants.AMMETER + siteId + "_" + deviceId, dataLoad); + + } + + private void batteryClusterDataProcess(String siteId, String dataJson) { + if (!SiteEnum.DDS.getCode().equals(siteId)) { + return; + } + + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + List deviceIds = Arrays.asList("BMSC02", "BMSC01"); + for (String deviceId : deviceIds) { + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.CLUSTER.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理LOAD总表数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + //BMSC 电池簇 + EmsBatteryCluster data = new EmsBatteryCluster(); + // 其他非 BigDecimal 字段 + data.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + data.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + data.setCreateBy("system"); + data.setCreateTime(DateUtils.getNowDate()); + data.setUpdateBy("system"); + data.setUpdateTime(DateUtils.getNowDate()); + data.setSiteId(siteId); + String stackDeviceId = getDeviceParent(siteId, deviceId); + if (StringUtils.isNotBlank(stackDeviceId)) { + data.setStackDeviceId(stackDeviceId); + } else { + data.setStackDeviceId("1"); + } + // 获取redis获取最新的BMSD数据 + Map stackObj = redisCache.getCacheObject(RedisKeyConstants.ORIGINAL_BMSD + siteId + "_" + stackDeviceId); + data.setDeviceId(deviceId); + saveDeviceData(pointMatchList, obj, data); + + // 取堆里面数据 + saveDeviceData(pointMatchList, stackObj, data); + + emsBatteryClusterMapper.insertEmsBatteryCluster(data); + redisCache.setCacheObject(RedisKeyConstants.CLUSTER + siteId + "_" + deviceId, data); + + } + + } + + private String getDeviceParent(String siteId, String deviceId) { + Map> map = redisCache.getCacheObject(RedisKeyConstants.INIT_DEVICE_INFO); + if (map == null || map.isEmpty()) { + map = iEmsDeviceSettingService.initDeviceInfo(); + } + // 不为空,则查找父类 + String stackDeviceId = "1"; + if (map != null && !map.isEmpty()) { + List list = map.get(siteId); + if (list == null || list.isEmpty()) { + EmsDevicesSetting deviceInfo = new EmsDevicesSetting(); + deviceInfo.setDeviceId(deviceId); + deviceInfo.setSiteId(siteId); + list = emsDevicesSettingMapper.selectEmsDevicesSettingList(deviceInfo); + if (list == null || list.isEmpty()) { + return stackDeviceId; + } + } + for (EmsDevicesSetting emsDevicesSetting : list) { + if (deviceId.equals(emsDevicesSetting.getDeviceId())) { + stackDeviceId = emsDevicesSetting.getParentId(); + } + } + } + return stackDeviceId; + } + + private void dealFXXDailyChargeDate(String siteId, String deviceId, EmsPcsData pcsData) { + log.info("start dealFXXDailyChargeDate"); + //日充放电数据 + if (pcsData == null) { + log.info("日充放电数据为空, deviceId: " + deviceId); + return; + } + + // 初始化当日数据 + EmsDailyChargeData emsDailyChargeData = new EmsDailyChargeData(); + emsDailyChargeData.setSiteId(siteId); + emsDailyChargeData.setDeviceId(deviceId); + emsDailyChargeData.setDateTime(DateUtils.getNowDate()); + emsDailyChargeData.setTotalChargeData(pcsData.getTotalAcChargeEnergy()); + emsDailyChargeData.setTotalDischargeData(pcsData.getTotalAcDischargeEnergy()); + emsDailyChargeData.setChargeData(pcsData.getDailyAcChargeEnergy()); + emsDailyChargeData.setDischargeData(pcsData.getDailyAcDischargeEnergy()); + emsDailyChargeData.setCreateBy("system"); + emsDailyChargeData.setCreateTime(DateUtils.getNowDate()); + emsDailyChargeData.setUpdateBy("system"); + emsDailyChargeData.setUpdateTime(DateUtils.getNowDate()); + // 插入或更新每日充放电数据表 + emsDailyChargeDataMapper.insertOrUpdateData(emsDailyChargeData); + log.info("end dealFXXDailyChargeDate"); + } + + private void meteDataProcess(String siteId, String deviceId, String dataJson, Date dataUpdateTime) { + + //总表 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.AMMETER.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理METE储能电表数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + // 获取上次数据,便于后面计算差值均无则默认0 + EmsAmmeterData lastAmmeterData = getLastAmmeterData(siteId, deviceId); + + EmsAmmeterData dataMete = new EmsAmmeterData(); + // 更新时间 + dataMete.setDataUpdateTime(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, dataMete); + + dataMete.setCreateBy("system"); + dataMete.setCreateTime(DateUtils.getNowDate()); + dataMete.setUpdateBy("system"); + dataMete.setUpdateTime(DateUtils.getNowDate()); + dataMete.setSiteId(siteId); + dataMete.setDeviceId(deviceId); + + emsAmmeterDataMapper.insertEmsAmmeterData(dataMete); + + redisCache.setCacheObject(RedisKeyConstants.AMMETER + siteId + "_" + deviceId, dataMete); + + // 处理电表每日充放电数据 + if (!deviceId.contains(SiteDevice.METEGF.name()) && !deviceId.contains(SiteDevice.METE0.name())) { + if (SiteEnum.FX.getCode().equals(siteId)) { + dealAmmeterDailyDate(siteId, obj, dataUpdateTime, lastAmmeterData); + } else if (SiteEnum.DDS.getCode().equals(siteId)) { + dealDDSDailyChargeDate(siteId, obj, deviceId); + } + } + } + + private EmsAmmeterData getLastAmmeterData(String siteId, String deviceId) { + // 先从redis取,取不到查数据 + EmsAmmeterData lastData = redisCache.getCacheObject(RedisKeyConstants.AMMETER + siteId + "_" + deviceId); + if (lastData == null) { + lastData = emsAmmeterDataMapper.getLastData(siteId, deviceId); + if (lastData == null) { + lastData = new EmsAmmeterData(); + lastData.setSiteId(siteId); + lastData.setDeviceId(deviceId); + lastData.setCurrentForwardActiveTotal(BigDecimal.ZERO); + lastData.setCurrentReverseActiveTotal(BigDecimal.ZERO); + } + } + return lastData; + } + + private void dealDDSDailyChargeDate(String siteId, Map obj, String deviceId) { + // 初始化今日充放电 + BigDecimal dailyDisChargeDate = new BigDecimal(0); + BigDecimal dailyChargeDate = new BigDecimal(0); + + BigDecimal nowTotalDisChargeDate = StringUtils.getBigDecimal(obj.get("DQFXZYGDN")); + BigDecimal nowTotalChargeDate = StringUtils.getBigDecimal(obj.get("DQZXZYGDN")); + // 初始化当日数据-总的 + EmsDailyChargeData emsDailyChargeData = initDailyChargeData(siteId, deviceId, nowTotalChargeDate, nowTotalDisChargeDate); + // 获取redis存放昨日最晚数据 + String yestDate = DateUtils.getYesterdayDate(); + String yestDateRedisKey = RedisKeyConstants.AMMETER + siteId + "_" + deviceId + "_" + yestDate; + EmsAmmeterData yestData = redisCache.getCacheObject(yestDateRedisKey); + if (yestData == null) { + // redis没有这查电表总数据表取截止到昨日最新第一条数据 + yestData = emsAmmeterDataMapper.getYestLatestDate(siteId, deviceId, yestDate); + // 数据存redis-有效期1天 + redisCache.setCacheObject(yestDateRedisKey, yestData, Constants.DATE_VALID_TIME, TimeUnit.DAYS); + } + if (yestData != null) { + // 今日总数据-昨日总数据=今日充放电 + BigDecimal yestTotalDisChargeDate = yestData.getCurrentReverseActiveTotal(); + BigDecimal yestTotalChargeDate = yestData.getCurrentForwardActiveTotal(); + + dailyChargeDate = nowTotalChargeDate.subtract(yestTotalChargeDate); + dailyDisChargeDate = nowTotalDisChargeDate.subtract(yestTotalDisChargeDate); + emsDailyChargeData.setChargeData(dailyChargeDate); + emsDailyChargeData.setDischargeData(dailyDisChargeDate); + } + + // 插入或更新每日充放电数据表 + emsDailyChargeDataMapper.insertOrUpdateData(emsDailyChargeData); + + // 初始化数据-尖峰平谷 + EmsDailyEnergyData energyData = initEnergyData(siteId); + // 计算尖峰平谷差值,更新表 + calcEnergyDiffAndRevenue(siteId, energyData, obj, yestData); + energyData.setCalcTime(DateUtils.getNowDate()); + // 插入或更新电表每日差值数据表 + emsDailyEnergyDataMapper.insertOrUpdateData(energyData); + } + + private EmsDailyChargeData initDailyChargeData(String siteId, String deviceId, BigDecimal nowTotalChargeDate, + BigDecimal nowTotalDisChargeDate) { + EmsDailyChargeData emsDailyChargeData = new EmsDailyChargeData(); + emsDailyChargeData.setSiteId(siteId); + emsDailyChargeData.setDeviceId(deviceId); + emsDailyChargeData.setDateTime(DateUtils.getNowDate()); + emsDailyChargeData.setTotalChargeData(nowTotalChargeDate); + emsDailyChargeData.setTotalDischargeData(nowTotalDisChargeDate); + emsDailyChargeData.setCreateBy("system"); + emsDailyChargeData.setCreateTime(DateUtils.getNowDate()); + emsDailyChargeData.setUpdateBy("system"); + emsDailyChargeData.setUpdateTime(DateUtils.getNowDate()); + return emsDailyChargeData; + } + + private void calcEnergyDiffAndRevenue(String siteId, EmsDailyEnergyData energyData, Map obj, EmsAmmeterData yestData) { + + // 获取当月电价 + String key = RedisKeyConstants.ENERGY_PRICE_TIME + siteId + "_" + LocalDate.now().getYear() + LocalDate.now().getMonthValue(); + EnergyPriceVo priceVo = redisCache.getCacheObject(key); + + // 计算尖峰平谷差值 + // 正反向-尖 + BigDecimal peakChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGJDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActivePeak()); + energyData.setPeakChargeDiff(peakChargeDiff); + BigDecimal peakDischargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGJDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActivePeak()); + energyData.setPeakDischargeDiff(peakDischargeDiff); + // 正反向-峰 + BigDecimal highChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGFDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveHigh()); + energyData.setHighChargeDiff(highChargeDiff); + BigDecimal highDischargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGFDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveHigh()); + energyData.setHighDischargeDiff(highDischargeDiff); + // 正反向-平 + BigDecimal flatChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGPDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveFlat()); + energyData.setFlatChargeDiff(flatChargeDiff); + BigDecimal flatDisChargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGPDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveFlat()); + energyData.setFlatDischargeDiff(flatDisChargeDiff); + // 正反向-谷 + BigDecimal valleyChargeDiff = StringUtils.getBigDecimal(obj.get("DQZXYGGDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentForwardActiveValley()); + energyData.setValleyChargeDiff(valleyChargeDiff); + BigDecimal valleyDisChargeDiff = StringUtils.getBigDecimal(obj.get("DQFXYGGDN")) + .subtract(yestData == null ? new BigDecimal(0) : yestData.getCurrentReverseActiveValley()); + energyData.setValleyDischargeDiff(valleyDisChargeDiff); + + + BigDecimal totalRevenue = getYestLastData(siteId); + BigDecimal dayRevenue = BigDecimal.ZERO; + BigDecimal price = BigDecimal.ZERO; + // 计算当日收益,尖峰平谷收益累加,(放电量-充电量)*电价 + if (priceVo != null) { + price = priceVo.getPeak() == null ? BigDecimal.ZERO : priceVo.getPeak(); + BigDecimal peakRevenue = peakDischargeDiff.subtract(peakChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(peakRevenue); + price = priceVo.getHigh() == null ? BigDecimal.ZERO : priceVo.getHigh(); + BigDecimal highRevenue = highDischargeDiff.subtract(highChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(highRevenue); + price = priceVo.getFlat() == null ? BigDecimal.ZERO : priceVo.getFlat(); + BigDecimal flatRevenue = flatDisChargeDiff.subtract(flatChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(flatRevenue); + price = priceVo.getValley() == null ? BigDecimal.ZERO : priceVo.getValley(); + BigDecimal valleyRevenue = valleyDisChargeDiff.subtract(valleyChargeDiff).multiply(price); + dayRevenue = dayRevenue.add(valleyRevenue); + energyData.setDayRevenue(dayRevenue); + } + // 总收益 = 昨日总收益+今日实时收益 + totalRevenue = totalRevenue.add(dayRevenue); + energyData.setTotalRevenue(totalRevenue); + } + + private BigDecimal getYestLastData(String siteId) { + // dds存的是累计到昨日总收益 + String yestDate = DateUtils.getYesterdayDayString(); + String redisKey = RedisKeyConstants.DDS_TOTAL_REVENUE + siteId + "_" + yestDate; + BigDecimal yestLastTotalRevenue = redisCache.getCacheObject(redisKey); + if (yestLastTotalRevenue == null) { + yestLastTotalRevenue = emsDailyEnergyDataMapper.getLastTotalRevenue(siteId); + if (yestLastTotalRevenue == null) { + yestLastTotalRevenue = BigDecimal.ZERO; + } + redisCache.setCacheObject(redisKey, yestLastTotalRevenue, 1, TimeUnit.DAYS); + } + return yestLastTotalRevenue; + } + + private void dealAmmeterDailyDate(String siteId, Map obj, Date dataUpdateTime, EmsAmmeterData lastData) { + // 先获取当月电价配置,redis没有这查数据库,都没有则返回 + String priceKey = RedisKeyConstants.ENERGY_PRICE_TIME + siteId + "_" + LocalDate.now().getYear() + LocalDate.now().getMonthValue(); + EnergyPriceVo priceVo = redisCache.getCacheObject(priceKey); + if (priceVo == null) { + priceVo = emsEnergyPriceConfigService.getCurrentMonthPrice(siteId); + redisCache.setCacheObject(priceKey, priceVo, 31, TimeUnit.DAYS); + if (priceVo == null) { + return; + } + } + List timeRanges = priceVo.getRange(); + if (timeRanges == null) { + return; + } + + // 根据时间范围判断数据类型(尖峰平谷),无法确定数据类型则不处理 + String costType = ""; + String startTime = ""; + for (EnergyPriceTimeRange timeRange : timeRanges) { + startTime = timeRange.getStartTime(); + if (isInPriceTimeRange(startTime, timeRange.getEndTime(), dataUpdateTime)) { + costType = timeRange.getCostType(); + break; + } + } + if (StringUtils.isEmpty(costType)) { + return; + } + + //初始化电表每日差值对象 + EmsDailyEnergyData energyData = initEnergyData(siteId); + + // 根据 costType,计算本次与上次数据差值,累加到对应的数据类型里面 + setDiffByCostType(siteId, costType, energyData, lastData, obj, priceVo); + + // 插入或更新电表每日差值数据表 + emsDailyEnergyDataMapper.insertOrUpdateData(energyData); + } + + private void setDiffByCostType(String siteId, String costType, EmsDailyEnergyData energyData, EmsAmmeterData lastData, + Map obj, EnergyPriceVo priceVo) { + BigDecimal currentChargeData = StringUtils.getBigDecimal(obj.get("ZXYGDN")); + BigDecimal currentDischargeData = StringUtils.getBigDecimal(obj.get("FXYGDN")); + currentChargeData = currentChargeData != null ? currentChargeData : BigDecimal.ZERO; + currentDischargeData = currentDischargeData != null ? currentDischargeData : BigDecimal.ZERO; + + // 获取上次实时总收益+当日实时总收益,初始化电价 + Map revenueMap = getRealTimeData(siteId); + BigDecimal totalRevenue = revenueMap.get("totalRevenue") == null ? BigDecimal.ZERO : revenueMap.get("totalRevenue"); + BigDecimal dayRevenue = revenueMap.get("dayRevenue") == null ? BigDecimal.ZERO : revenueMap.get("dayRevenue"); + BigDecimal price = BigDecimal.ZERO; + // 计算时段差值,按照数据类型累加 + // 计算当日累加收益,尖峰平谷收益在当日原基础累加,(放电量-充电量)*电价 + BigDecimal chargeDiffData = currentChargeData.subtract( + lastData.getCurrentForwardActiveTotal() == null ? BigDecimal.ZERO : lastData.getCurrentForwardActiveTotal()); + BigDecimal disChargeDiffData = currentDischargeData.subtract( + lastData.getCurrentReverseActiveTotal() == null ? BigDecimal.ZERO : lastData.getCurrentReverseActiveTotal() + ); + switch (costType) { + case "peak": + // 增加电量 + BigDecimal peakCharge = energyData.getPeakChargeDiff() == null ? BigDecimal.ZERO : energyData.getPeakChargeDiff(); + energyData.setPeakChargeDiff(peakCharge.add(chargeDiffData)); + BigDecimal peakDischarge = energyData.getPeakDischargeDiff() == null ? BigDecimal.ZERO : energyData.getPeakDischargeDiff(); + energyData.setPeakDischargeDiff(peakDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getPeak() == null ? BigDecimal.ZERO : priceVo.getPeak(); + break; + case "high": + // 增加电量 + BigDecimal highCharge = energyData.getHighChargeDiff() == null ? BigDecimal.ZERO : energyData.getHighChargeDiff(); + energyData.setHighChargeDiff(highCharge.add(chargeDiffData)); + BigDecimal highDischarge = energyData.getHighDischargeDiff() == null ? BigDecimal.ZERO : energyData.getHighDischargeDiff(); + energyData.setHighDischargeDiff(highDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getHigh() == null ? BigDecimal.ZERO : priceVo.getHigh(); + break; + case "flat": + // 增加电量 + BigDecimal flatCharge = energyData.getFlatChargeDiff() == null ? BigDecimal.ZERO : energyData.getFlatChargeDiff(); + energyData.setFlatChargeDiff(flatCharge.add(chargeDiffData)); + BigDecimal flatDischarge = energyData.getFlatDischargeDiff() == null ? BigDecimal.ZERO : energyData.getFlatDischargeDiff(); + energyData.setFlatDischargeDiff(flatDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getFlat() == null ? BigDecimal.ZERO : priceVo.getFlat(); + break; + case "valley": + // 增加电量 + BigDecimal valleyCharge = energyData.getValleyChargeDiff() == null ? BigDecimal.ZERO : energyData.getValleyChargeDiff(); + energyData.setValleyChargeDiff(valleyCharge.add(chargeDiffData)); + BigDecimal valleyDischarge = energyData.getValleyDischargeDiff() == null ? BigDecimal.ZERO : energyData.getValleyDischargeDiff(); + energyData.setValleyDischargeDiff(valleyDischarge.add(disChargeDiffData)); + + // 电价 + price = priceVo.getValley() == null ? BigDecimal.ZERO : priceVo.getValley(); + break; + default: + return; + } + + // 计算本次累加收益 + BigDecimal addRevenue = disChargeDiffData.subtract(chargeDiffData).multiply(price); + dayRevenue = dayRevenue.add(addRevenue); + energyData.setDayRevenue(dayRevenue); + // 总收益 = 上次实时总收益+今日实时增加的收益 + totalRevenue = totalRevenue.add(addRevenue); + energyData.setTotalRevenue(totalRevenue); + + // 存redis便于下次取用 + String today = DateUtils.getDate(); + String redisKey = RedisKeyConstants.FXX_REALTIME_REVENUE + siteId + "_" + today; + Map realTimeRevenue = new HashMap<>(); + realTimeRevenue.put("totalRevenue", totalRevenue); + realTimeRevenue.put("dayRevenue", dayRevenue); + redisCache.setCacheObject(redisKey, realTimeRevenue, 1, TimeUnit.DAYS); + } + + private Map getRealTimeData(String siteId) { + // fx取实时总收益和当天实时收益 + String today = DateUtils.getDate(); + String redisKey = RedisKeyConstants.FXX_REALTIME_REVENUE + siteId + "_" + today; + Map realTimeRevenue = redisCache.getCacheObject(redisKey); + if (realTimeRevenue == null) { + // 查数据库 + realTimeRevenue = iEmsEnergyPriceConfigService.getDayRevenueMap(siteId); + if (realTimeRevenue == null) { + realTimeRevenue = new HashMap<>(); + realTimeRevenue.put("totalRevenue", BigDecimal.ZERO); + realTimeRevenue.put("dayRevenue", BigDecimal.ZERO); + } + redisCache.setCacheObject(redisKey, realTimeRevenue, 1, TimeUnit.DAYS); + } + return realTimeRevenue; + } + + private boolean isInPriceTimeRange(String startTime, String endTime, Date dataUpdateTime) { + if (startTime == null || endTime == null || dataUpdateTime == null) { + return false; + } + LocalDateTime time = DateUtils.toLocalDateTime(dataUpdateTime); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); + String dataTimeStr = time.format(formatter); + // 比较时间范围 + return dataTimeStr.compareTo(startTime) >= 0 + && dataTimeStr.compareTo(endTime) < 0; + } + + private EmsDailyEnergyData initEnergyData(String siteId) { + // 先获取数据库当天数据,存在则更新时间,不存在则初始化 + EmsDailyEnergyData energyData = emsDailyEnergyDataMapper.getDataByDate(siteId, DateUtils.getDate()); + if (energyData == null) { + energyData = new EmsDailyEnergyData(); + energyData.setSiteId(siteId); + energyData.setDataDate(DateUtils.getNowDate()); + energyData.setCreateBy("system"); + energyData.setCreateTime(DateUtils.getNowDate()); + } + energyData.setUpdateBy("system"); + energyData.setCalcTime(DateUtils.getNowDate()); + return energyData; + } + + // 数据分组处理 + private static Map> processData(Map rawData) { + Map> records = new HashMap<>(); + + for (Map.Entry entry : rawData.entrySet()) { + String key = entry.getKey(); + // 提取记录ID(最后3位) + String recordId = key.substring(key.length() - 3); + try { + Long.parseLong(recordId); + } catch (Exception e) { + continue; + } + + // 提取字段类型(前缀) + String fieldType = key.substring(0, key.length() - 3); + + // 初始化记录 + records.putIfAbsent(recordId, new HashMap<>()); + // 存入字段值 + records.get(recordId).put(fieldType, entry.getValue()); + } + return records; + } + + private static Map> processDataPrefix(Map rawData) { + Map> records = new HashMap<>(); + + for (Map.Entry entry : rawData.entrySet()) { + String key = entry.getKey(); + // 确保键长度足够 + if (key.length() < 3) { + continue; + } + + // 提取记录ID(前3位) + String recordId = key.substring(0, 3); + if (!recordId.startsWith("DY")) { + continue; + } + + // 提取字段类型(剩余部分) + String fieldType = key.substring(3); + + // 初始化记录 + records.putIfAbsent(recordId, new HashMap<>()); + // 存入字段值 + records.get(recordId).put(fieldType, entry.getValue()); + } + if (records.isEmpty() && rawData.size() > 0) { + records.put("DY1", rawData); + } + return records; + } + + @Override + public void handleAlarmData(String message, String siteId) { + JSONArray arraylist = JSONArray.parseArray(message); + + // 获取redis缓存-告警信息 + Map alarmMatchInfo = redisCache.getCacheObject(RedisKeyConstants.ALARM_MATCH_INFO); + + for (int i = 0; i < arraylist.size(); i++) { + JSONObject obj = JSONObject.parseObject(arraylist.get(i).toString()); + + String deviceId = obj.getString("Device"); + String jsonData = obj.getString("Data"); + Long timestamp = obj.getLong("timestamp"); + Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp); + + log.info("deviceId:" + deviceId); + String deviceCategory = ""; + if (deviceId.contains(SiteDevice.ZSLQ.name())) { + coolingAlarmDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.BMSD.name())) { + deviceCategory = DeviceCategory.STACK.getCode(); + stackAlarmDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.BMSC.name())) { + deviceCategory = DeviceCategory.CLUSTER.getCode(); + clusterAlarmDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } else if (deviceId.contains(SiteDevice.PCS.name())) { + deviceCategory = DeviceCategory.PCS.getCode(); + pcsAlarmDataProcess(siteId, deviceId, jsonData, dataUpdateTime); + } + if (StringUtils.isEmpty(deviceCategory)) { + // 处理告警信息 + alarmDataProcess(siteId, deviceId, jsonData, alarmMatchInfo, deviceCategory); + } + } + } + + private void pcsAlarmDataProcess(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + //pcs + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.PCS.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理中水冷却告警数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + EmsPcsAlarmData pcsAlarmData = new EmsPcsAlarmData(); + // 更新时间 + pcsAlarmData.setDataTimestamp(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, pcsAlarmData); + + pcsAlarmData.setCreateBy("system"); + pcsAlarmData.setCreateTime(DateUtils.getNowDate()); + pcsAlarmData.setUpdateBy("system"); + pcsAlarmData.setUpdateTime(DateUtils.getNowDate()); + pcsAlarmData.setSiteId(siteId); + pcsAlarmData.setDeviceId(deviceId); + emsPcsAlarmDataMapper.insertEmsPcsAlarmData(pcsAlarmData); + } + + private void stackAlarmDataProcess(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + // bmsd + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.STACK.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理电池堆告警数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + EmsStackAlarmData stackAlarmData = new EmsStackAlarmData(); + // 更新时间 + stackAlarmData.setDataTimestamp(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, stackAlarmData); + + stackAlarmData.setCreateBy("system"); + stackAlarmData.setCreateTime(DateUtils.getNowDate()); + stackAlarmData.setUpdateBy("system"); + stackAlarmData.setUpdateTime(DateUtils.getNowDate()); + stackAlarmData.setSiteId(siteId); + stackAlarmData.setDeviceId(deviceId); + emsStackAlarmDataMapper.insertEmsStackAlarmData(stackAlarmData); + } + + private void clusterAlarmDataProcess(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + // bmsc + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(siteId, deviceId, DeviceMatchTable.CLUSTER.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理电池簇告警数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + EmsClusterAlarmData clusterAlarmData = new EmsClusterAlarmData(); + // 更新时间 + clusterAlarmData.setDataTimestamp(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, clusterAlarmData); + + clusterAlarmData.setCreateBy("system"); + clusterAlarmData.setCreateTime(DateUtils.getNowDate()); + clusterAlarmData.setUpdateBy("system"); + clusterAlarmData.setUpdateTime(DateUtils.getNowDate()); + clusterAlarmData.setSiteId(siteId); + clusterAlarmData.setDeviceId(deviceId); + emsClusterAlarmDataMapper.insertEmsClusterAlarmData(clusterAlarmData); + } + + private void coolingAlarmDataProcess(String siteId, String deviceId, String jsonData, Date dataUpdateTime) { + //中水冷却 + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + // 点位匹配数据 + List pointMatchList = devicePointMatchDataProcessor.getDeviceAlarmPointMatch(siteId, deviceId, DeviceMatchTable.COOLING.getCode()); + if (CollectionUtils.isEmpty(pointMatchList)) { + log.info("未找到匹配的点位数据,无法处理中水冷却告警数据,siteId: " + siteId + ",deviceId: " + deviceId); + return; + } + + EmsCoolingAlarmData coolingAlarmData = new EmsCoolingAlarmData(); + // 更新时间 + coolingAlarmData.setDataTimestamp(dataUpdateTime); + + saveDeviceData(pointMatchList, obj, coolingAlarmData); + + coolingAlarmData.setCreateBy("system"); + coolingAlarmData.setCreateTime(DateUtils.getNowDate()); + coolingAlarmData.setUpdateBy("system"); + coolingAlarmData.setUpdateTime(DateUtils.getNowDate()); + coolingAlarmData.setSiteId(siteId); + coolingAlarmData.setDeviceId(deviceId); + emsCoolingAlarmDataMapper.insertEmsCoolingAlarmData(coolingAlarmData); + } + + private void alarmDataProcess(String siteId, String deviceId, String jsonData, + Map alarmInfoData, String category) { + Map obj = JSON.parseObject(jsonData, new TypeReference>() { + }); + + String redisKey = RedisKeyConstants.LATEST_ALARM_RECORD + "_" + siteId + "_" + deviceId; + // 获取redis里面的当前有效告警遍历添加到已存在告警key里面 + Map currentAlarm = redisCache.getCacheMap(redisKey); + final Set currentAlarmKeys = new HashSet<>(); + if (currentAlarm != null && !currentAlarm.isEmpty()) { + currentAlarm.keySet().stream() + .filter(Objects::nonNull) + .map(Object::toString) + .forEach(currentAlarmKeys::add); + } + + // 结合同步数据,筛选簇需要更新的告警信息 + List needUpdateKeys = obj.entrySet().stream() + .filter(entry -> { + Object valueObj = entry.getValue(); + if (valueObj == null) { + return false; + } + int value = Integer.parseInt(valueObj.toString()); + return value == 0 && currentAlarmKeys.contains(entry.getKey()); + }) + .map(Map.Entry::getKey) + .collect(Collectors.toList()); + + // 批量查询数据库-需要更新的数据 + Map needUpdateMap = new HashMap<>(); + if (!needUpdateKeys.isEmpty()) { + List records = iEmsAlarmRecordsService.getAllUnfinishedRecords(needUpdateKeys, siteId, deviceId); + // 转为Map便于快速获取 + needUpdateMap = records.stream() + .collect(Collectors.toMap( + EmsAlarmRecords::getAlarmPoint, + record -> record + )); + } + + + List saveOrUpdateList = new ArrayList<>(); + List newAddRecordList = new ArrayList<>(); + List toRemoveFromRedis = new ArrayList<>(); + + // 遍历数据map + for (Map.Entry entry : obj.entrySet()) { + String key = entry.getKey(); + Integer value = (Integer) entry.getValue(); + Boolean isCurrentAlarm = currentAlarmKeys.contains(key); + + // 值为 1且不在当前告警里面 - 新增告警 + if (value == 1 && !isCurrentAlarm) { + String matchRedisKey = category + "_" + key; + Object cacheObj = alarmInfoData.get(matchRedisKey); + if (cacheObj == null) { + // 处理空数据逻辑 + return; + } + EmsAlarmMatchData matchInfo = JSON.toJavaObject(cacheObj, EmsAlarmMatchData.class); + EmsAlarmRecords emsAlarmRecord = convertAlarmRecord(siteId, deviceId, matchInfo); + saveOrUpdateList.add(emsAlarmRecord); + newAddRecordList.add(emsAlarmRecord); + } else if (value == 0 && isCurrentAlarm) {// 值为 0且在当前告警里面 - 更新告警已处理 + EmsAlarmRecords existingAlarm = needUpdateMap.get(key); + if (existingAlarm != null) { + existingAlarm.setStatus(AlarmStatus.DONE.getCode()); + existingAlarm.setUpdateTime(new Date()); + existingAlarm.setAlarmEndTime(new Date()); + saveOrUpdateList.add(existingAlarm); + toRemoveFromRedis.add(key); + } + } + } + + // 批量处理插入和更新操作 + if (CollectionUtils.isNotEmpty(saveOrUpdateList)) { + iEmsAlarmRecordsService.batchProcessAlarmRecords(saveOrUpdateList); + } + // 已处理的从redis里面删除 + if (!toRemoveFromRedis.isEmpty()) { + redisCache.deleteAllCacheMapValue(RedisKeyConstants.LATEST_ALARM_RECORD + siteId, toRemoveFromRedis.toArray()); + } + // 批量添加新增的告警到Redis + Map newAlarms = newAddRecordList.stream() + .filter(a -> !AlarmStatus.DONE.getCode().equals(a.getStatus())) + .collect(Collectors.toMap(EmsAlarmRecords::getAlarmPoint, a -> a)); + if (!newAlarms.isEmpty()) { + // 本次新增的放入redis + redisCache.setAllCacheMapValue(redisKey, newAlarms); + } + } + + private EmsAlarmRecords convertAlarmRecord(String siteId, String deviceId, EmsAlarmMatchData matchInfo) { + EmsAlarmRecords emsAlarmRecords = new EmsAlarmRecords(); + emsAlarmRecords.setSiteId(siteId); + emsAlarmRecords.setDeviceId(deviceId); + emsAlarmRecords.setDeviceType(DeviceType.TCP.toString()); + emsAlarmRecords.setAlarmLevel(AlarmLevelStatus.GENERAL.getCode()); + emsAlarmRecords.setStatus(AlarmStatus.WAITING.getCode()); + emsAlarmRecords.setAlarmStartTime(DateUtils.getNowDate()); + emsAlarmRecords.setCreateTime(DateUtils.getNowDate()); + emsAlarmRecords.setCreateBy("system"); + emsAlarmRecords.setUpdateTime(DateUtils.getNowDate()); + emsAlarmRecords.setUpdateBy("system"); + + if (matchInfo != null) { + emsAlarmRecords.setAlarmPoint(matchInfo.getPoint()); + emsAlarmRecords.setAlarmContent(matchInfo.getAlarmDescription()); + } + return emsAlarmRecords; + } + + @Override + public void processBatch(List batchData) { + super.processBatch(batchData); + } + + // 空数据不处理 + private boolean checkJsonDataEmpty(String jsonData) { + boolean flag = false; + try { + if (StringUtils.isEmpty(jsonData)) { + flag = true; + } + JsonNode jsonNode = objectMapper.readTree(jsonData); + // 判断是否为空对象({}) + if (jsonNode.isObject() && jsonNode.isEmpty()) { + flag = true; + } + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + return flag; + } +} diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java index f5e1d53..390f8eb 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsDeviceSettingServiceImpl.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson2.TypeReference; import com.xzzn.common.constant.RedisKeyConstants; import com.xzzn.common.core.redis.RedisCache; import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.common.enums.PointType; import com.xzzn.common.enums.SiteEnum; import com.xzzn.common.utils.DateUtils; import com.xzzn.common.utils.StringUtils; @@ -142,15 +143,16 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService String parentDeviceId = request.getParentId(); String ipAddress = request.getIpAddress(); Integer ipPort = request.getIpPort(); + Integer isAlarm = request.getIsAlarm() == null ? PointType.YES.getCode() : request.getIsAlarm(); // 电动所的电池簇特殊处理-来源pcs+bmsd if (siteId.equals(DDS_SITE_ID) && DeviceCategory.CLUSTER.getCode().equals(deviceCategory)) { - response = specialDealWithDDSCluster(siteId,deviceId,deviceCategory,dataPointName,dataPoint,ipAddress,ipPort); + response = specialDealWithDDSCluster(siteId,deviceId,deviceCategory,dataPointName,dataPoint,ipAddress,ipPort,isAlarm); } else if (DeviceCategory.BATTERY.getCode().equals(deviceCategory)) { response = specialDealWithBattery(siteId,deviceId,deviceCategory, - dataPointName,dataPoint,parentDeviceId,ipAddress,ipPort); + dataPointName,dataPoint,parentDeviceId,ipAddress,ipPort,isAlarm); } else { response = emsPointMatchMapper.getSingleSiteDevicePoints( - siteId,deviceCategory,dataPointName,dataPoint,ipAddress,ipPort); + siteId,deviceCategory,dataPointName,dataPoint,ipAddress,ipPort,isAlarm); // 从redis取最新数据 JSONObject mqttJson = redisCache.getCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId); if(mqttJson == null){ @@ -235,9 +237,10 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService } private List specialDealWithBattery(String siteId, String deviceId, String deviceCategory, - String dataPointName, String dataPoint, String parentDeviceId, String ipAddress, Integer ipPort) { + String dataPointName, String dataPoint, String parentDeviceId, + String ipAddress, Integer ipPort, Integer isAlarm) { List response = emsPointMatchMapper.getSingleSiteDevicePoints(siteId,deviceCategory, - dataPointName,dataPoint,ipAddress,ipPort); + dataPointName,dataPoint,ipAddress,ipPort,isAlarm); // 获取redis同步最新数据 JSONObject jsonObject = new JSONObject(); @@ -316,12 +319,13 @@ public class EmsDeviceSettingServiceImpl implements IEmsDeviceSettingService // 对于dds的电池簇点位最新数据获取特殊处理 private List specialDealWithDDSCluster(String siteId, String deviceId, String deviceCategory, - String dataPointName, String dataPoint, String ipAddress, Integer ipPort) { + String dataPointName, String dataPoint, String ipAddress, + Integer ipPort, Integer isAlarm) { // 替换为对应的父类id String bmsdDeviceId = deviceId.replace("BMSC","BMSD"); List response = emsPointMatchMapper - .getClusterDevicePoints(siteId,deviceId,bmsdDeviceId,deviceCategory,dataPointName,dataPoint,ipAddress,ipPort); + .getClusterDevicePoints(siteId,deviceId,bmsdDeviceId,deviceCategory,dataPointName,dataPoint,ipAddress,ipPort,isAlarm); JSONObject mergedData = new JSONObject(); diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java index 2363075..ff625e5 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsPointMatchServiceImpl.java @@ -2,16 +2,22 @@ package com.xzzn.ems.service.impl; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; import com.alibaba.fastjson2.JSON; import com.xzzn.common.constant.RedisKeyConstants; import com.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.PointType; import com.xzzn.common.exception.ServiceException; import com.xzzn.common.utils.StringUtils; import com.xzzn.common.utils.bean.BeanValidators; +import org.apache.commons.compress.utils.Lists; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -140,7 +146,6 @@ public class EmsPointMatchServiceImpl implements IEmsPointMatchService } String siteId = request.getSiteId(); - String deviceId = request.getDeviceId(); String deviceCategory = request.getDeviceCategory(); List errorList = new ArrayList<>(); for (DevicePointMatchVo pointMatch : pointMatchList) { @@ -152,17 +157,22 @@ public class EmsPointMatchServiceImpl implements IEmsPointMatchService EmsPointMatch savePoint = new EmsPointMatch(); BeanUtils.copyProperties(pointMatch, savePoint); savePoint.setSiteId(siteId); - savePoint.setDeviceId(deviceId); savePoint.setDeviceCategory(deviceCategory); - savePoint.setMatchTable(DeviceMatchTable.getMatchTableByCode(deviceCategory)); + if (StringUtils.isNotBlank(pointMatch.getIsAlarm()) && String.valueOf(PointType.YES.getCode()).equals(pointMatch.getIsAlarm())) { + savePoint.setMatchTable(DeviceMatchTable.getAlarmMatchTableByCode(deviceCategory)); + savePoint.setIsAlarm(PointType.YES.getCode()); + } else { + savePoint.setMatchTable(DeviceMatchTable.getMatchTableByCode(deviceCategory)); + } savePoint.setPointName(DevicePointMatchDataProcessor.getFieldAnnotation(DeviceMatchTable.getClassByTable(savePoint.getMatchTable()), StringUtils.toCamelCase(savePoint.getMatchField()))); savePoint.setCreateBy(operName); savePoint.setUpdateBy(operName); // 验证点位是否存在 - EmsPointMatch dbPoint = emsPointMatchMapper.getOnePointMatch(siteId, deviceId, deviceCategory, pointMatch.getDataPoint()); + EmsPointMatch dbPoint = emsPointMatchMapper.getOnePointMatch(siteId, deviceCategory, pointMatch.getDataPoint()); if (Objects.isNull(dbPoint)) { emsPointMatchMapper.insertEmsPointMatch(savePoint); } else { + savePoint.setId(dbPoint.getId()); emsPointMatchMapper.updateEmsPointMatch(savePoint); } } catch (Exception e) { @@ -171,7 +181,7 @@ public class EmsPointMatchServiceImpl implements IEmsPointMatchService } } // 同步到Redis - syncToRedis(siteId, deviceId, deviceCategory); + syncToRedis(siteId, deviceCategory); return errorList; } @@ -197,10 +207,10 @@ public class EmsPointMatchServiceImpl implements IEmsPointMatchService return false; } - private void syncToRedis(String siteId, String deviceId, String deviceCategory) { + private void syncToRedis(String siteId, String deviceCategory) { // 同步到Redis - String pointMatchKey = RedisKeyConstants.POINT_MATCH + deviceCategory + "_" + siteId + "_" + deviceId; - List pointMatchData = emsPointMatchMapper.getDevicePointMatchList(siteId, deviceId, deviceCategory); + String pointMatchKey = DevicePointMatchDataProcessor.getPointMacthCacheKey(siteId, deviceCategory); + List pointMatchData = emsPointMatchMapper.getDevicePointMatchList(siteId, deviceCategory); // log.info("同步点位匹配数据到Redis key:{} data:{}", pointMatchKey, pointMatchData); redisCache.setCacheObject(pointMatchKey, pointMatchData); log.info("点位匹配数据同步完成 data:{}", JSON.toJSONString(redisCache.getCacheObject(pointMatchKey))); diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java index 03dd35d..9c4641b 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsStatsReportServiceImpl.java @@ -3,10 +3,12 @@ package com.xzzn.ems.service.impl; import com.xzzn.common.enums.SiteEnum; import com.xzzn.common.utils.DateUtils; import com.xzzn.ems.domain.EmsAmmeterData; +import com.xzzn.ems.domain.EmsEnergyPriceConfig; import com.xzzn.ems.domain.vo.*; import com.xzzn.ems.mapper.*; import com.xzzn.ems.service.IEmsStatsReportService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -16,6 +18,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -43,6 +46,8 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService private EmsDailyChargeDataMapper emsDailyChargeDataMapper; @Autowired private EmsDailyEnergyDataMapper emsDailyEnergyDataMapper; + @Autowired + private EmsEnergyPriceConfigMapper emsEnergyPriceConfigMapper; // 电量指标 @Override @@ -305,6 +310,40 @@ public class EmsStatsReportServiceImpl implements IEmsStatsReportService return dataList; } + @Override + public List getAmmeterRevenueDataResult(StatisAmmeterDateRequest requestVo) { + //查询电表数据 + List dataList = emsDailyEnergyDataMapper.getDataBySiteId(requestVo.getSiteId(), requestVo.getStartTime(), requestVo.getEndTime()); + if (CollectionUtils.isEmpty(dataList)){ + return null; + } + //查询电价配置 + List priceConfigList = emsEnergyPriceConfigMapper.getConfigListByTimeFrame(requestVo.getSiteId(), requestVo.getStartTime(), requestVo.getEndTime()); + if (CollectionUtils.isEmpty(priceConfigList)){ + return null; + } + Map priceConfigMap = priceConfigList.stream().collect(Collectors.toMap(data -> data.getYear() + "-" + String.format("%02d", Integer.parseInt(data.getMonth())), Function.identity())); + List resultList = new ArrayList<>(); + dataList.forEach(ammeter -> { + EmsEnergyPriceConfig price = priceConfigMap.get(ammeter.getDataTime().substring(0, 7)); + resultList.add(calculateDailyBill(ammeter, price)); + }); + + return resultList; + } + + public static AmmeterRevenueStatisListVo calculateDailyBill(AmmeterStatisListVo ammeter, EmsEnergyPriceConfig price) { + AmmeterRevenueStatisListVo ammeterRevenue = new AmmeterRevenueStatisListVo(); + ammeterRevenue.setDataTime(ammeter.getDataTime()); + if (price != null) { +// BigDecimal activeTotalPrice = ammeter.getActiveTotalKwh().multiply(new BigDecimal(price.getPeak())); +// BigDecimal activePeakPrice = ammeter.getActivePeakKwh().multiply(new BigDecimal(price.getPeak())); +// BigDecimal activeHighPrice = ammeter.getActiveHighKwh().multiply(new BigDecimal(price.getHigh())); +// BigDecimal activeFlatPrice = ammeter.getActiveFlatKwh().multiply(new BigDecimal(price.getFlat())); + } + return ammeterRevenue; + } + private void dealWithAmmeterTotalDate(AmmeterStatisListVo ammeterStatisListVo, AmmeterStatisListVo totalVo) { // 有功 totalVo.setActiveTotalKwh(totalVo.getActiveTotalKwh().add(ammeterStatisListVo.getActiveTotalKwh())); diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java index 5bfdbfa..8f9d2bd 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java @@ -155,19 +155,14 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl }); EmsCoolingData coolingData = new EmsCoolingData(); - // 点位匹配数据 - List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(SITE_ID, deviceId, DeviceMatchTable.COOLING.getCode()); - if (CollectionUtils.isNotEmpty(pointMatchList)) { - saveDeviceData(pointMatchList, obj, coolingData); - } else { - coolingData.setGsTemp(StringUtils.getBigDecimal(obj.get("GSWD"))); - coolingData.setHsTemp(StringUtils.getBigDecimal(obj.get("HSWD"))); - coolingData.setGsPressure(StringUtils.getBigDecimal(obj.get("GSYL"))); - coolingData.setHsPressure(StringUtils.getBigDecimal(obj.get("HSYL"))); - coolingData.setLysTemp(StringUtils.getBigDecimal(obj.get("LYSWD"))); - coolingData.setVb01Kd(StringUtils.getBigDecimal(obj.get("VB1KD"))); - coolingData.setVb02Kd(StringUtils.getBigDecimal(obj.get("VB2KD"))); - } + + coolingData.setGsTemp(StringUtils.getBigDecimal(obj.get("GSWD"))); + coolingData.setHsTemp(StringUtils.getBigDecimal(obj.get("HSWD"))); + coolingData.setGsPressure(StringUtils.getBigDecimal(obj.get("GSYL"))); + coolingData.setHsPressure(StringUtils.getBigDecimal(obj.get("HSYL"))); + coolingData.setLysTemp(StringUtils.getBigDecimal(obj.get("LYSWD"))); + coolingData.setVb01Kd(StringUtils.getBigDecimal(obj.get("VB1KD"))); + coolingData.setVb02Kd(StringUtils.getBigDecimal(obj.get("VB2KD"))); coolingData.setCreateBy("system"); coolingData.setCreateTime(DateUtils.getNowDate()); @@ -180,7 +175,6 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl redisCache.setCacheObject(RedisKeyConstants.COOLING + SITE_ID + "_" +deviceId, coolingData); - saveDevicePointMatchData(pointMatchList, deviceId, DeviceMatchTable.COOLING, "ZSLQ"); } private void dhDataProcess(String deviceId, String dataJson) { @@ -190,14 +184,8 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl //DH EmsDhData dhData = new EmsDhData(); - // 点位匹配数据 - List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(SITE_ID, deviceId, DeviceMatchTable.DH.getCode()); - if (CollectionUtils.isNotEmpty(pointMatchList)) { - saveDeviceData(pointMatchList, obj, dhData); - } else { - dhData.setHumidity(StringUtils.getBigDecimal(obj.get("SD3"))); - dhData.setTemperature(StringUtils.getBigDecimal(obj.get("WD3"))); - } + dhData.setHumidity(StringUtils.getBigDecimal(obj.get("SD3"))); + dhData.setTemperature(StringUtils.getBigDecimal(obj.get("WD3"))); dhData.setCreateBy("system"); dhData.setCreateTime(DateUtils.getNowDate()); @@ -209,7 +197,6 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl redisCache.setCacheObject(RedisKeyConstants.DH + SITE_ID + "_" +deviceId, dhData); - saveDevicePointMatchData(pointMatchList, deviceId, DeviceMatchTable.DH, "donghuan"); } private void batteryStackDataProcess(String deviceId, String dataJson) { @@ -226,66 +213,58 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl dataStack.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); dataStack.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); - // 点位匹配数据 - List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(SITE_ID, deviceId, DeviceMatchTable.STACK.getCode()); - if (CollectionUtils.isNotEmpty(pointMatchList)) { - saveDeviceData(pointMatchList, obj, dataStack); - } else { + // 电池堆状态数据设置 + dataStack.setOperationStatus(StringUtils.getString(obj.get("DCZT"))); + dataStack.setStackVoltage(StringUtils.getBigDecimal(obj.get("DCDDY"))); + dataStack.setStackCurrent(StringUtils.getBigDecimal(obj.get("DCDDL"))); + dataStack.setStackSoc(StringUtils.getBigDecimal(obj.get("DCDSOC"))); + dataStack.setStackSoh(StringUtils.getBigDecimal(obj.get("DCDSOH"))); - // 电池堆状态数据设置 - dataStack.setOperationStatus(StringUtils.getString(obj.get("DCZT"))); - dataStack.setStackVoltage(StringUtils.getBigDecimal(obj.get("DCDDY"))); - dataStack.setStackCurrent(StringUtils.getBigDecimal(obj.get("DCDDL"))); - dataStack.setStackSoc(StringUtils.getBigDecimal(obj.get("DCDSOC"))); - dataStack.setStackSoh(StringUtils.getBigDecimal(obj.get("DCDSOH"))); + // 电压极值信息 + dataStack.setMaxCellVoltage(StringUtils.getBigDecimal(obj.get("ZGDCDY"))); + dataStack.setMaxVoltageGroupId(StringUtils.getLong(obj.get("ZGDCDYZH"))); + dataStack.setMaxVoltageCellId(StringUtils.getLong(obj.get("ZGDCDYZHDH"))); + dataStack.setMinCellVoltage(StringUtils.getBigDecimal(obj.get("ZDDCDY"))); + dataStack.setMinVoltageGroupId(StringUtils.getLong(obj.get("ZDDCDYZH"))); + dataStack.setMinVoltageCellId(StringUtils.getLong(obj.get("ZDDCDYZHDH"))); - // 电压极值信息 - dataStack.setMaxCellVoltage(StringUtils.getBigDecimal(obj.get("ZGDCDY"))); - dataStack.setMaxVoltageGroupId(StringUtils.getLong(obj.get("ZGDCDYZH"))); - dataStack.setMaxVoltageCellId(StringUtils.getLong(obj.get("ZGDCDYZHDH"))); - dataStack.setMinCellVoltage(StringUtils.getBigDecimal(obj.get("ZDDCDY"))); - dataStack.setMinVoltageGroupId(StringUtils.getLong(obj.get("ZDDCDYZH"))); - dataStack.setMinVoltageCellId(StringUtils.getLong(obj.get("ZDDCDYZHDH"))); + // 温度极值信息 + dataStack.setMaxCellTemp(StringUtils.getBigDecimal(obj.get("ZGDCWD"))); + dataStack.setMaxTempGroupId(StringUtils.getLong(obj.get("ZGDCWDZH"))); + dataStack.setMaxTempCellId(StringUtils.getLong(obj.get("ZGDCWDZHDH"))); + dataStack.setMinCellTemp(StringUtils.getBigDecimal(obj.get("ZDDCWD"))); + dataStack.setMinTempGroupId(StringUtils.getLong(obj.get("ZDDCWDZH"))); + dataStack.setMinTempCellId(StringUtils.getLong(obj.get("ZDDCWDZHDH"))); - // 温度极值信息 - dataStack.setMaxCellTemp(StringUtils.getBigDecimal(obj.get("ZGDCWD"))); - dataStack.setMaxTempGroupId(StringUtils.getLong(obj.get("ZGDCWDZH"))); - dataStack.setMaxTempCellId(StringUtils.getLong(obj.get("ZGDCWDZHDH"))); - dataStack.setMinCellTemp(StringUtils.getBigDecimal(obj.get("ZDDCWD"))); - dataStack.setMinTempGroupId(StringUtils.getLong(obj.get("ZDDCWDZH"))); - dataStack.setMinTempCellId(StringUtils.getLong(obj.get("ZDDCWDZHDH"))); + // 电量统计信息 + dataStack.setTotalChargeCapacity(StringUtils.getBigDecimal(obj.get("DLJCDDL"))); + dataStack.setTotalDischargeCapacity(StringUtils.getBigDecimal(obj.get("DLCFDDL"))); + dataStack.setSessionChargeCapacity(StringUtils.getBigDecimal(obj.get("DDCLJCDDL"))); + dataStack.setSessionDischargeCapacity(StringUtils.getBigDecimal(obj.get("DDCLJFDDL"))); + dataStack.setAvailableChargeCapacity(StringUtils.getBigDecimal(obj.get("DKCDL"))); + dataStack.setAvailableDischargeCapacity(StringUtils.getBigDecimal(obj.get("DKFDL"))); - // 电量统计信息 - dataStack.setTotalChargeCapacity(StringUtils.getBigDecimal(obj.get("DLJCDDL"))); - dataStack.setTotalDischargeCapacity(StringUtils.getBigDecimal(obj.get("DLCFDDL"))); - dataStack.setSessionChargeCapacity(StringUtils.getBigDecimal(obj.get("DDCLJCDDL"))); - dataStack.setSessionDischargeCapacity(StringUtils.getBigDecimal(obj.get("DDCLJFDDL"))); - dataStack.setAvailableChargeCapacity(StringUtils.getBigDecimal(obj.get("DKCDL"))); - dataStack.setAvailableDischargeCapacity(StringUtils.getBigDecimal(obj.get("DKFDL"))); + // 时间信息 + dataStack.setRemainingDischargeTime(StringUtils.getLong(obj.get("KYFDSJ"))); + dataStack.setRemainingChargeTime(StringUtils.getLong(obj.get("KYCDSJ"))); - // 时间信息 - dataStack.setRemainingDischargeTime(StringUtils.getLong(obj.get("KYFDSJ"))); - dataStack.setRemainingChargeTime(StringUtils.getLong(obj.get("KYCDSJ"))); + // 功率/电流限制 + dataStack.setMaxDischargePower(StringUtils.getBigDecimal(obj.get("YXZDFDGL"))); + dataStack.setMaxChargePower(StringUtils.getBigDecimal(obj.get("YXZDCDGL"))); + dataStack.setMaxDischargeCurrent(StringUtils.getBigDecimal(obj.get("YXZDFDDL"))); + dataStack.setMaxChargeCurrent(StringUtils.getBigDecimal(obj.get("YXZDCDDL"))); - // 功率/电流限制 - dataStack.setMaxDischargePower(StringUtils.getBigDecimal(obj.get("YXZDFDGL"))); - dataStack.setMaxChargePower(StringUtils.getBigDecimal(obj.get("YXZDCDGL"))); - dataStack.setMaxDischargeCurrent(StringUtils.getBigDecimal(obj.get("YXZDFDDL"))); - dataStack.setMaxChargeCurrent(StringUtils.getBigDecimal(obj.get("YXZDCDDL"))); + // 当日统计 + dataStack.setDailyDischargeCycles(StringUtils.getLong(obj.get("DTFDCS"))); + dataStack.setDailyChargeCycles(StringUtils.getLong(obj.get("DTCDCS"))); + dataStack.setDailyDischargeCapacity(StringUtils.getBigDecimal(obj.get("DTFDDL"))); + dataStack.setDailyChargeCapacity(StringUtils.getBigDecimal(obj.get("DTCDDL"))); - // 当日统计 - dataStack.setDailyDischargeCycles(StringUtils.getLong(obj.get("DTFDCS"))); - dataStack.setDailyChargeCycles(StringUtils.getLong(obj.get("DTCDCS"))); - dataStack.setDailyDischargeCapacity(StringUtils.getBigDecimal(obj.get("DTFDDL"))); - dataStack.setDailyChargeCapacity(StringUtils.getBigDecimal(obj.get("DTCDDL"))); - - // 系统状态 - dataStack.setOperatingTemp(StringUtils.getBigDecimal(obj.get("YXWD"))); - dataStack.setBmsStatus(StringUtils.getString(obj.get("BMSDDQZT"))); - dataStack.setBmsChargeStatus(StringUtils.getString(obj.get("BMSCFDZT"))); - dataStack.setStackInsulationResistance(StringUtils.getBigDecimal(obj.get("DCDJYDZ"))); - - } + // 系统状态 + dataStack.setOperatingTemp(StringUtils.getBigDecimal(obj.get("YXWD"))); + dataStack.setBmsStatus(StringUtils.getString(obj.get("BMSDDQZT"))); + dataStack.setBmsChargeStatus(StringUtils.getString(obj.get("BMSCFDZT"))); + dataStack.setStackInsulationResistance(StringUtils.getBigDecimal(obj.get("DCDJYDZ"))); dataStack.setCreateBy("system"); @@ -299,7 +278,6 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl redisCache.setCacheObject(RedisKeyConstants.STACK + SITE_ID + "_" +deviceId, dataStack); - saveDevicePointMatchData(pointMatchList, deviceId, DeviceMatchTable.STACK, "BMSD"); } private void saveDeviceData(List pointMatchList, Map obj, Object entity) { @@ -350,58 +328,51 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl } //BMS 电池簇 EmsBatteryCluster data = new EmsBatteryCluster(); - // 点位匹配数据 - List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(SITE_ID, deviceId, DeviceMatchTable.CLUSTER.getCode()); - if (CollectionUtils.isNotEmpty(pointMatchList)) { - saveDeviceData(pointMatchList, obj, data); - } else { + // 设置所有 BigDecimal 类型字段为 ZERO + data.setChargeableCapacity(StringUtils.getBigDecimal(obj.get("KCDL"))); + data.setClusterVoltage(StringUtils.getBigDecimal(obj.get("ZDY"))); + data.setClusterCurrent(StringUtils.getBigDecimal(obj.get("ZDL"))); + data.setTotalChargedCapacity(StringUtils.getBigDecimal(obj.get("LJCDDL"))); + data.setDischargeableCapacity(StringUtils.getBigDecimal(obj.get("KFDL"))); + data.setTotalDischargedCapacity(StringUtils.getBigDecimal(obj.get("LJFDDL"))); + data.setSoh(StringUtils.getBigDecimal(obj.get("ZSOH"))); + data.setAverageTemperature(StringUtils.getBigDecimal(obj.get("MKWD"))); + data.setInsulationResistance(StringUtils.getBigDecimal(obj.get("ZJYDZ"))); + data.setCurrentSoc(StringUtils.getBigDecimal(obj.get("ZSOC"))); + data.setMaxAllowedChargePower(StringUtils.getBigDecimal(obj.get("YXCDZDGL"))); + data.setMaxAllowedDischargePower(StringUtils.getBigDecimal(obj.get("YXFDZDGL"))); + data.setMaxAllowedChargeVoltage(StringUtils.getBigDecimal(obj.get("YXCDZDDY"))); + data.setMaxAllowedDischargeVoltage(StringUtils.getBigDecimal(obj.get("YXFDZDDY"))); + data.setMaxAllowedChargeCurrent(StringUtils.getBigDecimal(obj.get("YXCDZDDL"))); + data.setMaxAllowedDischargeCurrent(StringUtils.getBigDecimal(obj.get("YXFDZDDL"))); + data.setBatteryPackVoltage(StringUtils.getBigDecimal(obj.get("ZDY"))); + data.setBatteryPackCurrent(StringUtils.getBigDecimal(obj.get("ZDL"))); + data.setBatteryPackTemp(StringUtils.getBigDecimal(obj.get("MKWD"))); + data.setBatteryPackSoc(StringUtils.getBigDecimal(obj.get("ZSOC"))); + data.setBatteryPackSoh(StringUtils.getBigDecimal(obj.get("ZSOH"))); + data.setBatteryPackInsulationResistance(StringUtils.getBigDecimal(obj.get("ZJYDZ"))); + data.setAvgCellVoltage(StringUtils.getBigDecimal(obj.get("PJDTDY"))); + data.setAvgCellTemp(StringUtils.getBigDecimal(obj.get("PJDTWD"))); + data.setMaxCellVoltage(StringUtils.getBigDecimal(obj.get("ZGDTDY"))); + data.setMinCellVoltage(StringUtils.getBigDecimal(obj.get("ZDDTDY"))); + data.setMaxCellTemp(StringUtils.getBigDecimal(obj.get("ZGDTWD"))); + data.setMinCellTemp(StringUtils.getBigDecimal(obj.get("ZDDTWD"))); + data.setMaxCellSoc(StringUtils.getBigDecimal(obj.get("ZGDTSOC"))); + data.setMinCellSoc(StringUtils.getBigDecimal(obj.get("ZDDTSOC"))); + data.setMaxCellSoh(StringUtils.getBigDecimal(obj.get("ZGDTSOH"))); + data.setMinCellSoh(StringUtils.getBigDecimal(obj.get("ZDDTSOH"))); + data.setTotalChargeEnergy(StringUtils.getBigDecimal(obj.get("DCLJCDDL"))); + data.setTotalDischargeEnergy(StringUtils.getBigDecimal(obj.get("DCLJFDDL"))); - // 设置所有 BigDecimal 类型字段为 ZERO - data.setChargeableCapacity(StringUtils.getBigDecimal(obj.get("KCDL"))); - data.setClusterVoltage(StringUtils.getBigDecimal(obj.get("ZDY"))); - data.setClusterCurrent(StringUtils.getBigDecimal(obj.get("ZDL"))); - data.setTotalChargedCapacity(StringUtils.getBigDecimal(obj.get("LJCDDL"))); - data.setDischargeableCapacity(StringUtils.getBigDecimal(obj.get("KFDL"))); - data.setTotalDischargedCapacity(StringUtils.getBigDecimal(obj.get("LJFDDL"))); - data.setSoh(StringUtils.getBigDecimal(obj.get("ZSOH"))); - data.setAverageTemperature(StringUtils.getBigDecimal(obj.get("MKWD"))); - data.setInsulationResistance(StringUtils.getBigDecimal(obj.get("ZJYDZ"))); - data.setCurrentSoc(StringUtils.getBigDecimal(obj.get("ZSOC"))); - data.setMaxAllowedChargePower(StringUtils.getBigDecimal(obj.get("YXCDZDGL"))); - data.setMaxAllowedDischargePower(StringUtils.getBigDecimal(obj.get("YXFDZDGL"))); - data.setMaxAllowedChargeVoltage(StringUtils.getBigDecimal(obj.get("YXCDZDDY"))); - data.setMaxAllowedDischargeVoltage(StringUtils.getBigDecimal(obj.get("YXFDZDDY"))); - data.setMaxAllowedChargeCurrent(StringUtils.getBigDecimal(obj.get("YXCDZDDL"))); - data.setMaxAllowedDischargeCurrent(StringUtils.getBigDecimal(obj.get("YXFDZDDL"))); - data.setBatteryPackVoltage(StringUtils.getBigDecimal(obj.get("ZDY"))); - data.setBatteryPackCurrent(StringUtils.getBigDecimal(obj.get("ZDL"))); - data.setBatteryPackTemp(StringUtils.getBigDecimal(obj.get("MKWD"))); - data.setBatteryPackSoc(StringUtils.getBigDecimal(obj.get("ZSOC"))); - data.setBatteryPackSoh(StringUtils.getBigDecimal(obj.get("ZSOH"))); - data.setBatteryPackInsulationResistance(StringUtils.getBigDecimal(obj.get("ZJYDZ"))); - data.setAvgCellVoltage(StringUtils.getBigDecimal(obj.get("PJDTDY"))); - data.setAvgCellTemp(StringUtils.getBigDecimal(obj.get("PJDTWD"))); - data.setMaxCellVoltage(StringUtils.getBigDecimal(obj.get("ZGDTDY"))); - data.setMinCellVoltage(StringUtils.getBigDecimal(obj.get("ZDDTDY"))); - data.setMaxCellTemp(StringUtils.getBigDecimal(obj.get("ZGDTWD"))); - data.setMinCellTemp(StringUtils.getBigDecimal(obj.get("ZDDTWD"))); - data.setMaxCellSoc(StringUtils.getBigDecimal(obj.get("ZGDTSOC"))); - data.setMinCellSoc(StringUtils.getBigDecimal(obj.get("ZDDTSOC"))); - data.setMaxCellSoh(StringUtils.getBigDecimal(obj.get("ZGDTSOH"))); - data.setMinCellSoh(StringUtils.getBigDecimal(obj.get("ZDDTSOH"))); - data.setTotalChargeEnergy(StringUtils.getBigDecimal(obj.get("DCLJCDDL"))); - data.setTotalDischargeEnergy(StringUtils.getBigDecimal(obj.get("DCLJFDDL"))); - - // 其他非 BigDecimal 字段 - data.setMaxCellVoltageId(StringUtils.getString(obj.get("ZGDTDYDYD"))); - data.setMinCellVoltageId(StringUtils.getString(obj.get("ZDDTDYDYD"))); - data.setMaxCellTempId(StringUtils.getString(obj.get("ZGDTWDDYD"))); - data.setMinCellTempId(StringUtils.getString(obj.get("ZDDTWDDYD"))); - data.setMaxCellSocId(StringUtils.getString(obj.get("ZGDTSOCDYD"))); - data.setMinCellSocId(StringUtils.getString(obj.get("ZDDTSOCDYD"))); - data.setMaxCellSohId(StringUtils.getString(obj.get("ZGDTSOHDYD"))); - data.setMinCellSohId(StringUtils.getString(obj.get("ZDDTSOHDYD"))); - } + // 其他非 BigDecimal 字段 + data.setMaxCellVoltageId(StringUtils.getString(obj.get("ZGDTDYDYD"))); + data.setMinCellVoltageId(StringUtils.getString(obj.get("ZDDTDYDYD"))); + data.setMaxCellTempId(StringUtils.getString(obj.get("ZGDTWDDYD"))); + data.setMinCellTempId(StringUtils.getString(obj.get("ZDDTWDDYD"))); + data.setMaxCellSocId(StringUtils.getString(obj.get("ZGDTSOCDYD"))); + data.setMinCellSocId(StringUtils.getString(obj.get("ZDDTSOCDYD"))); + data.setMaxCellSohId(StringUtils.getString(obj.get("ZGDTSOHDYD"))); + data.setMinCellSohId(StringUtils.getString(obj.get("ZDDTSOHDYD"))); data.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 data.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); @@ -421,7 +392,6 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl redisCache.setCacheObject(RedisKeyConstants.CLUSTER + SITE_ID + "_" +deviceId, data); - saveDevicePointMatchData(pointMatchList, deviceId, DeviceMatchTable.CLUSTER, "BMSC"); } private void batteryDataProcess(String deviceId, String dataJson, Date dataUpdateTime) { @@ -444,8 +414,6 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl LocalDateTime oneHourAgo = LocalDateTime.now().minus(1, ChronoUnit.HOURS); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String oneHourAgoStr = oneHourAgo.format(formatter); - // 点位匹配数据 - List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(SITE_ID, deviceId, DeviceMatchTable.BATTERY.getCode()); //单体电池 for (Map.Entry> record : records.entrySet()) { String recordId = record.getKey(); @@ -455,14 +423,10 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl batteryData.setDeviceId(recordId); batteryData.setBatteryCellId(recordId); - if (CollectionUtils.isNotEmpty(pointMatchList)) { - saveDeviceData(pointMatchList, fields, batteryData); - } else { - batteryData.setSoc(StringUtils.getBigDecimal(fields.get("DTSOC"))); - batteryData.setSoh(StringUtils.getBigDecimal(fields.get("DTSOH"))); - batteryData.setTemperature(StringUtils.getBigDecimal(fields.get("DTWD"))); - batteryData.setVoltage(StringUtils.getBigDecimal(fields.get("DTDY"))); - } + batteryData.setSoc(StringUtils.getBigDecimal(fields.get("DTSOC"))); + batteryData.setSoh(StringUtils.getBigDecimal(fields.get("DTSOH"))); + batteryData.setTemperature(StringUtils.getBigDecimal(fields.get("DTWD"))); + batteryData.setVoltage(StringUtils.getBigDecimal(fields.get("DTDY"))); batteryData.setBatteryCluster(deviceId); batteryData.setBatteryPack(stackDeviceId); @@ -496,7 +460,6 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl redisCache.deleteList(RedisKeyConstants.BATTERY + SITE_ID + "_" + deviceId); redisCache.setCacheList(RedisKeyConstants.BATTERY + SITE_ID + "_" + deviceId, list); - saveDevicePointMatchData(pointMatchList, deviceId, DeviceMatchTable.BATTERY, "BMSC"); } // 批量处理每日最新数据 @@ -523,62 +486,54 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl //pcs EmsPcsData pcsData = new EmsPcsData(); - // 点位匹配数据 - List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(SITE_ID, deviceId, DeviceMatchTable.PCS.getCode()); - if (CollectionUtils.isNotEmpty(pointMatchList)) { - saveDeviceData(pointMatchList, obj, pcsData); - } else { - - // 功率与能量类字段 - pcsData.setTotalActivePower(StringUtils.getBigDecimal(obj.get("YGGL"))); - pcsData.setDailyAcChargeEnergy(StringUtils.getBigDecimal(obj.get("RCDL"))); - pcsData.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("XTWGGL"))); - pcsData.setDailyAcDischargeEnergy(StringUtils.getBigDecimal(obj.get("RFDL"))); - pcsData.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("XTSZGL"))); - pcsData.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("GLYS"))); - pcsData.setDcPower(StringUtils.getBigDecimal(obj.get("XTSZGL"))); - pcsData.setTotalAcChargeEnergy(StringUtils.getBigDecimal(obj.get("ZCDL"))); - pcsData.setTotalAcDischargeEnergy(StringUtils.getBigDecimal(obj.get("ZFDL"))); - pcsData.setAcChargeActivePower(StringUtils.getBigDecimal(obj.get("JLCCDYGGL"))); - pcsData.setAcCapacitiveReactivePower(StringUtils.getBigDecimal(obj.get("JLCRXWGGL"))); - pcsData.setAcDischargeActivePower(StringUtils.getBigDecimal(obj.get("JLCFDYGGL"))); - pcsData.setAcInductiveReactivePower(StringUtils.getBigDecimal(obj.get("JLCGXWGGL"))); - pcsData.setMaxCapacitivePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDRXWGNL"))); - pcsData.setMaxInductivePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDGXWGNL"))); - pcsData.setMaxChargePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDKCGL"))); - pcsData.setMaxDischargePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDKFGL"))); + // 功率与能量类字段 + pcsData.setTotalActivePower(StringUtils.getBigDecimal(obj.get("YGGL"))); + pcsData.setDailyAcChargeEnergy(StringUtils.getBigDecimal(obj.get("RCDL"))); + pcsData.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("XTWGGL"))); + pcsData.setDailyAcDischargeEnergy(StringUtils.getBigDecimal(obj.get("RFDL"))); + pcsData.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("XTSZGL"))); + pcsData.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("GLYS"))); + pcsData.setDcPower(StringUtils.getBigDecimal(obj.get("XTSZGL"))); + pcsData.setTotalAcChargeEnergy(StringUtils.getBigDecimal(obj.get("ZCDL"))); + pcsData.setTotalAcDischargeEnergy(StringUtils.getBigDecimal(obj.get("ZFDL"))); + pcsData.setAcChargeActivePower(StringUtils.getBigDecimal(obj.get("JLCCDYGGL"))); + pcsData.setAcCapacitiveReactivePower(StringUtils.getBigDecimal(obj.get("JLCRXWGGL"))); + pcsData.setAcDischargeActivePower(StringUtils.getBigDecimal(obj.get("JLCFDYGGL"))); + pcsData.setAcInductiveReactivePower(StringUtils.getBigDecimal(obj.get("JLCGXWGGL"))); + pcsData.setMaxCapacitivePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDRXWGNL"))); + pcsData.setMaxInductivePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDGXWGNL"))); + pcsData.setMaxChargePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDKCGL"))); + pcsData.setMaxDischargePowerCapacity(StringUtils.getBigDecimal(obj.get("ZDKFGL"))); - // 温度与环境参数 + // 温度与环境参数 // pcsData.setPcsModuleTemperature(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); // pcsData.setPcsEnvironmentTemperature(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); // pcsData.setAcFrequency(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); - // 状态指示类 - pcsData.setBranchStatus(BranchStatus.NORMAL.getCode()); - pcsData.setDischargeStatus(ChargeStatus.CHARGING.getCode()); - String acSwitchStatus = StringUtils.getString(obj.get("JLKGZT")); - pcsData.setAcSwitchStatus(SwitchStatus.CLOSED.getCode()); - String dcSwitchStatus = StringUtils.getString(obj.get("ZLKGZT")); - pcsData.setDcSwitchStatus(SwitchStatus.CLOSED.getCode()); - String controlMode = StringUtils.getString(obj.get("YCTT")); - pcsData.setRemoteControlStatus(ControlModeStatus.REMOTE.getCode()); + // 状态指示类 + pcsData.setBranchStatus(BranchStatus.NORMAL.getCode()); + pcsData.setDischargeStatus(ChargeStatus.CHARGING.getCode()); + String acSwitchStatus = StringUtils.getString(obj.get("JLKGZT")); + pcsData.setAcSwitchStatus(SwitchStatus.CLOSED.getCode()); + String dcSwitchStatus = StringUtils.getString(obj.get("ZLKGZT")); + pcsData.setDcSwitchStatus(SwitchStatus.CLOSED.getCode()); + String controlMode = StringUtils.getString(obj.get("YCTT")); + pcsData.setRemoteControlStatus(ControlModeStatus.REMOTE.getCode()); - // 电流参数 - pcsData.setSysUCurrent(StringUtils.getBigDecimal(obj.get("XTSCUXDL"))); - pcsData.setSysVCurrent(StringUtils.getBigDecimal(obj.get("XTSCVXDL"))); - pcsData.setSysWCurrent(StringUtils.getBigDecimal(obj.get("XTSCWXDL"))); + // 电流参数 + pcsData.setSysUCurrent(StringUtils.getBigDecimal(obj.get("XTSCUXDL"))); + pcsData.setSysVCurrent(StringUtils.getBigDecimal(obj.get("XTSCVXDL"))); + pcsData.setSysWCurrent(StringUtils.getBigDecimal(obj.get("XTSCWXDL"))); - // 直流参数 + // 直流参数 // pcsData.setDcVoltage(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); // pcsData.setDcCurrent(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); - // 三相温度 - pcsData.setuTemperature(StringUtils.getBigDecimal(obj.get("DY1UXIGBTWD"))); - pcsData.setvTemperature(StringUtils.getBigDecimal(obj.get("DY1VXIGBTWD"))); - pcsData.setwTemperature(StringUtils.getBigDecimal(obj.get("DY1WXIGBTWD"))); - - } + // 三相温度 + pcsData.setuTemperature(StringUtils.getBigDecimal(obj.get("DY1UXIGBTWD"))); + pcsData.setvTemperature(StringUtils.getBigDecimal(obj.get("DY1VXIGBTWD"))); + pcsData.setwTemperature(StringUtils.getBigDecimal(obj.get("DY1WXIGBTWD"))); // 时间与状态类字段 pcsData.setDataUpdateTime(dataUpdateTime); @@ -599,15 +554,13 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl emsPcsDataMapper.insertEmsPcsData(pcsData); redisCache.setCacheObject(RedisKeyConstants.PCS + SITE_ID + "_" +deviceId, pcsData); - saveDevicePointMatchData(pointMatchList, deviceId, DeviceMatchTable.PCS, "PCS"); + } private void pcsBranchDataProcess(String deviceId, String dataJson) { Map> records = processDataPrefix(JSON.parseObject(dataJson, new TypeReference>() {})); List list = new ArrayList<>(); - // 点位匹配数据 - List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(SITE_ID, deviceId, DeviceMatchTable.BRANCH.getCode()); //PCS支路 for (Map.Entry> record : records.entrySet()) { @@ -618,32 +571,28 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl data.setDeviceId(deviceId); data.setSiteId(SITE_ID); data.setGridStatus(GridStatus.GRID.getCode()); - if (CollectionUtils.isNotEmpty(pointMatchList)) { - saveDeviceData(pointMatchList, fields, data); - } else { - data.setDcPower(StringUtils.getBigDecimal(fields.get("ZLGL"))); - data.setDcVoltage(StringUtils.getBigDecimal(fields.get("ZLDY"))); - data.setDcCurrent(StringUtils.getBigDecimal(fields.get("ZLDL"))); - data.setGridUVoltage(StringUtils.getBigDecimal(fields.get("DWUXDY"))); - data.setGridVVoltage(StringUtils.getBigDecimal(fields.get("DWVXDY"))); - data.setGridWVoltage(StringUtils.getBigDecimal(fields.get("DWWXDY"))); - data.setOutputUCurrent(StringUtils.getBigDecimal(fields.get("SCUXDL"))); - data.setOutputVCurrent(StringUtils.getBigDecimal(fields.get("SCVXDL"))); - data.setOutputWCurrent(StringUtils.getBigDecimal(fields.get("SCWXDL"))); - data.setApparentPower(StringUtils.getBigDecimal(fields.get("SZGL"))); - data.setActivePower(StringUtils.getBigDecimal(fields.get("YGGL"))); - data.setReactivePower(StringUtils.getBigDecimal(fields.get("WGGL"))); - data.setPowerFactor(StringUtils.getBigDecimal(fields.get("GLYS"))); - data.setFrequency(StringUtils.getBigDecimal(fields.get("PL"))); - data.setInternalTemp(StringUtils.getBigDecimal(fields.get("DY1WD"))); - data.setuIgbtTemp(StringUtils.getBigDecimal(fields.get("UXIGBTWD"))); - data.setvIgbtTemp(StringUtils.getBigDecimal(fields.get("VXIGBTWD"))); - data.setwIgbtTemp(StringUtils.getBigDecimal(fields.get("WXIGBTWD"))); - data.setAvailablePower(StringUtils.getBigDecimal(fields.get("KYGL"))); - data.setTotalLoadRatio(StringUtils.getBigDecimal(fields.get("ZFZB"))); - data.setAcLeakageCurrent(StringUtils.getBigDecimal(fields.get("JLLDL"))); - data.setInsulationResistance(StringUtils.getBigDecimal(fields.get("JYZK"))); - } + data.setDcPower(StringUtils.getBigDecimal(fields.get("ZLGL"))); + data.setDcVoltage(StringUtils.getBigDecimal(fields.get("ZLDY"))); + data.setDcCurrent(StringUtils.getBigDecimal(fields.get("ZLDL"))); + data.setGridUVoltage(StringUtils.getBigDecimal(fields.get("DWUXDY"))); + data.setGridVVoltage(StringUtils.getBigDecimal(fields.get("DWVXDY"))); + data.setGridWVoltage(StringUtils.getBigDecimal(fields.get("DWWXDY"))); + data.setOutputUCurrent(StringUtils.getBigDecimal(fields.get("SCUXDL"))); + data.setOutputVCurrent(StringUtils.getBigDecimal(fields.get("SCVXDL"))); + data.setOutputWCurrent(StringUtils.getBigDecimal(fields.get("SCWXDL"))); + data.setApparentPower(StringUtils.getBigDecimal(fields.get("SZGL"))); + data.setActivePower(StringUtils.getBigDecimal(fields.get("YGGL"))); + data.setReactivePower(StringUtils.getBigDecimal(fields.get("WGGL"))); + data.setPowerFactor(StringUtils.getBigDecimal(fields.get("GLYS"))); + data.setFrequency(StringUtils.getBigDecimal(fields.get("PL"))); + data.setInternalTemp(StringUtils.getBigDecimal(fields.get("DY1WD"))); + data.setuIgbtTemp(StringUtils.getBigDecimal(fields.get("UXIGBTWD"))); + data.setvIgbtTemp(StringUtils.getBigDecimal(fields.get("VXIGBTWD"))); + data.setwIgbtTemp(StringUtils.getBigDecimal(fields.get("WXIGBTWD"))); + data.setAvailablePower(StringUtils.getBigDecimal(fields.get("KYGL"))); + data.setTotalLoadRatio(StringUtils.getBigDecimal(fields.get("ZFZB"))); + data.setAcLeakageCurrent(StringUtils.getBigDecimal(fields.get("JLLDL"))); + data.setInsulationResistance(StringUtils.getBigDecimal(fields.get("JYZK"))); data.setBranchId(recordId); data.setCreateBy("system"); data.setCreateTime(DateUtils.getNowDate()); @@ -656,7 +605,6 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl redisCache.setCacheObject(RedisKeyConstants.BRANCH + SITE_ID + "_" +deviceId, list); - saveDevicePointMatchData(pointMatchList, deviceId, DeviceMatchTable.BRANCH, "PCS"); } } @@ -671,90 +619,83 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl // 更新时间 dataLoad.setDataUpdateTime(dataUpdateTime); - // 点位匹配数据 - List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(SITE_ID, deviceId, DeviceMatchTable.AMMETER.getCode()); - if (CollectionUtils.isNotEmpty(pointMatchList)) { - saveDeviceData(pointMatchList, obj, dataLoad); - } else { + // 电能设置-组合有功 + dataLoad.setCurrentCombActiveTotal(StringUtils.getBigDecimal(obj.get("DQZHYGZDN"))); + dataLoad.setCurrentCombActivePeak(StringUtils.getBigDecimal(obj.get("DQZHYGJDN"))); + dataLoad.setCurrentCombActiveHigh(StringUtils.getBigDecimal(obj.get("DQZHYGFDN"))); + dataLoad.setCurrentCombActiveFlat(StringUtils.getBigDecimal(obj.get("DQZHYGPDN"))); + dataLoad.setCurrentCombActiveValley(StringUtils.getBigDecimal(obj.get("DQZHYGGDN"))); + // 电能设置-正向有功 + dataLoad.setCurrentForwardActiveTotal(StringUtils.getBigDecimal(obj.get("DQZXYGZDN"))); + dataLoad.setCurrentForwardActivePeak(StringUtils.getBigDecimal(obj.get("DQZXYGJDN"))); + dataLoad.setCurrentForwardActiveHigh(StringUtils.getBigDecimal(obj.get("DQZXYGFDN"))); + dataLoad.setCurrentForwardActiveFlat(StringUtils.getBigDecimal(obj.get("DQZXYGPDN"))); + dataLoad.setCurrentForwardActiveValley(StringUtils.getBigDecimal(obj.get("DQZXYGGDN"))); + // 电能设置-反向有功 + dataLoad.setCurrentReverseActiveTotal(StringUtils.getBigDecimal(obj.get("DQFXYGZDN"))); + dataLoad.setCurrentReverseActivePeak(StringUtils.getBigDecimal(obj.get("DQFXYGJDN"))); + dataLoad.setCurrentReverseActiveHigh(StringUtils.getBigDecimal(obj.get("DQFXYGFDN"))); + dataLoad.setCurrentReverseActiveFlat(StringUtils.getBigDecimal(obj.get("DQFXYGPDN"))); + dataLoad.setCurrentReverseActiveValley(StringUtils.getBigDecimal(obj.get("DQFXYGGDN"))); + // 电能设置-组合无功 + dataLoad.setCurrentCombReactiveTotal(StringUtils.getBigDecimal(obj.get("DQZHWGZDN"))); + dataLoad.setCurrentCombReactivePeak(StringUtils.getBigDecimal(obj.get("DQZHWGJDN"))); + dataLoad.setCurrentCombReactiveHigh(StringUtils.getBigDecimal(obj.get("DQZHWGFDN"))); + dataLoad.setCurrentCombReactiveFlat(StringUtils.getBigDecimal(obj.get("DQZHWGPDN"))); + dataLoad.setCurrentCombReactiveValley(StringUtils.getBigDecimal(obj.get("DQZHWGGDN"))); + // 电能设置-正向无功 + dataLoad.setCurrentForwardReactiveTotal(StringUtils.getBigDecimal(obj.get("DQZXWGZDN"))); + dataLoad.setCurrentForwardReactivePeak(StringUtils.getBigDecimal(obj.get("DQZXWGJDN"))); + dataLoad.setCurrentForwardReactiveHigh(StringUtils.getBigDecimal(obj.get("DQZXWGFDN"))); + dataLoad.setCurrentForwardReactiveFlat(StringUtils.getBigDecimal(obj.get("DQZXWGPDN"))); + dataLoad.setCurrentForwardReactiveValley(StringUtils.getBigDecimal(obj.get("DQZXWGGDN"))); + // 电能设置-反向无功 + dataLoad.setCurrentReverseReactiveTotal(StringUtils.getBigDecimal(obj.get("DQFXWGZDN"))); + dataLoad.setCurrentReverseReactivePeak(StringUtils.getBigDecimal(obj.get("DQFXWGJDN"))); + dataLoad.setCurrentReverseReactiveHigh(StringUtils.getBigDecimal(obj.get("DQFXWGFDN"))); + dataLoad.setCurrentReverseReactiveFlat(StringUtils.getBigDecimal(obj.get("DQFXWGPDN"))); + dataLoad.setCurrentReverseReactiveValley(StringUtils.getBigDecimal(obj.get("DQFXWGGDN"))); - // 电能设置-组合有功 - dataLoad.setCurrentCombActiveTotal(StringUtils.getBigDecimal(obj.get("DQZHYGZDN"))); - dataLoad.setCurrentCombActivePeak(StringUtils.getBigDecimal(obj.get("DQZHYGJDN"))); - dataLoad.setCurrentCombActiveHigh(StringUtils.getBigDecimal(obj.get("DQZHYGFDN"))); - dataLoad.setCurrentCombActiveFlat(StringUtils.getBigDecimal(obj.get("DQZHYGPDN"))); - dataLoad.setCurrentCombActiveValley(StringUtils.getBigDecimal(obj.get("DQZHYGGDN"))); - // 电能设置-正向有功 - dataLoad.setCurrentForwardActiveTotal(StringUtils.getBigDecimal(obj.get("DQZXYGZDN"))); - dataLoad.setCurrentForwardActivePeak(StringUtils.getBigDecimal(obj.get("DQZXYGJDN"))); - dataLoad.setCurrentForwardActiveHigh(StringUtils.getBigDecimal(obj.get("DQZXYGFDN"))); - dataLoad.setCurrentForwardActiveFlat(StringUtils.getBigDecimal(obj.get("DQZXYGPDN"))); - dataLoad.setCurrentForwardActiveValley(StringUtils.getBigDecimal(obj.get("DQZXYGGDN"))); - // 电能设置-反向有功 - dataLoad.setCurrentReverseActiveTotal(StringUtils.getBigDecimal(obj.get("DQFXYGZDN"))); - dataLoad.setCurrentReverseActivePeak(StringUtils.getBigDecimal(obj.get("DQFXYGJDN"))); - dataLoad.setCurrentReverseActiveHigh(StringUtils.getBigDecimal(obj.get("DQFXYGFDN"))); - dataLoad.setCurrentReverseActiveFlat(StringUtils.getBigDecimal(obj.get("DQFXYGPDN"))); - dataLoad.setCurrentReverseActiveValley(StringUtils.getBigDecimal(obj.get("DQFXYGGDN"))); - // 电能设置-组合无功 - dataLoad.setCurrentCombReactiveTotal(StringUtils.getBigDecimal(obj.get("DQZHWGZDN"))); - dataLoad.setCurrentCombReactivePeak(StringUtils.getBigDecimal(obj.get("DQZHWGJDN"))); - dataLoad.setCurrentCombReactiveHigh(StringUtils.getBigDecimal(obj.get("DQZHWGFDN"))); - dataLoad.setCurrentCombReactiveFlat(StringUtils.getBigDecimal(obj.get("DQZHWGPDN"))); - dataLoad.setCurrentCombReactiveValley(StringUtils.getBigDecimal(obj.get("DQZHWGGDN"))); - // 电能设置-正向无功 - dataLoad.setCurrentForwardReactiveTotal(StringUtils.getBigDecimal(obj.get("DQZXWGZDN"))); - dataLoad.setCurrentForwardReactivePeak(StringUtils.getBigDecimal(obj.get("DQZXWGJDN"))); - dataLoad.setCurrentForwardReactiveHigh(StringUtils.getBigDecimal(obj.get("DQZXWGFDN"))); - dataLoad.setCurrentForwardReactiveFlat(StringUtils.getBigDecimal(obj.get("DQZXWGPDN"))); - dataLoad.setCurrentForwardReactiveValley(StringUtils.getBigDecimal(obj.get("DQZXWGGDN"))); - // 电能设置-反向无功 - dataLoad.setCurrentReverseReactiveTotal(StringUtils.getBigDecimal(obj.get("DQFXWGZDN"))); - dataLoad.setCurrentReverseReactivePeak(StringUtils.getBigDecimal(obj.get("DQFXWGJDN"))); - dataLoad.setCurrentReverseReactiveHigh(StringUtils.getBigDecimal(obj.get("DQFXWGFDN"))); - dataLoad.setCurrentReverseReactiveFlat(StringUtils.getBigDecimal(obj.get("DQFXWGPDN"))); - dataLoad.setCurrentReverseReactiveValley(StringUtils.getBigDecimal(obj.get("DQFXWGGDN"))); + // 电压+电流 + dataLoad.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY"))); + dataLoad.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("BXDY"))); + dataLoad.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("CXDY"))); + dataLoad.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("AXDL"))); + dataLoad.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("BXDL"))); + dataLoad.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("CXDL"))); - // 电压+电流 - dataLoad.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY"))); - dataLoad.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("BXDY"))); - dataLoad.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("CXDY"))); - dataLoad.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("AXDL"))); - dataLoad.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("BXDL"))); - dataLoad.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("CXDL"))); + dataLoad.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("ABXDY"))); + dataLoad.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("CBXDY"))); + dataLoad.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("ACXDY"))); - dataLoad.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("ABXDY"))); - dataLoad.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("CBXDY"))); - dataLoad.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("ACXDY"))); + // 频率 + dataLoad.setFrequency(StringUtils.getBigDecimal(obj.get("PL"))); - // 频率 - dataLoad.setFrequency(StringUtils.getBigDecimal(obj.get("PL"))); + // 功率 有功+总+无功+无总+视在 + dataLoad.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL"))); + dataLoad.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL"))); + dataLoad.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL"))); + dataLoad.setTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL"))); + dataLoad.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL"))); + dataLoad.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL"))); + dataLoad.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL"))); + dataLoad.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("ZWGGL"))); + dataLoad.setPhaseAApparentPower(StringUtils.getBigDecimal(obj.get("AXSZGL"))); + dataLoad.setPhaseBApparentPower(StringUtils.getBigDecimal(obj.get("BXSZGL"))); + dataLoad.setPhaseCApparentPower(StringUtils.getBigDecimal(obj.get("CXSZGL"))); + dataLoad.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL"))); - // 功率 有功+总+无功+无总+视在 - dataLoad.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL"))); - dataLoad.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL"))); - dataLoad.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL"))); - dataLoad.setTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL"))); - dataLoad.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL"))); - dataLoad.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL"))); - dataLoad.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL"))); - dataLoad.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("ZWGGL"))); - dataLoad.setPhaseAApparentPower(StringUtils.getBigDecimal(obj.get("AXSZGL"))); - dataLoad.setPhaseBApparentPower(StringUtils.getBigDecimal(obj.get("BXSZGL"))); - dataLoad.setPhaseCApparentPower(StringUtils.getBigDecimal(obj.get("CXSZGL"))); - dataLoad.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL"))); + // 功率因数 + dataLoad.setPhaseAPowerFactor(StringUtils.getBigDecimal(obj.get("AXGLYS"))); + dataLoad.setPhaseBPowerFactor(StringUtils.getBigDecimal(obj.get("BXGLYS"))); + dataLoad.setPhaseCPowerFactor(StringUtils.getBigDecimal(obj.get("CXGLYS"))); + dataLoad.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS"))); - // 功率因数 - dataLoad.setPhaseAPowerFactor(StringUtils.getBigDecimal(obj.get("AXGLYS"))); - dataLoad.setPhaseBPowerFactor(StringUtils.getBigDecimal(obj.get("BXGLYS"))); - dataLoad.setPhaseCPowerFactor(StringUtils.getBigDecimal(obj.get("CXGLYS"))); - dataLoad.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS"))); + // 需量 + dataLoad.setForwardAcMaxDemand(StringUtils.getBigDecimal(obj.get("ZXYGZDXL"))); + dataLoad.setReverseAcMaxDemand(StringUtils.getBigDecimal(obj.get("FXYGZDXL"))); + dataLoad.setDailyForwardMaxDemand(StringUtils.getBigDecimal(obj.get("DRZXYGZDXL"))); - // 需量 - dataLoad.setForwardAcMaxDemand(StringUtils.getBigDecimal(obj.get("ZXYGZDXL"))); - dataLoad.setReverseAcMaxDemand(StringUtils.getBigDecimal(obj.get("FXYGZDXL"))); - dataLoad.setDailyForwardMaxDemand(StringUtils.getBigDecimal(obj.get("DRZXYGZDXL"))); - - } dataLoad.setCreateBy("system"); dataLoad.setCreateTime(DateUtils.getNowDate()); dataLoad.setUpdateBy("system"); @@ -766,7 +707,6 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad); - saveDevicePointMatchData(pointMatchList, deviceId, DeviceMatchTable.AMMETER, "LOAD"); } private void dealFXXDailyChargeDate(String deviceId, String dataJson) { @@ -805,84 +745,78 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl EmsAmmeterData dataLoad = new EmsAmmeterData(); // 更新时间 dataLoad.setDataUpdateTime(dataUpdateTime); - // 点位匹配数据 - List pointMatchList = devicePointMatchDataProcessor.getDevicePointMatch(SITE_ID, deviceId, DeviceMatchTable.AMMETER.getCode()); - if (CollectionUtils.isNotEmpty(pointMatchList)) { - saveDeviceData(pointMatchList, obj, dataLoad); - } else { - // 电压+电流 - dataLoad.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY"))); - dataLoad.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("BXDY"))); - dataLoad.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("CXDY"))); - dataLoad.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("AXDL"))); - dataLoad.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("BXDL"))); - dataLoad.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("CXDL"))); + // 电压+电流 + dataLoad.setPhaseAVoltage(StringUtils.getBigDecimal(obj.get("AXDY"))); + dataLoad.setPhaseBVoltage(StringUtils.getBigDecimal(obj.get("BXDY"))); + dataLoad.setPhaseCVoltage(StringUtils.getBigDecimal(obj.get("CXDY"))); + dataLoad.setPhaseACurrent(StringUtils.getBigDecimal(obj.get("AXDL"))); + dataLoad.setPhaseBCurrent(StringUtils.getBigDecimal(obj.get("BXDL"))); + dataLoad.setPhaseCCurrent(StringUtils.getBigDecimal(obj.get("CXDL"))); - dataLoad.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("ABXDY"))); - dataLoad.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("BCXDY"))); - dataLoad.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("CAXDY"))); + dataLoad.setAbLineVoltage(StringUtils.getBigDecimal(obj.get("ABXDY"))); + dataLoad.setCbLineVoltage(StringUtils.getBigDecimal(obj.get("BCXDY"))); + dataLoad.setAcLineVoltage(StringUtils.getBigDecimal(obj.get("CAXDY"))); - // 频率 - dataLoad.setFrequency(StringUtils.getBigDecimal(obj.get("DWPL"))); + // 频率 + dataLoad.setFrequency(StringUtils.getBigDecimal(obj.get("DWPL"))); - // 功率 - dataLoad.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL"))); - dataLoad.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL"))); - dataLoad.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL"))); - dataLoad.setTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL"))); - dataLoad.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL"))); - dataLoad.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL"))); - dataLoad.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL"))); - dataLoad.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("ZWGGL"))); + // 功率 + dataLoad.setPhaseAActivePower(StringUtils.getBigDecimal(obj.get("AXYGGL"))); + dataLoad.setPhaseBActivePower(StringUtils.getBigDecimal(obj.get("BXYGGL"))); + dataLoad.setPhaseCActivePower(StringUtils.getBigDecimal(obj.get("CXYGGL"))); + dataLoad.setTotalActivePower(StringUtils.getBigDecimal(obj.get("ZYGGL"))); + dataLoad.setPhaseAReactivePower(StringUtils.getBigDecimal(obj.get("AXWGGL"))); + dataLoad.setPhaseBReactivePower(StringUtils.getBigDecimal(obj.get("BXWGGL"))); + dataLoad.setPhaseCReactivePower(StringUtils.getBigDecimal(obj.get("CXWGGL"))); + dataLoad.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("ZWGGL"))); - dataLoad.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL"))); - dataLoad.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS"))); + dataLoad.setTotalApparentPower(StringUtils.getBigDecimal(obj.get("ZSZGL"))); + dataLoad.setTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ZGLYS"))); - // 二次相关数据 - dataLoad.setSecondaryAbLineVoltage(StringUtils.getBigDecimal(obj.get("ECABXDY"))); - dataLoad.setSecondaryAPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECAXDL"))); - dataLoad.setSecondaryAPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECAXDY"))); - dataLoad.setSecondaryAPowerFactor(StringUtils.getBigDecimal(obj.get("ECAXGLYS"))); - dataLoad.setSecondaryAApparentPower(StringUtils.getBigDecimal(obj.get("ECAXSZGL"))); - dataLoad.setSecondaryAReactivePower(StringUtils.getBigDecimal(obj.get("ECAXWGGL"))); - dataLoad.setSecondaryAActivePower(StringUtils.getBigDecimal(obj.get("ECAXYGGL"))); - dataLoad.setSecondaryBcLineVoltage(StringUtils.getBigDecimal(obj.get("ECBCXDY"))); - dataLoad.setSecondaryBPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECBXDL"))); - dataLoad.setSecondaryBPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECBXDY"))); - dataLoad.setSecondaryBPowerFactor(StringUtils.getBigDecimal(obj.get("ECBXGLYS"))); - dataLoad.setSecondaryBApparentPower(StringUtils.getBigDecimal(obj.get("ECBXSZGL"))); - dataLoad.setSecondaryBReactivePower(StringUtils.getBigDecimal(obj.get("ECBXWGGL"))); - dataLoad.setSecondaryBActivePower(StringUtils.getBigDecimal(obj.get("ECBXYGGL"))); - dataLoad.setSecondaryCaLineVoltage(StringUtils.getBigDecimal(obj.get("ECCAXDY"))); - dataLoad.setSecondaryCPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECCXDL"))); - dataLoad.setSecondaryCPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECCXDY"))); - dataLoad.setSecondaryCPowerFactor(StringUtils.getBigDecimal(obj.get("ECCXGLYS"))); - dataLoad.setSecondaryCApparentPower(StringUtils.getBigDecimal(obj.get("ECCXSZGL"))); - dataLoad.setSecondaryCReactivePower(StringUtils.getBigDecimal(obj.get("ECCXWGGL"))); - dataLoad.setSecondaryCActivePower(StringUtils.getBigDecimal(obj.get("ECCXYGGL"))); - dataLoad.setSecondaryGridFrequency(StringUtils.getBigDecimal(obj.get("ECDWPL"))); - dataLoad.setSecondaryReverseReactiveEnergy(StringUtils.getBigDecimal(obj.get("ECFXWGDN"))); - dataLoad.setSecondaryNegativeActiveEnergy(StringUtils.getBigDecimal(obj.get("ECFXYGDN"))); - dataLoad.setSecondaryTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ECZGLYS"))); - dataLoad.setSecondaryTotalApparentPower(StringUtils.getBigDecimal(obj.get("ECZSZFL"))); - dataLoad.setSecondaryTotalReactivePower(StringUtils.getBigDecimal(obj.get("ECZWGGL"))); - dataLoad.setSecondaryPositiveReactiveEnergy(StringUtils.getBigDecimal(obj.get("ECZXWGDN"))); - dataLoad.setSecondaryPositiveActiveEnergy(StringUtils.getBigDecimal(obj.get("ECZXYGDN"))); - dataLoad.setSecondaryTotalActivePower(StringUtils.getBigDecimal(obj.get("ECZYGGL"))); + // 二次相关数据 + dataLoad.setSecondaryAbLineVoltage(StringUtils.getBigDecimal(obj.get("ECABXDY"))); + dataLoad.setSecondaryAPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECAXDL"))); + dataLoad.setSecondaryAPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECAXDY"))); + dataLoad.setSecondaryAPowerFactor(StringUtils.getBigDecimal(obj.get("ECAXGLYS"))); + dataLoad.setSecondaryAApparentPower(StringUtils.getBigDecimal(obj.get("ECAXSZGL"))); + dataLoad.setSecondaryAReactivePower(StringUtils.getBigDecimal(obj.get("ECAXWGGL"))); + dataLoad.setSecondaryAActivePower(StringUtils.getBigDecimal(obj.get("ECAXYGGL"))); + dataLoad.setSecondaryBcLineVoltage(StringUtils.getBigDecimal(obj.get("ECBCXDY"))); + dataLoad.setSecondaryBPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECBXDL"))); + dataLoad.setSecondaryBPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECBXDY"))); + dataLoad.setSecondaryBPowerFactor(StringUtils.getBigDecimal(obj.get("ECBXGLYS"))); + dataLoad.setSecondaryBApparentPower(StringUtils.getBigDecimal(obj.get("ECBXSZGL"))); + dataLoad.setSecondaryBReactivePower(StringUtils.getBigDecimal(obj.get("ECBXWGGL"))); + dataLoad.setSecondaryBActivePower(StringUtils.getBigDecimal(obj.get("ECBXYGGL"))); + dataLoad.setSecondaryCaLineVoltage(StringUtils.getBigDecimal(obj.get("ECCAXDY"))); + dataLoad.setSecondaryCPhaseCurrent(StringUtils.getBigDecimal(obj.get("ECCXDL"))); + dataLoad.setSecondaryCPhaseVoltage(StringUtils.getBigDecimal(obj.get("ECCXDY"))); + dataLoad.setSecondaryCPowerFactor(StringUtils.getBigDecimal(obj.get("ECCXGLYS"))); + dataLoad.setSecondaryCApparentPower(StringUtils.getBigDecimal(obj.get("ECCXSZGL"))); + dataLoad.setSecondaryCReactivePower(StringUtils.getBigDecimal(obj.get("ECCXWGGL"))); + dataLoad.setSecondaryCActivePower(StringUtils.getBigDecimal(obj.get("ECCXYGGL"))); + dataLoad.setSecondaryGridFrequency(StringUtils.getBigDecimal(obj.get("ECDWPL"))); + dataLoad.setSecondaryReverseReactiveEnergy(StringUtils.getBigDecimal(obj.get("ECFXWGDN"))); + dataLoad.setSecondaryNegativeActiveEnergy(StringUtils.getBigDecimal(obj.get("ECFXYGDN"))); + dataLoad.setSecondaryTotalPowerFactor(StringUtils.getBigDecimal(obj.get("ECZGLYS"))); + dataLoad.setSecondaryTotalApparentPower(StringUtils.getBigDecimal(obj.get("ECZSZFL"))); + dataLoad.setSecondaryTotalReactivePower(StringUtils.getBigDecimal(obj.get("ECZWGGL"))); + dataLoad.setSecondaryPositiveReactiveEnergy(StringUtils.getBigDecimal(obj.get("ECZXWGDN"))); + dataLoad.setSecondaryPositiveActiveEnergy(StringUtils.getBigDecimal(obj.get("ECZXYGDN"))); + dataLoad.setSecondaryTotalActivePower(StringUtils.getBigDecimal(obj.get("ECZYGGL"))); - // 需量 - dataLoad.setReverseReactiveEnergyEqMinus(StringUtils.getBigDecimal(obj.get("FXWGDN"))); - dataLoad.setReverseActiveEnergyEpMinus(StringUtils.getBigDecimal(obj.get("FXYGDN"))); - dataLoad.setPositiveReactiveEnergyEqPlus(StringUtils.getBigDecimal(obj.get("ZXWGDN"))); - dataLoad.setPositiveActiveEnergyEpPlus(StringUtils.getBigDecimal(obj.get("ZXYGDN"))); + // 需量 + dataLoad.setReverseReactiveEnergyEqMinus(StringUtils.getBigDecimal(obj.get("FXWGDN"))); + dataLoad.setReverseActiveEnergyEpMinus(StringUtils.getBigDecimal(obj.get("FXYGDN"))); + dataLoad.setPositiveReactiveEnergyEqPlus(StringUtils.getBigDecimal(obj.get("ZXWGDN"))); + dataLoad.setPositiveActiveEnergyEpPlus(StringUtils.getBigDecimal(obj.get("ZXYGDN"))); - // 正反向有功无功电能 - dataLoad.setCurrentForwardActiveTotal(StringUtils.getBigDecimal(obj.get("ZXYGDN"))); - dataLoad.setCurrentReverseActiveTotal(StringUtils.getBigDecimal(obj.get("FXYGDN"))); - dataLoad.setCurrentForwardReactiveTotal(StringUtils.getBigDecimal(obj.get("ZXWGDN"))); - dataLoad.setCurrentReverseReactiveTotal(StringUtils.getBigDecimal(obj.get("FXWGDN"))); + // 正反向有功无功电能 + dataLoad.setCurrentForwardActiveTotal(StringUtils.getBigDecimal(obj.get("ZXYGDN"))); + dataLoad.setCurrentReverseActiveTotal(StringUtils.getBigDecimal(obj.get("FXYGDN"))); + dataLoad.setCurrentForwardReactiveTotal(StringUtils.getBigDecimal(obj.get("ZXWGDN"))); + dataLoad.setCurrentReverseReactiveTotal(StringUtils.getBigDecimal(obj.get("FXWGDN"))); - } dataLoad.setCreateBy("system"); dataLoad.setCreateTime(DateUtils.getNowDate()); dataLoad.setUpdateBy("system"); @@ -894,8 +828,6 @@ public class FXXDataProcessServiceImpl extends AbstractBatteryDataProcessor impl redisCache.setCacheObject(RedisKeyConstants.AMMETER + SITE_ID + "_" +deviceId, dataLoad); - saveDevicePointMatchData(pointMatchList, deviceId, DeviceMatchTable.AMMETER, "METE"); - // 处理电表每日充放电数据 dealAmmeterDailyDate(obj, dataUpdateTime, lastAmmeterData); } diff --git a/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java b/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java index a61f8de..2b1c72c 100644 --- a/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java +++ b/ems-system/src/main/java/com/xzzn/ems/utils/DevicePointMatchDataProcessor.java @@ -7,11 +7,13 @@ import com.xzzn.common.annotation.Excel; import com.xzzn.common.constant.RedisKeyConstants; import com.xzzn.common.core.redis.RedisCache; import com.xzzn.common.enums.DeviceCategory; +import com.xzzn.common.enums.PointType; import com.xzzn.common.utils.DataUtils; import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.EmsDevicesSetting; import com.xzzn.ems.domain.EmsPointMatch; import com.xzzn.ems.domain.vo.DevicePointMatchInfo; +import com.xzzn.ems.domain.vo.StackStatisListVo; import com.xzzn.ems.enums.DeviceMatchTable; import com.xzzn.ems.mapper.EmsDevicesSettingMapper; import com.xzzn.ems.mapper.EmsPointMatchMapper; @@ -23,6 +25,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; import javax.annotation.PostConstruct; @@ -82,15 +85,31 @@ public class DevicePointMatchDataProcessor { } public List getDevicePointMatch(String siteId, String deviceId, String deviceCategory) { + return getDevicePointMatch(siteId, deviceId, deviceCategory, false); + } + + public List getDeviceAlarmPointMatch(String siteId, String deviceId, String deviceCategory) { + return getDevicePointMatch(siteId, deviceId, deviceCategory, true); + } + + private List getDevicePointMatch(String siteId, String deviceId, String deviceCategory, boolean isAlarm) { // List pointMatchList = new ArrayList<>(); // EmsDevicesSetting devicesSetting = emsDevicesSettingMapper.getDeviceBySiteAndDeviceId(deviceId, siteId); // if (devicesSetting == null) { // log.info("未找到设备配置信息,siteId: " + siteId + ", deviceId: "+ deviceId); // return pointMatchList; // } - List pointMatchList = redisCache.getCacheList(getPointTacthCacheKey(siteId, deviceId, deviceCategory)); + List pointMatchList = redisCache.getCacheList(getPointMacthCacheKey(siteId, deviceCategory)); if (CollectionUtils.isEmpty(pointMatchList)) { - pointMatchList = emsPointMatchMapper.getDevicePointMatchList(siteId, deviceId, deviceCategory); + pointMatchList = emsPointMatchMapper.getDevicePointMatchList(siteId, deviceCategory); + } + if (CollectionUtils.isNotEmpty(pointMatchList)) { + Map> map = pointMatchList.stream().collect(Collectors.groupingBy(EmsPointMatch::getIsAlarm)); + if (isAlarm) { + pointMatchList = map.get(PointType.YES.getCode()); + } else { + pointMatchList = map.get(PointType.NO.getCode()); + } } return pointMatchList; @@ -111,13 +130,12 @@ public class DevicePointMatchDataProcessor { try { devicePintointMtachInfo.forEach((key, value) -> { // 查询点位是否存在 - EmsPointMatch dbPoint = emsPointMatchMapper.getOnePointMatch(siteId, deviceId, deviceCategory, value); + EmsPointMatch dbPoint = emsPointMatchMapper.getOnePointMatch(siteId, deviceCategory, value); if (!Objects.isNull(dbPoint)) { return; } EmsPointMatch pointMatch = new EmsPointMatch(); pointMatch.setSiteId(siteId); - pointMatch.setDeviceId(deviceId); pointMatch.setDeviceCategory(deviceCategory); pointMatch.setMatchTable(DeviceMatchTable.getMatchTableByCode(deviceCategory)); pointMatch.setMatchField(StringUtils.toUnderScoreCase(key)); @@ -169,12 +187,11 @@ public class DevicePointMatchDataProcessor { /** * 设置点位缓存key * @param siteId - * @param deviceId * @param deviceCategory * @return 点位缓存key */ - public static String getPointTacthCacheKey(String siteId, String deviceId, String deviceCategory) + public static String getPointMacthCacheKey(String siteId, String deviceCategory) { - return RedisKeyConstants.POINT_MATCH + deviceCategory + "_" + siteId + "_" + deviceId; + return RedisKeyConstants.POINT_MATCH + deviceCategory + "_" + siteId; } } diff --git a/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml index a9a19ff..534389d 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsEnergyPriceConfigMapper.xml @@ -177,4 +177,18 @@ where t.`year` = #{currentYear} and t.`month` = #{currentMonth} + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsMqttTopicConfigMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsMqttTopicConfigMapper.xml index dd0ab8d..8c5de17 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsMqttTopicConfigMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsMqttTopicConfigMapper.xml @@ -100,4 +100,9 @@ from ems_mqtt_topic_config where mqtt_topic = #{strategyTopic} + + \ No newline at end of file diff --git a/ems-system/src/main/resources/mapper/ems/EmsPointMatchMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPointMatchMapper.xml index 2dd6aad..c3e4db8 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsPointMatchMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsPointMatchMapper.xml @@ -24,11 +24,11 @@ - + - select id, point_name, match_table, match_field, site_id, device_category, data_point, data_point_name, data_device, data_unit, ip_address, ip_port, data_type, need_diff_device_id, create_by, create_time, update_by, update_time, remark, device_id from ems_point_match + select id, point_name, match_table, match_field, site_id, device_category, data_point, data_point_name, data_device, data_unit, ip_address, ip_port, data_type, need_diff_device_id, create_by, create_time, update_by, update_time, remark, is_alarm from ems_point_match \ No newline at end of file