M8-T03: adopt DSMR history into meter sources

This commit is contained in:
2026-08-23 21:22:05 +02:00
parent a78401c2ef
commit 28486a83c7
7 changed files with 628 additions and 29 deletions
+6 -1
View File
@@ -363,7 +363,7 @@ T01T06 先把现有 DSMR 安全迁到统一 source/bindingT07T11 再接
### M8-T03 — 将 DSMR 历史迁入 Source / Binding [structural]
- **Status**: `todo`
- **Status**: `done`
- **Depends**: M8-T02
- **Context**: 先把既有电力链路安全迁到统一模型,之后才能让 runtime 和计费真正按 source 工作。
@@ -373,6 +373,7 @@ T01T06 先把现有 DSMR 安全迁到统一 source/bindingT07T11 再接
- `modify scripts/app_db_adopt.py`
- `create tests/test_dsmr_source_migration.py`
- `modify tests/test_energy_models.py`
- `modify tests/test_meter_sources.py`
**Steps**
1. 把 ORM `DsmrReading.source_id` 重命名为 nullable `telegram_id`,新增 non-null
@@ -385,6 +386,8 @@ T01T06 先把现有 DSMR 安全迁到统一 source/bindingT07T11 再接
5. 用 revision 14 的历史 fixture 覆盖单 Meter、多次换表、跨界成本、无读数 Meter 和无旧 config。
6.`APP_BASELINE_REVISION` 同步到 revision 16;所有升级 fixture 仅在 `tmp_path` 中构造,不读取
真实 app DB 或 volume。
7. 把 T01 自身的 revision 14→15 schema 对账测试固定升级到明确 revision 15,不以可继续前进的
`head` 作为 T01 终点;T03 的新 fixture 单独负责 revision 14/15→16 历史回填对账。
**Out of scope / 不要碰**
- 不删除旧 DSMR `app_config` 行,不改变 MQTT subscription,不改 API 响应。
@@ -395,11 +398,13 @@ T01T06 先把现有 DSMR 安全迁到统一 source/bindingT07T11 再接
- [ ] 两个 source 可在同一 timestamp 各存一条 DSMR reading;同 source 重复 timestamp 被拒绝。
- [ ] `telegram_id` 不参与幂等唯一键,旧 telegram id 完整保留。
- [ ] `APP_BASELINE_REVISION` 等于唯一 revision 16 head,升级重复运行幂等。
- [ ] T01 schema-only fixture 固定停在 revision 15T03 fixture 到 revision 16,二者职责不随 head 漂移。
- [ ] 历史升级 fixture、空库升级、`pytest``ruff check .` 全绿。
**Reviewer checklist**
- 对账是否在 migration 中真实执行,而不只是测试断言;失败能否原子回滚。
- baseline 常量是否随 revision 16 同步,fixture 是否完全隔离于真实生产路径。
- 前序 migration 测试是否使用明确 revision 边界,而非把历史阶段误写为永久 `head`
- 是否存在“把所有历史强绑当前 Meter/source”的静默错误或任何 destructive cleanup。
### M8-T04 — DSMR runtime 改为多 Source 配置 [structural]