feat: 扩展心跳消息支持电力与空调设备数组字段

新增 Kafka 消息中 electricity[] 和 air_conditioner[] 数组字段支持,用于存储电力与空调设备明细数据。数据库表新增对应数组列并创建 GIN 索引优化查询性能,processor 实现数组字段校验与聚合转换逻辑。

主要变更:
- Kafka 消息规范新增 electricity 和 air_conditioner 数组字段定义
- 数据库 heartbeat_events 表新增 14 个数组列并创建 4 个 GIN 索引
- processor 实现数组字段解析、校验及聚合转换逻辑
- 更新相关文档与测试用例,确保端到端功能完整
This commit is contained in:
2026-01-16 14:45:36 +08:00
parent 7d5b9c50ea
commit 455185ac5d
16 changed files with 693 additions and 8 deletions

View File

@@ -58,6 +58,21 @@
- **THEN** 系统应能够自动创建对应日分区或确保分区被预创建
- **AND** 不应影响持续写入(高吞吐场景)
### Requirement: 数组字段存储与索引
系统 MUST 支持将电力与空调子设备数据以数组列形式存储,并为指定数组列建立针对元素查询的索引。
#### Scenario: 新增数组列用于存储电力与空调子设备数据
- **WHEN** 系统初始化 v2 心跳明细表结构时
- **THEN** 表结构应包含以下新增列:
- elec_addresstext[]
- air_addresstext[]
- voltagedouble precision[]、amperedouble precision[]、powerdouble precision[]、phasetext[]、energydouble precision[]、sum_energydouble precision[]
- stateint2[]、modelint2[]、speedint2[]、set_tempint2[]、now_tempint2[]、solenoid_valveint2[]
#### Scenario: 针对数组元素的索引
- **WHEN** 对 elec_address、air_address、state、model 执行“元素包含”类查询时
- **THEN** 系统应提供 GIN 索引以优化查询
### Requirement: 数据查询支持
系统 MUST 支持基本的数据查询操作,用于监控和调试。

View File

@@ -53,6 +53,32 @@ Kafka 心跳消息 MUST 包含数据库落库所需的必填字段,并采用 U
- **THEN** 消息 value 应为 JSONUTF-8
- **AND** 至少包含 ts_ms、hotel_id、room_id、device_id、ip、power_state、guest_type、cardless_state、service_mask、pms_state、carbon_state、device_count、comm_seq
- **AND** 可选包含 extrajson object
- **AND** 可选包含 electricityarray of object
- **AND** 可选包含 air_conditionerarray of object
#### Scenario: electricity 数组字段结构
- **WHEN** 生产者在心跳消息中携带 electricity 字段时
- **THEN** electricity MUST 为数组
- **AND** 数组每个元素 MUST 为对象,包含:
- addressstring设备地址
- voltagedouble电压
- amperedouble电流
- powerdouble功率
- phasestring相位
- energydouble能耗
- sum_energydouble总能耗
#### Scenario: air_conditioner 数组字段结构
- **WHEN** 生产者在心跳消息中携带 air_conditioner 字段时
- **THEN** air_conditioner MUST 为数组
- **AND** 数组每个元素 MUST 为对象,包含:
- addressstring设备地址
- stateint2开关状态
- modelint2运行模式
- speedint2风速设置
- set_tempint2设定温度
- now_tempint2当前温度
- solenoid_valveint2电磁阀门状态
### Requirement: 分区键友好的 Kafka Key
系统 MUST 支持使用 `hotel_id:device_id` 作为 Kafka message key 以获得更好的分区与有序性。

View File

@@ -55,6 +55,29 @@
- **WHEN** 心跳数据缺失必填字段时
- **THEN** 系统应判定为无效数据并丢弃
### Requirement: 数组字段聚合转换
系统 MUST 支持将 electricity[] 与 air_conditioner[] 的对象数组聚合为数据库的“列数组”,并保持原始顺序一致性。
#### Scenario: electricity 数组聚合为列数组
- **WHEN** 心跳数据包含 electricity对象数组
- **THEN** 系统应按输入数组原始顺序提取并聚合为:
- elec_address[]、voltage[]、ampere[]、power[]、phase[]、energy[]、sum_energy[]
- **AND** 同一条心跳记录内,上述各数组下标必须与输入 electricity 的下标一一对应
#### Scenario: air_conditioner 数组聚合为列数组
- **WHEN** 心跳数据包含 air_conditioner对象数组
- **THEN** 系统应按输入数组原始顺序提取并聚合为:
- air_address[]、state[]、model[]、speed[]、set_temp[]、now_temp[]、solenoid_valve[]
- **AND** 同一条心跳记录内,上述各数组下标必须与输入 air_conditioner 的下标一一对应
#### Scenario: 数组字段缺失与类型校验
- **WHEN** electricity 或 air_conditioner 字段存在但类型不为数组时
- **THEN** 系统应判定该条消息为无效并丢弃
- **AND** 记录错误日志
- **WHEN** 数组元素字段缺失或类型不匹配但消息其余必填字段有效时
- **THEN** 系统应保持数组长度对齐,并对无法转换的单元写入 null
- **AND** 不应破坏其余字段的写入
### Requirement: 批量处理支持
系统 MUST 支持批量处理心跳数据,提高处理效率。