docs(plan): P0 施工单与真机验证结果归档(迁移 0039)

This commit is contained in:
yml2213
2026-10-02 22:51:25 +08:00
parent afa5c815f6
commit d669552be8
+28
View File
@@ -1369,6 +1369,34 @@ OSS_PREFIX=collect
**P1a 完成定义(DoD)**:接口能开关与手动触发;巡检结果与人工检测一致;`login_tasks.status` / `cookie` 全程无变化;关掉开关后调度立即停止。
### C.4-bis P0 施工单(✅ 已完成,2026-10-02;**迁移 0039**)
| # | 动作 | 文件 | 验证 |
| --- | --- | --- | --- |
| 1 | 加 PG 驱动 `psycopg[binary]` 并重锁 `uv.lock`(Dockerfile 用 `uv sync --frozen`,不重锁构建会失败) | `pyproject.toml`、`uv.lock` | 容器内 `import psycopg` 通过 |
| 2 | 迁移 **0039**:`external_order_cache`,主键 `platform_order_id + source_order_id` | `migrations/versions/20261002_0039_external_order_cache.py`、`models.py` | `pytest tests/test_migrations.py`(`HEAD_REVISION` 已同步);本地建表通过 |
| 3 | 适配层(唯一跨库 SQL):URL 归一、`statement_timeout=3s`、2 条连接池、**订单号维度聚合 route**、回显取真实店铺行 | `services/external_order_source.py` | `tests/test_external_order_source.py`(24 条) |
| 4 | 真机验证(只读账号 `livehub_ro`) | `tests/test_external_order_source_live.py`(手工跑,未配 URL 时 skip) | 见下 |
| 5 | 降级开关验证 | —— | 未配 URL / `ENABLED=false` / 库不可用时均抛 `OrderLookupUnavailable`,主流程照常 |
**真机验证结果(生产容器,`ORDER_SITE_LOOKUP_ENABLED` 临时打开)**
| 用例 | route | 回显 | 结论 |
| --- | --- | --- | --- |
| C 桶 `2627501602915345` | `unhandled` | 激萌罗小黑 | ✅ 进候选 |
| B 桶 `2627501932004488` | `worker_platform` | 指挥官密钥4个 | ✅ 拒绝 |
| A 桶 `2627501850053080` | `auto_fulfilled` | 套装-浪漫天命 | ✅ 拒绝 |
| **重复组** `2624100167260659` | **`auto_fulfilled`** | **狂沙舞者** | ✅ **拦下,且回显真实店铺行** |
| 重复组 `2624100563293477` | `auto_fulfilled` | 100011 | ✅ 拦下 |
| 不存在 `0000000000000000` | —— | —— | ✅ 明确「订单号不存在」 |
| 单次查询耗时 | —— | —— | ✅ **3.3 ms**(要求 < 50ms) |
**⚠️ 上线前还需做(P0 未完的部分)**
1. `ORDER_SITE_LOOKUP_ENABLED` 仍为 `false`(默认关闭)—— 要正式启用需改生产 `.env` 并重启;
2. 生产库还没跑迁移 0039,`external_order_cache` 表不存在(缓存写入会 warning 降级,不影响主流程);
3. **P0 目前只有适配层,没有接口和页面** —— 运营还查不了。按 §12 排期,接口/页面可随 P2 收集链接一起上(用户填订单号时调用)。
### C.5 其余阶段的施工顺序(粗粒度)
| 阶段 | 顺序 |