diff --git a/docs/自动化与资料收集规划.md b/docs/自动化与资料收集规划.md index 1c6479a..48d17a9 100644 --- a/docs/自动化与资料收集规划.md +++ b/docs/自动化与资料收集规划.md @@ -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 其余阶段的施工顺序(粗粒度) | 阶段 | 顺序 |