docs: 归档心跳数组扩展任务并更新规范文档

将已完成的任务清单、提案及规范从变更目录移至归档目录,并更新主规范文档以包含新增的数组字段与处理要求。这标志着该功能变更已从开发阶段进入完成归档阶段。
This commit is contained in:
2026-02-03 08:41:40 +08:00
parent 299e8de921
commit d10bedb7e7
9 changed files with 44 additions and 11 deletions

View File

@@ -0,0 +1,11 @@
## 1. Implementation
- [x] 1.1 更新 OpenSpec 增量规范Kafka/Processor/DB
- [x] 1.2 数据库脚本与初始化:新增数组列与索引
- [x] 1.3 Processor数组字段校验与聚合转换
- [x] 1.4 DB 写入:扩展批量 insert 列与参数
- [x] 1.5 测试:新增单元测试覆盖顺序与类型/缺失处理
- [x] 1.6 文档:更新 producer 与 DB schema
## 2. Validation
- [x] 2.1 运行单元测试与 lint
- [x] 2.2 在可用 PostgreSQL 环境执行冒烟(含数组列插入)

View File

@@ -1,11 +0,0 @@
## 1. Implementation
- [ ] 1.1 更新 OpenSpec 增量规范Kafka/Processor/DB
- [ ] 1.2 数据库脚本与初始化:新增数组列与索引
- [ ] 1.3 Processor数组字段校验与聚合转换
- [ ] 1.4 DB 写入:扩展批量 insert 列与参数
- [ ] 1.5 测试:新增单元测试覆盖顺序与类型/缺失处理
- [ ] 1.6 文档:更新 producer 与 DB schema
## 2. Validation
- [ ] 2.1 运行单元测试与 lint
- [ ] 2.2 在可用 PostgreSQL 环境执行冒烟(含数组列插入)

View File

@@ -95,3 +95,10 @@
- **THEN** 写入应路由到正确日分区 - **THEN** 写入应路由到正确日分区
- **AND** 常见查询hotel_id + 时间范围)应触发分区裁剪 - **AND** 常见查询hotel_id + 时间范围)应触发分区裁剪
## ADDED Requirements
### Requirement: 分区表新增数组列与数组元素索<E7B4A0><E7B4A2>?系统 SHALL <20><>?`heartbeat.heartbeat_events` 中新增用于存储电力与空调子设备的数组列并为指定数组列提供数组元素级查询索引<E7B4A2><E5BC95>?
#### Scenario: 新增数组<E695B0><E7BB84>?- **WHEN** 部署或升级数据库结构<E7BB93><E69E84>?- **THEN** 表应包含 elec_address、air_address、voltage、ampere、power、phase、energy、sum_energy、state、model、speed、set_temp、now_temp、solenoid_valve
#### Scenario: 数组元素索引
- **WHEN** 需要按 elec_address/air_address/state/model 的数组元素进行查<E8A18C><E69FA5>?- **THEN** 数据库应具备 GIN 索引以优化包含类查询

View File

@@ -92,3 +92,14 @@ Kafka 心跳消息 MUST 包含数据库落库所需的必填字段,并采用 U
- **THEN** 建议使用 `hotel_id:device_id` 作为 Kafka message key - **THEN** 建议使用 `hotel_id:device_id` 作为 Kafka message key
- **AND** 以提升同设备有序性与消费侧批量聚合效率 - **AND** 以提升同设备有序性与消费侧批量聚合效率
## ADDED Requirements
### Requirement: 心跳消息扩展数组字段
Kafka 心跳消息 SHALL 支持携带电力与空调子设备的数组字段以便消费端拆列落库与查询优化<E4BC98><E58C96>?
#### Scenario: 携带 electricity 数组
- **WHEN** 生产者需要上报电力设备明细时
- **THEN** 消息可选包<E98089><E58C85>?`electricity`array of object<63><74>?- **AND** 每个元素包含 address、voltage、ampere、power、phase、energy、sum_energy
#### Scenario: 携带 air_conditioner 数组
- **WHEN** 生产者需要上报空调设备明细时
- **THEN** 消息可选包<E98089><E58C85>?`air_conditioner`array of object<63><74>?- **AND** 每个元素包含 address、state、model、speed、set_temp、now_temp、solenoid_valve

View File

@@ -98,3 +98,18 @@
- **THEN** 系统应继续写入同批次其他合法记录 - **THEN** 系统应继续写入同批次其他合法记录
- **AND** 失败记录应按错误日志规则写入 Redis 项目控制台 - **AND** 失败记录应按错误日志规则写入 Redis 项目控制台
## ADDED Requirements
### Requirement: 数组字段聚合为列数组
系统 SHALL <20><>?`electricity[]` <20><>?`air_conditioner[]` 按原始顺序聚合为数据库写入结构的列数组<E695B0><E7BB84>?
#### Scenario: electricity 聚合
- **WHEN** 输入包含 `electricity` 数组
- **THEN** 输出应包<E5BA94><E58C85>?elec_address[]、voltage[]、ampere[]、power[]、phase[]、energy[]、sum_energy[]
- **AND** 各数组下标与输入数组下标一一对应
#### Scenario: air_conditioner 聚合
- **WHEN** 输入包含 `air_conditioner` 数组
- **THEN** 输出应包<E5BA94><E58C85>?air_address[]、state[]、model[]、speed[]、set_temp[]、now_temp[]、solenoid_valve[]
- **AND** 各数组下标与输入数组下标一一对应
#### Scenario: 类型与缺失处<E5A4B1><E5A484>?- **WHEN** electricity <20><>?air_conditioner 存在但不是数<E698AF><E695B0>?- **THEN** 系统应丢弃该消息并记录错<E5BD95><E99499>?- **WHEN** 数组元素字段缺失或无法转<E6B395><E8BDAC>?- **THEN** 系统应保持长度对齐并写入 null