## 目标
- 将 `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<Double>`（以 V 为单位）
   - 在 `parseCellVoltageAtIndex(...)` 构造 `SubsystemVoltage`：填充映射字段与 `battery_voltages`（以 "," 连接），调用 `ISubsystemVoltageService.insertSubsystemVoltage(...)`
3. 温度数据保存
   - 调整 `parseCellTemperaturesDetail(byte[], start, deviceSn, tempCount)` 返回 `List<Integer>`（单位 ℃）
   - 在 `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(...)`
- 新实体与持久化文件（仅用于充/放电汇总）按上述命名与目录创建

## 交付结果
- 三类数据均入库，对应后台列表页可查询；极值数据已按此前改造保持一致风格