## 1. Configuration - [x] 1.1 在 `src/config/config.js` 新增旧/新明细写入开关、目标表名、`room_status` 独立开关配置 - [x] 1.2 在 `src/config/config.example.js` 同步新增对应示例配置 ## 2. Database Layer Refactor - [x] 2.1 抽象通用批量 COPY 写入内核 `_insertEventsToTarget(events, targetConfig)`,支持接收目标表名、列清单、日志前缀等参数 - [x] 2.2 将旧表 `insertHeartbeatEvents()` 迁移为调用通用内核,保证旧逻辑行为不变 - [x] 2.3 新增新表 `heartbeat.heartbeat_events_g4_hot` 的目标配置与列映射 - [x] 2.4 新增双明细独立编排方法 `insertHeartbeatEventsDual(events)`,按配置分别调用旧/新 writer,聚合返回结构化结果 ## 3. Processor Flow Adjustment - [x] 3.1 调整 `HeartbeatProcessor.processBatch()` 调用链:改用 `insertHeartbeatEventsDual()` 替代原 `insertHeartbeatEvents()` - [x] 3.2 将 `upsertRoomStatus()` 从"依赖旧表成功"改为"独立执行"——无论旧/新明细开关状态如何,只要 `roomStatusEnabled=true` 就始终执行 - [x] 3.3 调整错误表调用:仅将新表 (`g4Hot`) 失败记录送入 `insertHeartbeatEventsErrors()`,旧表失败不写错误表 ## 4. Connection & Pause Strategy - [x] 4.1 重构消费暂停判定:基于"当前启用的 sink 是否全部连接级不可写",而非单一旧表状态 - [x] 4.2 区分连接错误与表级错误,避免新表结构问题误触发全局暂停 ## 5. Observability - [x] 5.1 在 `src/index.js` 启动时输出双写配置摘要(旧/新开关状态、目标表名、`room_status` 开关) - [x] 5.2 在 `src/stats/statsManager.js` 新增按 sink 维度的统计项(legacy/g4Hot 成功数、失败数、room_status 成功/失败数) ## 6. Testing - [x] 6.1 补充 `databaseManager` 双写编排单元测试(仅旧、仅新、双开、双关、交叉失败等场景) - [x] 6.2 补充 `room_status` 独立性断言测试 - [x] 6.3 补充错误表仅接新表失败的断言测试 - [x] 6.4 补充/扩展数据库 smoke 验证脚本,覆盖新表写入、分区、索引验证