feat(t223): generate tasks from freight items

This commit is contained in:
QiuSW
2026-07-28 23:51:59 +08:00
parent 6d052b0462
commit 433db45100
25 changed files with 2697 additions and 48 deletions
+28 -5
View File
@@ -257,18 +257,41 @@ Connector 未登录、找不到货运单、响应协议错误和暂时不可用
### `POST /api/v1/freight-items/{item_id}/procurement-request`
T-223 创建或重放该商品当前 revision 的采购需求。标题、SKU/规格或数量不合法时返回
`422 FREIGHT_ITEM_NOT_PURCHASABLE`;不调用 VLM 补字段。
T-223 创建或重放该商品当前 revision 的采购需求。ERP 数字状态不自动解释,ADMIN
必须显式确认仍需采购:
```json
{"confirm_procurement_needed":true}
```
请求快照保留 title、product spec、SKU、quantity、来源 hash/revision 和当时的取消/
采购状态。缺标题、SKU、正整数数量或来源明确取消时创建为 `BLOCKED`,不调用 VLM
补字段;字段合格但没有受控参考图时为 `NEEDS_IMAGE`。
### `PUT /api/v1/procurement-requests/{id}/reference-asset`
绑定当前 ADMIN 已上传的 `TASK_REFERENCE` asset。asset 必须尚未属于其他任务/请求,
内容仍走既有解码、像素、规范化和 hash 校验。
内容仍走既有解码、像素、规范化和 hash 校验。请求体:
```json
{"image_asset_id":"2bbc1bf2-30f7-497e-a52b-bcb4c61d57c3"}
```
绑定成功后进入 `READY`。来源 revision/hash 或货运取消标记已变化时返回
`409 PROCUREMENT_SOURCE_CHANGED`。
### `POST /api/v1/procurement-requests/{id}/purchase-task`
必须带 `Idempotency-Key`。只有 `READY` request 可生成任务;同一 request revision
并发或重试返回同一 task。来源后续更新不修改已生成任务。
必须带 `Idempotency-Key`,请求体是空 JSON 对象 `{}`。只有 `READY` request 可生成
任务;task、`purchase_task_sources` 和 request 的 `TASK_CREATED` 状态在同一事务内
提交。同一 request revision 即使使用不同幂等 key 重试也返回同一 task。来源后续
更新只显示 `source_changed=true`,不修改 PENDING、CLAIMED、RUNNING 或终态任务。
管理 Web 在 `/freight/{id}` 内提供对应的人工确认、参考图上传和生成任务操作;写操作
分别使用 `/freight/items/{id}/procurement-request`、
`/freight/procurement-requests/{id}/reference` 和
`/freight/procurement-requests/{id}/purchase-task`,均受 ADMIN session 与 CSRF
保护。
## 采购任务
+10 -8
View File
@@ -5,7 +5,7 @@
## 当前快照
- 日期:2026-07-28
- 阶段:T-222 已完成,T-223 待采购需求提取与任务生成已领取
- 阶段:T-223 已完成,T-224 ERP 日期增量同步已领取
- Git:当前分支为 `main`;T-001 至 T-004、T-101 至 T-104、T-201 至 T-219
均按文档提交、实现提交的顺序纳入历史
- 生产代码:`android-buyer/` 已接入 Roubao Android 源码
@@ -17,14 +17,16 @@
- ERP 货运:Go 后端通过仅限 loopback、服务密钥鉴权的 Python Connector 异步按
完整单号同步;v12 保存同步记录、货运头和全部明细,canonical hash 控制 revision,
Admin 已有 `/freight`、`/freight/import`、`/freight/{id}` 与对应 JSON API。
- 采购需求:v13 按货运商品 revision 保存可复核快照;ADMIN 显式确认采购、上传参考
图后生成不可变 PENDING 任务。来源变化不会改写任务,Roubao 可沿用现有 claim 流程。
- 本机 Android 工具:JDK 17.0.13、Command-line Tools 22.0、SDK 34、
Build Tools 34.0.0、Platform Tools/ADB 37.0.0;用户级 SDK 环境变量已设置
- Android Studio:未安装;`winget` 静默安装卡住后已终止,不阻塞命令行构建
- 测试:T-219 Android Debug/Release 单元测试与构建和根 `init.ps1` 通过;
Debug APK `1.4.16 (21)` 已覆盖安装到 PKG110
- 后端测试:T-222 运行 `go test ./...`、`go test -race ./...`、`go vet ./...`;
覆盖货运 migration 降级保护、严格 Connector 字段白名单、重复导入/revision、
中断恢复、Admin API/SSR 鉴权和 PII 缺失断言
- 后端测试:T-223 运行 `go test ./...`、`go test -race ./...`、`go vet ./...`;
覆盖采购需求 migration 降级保护、一商品一需求、阻塞字段、图片唯一绑定、任务
并发重放、来源变化后任务不变、Roubao claim 和 Admin API/SSR
- 原型:4 个管理 Web 页面和 7 个 Android 页面均可离线独立打开;Playwright
以 1440×900、390×844、360×800 验证 36 个页面/视口组合,无页面横向溢出、
脚本错误或外部请求,Android 可见交互控件均不小于 44px
@@ -162,8 +164,8 @@
| `docs/tasks/T-220.md` | DONE | 顺运宝 ERP 字段契约与凭证安全基线 |
| `docs/tasks/T-221.md` | DONE | 顺运宝精确单号 Connector |
| `docs/tasks/T-222.md` | DONE | 货运信息存储、API 与 Admin 页面 |
| `docs/tasks/T-223.md` | DOING | 待采购需求提取与任务生成 |
| `docs/tasks/T-224.md` | TODO | ERP 日期增量同步 |
| `docs/tasks/T-223.md` | DONE | 待采购需求提取与任务生成 |
| `docs/tasks/T-224.md` | DOING | ERP 日期增量同步 |
| `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 |
| `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 |
| `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 |
@@ -176,8 +178,8 @@
## 任务摘要
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-219。
- 已完成:另含 T-220 至 T-222 ERP 契约、Connector、货运存储/API/Admin。
- 进行中:T-223 待采购需求提取与任务生成。
- 已完成:另含 T-220 至 T-223 ERP 契约、Connector、货运存储和采购需求生成。
- 进行中:T-224 ERP 日期增量同步。
- 下一步:完成 T-223 采购需求生成和 T-224 日期增量同步,再进入 T-301 P0 UI
完整交互验收。
+13 -6
View File
@@ -4,7 +4,7 @@ title: 待采购需求提取与任务生成
phase: 2
deps:
- T-222
status: TODO
status: DONE
created: 2026-07-28
context_ref: 78dc595
work_branch: null
@@ -50,11 +50,11 @@ Roubao 队列。
## 验收要点
- [ ] 一货运单多商品形成多条独立采购需求。
- [ ] 缺标题/SKU/数量/图片和来源状态不明时不能生成任务。
- [ ] 同一 revision 并发/重试只生成一个采购任务。
- [ ] 来源变化不覆写 PENDING/CLAIMED/RUNNING/终态任务。
- [ ] 生成任务可被现有 Roubao claim,原始字段和参考图 hash 一致。
- [x] 一货运单多商品形成多条独立采购需求。
- [x] 缺标题/SKU/数量/图片、明确取消或未人工确认时不能生成任务。
- [x] 同一 revision 并发/重试只生成一个采购任务。
- [x] 来源变化不覆写 PENDING/CLAIMED/RUNNING/终态任务。
- [x] 生成任务可被现有 Roubao claim,原始字段和参考图 hash 一致。
## 边界
@@ -65,3 +65,10 @@ Roubao 队列。
## 执行记录
- 2026-07-28:任务合约已冻结,等待 T-222。
- 2026-07-28:新增 v13 `procurement_requests` 与不可变
`purchase_task_sources`;来源数字状态不猜测,由 ADMIN 显式确认是否仍需采购。
- 2026-07-28:参考图绑定、任务和来源快照采用唯一约束与单事务;ERP 更新后旧任务
保持原始标题、SKU、数量和 asset,旧请求显示来源变化,当前 revision 可新建需求。
- 2026-07-28:真实 Gin/SQLite SSR 流程完成确认需求、上传规范化参考图、生成 PENDING
任务;同任务可由既有 Roubao claim。Playwright 三种视口无横向溢出、短按钮或页头
重叠;未调用 VLM 或真实 ERP。