From 5eb8de692cdd44abc77920caf4f3ecbac13d1001 Mon Sep 17 00:00:00 2001 From: dashixiong Date: Tue, 1 Jul 2025 21:21:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=83=A8=E5=88=86=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ems/MqttMessageController.java | 387 +---------------- .../com/xzzn/common/utils/StringUtils.java | 20 + .../com/xzzn/ems/domain/EmsPcsBranchData.java | 6 +- .../ems/service/IFXXDataProcessService.java | 7 + .../impl/FXXDataProcessServiceImpl.java | 405 ++++++++++++++++++ 5 files changed, 440 insertions(+), 385 deletions(-) create mode 100644 ems-system/src/main/java/com/xzzn/ems/service/IFXXDataProcessService.java create mode 100644 ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java 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 6097bce..e6283a5 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,14 +1,8 @@ package com.xzzn.web.controller.ems; -import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONArray; -import com.alibaba.fastjson2.JSONObject; -import com.alibaba.fastjson2.TypeReference; -import com.xzzn.common.enums.*; -import com.xzzn.common.utils.DateUtils; -import com.xzzn.common.utils.StringUtils; -import com.xzzn.ems.domain.*; -import com.xzzn.ems.service.*; +import com.xzzn.ems.domain.EmsMqttMessage; +import com.xzzn.ems.service.IEmsMqttMessageService; +import com.xzzn.ems.service.IFXXDataProcessService; import com.xzzn.framework.manager.MqttLifecycleManager; import com.xzzn.framework.web.service.MqttPublisher; import com.xzzn.framework.web.service.MqttSubscriber; @@ -21,8 +15,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; -import java.math.BigDecimal; -import java.util.*; @Service public class MqttMessageController implements MqttPublisher, MqttSubscriber { @@ -37,21 +29,7 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { private IEmsMqttMessageService emsMqttMessageService; @Autowired - private IEmsBatteryDataService emsBatteryDataService; - - @Autowired - private IEmsPcsDataService emsPcsDataService; - - @Autowired - private IEmsPcsBranchDataService emsPcsBranchDataService; - - @Autowired - private IEmsBatteryClusterService emsBatteryClusterService; - - @Autowired - private IEmsBatteryStackService emsBatteryStackService; - - + private IFXXDataProcessService fXXDataProcessService; @Autowired public MqttMessageController(MqttLifecycleManager mqttLifecycleManager) { @@ -94,7 +72,7 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { System.out.println("[DEVICE] data: " + payload); try { // 业务处理逻辑 - handleFxData(payload); + fXXDataProcessService.handleFxData(payload); EmsMqttMessage mqttMessage = new EmsMqttMessage(); @@ -139,360 +117,5 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { } - private void handleFxData(String message) { - JSONArray arraylist = JSONArray.parseArray(message); - for (int i = 0; i < arraylist.size(); i++) { - JSONObject obj = JSONObject.parseObject(arraylist.get(i).toString()); - - String deviceId = obj.get("Device").toString(); - String jsonData = obj.get("Data").toString(); - - log.info("deviceId:" + deviceId); - if (deviceId.contains("BMSD")) { - - - //电池堆 - //BMS 电池簇 - EmsBatteryStack dataStack = new EmsBatteryStack(); - // 设置所有 BigDecimal 类型字段为 ZERO - dataStack.setChargeableCapacity(BigDecimal.ZERO); - dataStack.setTotalChargedCapacity(BigDecimal.ZERO); - dataStack.setDischargeableCapacity(BigDecimal.ZERO); - dataStack.setTotalDischargedCapacity(BigDecimal.ZERO); - dataStack.setSoh(BigDecimal.ZERO); - dataStack.setAverageTemperature(BigDecimal.ZERO); - dataStack.setInsulationResistance(BigDecimal.ZERO); - dataStack.setCurrentSoc(BigDecimal.ZERO); - dataStack.setMaxAllowedChargePower(BigDecimal.ZERO); - dataStack.setMaxAllowedDischargePower(BigDecimal.ZERO); - dataStack.setMaxAllowedChargeVoltage(BigDecimal.ZERO); - dataStack.setMaxAllowedDischargeVoltage(BigDecimal.ZERO); - dataStack.setMaxAllowedChargeCurrent(BigDecimal.ZERO); - dataStack.setMaxAllowedDischargeCurrent(BigDecimal.ZERO); - dataStack.setBatteryPackVoltage(BigDecimal.ZERO); - dataStack.setBatteryPackCurrent(BigDecimal.ZERO); - dataStack.setBatteryPackTemp(BigDecimal.ZERO); - dataStack.setBatteryPackSoc(BigDecimal.ZERO); - dataStack.setBatteryPackSoh(BigDecimal.ZERO); - dataStack.setBatteryPackInsulationResistance(BigDecimal.ZERO); - dataStack.setAvgCellVoltage(BigDecimal.ZERO); - dataStack.setAvgCellTemp(BigDecimal.ZERO); - dataStack.setMaxCellVoltage(BigDecimal.ZERO); - dataStack.setMinCellVoltage(BigDecimal.ZERO); - dataStack.setMaxCellTemp(BigDecimal.ZERO); - dataStack.setMinCellTemp(BigDecimal.ZERO); - dataStack.setMaxCellSoc(BigDecimal.ZERO); - dataStack.setMinCellSoc(BigDecimal.ZERO); - dataStack.setMaxCellSoh(BigDecimal.ZERO); - dataStack.setMinCellSoh(BigDecimal.ZERO); - dataStack.setTotalChargeEnergy(BigDecimal.ZERO); - dataStack.setTotalDischargeEnergy(BigDecimal.ZERO); - - // 其他非 BigDecimal 字段 - dataStack.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 - dataStack.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); - dataStack.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); - dataStack.setCreateBy("system"); - dataStack.setCreateTime(DateUtils.getNowDate()); - dataStack.setUpdateBy("system"); - dataStack.setUpdateTime(DateUtils.getNowDate()); - dataStack.setSiteId("021_FXX_01"); - dataStack.setDeviceId(deviceId); - dataStack.setMaxCellVoltageId(Long.parseLong("1")); - dataStack.setMinCellVoltageId(Long.parseLong("1")); - dataStack.setMaxCellTempId(Long.parseLong("1")); - dataStack.setMinCellTempId(Long.parseLong("1")); - dataStack.setMaxCellSocId(Long.parseLong("1")); - dataStack.setMinCellSocId(Long.parseLong("1")); - dataStack.setMaxCellSohId(Long.parseLong("1")); - dataStack.setMinCellSohId(Long.parseLong("1")); - - emsBatteryStackService.insertEmsBatteryStack(dataStack); - - - //单体电池 - Map> records = processData(JSON.parseObject(jsonData, new TypeReference>() {})); - List list = new ArrayList<>(); - //单体电池 - for (Map.Entry> record : records.entrySet()) { - String recordId = record.getKey(); - Map fields = record.getValue(); - - EmsBatteryData batteryData = new EmsBatteryData(); - batteryData.setDeviceId(recordId); - batteryData.setBatteryCellId(recordId); - 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(deviceId); - - // 时间戳 - batteryData.setDataTimestamp(new Date()); - - // ID字段 - batteryData.setSiteId(("021_FXX_01")); - batteryData.setClusterDeviceId(("021")); - - list.add(batteryData); - } - if (list.size() > 0 ) { - emsBatteryDataService.insertEmsBatteryDataList(list); - } - } else if (deviceId.contains("BMSC")) { - log.info("===================="); - log.info("BMSC data:"+ jsonData); - //BMS 电池簇 - EmsBatteryCluster data = new EmsBatteryCluster(); - // 设置所有 BigDecimal 类型字段为 ZERO - data.setChargeableCapacity(BigDecimal.ZERO); - data.setTotalChargedCapacity(BigDecimal.ZERO); - data.setDischargeableCapacity(BigDecimal.ZERO); - data.setTotalDischargedCapacity(BigDecimal.ZERO); - data.setSoh(BigDecimal.ZERO); - data.setAverageTemperature(BigDecimal.ZERO); - data.setInsulationResistance(BigDecimal.ZERO); - data.setCurrentSoc(BigDecimal.ZERO); - data.setMaxAllowedChargePower(BigDecimal.ZERO); - data.setMaxAllowedDischargePower(BigDecimal.ZERO); - data.setMaxAllowedChargeVoltage(BigDecimal.ZERO); - data.setMaxAllowedDischargeVoltage(BigDecimal.ZERO); - data.setMaxAllowedChargeCurrent(BigDecimal.ZERO); - data.setMaxAllowedDischargeCurrent(BigDecimal.ZERO); - data.setBatteryPackVoltage(BigDecimal.ZERO); - data.setBatteryPackCurrent(BigDecimal.ZERO); - data.setBatteryPackTemp(BigDecimal.ZERO); - data.setBatteryPackSoc(BigDecimal.ZERO); - data.setBatteryPackSoh(BigDecimal.ZERO); - data.setBatteryPackInsulationResistance(BigDecimal.ZERO); - data.setAvgCellVoltage(BigDecimal.ZERO); - data.setAvgCellTemp(BigDecimal.ZERO); - data.setMaxCellVoltage(BigDecimal.ZERO); - data.setMinCellVoltage(BigDecimal.ZERO); - data.setMaxCellTemp(BigDecimal.ZERO); - data.setMinCellTemp(BigDecimal.ZERO); - data.setMaxCellSoc(BigDecimal.ZERO); - data.setMinCellSoc(BigDecimal.ZERO); - data.setMaxCellSoh(BigDecimal.ZERO); - data.setMinCellSoh(BigDecimal.ZERO); - data.setTotalChargeEnergy(BigDecimal.ZERO); - data.setTotalDischargeEnergy(BigDecimal.ZERO); - - // 其他非 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("021_FXX_01"); - data.setDeviceId(deviceId); - data.setMaxCellVoltageId(Long.parseLong("1")); - data.setMinCellVoltageId(Long.parseLong("1")); - data.setMaxCellTempId(Long.parseLong("1")); - data.setMinCellTempId(Long.parseLong("1")); - data.setMaxCellSocId(Long.parseLong("1")); - data.setMinCellSocId(Long.parseLong("1")); - data.setMaxCellSohId(Long.parseLong("1")); - data.setMinCellSohId(Long.parseLong("1")); - data.setStackDeviceId("1"); - emsBatteryClusterService.insertEmsBatteryCluster(data); - - - //单体电池 - Map> records = processData(JSON.parseObject(jsonData, new TypeReference>() {})); - List list = new ArrayList<>(); - //单体电池 - for (Map.Entry> record : records.entrySet()) { - String recordId = record.getKey(); - Map fields = record.getValue(); - - EmsBatteryData batteryData = new EmsBatteryData(); - batteryData.setDeviceId(recordId); - batteryData.setBatteryCellId(recordId); - 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(deviceId); - - // 时间戳 - batteryData.setDataTimestamp(new Date()); - - // ID字段 - batteryData.setSiteId(("021_FXX_01")); - batteryData.setClusterDeviceId(deviceId); - - list.add(batteryData); - } - if (list.size() > 0 ) { - emsBatteryDataService.insertEmsBatteryDataList(list); - } - } else if (deviceId.contains("PCS")) { - log.info("===================="); - - log.info("PCS data:"+ jsonData); - - - //pcs - EmsPcsData pcsData = new EmsPcsData(); - // 时间与状态类字段 - pcsData.setDataUpdateTime(new Date()); - pcsData.setWorkStatus(WorkStatus.NORMAL.getCode()); - pcsData.setGridStatus(GridStatus.GRID.getCode()); - pcsData.setDeviceStatus(DeviceStatus.ONLINE.getCode()); - pcsData.setControlMode(ControlModeStatus.REMOTE.getCode()); - - // 功率与能量类字段 - pcsData.setTotalActivePower(BigDecimal.ZERO); - pcsData.setDailyAcChargeEnergy(BigDecimal.ZERO); - pcsData.setTotalReactivePower(BigDecimal.ZERO); - pcsData.setDailyAcDischargeEnergy(BigDecimal.ZERO); - pcsData.setTotalApparentPower(BigDecimal.ZERO); - pcsData.setTotalPowerFactor(BigDecimal.ZERO); - pcsData.setDcPower(BigDecimal.ZERO); - pcsData.setTotalAcChargeEnergy(BigDecimal.ZERO); - pcsData.setTotalAcDischargeEnergy(BigDecimal.ZERO); - pcsData.setAcChargeActivePower(BigDecimal.ZERO); - pcsData.setAcCapacitiveReactivePower(BigDecimal.ZERO); - pcsData.setAcDischargeActivePower(BigDecimal.ZERO); - pcsData.setAcInductiveReactivePower(BigDecimal.ZERO); - pcsData.setMaxCapacitivePowerCapacity(BigDecimal.ZERO); - pcsData.setMaxInductivePowerCapacity(BigDecimal.ZERO); - pcsData.setMaxChargePowerCapacity(BigDecimal.ZERO); - pcsData.setMaxDischargePowerCapacity(BigDecimal.ZERO); - - - // 温度与环境参数 - pcsData.setPcsModuleTemperature(BigDecimal.ZERO); - pcsData.setPcsEnvironmentTemperature(BigDecimal.ZERO); - pcsData.setAcFrequency(BigDecimal.ZERO); - - // 状态指示类 - 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.setDcVoltage(BigDecimal.ZERO); - pcsData.setDcCurrent(BigDecimal.ZERO); - - // 系统管理字段 -// data.setCreateBy(BigDecimal.ZERO); -// data.setCreateTime(BigDecimal.ZERO); -// data.setUpdateBy(BigDecimal.ZERO); -// data.setUpdateTime(BigDecimal.ZERO); -// data.setRemark(BigDecimal.ZERO); - pcsData.setSiteId("021_FXX_01"); - pcsData.setDeviceId(deviceId); - pcsData.setDateMonth(DateUtils.getNowMonthLong()); - pcsData.setDateDay(DateUtils.getNowDayLong()); - - emsPcsDataService.insertEmsPcsData(pcsData); - - Map> records = processDataPrefix(JSON.parseObject(jsonData, new TypeReference>() {})); - List list = new ArrayList<>(); - - //PCS支路 - for (Map.Entry> record : records.entrySet()) { - String recordId = record.getKey(); - Map fields = record.getValue(); - - EmsPcsBranchData data = new EmsPcsBranchData(); - data.setDeviceId(recordId); - data.setDcPower(BigDecimal.ZERO); - data.setDcVoltage(BigDecimal.ZERO); - data.setDcCurrent(BigDecimal.ZERO); - data.setGridUVoltage(BigDecimal.ZERO); - data.setGridVVoltage(BigDecimal.ZERO); - data.setGridWVoltage(BigDecimal.ZERO); - data.setOutputUCurrent(BigDecimal.ZERO); - data.setOutputVCurrent(BigDecimal.ZERO); - data.setOutputWCurrent(BigDecimal.ZERO); - data.setApparentPower(BigDecimal.ZERO); - data.setActivePower(BigDecimal.ZERO); - data.setReactivePower(BigDecimal.ZERO); - data.setPowerFactor(BigDecimal.ZERO); - data.setFrequency(BigDecimal.ZERO); - data.setInternalTemp(BigDecimal.ZERO); - data.setuIgbtTemp(BigDecimal.ZERO); - data.setvIgbtTemp(BigDecimal.ZERO); - data.setwIgbtTemp(BigDecimal.ZERO); - data.setAvailablePower(BigDecimal.ZERO); - data.setTotalLoadRatio(BigDecimal.ZERO); - data.setAcLeakageCurrent(BigDecimal.ZERO); - data.setInsulationResistance(BigDecimal.ZERO); - data.setBranchId(Long.parseLong("1")); - list.add(data); - } - if (list.size() > 0 ) { - emsPcsBranchDataService.insertEmsPcsBranchDataList(list); - } - - } - - } - - - } - - // 数据分组处理 - 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()); - } - return records; - } } \ No newline at end of file diff --git a/ems-common/src/main/java/com/xzzn/common/utils/StringUtils.java b/ems-common/src/main/java/com/xzzn/common/utils/StringUtils.java index 0eb43f4..501f549 100644 --- a/ems-common/src/main/java/com/xzzn/common/utils/StringUtils.java +++ b/ems-common/src/main/java/com/xzzn/common/utils/StringUtils.java @@ -731,4 +731,24 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils } } + + public static Long getLong(Object s){ + + try { + return Long.parseLong(s.toString()); + } catch (NumberFormatException e) { + return Long.parseLong("0"); + } + + } + + public static String getString(Object s){ + + try { + return String.valueOf(s); + } catch (NumberFormatException e) { + return "0"; + } + + } } \ No newline at end of file diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsBranchData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsBranchData.java index f981197..a954deb 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsBranchData.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsBranchData.java @@ -46,7 +46,7 @@ public class EmsPcsBranchData extends BaseEntity /** 支路id */ @Excel(name = "支路id") - private Long branchId; + private String branchId; /** 电网U相电压 */ @Excel(name = "电网U相电压") @@ -198,12 +198,12 @@ public class EmsPcsBranchData extends BaseEntity return deviceId; } - public void setBranchId(Long branchId) + public void setBranchId(String branchId) { this.branchId = branchId; } - public Long getBranchId() + public String getBranchId() { return branchId; } diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IFXXDataProcessService.java b/ems-system/src/main/java/com/xzzn/ems/service/IFXXDataProcessService.java new file mode 100644 index 0000000..1c8219d --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/IFXXDataProcessService.java @@ -0,0 +1,7 @@ +package com.xzzn.ems.service; + +public interface IFXXDataProcessService { + + public void handleFxData(String message); + +} 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 new file mode 100644 index 0000000..3968249 --- /dev/null +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/FXXDataProcessServiceImpl.java @@ -0,0 +1,405 @@ +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.xzzn.common.core.redis.RedisCache; +import com.xzzn.common.enums.*; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; +import com.xzzn.ems.domain.*; +import com.xzzn.ems.mapper.*; +import com.xzzn.ems.service.IFXXDataProcessService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.*; + +@Service +public class FXXDataProcessServiceImpl implements IFXXDataProcessService { + private static final Log log = LogFactory.getLog(FXXDataProcessServiceImpl.class); + + @Autowired + private EmsBatteryClusterMapper emsBatteryClusterMapper; + + @Autowired + private EmsBatteryStackMapper emsBatteryStackMapper; + + @Autowired + private EmsBatteryDataMapper emsBatteryDataMapper; + + @Autowired + private EmsPcsDataMapper emsPcsDataMapper; + + @Autowired + private EmsPcsBranchDataMapper emsPcsBranchDataMapper; + + @Autowired + private RedisCache redisCache; + + + @Override + public void handleFxData(String message) { + JSONArray arraylist = JSONArray.parseArray(message); + + for (int i = 0; i < arraylist.size(); i++) { + JSONObject obj = JSONObject.parseObject(arraylist.get(i).toString()); + + String deviceId = obj.get("Device").toString(); + String jsonData = obj.get("Data").toString(); + + log.info("deviceId:" + deviceId); + if (deviceId.contains("BMSD")) { + batteryStackDataProcess(deviceId, jsonData); + + } else if (deviceId.contains("BMSC")) { + log.info("BMSC data:"+ jsonData); + batteryCluserDataProcess(deviceId, jsonData); + batteryDataProcess(deviceId, jsonData); + + } else if (deviceId.contains("PCS")) { + pcsDataProcess(deviceId, jsonData); + pcsBranchDataProcess(deviceId, jsonData); + } + } + } + private void batteryStackDataProcess(String deviceId, String dataJson) { + + //电池堆 + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + //BMS 电池簇 + EmsBatteryStack dataStack = new EmsBatteryStack(); + // 设置所有 BigDecimal 类型字段为 ZERO + dataStack.setChargeableCapacity(StringUtils.getBigDecimal(obj.get("KCDL"))); + dataStack.setTotalChargedCapacity(StringUtils.getBigDecimal(obj.get("LJCDDL"))); + dataStack.setDischargeableCapacity(StringUtils.getBigDecimal(obj.get("KFDL"))); + dataStack.setTotalDischargedCapacity(StringUtils.getBigDecimal(obj.get("LJFDDL"))); + dataStack.setSoh(StringUtils.getBigDecimal(obj.get("ZSOH"))); + dataStack.setAverageTemperature(StringUtils.getBigDecimal(obj.get("MKWD"))); + dataStack.setInsulationResistance(StringUtils.getBigDecimal(obj.get("ZJYDZ"))); + dataStack.setCurrentSoc(StringUtils.getBigDecimal(obj.get("ZSOC"))); + dataStack.setMaxAllowedChargePower(StringUtils.getBigDecimal(obj.get("YXCDZDGL"))); + dataStack.setMaxAllowedDischargePower(StringUtils.getBigDecimal(obj.get("YXFDZDGL"))); + dataStack.setMaxAllowedChargeVoltage(StringUtils.getBigDecimal(obj.get("YXCDZDDY"))); + dataStack.setMaxAllowedDischargeVoltage(StringUtils.getBigDecimal(obj.get("YXFDZDDY"))); + dataStack.setMaxAllowedChargeCurrent(StringUtils.getBigDecimal(obj.get("YXCDZDDL"))); + dataStack.setMaxAllowedDischargeCurrent(StringUtils.getBigDecimal(obj.get("YXFDZDDL"))); + dataStack.setBatteryPackVoltage(StringUtils.getBigDecimal(obj.get("ZDY"))); + dataStack.setBatteryPackCurrent(StringUtils.getBigDecimal(obj.get("ZDL"))); + dataStack.setBatteryPackTemp(StringUtils.getBigDecimal(obj.get("MKWD"))); + dataStack.setBatteryPackSoc(StringUtils.getBigDecimal(obj.get("ZSOC"))); + dataStack.setBatteryPackSoh(StringUtils.getBigDecimal(obj.get("ZSOH"))); + dataStack.setBatteryPackInsulationResistance(StringUtils.getBigDecimal(obj.get("ZJYDZ"))); + dataStack.setAvgCellVoltage(StringUtils.getBigDecimal(obj.get("PJDTDY"))); + dataStack.setAvgCellTemp(StringUtils.getBigDecimal(obj.get("PJDTWD"))); + dataStack.setMaxCellVoltage(StringUtils.getBigDecimal(obj.get("ZGDTDY"))); + dataStack.setMinCellVoltage(StringUtils.getBigDecimal(obj.get("ZDDTDY"))); + dataStack.setMaxCellTemp(StringUtils.getBigDecimal(obj.get("ZGDTWD"))); + dataStack.setMinCellTemp(StringUtils.getBigDecimal(obj.get("ZDDTWD"))); + dataStack.setMaxCellSoc(StringUtils.getBigDecimal(obj.get("ZGDTSOC"))); + dataStack.setMinCellSoc(StringUtils.getBigDecimal(obj.get("ZDDTSOC"))); + dataStack.setMaxCellSoh(StringUtils.getBigDecimal(obj.get("ZGDTSOH"))); + dataStack.setMinCellSoh(StringUtils.getBigDecimal(obj.get("ZDDTSOH"))); + dataStack.setTotalChargeEnergy(StringUtils.getBigDecimal(obj.get("DCLJCDDL"))); + dataStack.setTotalDischargeEnergy(StringUtils.getBigDecimal(obj.get("DCLJFDDL"))); + + // 其他非 BigDecimal 字段 + dataStack.setWorkStatus(WorkStatus.NORMAL.getCode()); // 或其他默认值 + dataStack.setPcsCommunicationStatus(CommunicationStatus.OK.getCode()); + dataStack.setEmsCommunicationStatus(CommunicationStatus.OK.getCode()); + dataStack.setCreateBy("system"); + dataStack.setCreateTime(DateUtils.getNowDate()); + dataStack.setUpdateBy("system"); + dataStack.setUpdateTime(DateUtils.getNowDate()); + dataStack.setSiteId("021_FXX_01"); + dataStack.setDeviceId(deviceId); + dataStack.setMaxCellVoltageId(StringUtils.getLong(obj.get("ZGDTDYDYD"))); + dataStack.setMinCellVoltageId(StringUtils.getLong(obj.get("ZDDTDYDYD"))); + dataStack.setMaxCellTempId(StringUtils.getLong(obj.get("ZGDTWDDYD"))); + dataStack.setMinCellTempId(StringUtils.getLong(obj.get("ZDDTWDDYD"))); + dataStack.setMaxCellSocId(StringUtils.getLong(obj.get("ZGDTSOCDYD"))); + dataStack.setMinCellSocId(StringUtils.getLong(obj.get("ZDDTSOCDYD"))); + dataStack.setMaxCellSohId(StringUtils.getLong(obj.get("ZGDTSOHDYD"))); + dataStack.setMinCellSohId(StringUtils.getLong(obj.get("ZDDTSOHDYD"))); + + emsBatteryStackMapper.insertEmsBatteryStack(dataStack); + + + } + + + private void batteryCluserDataProcess(String deviceId, String dataJson) { + + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + + //BMS 电池簇 + EmsBatteryCluster data = new EmsBatteryCluster(); + // 设置所有 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.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("021_FXX_01"); + data.setDeviceId(deviceId); + data.setMaxCellVoltageId(StringUtils.getLong(obj.get("ZGDTDYDYD"))); + data.setMinCellVoltageId(StringUtils.getLong(obj.get("ZDDTDYDYD"))); + data.setMaxCellTempId(StringUtils.getLong(obj.get("ZGDTWDDYD"))); + data.setMinCellTempId(StringUtils.getLong(obj.get("ZDDTWDDYD"))); + data.setMaxCellSocId(StringUtils.getLong(obj.get("ZGDTSOCDYD"))); + data.setMinCellSocId(StringUtils.getLong(obj.get("ZDDTSOCDYD"))); + data.setMaxCellSohId(StringUtils.getLong(obj.get("ZGDTSOHDYD"))); + data.setMinCellSohId(StringUtils.getLong(obj.get("ZDDTSOHDYD"))); + data.setStackDeviceId("1"); + emsBatteryClusterMapper.insertEmsBatteryCluster(data); + + + } + + private void batteryDataProcess(String deviceId, String dataJson) { + + //单体电池 + Map> records = processData(JSON.parseObject(dataJson, new TypeReference>() {})); + List list = new ArrayList<>(); + //单体电池 + for (Map.Entry> record : records.entrySet()) { + String recordId = record.getKey(); + Map fields = record.getValue(); + + EmsBatteryData batteryData = new EmsBatteryData(); + batteryData.setDeviceId(recordId); + batteryData.setBatteryCellId(recordId); + 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(deviceId); + + // 时间戳 + batteryData.setDataTimestamp(new Date()); + + // ID字段 + batteryData.setSiteId(("021_FXX_01")); + batteryData.setClusterDeviceId(("021")); + + list.add(batteryData); + } + if (list.size() > 0 ) { + emsBatteryDataMapper.insertEmsBatteryDataList(list); + + redisCache.setCacheList(deviceId + "_DATA_LIST", list); + } + } + + + private void pcsDataProcess(String deviceId, String dataJson) { + Map obj = JSON.parseObject(dataJson, new TypeReference>() { + }); + //pcs + EmsPcsData pcsData = new EmsPcsData(); + // 时间与状态类字段 + pcsData.setDataUpdateTime(new Date()); + pcsData.setWorkStatus(WorkStatus.NORMAL.getCode()); + pcsData.setGridStatus(GridStatus.GRID.getCode()); + pcsData.setDeviceStatus(DeviceStatus.ONLINE.getCode()); + pcsData.setControlMode(ControlModeStatus.REMOTE.getCode()); + + // 功率与能量类字段 + pcsData.setTotalActivePower(StringUtils.getBigDecimal(obj.get("JLCCDYGGL"))); + pcsData.setDailyAcChargeEnergy(StringUtils.getBigDecimal(obj.get("RCDL"))); + pcsData.setTotalReactivePower(StringUtils.getBigDecimal(obj.get("JLCRXWGGL"))); + 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.setDcVoltage(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); +// pcsData.setDcCurrent(StringUtils.getBigDecimal(obj.get("ChargeableCapacity"))); + + // 系统管理字段 + pcsData.setCreateBy("system"); + pcsData.setCreateTime(DateUtils.getNowDate()); + pcsData.setUpdateBy("system"); + pcsData.setUpdateTime(DateUtils.getNowDate()); + pcsData.setSiteId("021_FXX_01"); + pcsData.setDeviceId(deviceId); + pcsData.setDateMonth(DateUtils.getNowMonthLong()); + pcsData.setDateDay(DateUtils.getNowDayLong()); + + emsPcsDataMapper.insertEmsPcsData(pcsData); + + } + + + private void pcsBranchDataProcess(String deviceId, String dataJson) { + + Map> records = processDataPrefix(JSON.parseObject(dataJson, new TypeReference>() {})); + List list = new ArrayList<>(); + + //PCS支路 + for (Map.Entry> record : records.entrySet()) { + String recordId = record.getKey(); + Map fields = record.getValue(); + + EmsPcsBranchData data = new EmsPcsBranchData(); + data.setDeviceId(deviceId); + data.setGridStatus(GridStatus.GRID.getCode()); + 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("DWVXDY"))); + data.setGridVVoltage(StringUtils.getBigDecimal(fields.get("DWUXDY"))); + 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); + list.add(data); + } + if (list.size() > 0 ) { + emsPcsBranchDataMapper.insertPcsBranchDataList(list); + } + + } + + + // 数据分组处理 + 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()); + } + return records; + } + +}