feat(t239): persist freight item metadata

This commit is contained in:
QiuSW
2026-07-29 14:54:58 +08:00
parent 42006acedb
commit 3bd9726ddc
23 changed files with 476 additions and 158 deletions
+8 -1
View File
@@ -186,9 +186,11 @@ T-203 成功返回 `201`。使用相同 `Idempotency-Key` 和相同图片内容
"external_item_id": "880011",
"title": "商品标题",
"product_spec": "灰色,2XL",
"sku": "原始 SKU",
"sku": "灰色,2XL",
"quantity": 2,
"product_thumb_ref": "190000000",
"original_unit_price_minor": 12950,
"original_currency": "TWD",
"purchase_status": "0"
}]
}]
@@ -198,6 +200,11 @@ T-203 成功返回 `201`。使用相同 `Idempotency-Key` 和相同图片内容
不得返回 receiver、receiverTel、receiverAddr、Cookie、JWT、ERP 用户资料或完整原始
对象。多商品必须全部保留;缺失详情返回协议错误,不允许部分成功。
商品 `product_spec` 和采购使用的 `sku` 均来自 ERP `productSpec`,不得静默回退
`sku/variationSku`。`productPrice` 严格转换为 `original_unit_price_minor`;缺失价格为
`null`,币种固定为 `TWD`。`product_thumb_ref` 来自商品 `productThumb`,存在时必须是
规范化正整数,不能使用货运单 ID、商品明细 ID 或完整 URL。
### Go ERP 会话(T-230、T-236)
`/erp`、`/erp/captcha`、`/erp/login` 和 `/api/v1/erp-session*` 不再暴露。创建货运同步
+7 -4
View File
@@ -198,6 +198,10 @@
| `docs/tasks/T-233.md` | DONE | 修复预检错误映射并增加受控 ERP 诊断日志 |
| `docs/tasks/T-234.md` | DONE | 在受控诊断模式输出 OCR 验证码文本 |
| `docs/tasks/T-235.md` | DONE | 修复顺运宝登录后用户会话校验协议 |
| `docs/tasks/T-236.md` | DONE | 验证码错误时重新取图和 OCR,最多额外重试 6 次 |
| `docs/tasks/T-237.md` | DONE | 完整单号在 55 秒预算内同步导入并可靠收敛终态 |
| `docs/tasks/T-238.md` | DONE | 兼容顺运宝详情分钟精度时间 |
| `docs/tasks/T-239.md` | DONE | 冻结货运规格 SKU、TWD 原始单价和图片引用契约 |
| `docs/design/` | 已确认 | T-202 原型索引、4 个管理页和 7 个 Android 页面 |
| `deepseek总结.txt` | 已有 | 历史讨论摘要,不是正式需求权威 |
| `android-buyer/` | 已有 | Roubao `main` 固定 commit 的 Android 基线 |
@@ -209,12 +213,11 @@
## 任务摘要
- 已完成:T-001 至 T-004、T-101 至 T-104、T-201 至 T-219。
- 已完成:另含 T-220 至 T-235 ERP 契约、货运存储、采购需求生成、日期增量同步、Go
- 已完成:另含 T-220 至 T-239 ERP 契约、货运存储、采购需求生成、日期增量同步、Go
直连协议、OCR 会话预检、稳定预检错误、安全诊断日志、直连 `FreightSource`、旧 Connector
清理和受控本地凭证加载。
清理、受控本地凭证加载、同步单号导入、分钟时间兼容和货运商品元数据契约。
- 进行中:无。
- 下一步:使用 `start-backend.bat --erp-debug` 重启 API 并重新执行受控单号 smoke;确认用户
校验成功后继续观察 listTotal/list/detail 请求和同步结果。
- 下一步:实现商品 `productThumb` 图片的后端受控下载、本地保存和鉴权访问。
## 当前可运行内容
+12 -8
View File
@@ -4,7 +4,7 @@ title: 冻结货运商品规格、原始价格与图片引用契约
phase: 2
deps:
- T-238
status: TODO
status: DONE
created: 2026-07-29
context_ref: 01be7e7
work_branch: null
@@ -55,13 +55,13 @@ ERP `sku/variationSku`,与本项目需要按颜色、尺码硬匹配的 `produ
## 验收要点
- [ ] `productSpec` 同时成为货运商品的规格和采购 SKU,缺失时不使用其他 ERP SKU 猜测。
- [ ] `productPrice` 的合法整数、小数和数字字符串精确转换为 TWD 最小单位。
- [ ] 缺失价格为 `NULL`;负数、指数、超过两位小数和越界值拒绝为 ERP 协议错误。
- [ ] `productThumb` 仅接受可规范化的正整数引用,且不与货运单 ID 混用。
- [ ] 金额、币种和新 SKU 进入 canonical hash,并通过 SQLite 往返和 revision 测试。
- [ ] API/Web 适配层能读取新增字段;既有采购快照和任务不可变语义不回归。
- [ ] 标准 Go 测试、race、vet 和三个入口构建通过。
- [x] `productSpec` 同时成为货运商品的规格和采购 SKU,缺失时不使用其他 ERP SKU 猜测。
- [x] `productPrice` 的合法整数、小数和数字字符串精确转换为 TWD 最小单位。
- [x] 缺失价格为 `NULL`;负数、指数、超过两位小数和越界值拒绝为 ERP 协议错误。
- [x] `productThumb` 仅接受可规范化的正整数引用,且不与货运单 ID 混用。
- [x] 金额、币种和新 SKU 进入 canonical hash,并通过 SQLite 往返和 revision 测试。
- [x] API/Web 适配层能读取新增字段;既有采购快照和任务不可变语义不回归。
- [x] 标准 Go 测试、race、vet 和三个入口构建通过。
## 边界
@@ -73,3 +73,7 @@ ERP `sku/variationSku`,与本项目需要按颜色、尺码硬匹配的 `produ
- 2026-07-29:创建任务。确认图片 URL 的查询参数必须来自商品 `productThumb`,不能使用
货运单或商品明细 ID;金额使用定点最小单位,图片网络获取拆分到后续任务。
- 2026-07-29:增加 migration 15 和货运领域/API/Web 字段;normalizer 以 `productSpec`
同时生成规格和采购 SKU,严格解析 TWD 原始单价及正整数图片引用。金额进入商品与货运单
canonical hash,SQLite 往返、revision、采购不可变快照和脱敏 API 回归通过。标准 Go
测试、race、vet 及三个入口构建均通过;真实 ERP JSON 保持未跟踪。