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 ce774f7..4baff1c 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 @@ -6,6 +6,8 @@ import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.TypeReference; import com.fasterxml.jackson.databind.json.JsonMapper; +import com.xzzn.common.utils.DateUtils; +import com.xzzn.common.utils.StringUtils; import com.xzzn.ems.domain.EmsBatteryData; import com.xzzn.ems.domain.EmsMqttMessage; import com.xzzn.ems.domain.EmsPcsData; @@ -26,10 +28,7 @@ import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Service public class MqttMessageController implements MqttPublisher, MqttSubscriber { @@ -90,7 +89,7 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { System.out.println("[DEVICE] data: " + payload); try { // 业务处理逻辑 -// handleFxData(JSONArray.parseArray(payload).get(0).toString()); + handleFxData(payload); EmsMqttMessage mqttMessage = new EmsMqttMessage(); mqttMessage.setMqttTopic(topic); @@ -135,18 +134,19 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { private void handleFxData(String message) { + JSONArray arraylist = JSONArray.parseArray(message); - - List upAll = JSON.parseObject(message, new TypeReference>() {}); - - for (int i = 0; i < upAll.size(); i++) { - JSONObject obj = JSONObject.parseObject(upAll.get(i)); + 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("BMS")) { + log.info("===================="); + log.info("BMS data:"+ jsonData); + Map> records = processData(JSON.parseObject(jsonData, new TypeReference>() {})); //单体电池 @@ -157,19 +157,85 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { EmsBatteryData data = new EmsBatteryData(); data.setDeviceId(recordId); data.setBatteryCellId(recordId); - data.setSoc(new BigDecimal(fields.get("DTSOC").toString())); - data.setSoh(new BigDecimal(fields.get("DTSOH").toString())); - data.setTemperature(new BigDecimal(fields.get("DTWD").toString())); - data.setVoltage(new BigDecimal(fields.get("DTDY").toString())); + data.setSoc(StringUtils.getBigDecimal(fields.get("DTSOC"))); + data.setSoh(StringUtils.getBigDecimal(fields.get("DTSOH"))); + data.setTemperature(StringUtils.getBigDecimal(fields.get("DTWD"))); + data.setVoltage(StringUtils.getBigDecimal(fields.get("DTDY"))); data.setBatteryCluster(deviceId); data.setBatteryPack(deviceId); + + // 时间戳 + data.setDataTimestamp(new Date()); + + // ID字段 + data.setSiteId(Long.parseLong("021")); + data.setClusterDeviceId(Long.parseLong("021")); + + emsBatteryDataService.insertEmsBatteryData(data); } } else if (deviceId.contains("PCS")) { + log.info("===================="); + + log.info("PCS data:"+ jsonData); //pcs EmsPcsData data = new EmsPcsData(); + // 时间与状态类字段 + data.setDataUpdateTime(new Date()); + data.setWorkStatus("A"); + data.setGridStatus("B"); + data.setDeviceStatus("C"); + data.setControlMode("D"); + // 功率与能量类字段 + data.setTotalActivePower(BigDecimal.ZERO); + data.setDailyAcChargeEnergy(BigDecimal.ZERO); + data.setTotalReactivePower(BigDecimal.ZERO); + data.setDailyAcDischargeEnergy(BigDecimal.ZERO); + data.setTotalApparentPower(BigDecimal.ZERO); + data.setTotalPowerFactor(BigDecimal.ZERO); + data.setDcPower(BigDecimal.ZERO); + data.setTotalAcChargeEnergy(BigDecimal.ZERO); + data.setTotalAcDischargeEnergy(BigDecimal.ZERO); + data.setAcChargeActivePower(BigDecimal.ZERO); + data.setAcCapacitiveReactivePower(BigDecimal.ZERO); + data.setAcDischargeActivePower(BigDecimal.ZERO); + data.setAcInductiveReactivePower(BigDecimal.ZERO); + data.setMaxCapacitivePowerCapacity(BigDecimal.ZERO); + data.setMaxInductivePowerCapacity(BigDecimal.ZERO); + data.setMaxChargePowerCapacity(BigDecimal.ZERO); + data.setMaxDischargePowerCapacity(BigDecimal.ZERO); + + + // 温度与环境参数 + data.setPcsModuleTemperature(BigDecimal.ZERO); + data.setPcsEnvironmentTemperature(BigDecimal.ZERO); + data.setAcFrequency(BigDecimal.ZERO); + + // 状态指示类 + data.setBranchStatus("A"); + data.setDischargeStatus("A"); + data.setAcSwitchStatus("A"); + data.setDcSwitchStatus("A"); + data.setRemoteControlStatus("A"); + + // 直流参数 + data.setDcVoltage(BigDecimal.ZERO); + data.setDcCurrent(BigDecimal.ZERO); + + // 系统管理字段 +// data.setCreateBy(BigDecimal.ZERO); +// data.setCreateTime(BigDecimal.ZERO); +// data.setUpdateBy(BigDecimal.ZERO); +// data.setUpdateTime(BigDecimal.ZERO); +// data.setRemark(BigDecimal.ZERO); + data.setSiteId(Long.parseLong("021")); + data.setDeviceId(deviceId); + data.setDateMonth(Long.parseLong("6")); + data.setDateDay(Long.parseLong("28")); + + data.setDeviceId(deviceId); @@ -191,6 +257,12 @@ public class MqttMessageController implements MqttPublisher, MqttSubscriber { 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); 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 bf29afe..0eb43f4 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 @@ -1,5 +1,6 @@ package com.xzzn.common.utils; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; @@ -719,4 +720,15 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils } return sb.toString(); } + + + public static BigDecimal getBigDecimal(Object s){ + + try { + return new BigDecimal(s.toString()); + } catch (NumberFormatException e) { + return BigDecimal.ZERO; + } + + } } \ No newline at end of file diff --git a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsData.java b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsData.java index d815905..1864b04 100644 --- a/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsData.java +++ b/ems-system/src/main/java/com/xzzn/ems/domain/EmsPcsData.java @@ -12,7 +12,7 @@ import com.xzzn.common.annotation.Excel; * PCS数据对象 ems_pcs_data * * @author xzzn - * @date 2025-06-17 + * @date 2025-06-28 */ public class EmsPcsData extends BaseEntity { @@ -22,7 +22,7 @@ public class EmsPcsData extends BaseEntity private Long id; /** 数据更新时间 */ - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd") @Excel(name = "数据更新时间", width = 30, dateFormat = "yyyy-MM-dd") private Date dataUpdateTime; @@ -132,11 +132,63 @@ public class EmsPcsData extends BaseEntity /** 月 */ @Excel(name = "月") - private int dateMonth; + private Long dateMonth; /** 日 */ @Excel(name = "日") - private int dateDay; + private Long dateDay; + + /** 总交流充电量 (kWh) */ + @Excel(name = "总交流充电量 (kWh)") + private BigDecimal totalAcChargeEnergy; + + /** 总交流放电量 (kWh) */ + @Excel(name = "总交流放电量 (kWh)") + private BigDecimal totalAcDischargeEnergy; + + /** 交流侧充电有功功率 */ + @Excel(name = "交流侧充电有功功率") + private BigDecimal acChargeActivePower; + + /** 交流侧容性无功功率 */ + @Excel(name = "交流侧容性无功功率") + private BigDecimal acCapacitiveReactivePower; + + /** 交流侧放电有功功率 */ + @Excel(name = "交流侧放电有功功率") + private BigDecimal acDischargeActivePower; + + /** 交流侧感性无功功率 */ + @Excel(name = "交流侧感性无功功率") + private BigDecimal acInductiveReactivePower; + + /** 最大容性无功能力 */ + @Excel(name = "最大容性无功能力") + private BigDecimal maxCapacitivePowerCapacity; + + /** 最大感性无功能力 */ + @Excel(name = "最大感性无功能力") + private BigDecimal maxInductivePowerCapacity; + + /** 最大可冲功率 */ + @Excel(name = "最大可冲功率") + private BigDecimal maxChargePowerCapacity; + + /** 最大可放功率 */ + @Excel(name = "最大可放功率") + private BigDecimal maxDischargePowerCapacity; + + /** 交流开关状态 */ + @Excel(name = "交流开关状态") + private String acSwitchStatus; + + /** 直流开关状态 */ + @Excel(name = "直流开关状态") + private String dcSwitchStatus; + + /** 远程投退状态 */ + @Excel(name = "远程投退状态") + private String remoteControlStatus; public void setId(Long id) { @@ -418,20 +470,154 @@ public class EmsPcsData extends BaseEntity return deviceId; } - public int getDateMonth() { - return dateMonth; - } - - public void setDateMonth(int dateMonth) { + public void setDateMonth(Long dateMonth) + { this.dateMonth = dateMonth; } - public int getDateDay() { + public Long getDateMonth() + { + return dateMonth; + } + + public void setDateDay(Long dateDay) + { + this.dateDay = dateDay; + } + + public Long getDateDay() + { return dateDay; } - public void setDateDay(int dateDay) { - this.dateDay = dateDay; + public void setTotalAcChargeEnergy(BigDecimal totalAcChargeEnergy) + { + this.totalAcChargeEnergy = totalAcChargeEnergy; + } + + public BigDecimal getTotalAcChargeEnergy() + { + return totalAcChargeEnergy; + } + + public void setTotalAcDischargeEnergy(BigDecimal totalAcDischargeEnergy) + { + this.totalAcDischargeEnergy = totalAcDischargeEnergy; + } + + public BigDecimal getTotalAcDischargeEnergy() + { + return totalAcDischargeEnergy; + } + + public void setAcChargeActivePower(BigDecimal acChargeActivePower) + { + this.acChargeActivePower = acChargeActivePower; + } + + public BigDecimal getAcChargeActivePower() + { + return acChargeActivePower; + } + + public void setAcCapacitiveReactivePower(BigDecimal acCapacitiveReactivePower) + { + this.acCapacitiveReactivePower = acCapacitiveReactivePower; + } + + public BigDecimal getAcCapacitiveReactivePower() + { + return acCapacitiveReactivePower; + } + + public void setAcDischargeActivePower(BigDecimal acDischargeActivePower) + { + this.acDischargeActivePower = acDischargeActivePower; + } + + public BigDecimal getAcDischargeActivePower() + { + return acDischargeActivePower; + } + + public void setAcInductiveReactivePower(BigDecimal acInductiveReactivePower) + { + this.acInductiveReactivePower = acInductiveReactivePower; + } + + public BigDecimal getAcInductiveReactivePower() + { + return acInductiveReactivePower; + } + + public void setMaxCapacitivePowerCapacity(BigDecimal maxCapacitivePowerCapacity) + { + this.maxCapacitivePowerCapacity = maxCapacitivePowerCapacity; + } + + public BigDecimal getMaxCapacitivePowerCapacity() + { + return maxCapacitivePowerCapacity; + } + + public void setMaxInductivePowerCapacity(BigDecimal maxInductivePowerCapacity) + { + this.maxInductivePowerCapacity = maxInductivePowerCapacity; + } + + public BigDecimal getMaxInductivePowerCapacity() + { + return maxInductivePowerCapacity; + } + + public void setMaxChargePowerCapacity(BigDecimal maxChargePowerCapacity) + { + this.maxChargePowerCapacity = maxChargePowerCapacity; + } + + public BigDecimal getMaxChargePowerCapacity() + { + return maxChargePowerCapacity; + } + + public void setMaxDischargePowerCapacity(BigDecimal maxDischargePowerCapacity) + { + this.maxDischargePowerCapacity = maxDischargePowerCapacity; + } + + public BigDecimal getMaxDischargePowerCapacity() + { + return maxDischargePowerCapacity; + } + + public void setAcSwitchStatus(String acSwitchStatus) + { + this.acSwitchStatus = acSwitchStatus; + } + + public String getAcSwitchStatus() + { + return acSwitchStatus; + } + + public void setDcSwitchStatus(String dcSwitchStatus) + { + this.dcSwitchStatus = dcSwitchStatus; + } + + public String getDcSwitchStatus() + { + return dcSwitchStatus; + } + + public void setRemoteControlStatus(String remoteControlStatus) + { + this.remoteControlStatus = remoteControlStatus; + } + + public String getRemoteControlStatus() + { + return remoteControlStatus; } @Override @@ -472,7 +658,19 @@ public class EmsPcsData extends BaseEntity .append("deviceId", getDeviceId()) .append("dateMonth", getDateMonth()) .append("dateDay", getDateDay()) + .append("totalAcChargeEnergy", getTotalAcChargeEnergy()) + .append("totalAcDischargeEnergy", getTotalAcDischargeEnergy()) + .append("acChargeActivePower", getAcChargeActivePower()) + .append("acCapacitiveReactivePower", getAcCapacitiveReactivePower()) + .append("acDischargeActivePower", getAcDischargeActivePower()) + .append("acInductiveReactivePower", getAcInductiveReactivePower()) + .append("maxCapacitivePowerCapacity", getMaxCapacitivePowerCapacity()) + .append("maxInductivePowerCapacity", getMaxInductivePowerCapacity()) + .append("maxChargePowerCapacity", getMaxChargePowerCapacity()) + .append("maxDischargePowerCapacity", getMaxDischargePowerCapacity()) + .append("acSwitchStatus", getAcSwitchStatus()) + .append("dcSwitchStatus", getDcSwitchStatus()) + .append("remoteControlStatus", getRemoteControlStatus()) .toString(); } } - diff --git a/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml b/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml index 1746e64..c0f90a7 100644 --- a/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml +++ b/ems-system/src/main/resources/mapper/ems/EmsPcsDataMapper.xml @@ -40,11 +40,23 @@ - + + + + + + + + + + + + + - select id, data_update_time, work_status, grid_status, device_status, control_mode, total_active_power, daily_ac_charge_energy, a_phase_voltage, a_phase_current, total_reactive_power, daily_ac_discharge_energy, b_phase_voltage, b_phase_current, total_apparent_power, pcs_module_temperature, c_phase_voltage, c_phase_current, total_power_factor, pcs_environment_temperature, ac_frequency, branch_status, discharge_status, dc_power, dc_voltage, dc_current, create_by, create_time, update_by, update_time, remark, site_id, device_id, date_month, date_day, communication_status from ems_pcs_data + select id, data_update_time, work_status, grid_status, device_status, control_mode, total_active_power, daily_ac_charge_energy, a_phase_voltage, a_phase_current, total_reactive_power, daily_ac_discharge_energy, b_phase_voltage, b_phase_current, total_apparent_power, pcs_module_temperature, c_phase_voltage, c_phase_current, total_power_factor, pcs_environment_temperature, ac_frequency, branch_status, discharge_status, dc_power, dc_voltage, dc_current, create_by, create_time, update_by, update_time, remark, site_id, device_id, date_month, date_day, total_ac_charge_energy, total_ac_discharge_energy, ac_charge_active_power, ac_capacitive_reactive_power, ac_discharge_active_power, ac_inductive_reactive_power, max_capacitive_power_capacity, max_inductive_power_capacity, max_charge_power_capacity, max_discharge_power_capacity, ac_switch_status, dc_switch_status, remote_control_status from ems_pcs_data @@ -122,10 +146,22 @@ update_time, remark, site_id, - device_id, + device_id, date_month, date_day, - communication_status, + total_ac_charge_energy, + total_ac_discharge_energy, + ac_charge_active_power, + ac_capacitive_reactive_power, + ac_discharge_active_power, + ac_inductive_reactive_power, + max_capacitive_power_capacity, + max_inductive_power_capacity, + max_charge_power_capacity, + max_discharge_power_capacity, + ac_switch_status, + dc_switch_status, + remote_control_status, #{dataUpdateTime}, @@ -159,10 +195,22 @@ #{updateTime}, #{remark}, #{siteId}, - #{deviceId}, + #{deviceId}, #{dateMonth}, #{dateDay}, - #{communicationStatus}, + #{totalAcChargeEnergy}, + #{totalAcDischargeEnergy}, + #{acChargeActivePower}, + #{acCapacitiveReactivePower}, + #{acDischargeActivePower}, + #{acInductiveReactivePower}, + #{maxCapacitivePowerCapacity}, + #{maxInductivePowerCapacity}, + #{maxChargePowerCapacity}, + #{maxDischargePowerCapacity}, + #{acSwitchStatus}, + #{dcSwitchStatus}, + #{remoteControlStatus}, @@ -200,10 +248,22 @@ update_time = #{updateTime}, remark = #{remark}, site_id = #{siteId}, - device_id = #{deviceId}, + device_id = #{deviceId}, date_month = #{dateMonth}, date_day = #{dateDay}, - communication_status = #{communicationStatus}, + total_ac_charge_energy = #{totalAcChargeEnergy}, + total_ac_discharge_energy = #{totalAcDischargeEnergy}, + ac_charge_active_power = #{acChargeActivePower}, + ac_capacitive_reactive_power = #{acCapacitiveReactivePower}, + ac_discharge_active_power = #{acDischargeActivePower}, + ac_inductive_reactive_power = #{acInductiveReactivePower}, + max_capacitive_power_capacity = #{maxCapacitivePowerCapacity}, + max_inductive_power_capacity = #{maxInductivePowerCapacity}, + max_charge_power_capacity = #{maxChargePowerCapacity}, + max_discharge_power_capacity = #{maxDischargePowerCapacity}, + ac_switch_status = #{acSwitchStatus}, + dc_switch_status = #{dcSwitchStatus}, + remote_control_status = #{remoteControlStatus}, where id = #{id} @@ -218,81 +278,4 @@ #{id} - - - - - - - - - - - - \ No newline at end of file