62 lines
4.0 KiB
Markdown
62 lines
4.0 KiB
Markdown
## 目标
|
||
- 将 `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(...)`
|
||
- 新实体与持久化文件(仅用于充/放电汇总)按上述命名与目录创建
|
||
|
||
## 交付结果
|
||
- 三类数据均入库,对应后台列表页可查询;极值数据已按此前改造保持一致风格 |