## 目标 - 将 `MqttService` 中解析的三类数据按实体模型入库: - 单体电压数据 → 表 `subsystem_voltage` - 单体温度数据 → 表 `subsystem_temperature` - 累计充/放电量 → 新增表(如 `charge_discharge_summary`) ## 现状与模型 - 单体电压解析位于 `src/main/java/com/evobms/project/bms/service/MqttService.java:257-265`,具体方法在 `parseCellVoltageAtIndex` 与 `parseCellVoltagesDetail`。 - 领域模型:`SubsystemVoltage`(`src/main/java/com/evobms/project/Battery/domain/SubsystemVoltage.java`) - Mapper/XML:`SubsystemVoltageMapper` 与 `mybatis/voltage/SubsystemVoltageMapper.xml` - 单体温度解析位于 `parseCellTemperatureAtIndex` 与 `parseCellTemperaturesDetail`。 - 领域模型:`SubsystemTemperature`(`src/main/java/com/evobms/project/Battery/domain/SubsystemTemperature.java`) - Mapper/XML:`SubsystemTemperatureMapper` 与 `mybatis/temperature/SubsystemTemperatureMapper.xml` - 累计充/放电量解析在 `parseChargeDischargeAtIndex`,目前 `saveChargeDischargeSummary(...)` 空实现,代码库未定义实体与表。 ## 字段映射 - 电压(来自 `parseCellVoltageAtIndex`) - `device_id` ⇔ 设备 SN - `timestamp` ⇔ `new Date()` - `subsystem_count` ⇔ 索引77 - `subsystem_no` ⇔ 索引78 - `subsystem_voltage` ⇔ 索引79-80 ×0.1V - `subsystem_current` ⇔ 索引81-82 (值-10000)×0.1A - `total_battery_count` ⇔ 索引83-84 - `frame_start_battery_no` ⇔ 索引85-86 - `frame_battery_count` ⇔ 索引87 - `battery_voltages` ⇔ 从 `parseCellVoltagesDetail` 得到列表,按 "," 连接为字符串(mV→V) - 温度(来自 `parseCellTemperatureAtIndex`) - `device_id`、`timestamp` - `subsystem_count` ⇔ 索引449 - `subsystem_no` ⇔ 索引450 - `temp_probe_count` ⇔ 索引451-452 - `temperature_values` ⇔ 从 `parseCellTemperaturesDetail` 得到列表(字节-40℃),按 "," 连接为字符串 - 充/放电汇总(来自 `parseChargeDischargeAtIndex`) - 建议新增实体 `ChargeDischargeSummary`:`device_id`, `timestamp`, `discharge_kwh`, `charge_kwh`, 审计字段 ## 实施步骤 1. 在 `MqttService` 注入服务 - `ISubsystemVoltageService`、`ISubsystemTemperatureService` 2. 电压数据保存 - 调整 `parseCellVoltagesDetail(byte[], start, deviceSn, startCellIndex, cellCount)` 返回 `List`(以 V 为单位) - 在 `parseCellVoltageAtIndex(...)` 构造 `SubsystemVoltage`:填充映射字段与 `battery_voltages`(以 "," 连接),调用 `ISubsystemVoltageService.insertSubsystemVoltage(...)` 3. 温度数据保存 - 调整 `parseCellTemperaturesDetail(byte[], start, deviceSn, tempCount)` 返回 `List`(单位 ℃) - 在 `parseCellTemperatureAtIndex(...)` 构造 `SubsystemTemperature`:填充映射字段与 `temperature_values`(以 "," 连接),调用 `ISubsystemTemperatureService.insertSubsystemTemperature(...)` 4. 累计充/放电量持久化 - 新增实体、Mapper、XML、Service(命名示例:`ChargeDischargeSummary`、`ChargeDischargeSummaryMapper`、`ChargeDischargeSummaryServiceImpl`) - 在 `saveChargeDischargeSummary(deviceSn, dischargeKwh, chargeKwh)` 构造实体并插入 5. 审计字段 - 为入库对象设置 `create_time`(使用 `BaseEntity.setCreateTime(new Date())`),`create_by` 设置为设备 SN ## 校验与兼容 - 编译并运行现有单元/集成测试,确保构建成功 - 注意 `SubsystemTemperatureMapper.xml` 中 `updatedTime` 属性命名与 `BaseEntity.updateTime` 不一致,当前插入流程不依赖该字段,可后续统一为 `updateTime` ## 变更点位 - `MqttService.java:257-265` 处的三个解析方法内新增调用保存方法 - 新增或调整的私有方法:`saveSubsystemVoltage(...)`、`saveSubsystemTemperature(...)`、完善 `saveChargeDischargeSummary(...)` - 新实体与持久化文件(仅用于充/放电汇总)按上述命名与目录创建 ## 交付结果 - 三类数据均入库,对应后台列表页可查询;极值数据已按此前改造保持一致风格