Files
cmroubao/docs/integrations/shunyunbao-contract.md
T

93 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 顺运宝 ERP 字段契约
> 本文只记录协议结构和字段语义,不保存真实账号、Cookie、JWT、订单号、收件人、
> 电话、地址、商品内容或原始响应。私有 HAR/响应只允许位于被 Git 忽略的本地目录。
## 已确认请求链
1. 同一 HTTP Session 获取 `GET /api/p/code1` 验证码。
2. `POST /am/auth/login` 提交环境变量提供的账号/密码和受控验证码。
3. `POST /am/stock/listTotal` 与 `/am/stock/list` 使用“全部单号”条件查询。
4. `POST /am/stock/detail/listByStock?hist=0` 使用列表 `stock.id` 批量读取详情。
本地 HAR 结构确认:
- “全部单号”查询输入匹配列表 `code`,不保证等于 `orderCode`。
- 列表 `id` 等于详情请求 `ids[]` 使用的 stock id,也等于详情头 `id`。
- 详情头 `details[]` 是商品级集合,一个货运单可以有多条商品。
- 日期区间使用 `t_stock.created`、`op=0`、`type=3`、`optType=0`;具体增量规则属于
T-224。
接口来自 ERP 页面协议,不是已确认的开放 API。生产使用前必须确认厂商授权、请求
频率、服务账号和个人信息处理规则。
## Go 直连迁移契约(T-225)
T-225 至 T-227 在 `backend-api/internal/platform/shunyunbao` 用脱敏 fixture 固定以下
内容,并由 API 进程内的 Go source 直接执行:
- 基础请求 header 固定 `Accept`、`Origin`、`Referer`、`User-Agent` 和
`X-Requested-With`;base URL 必须是无 userinfo、query、fragment 或路径的 origin。
- 单号条件为 `t_stock.allcode`、`op=6`、`type=0`、`optType=1`;日期范围为
`t_stock.created`、`op=0`、`type=3`、`optType=0`,单个 ERP 窗口最多 7 个自然日。
- `listTotal`、`list` 共享 `history=0`、`length`、`start`、`pageIndex`、`store=false`、
已验证 columns 和单一 `queries`;运行时每页固定 20 条、单次最多 100 条。
- `listByStock?hist=0` 每批最多 100 个去重后的正整数 stock id,详情 `id` 必须与列表
`stock.id` 一致。
- 所有结果必须经 Go allowlist 归一化;fixture 专门含收件信息、Cookie/JWT 标记值,
测试断言它们不会出现在输出或错误里。
Go 直连的验证码、登录、Cookie jar 和查询 source 都在 API 进程内。T-230 在未认证时仅可将
验证码图片一次提交给受控本机/HTTPS OCR endpoint,结果只用于当前登录请求;不得写入 Redis、
SQLite、日志或浏览器,也不得轮询或重试。真实线上请求不属于自动化测试。
## 身份和规范字段
### 货运单
| 规范字段 | ERP 来源 | 规则 |
| --- | --- | --- |
| `external_stock_id` | `stock.id` / `detail.id` | 必填正整数,字符串化保存;唯一外部身份 |
| `source_code` | `stock.code` | 受控展示;查询输入不作为主键 |
| `platform_order_no` | `stock.orderCode` | 可空,不进入 URL/普通日志 |
| `shop_name` | `detail.shopName`,回退 `stock.shopName` | 可空,限制长度 |
| `source_created_at` | `detail.created`,回退 `stock.created` | 必须可解析为 ERP 本地时间 |
| `order_status` | `stock.orderStatus` / `detail.status` | 原值字符串化,不猜测数字语义 |
| `purchase_status` | `stock.purchaseStatus` | 原值字符串化,不自动决定采购 |
| `is_canceled` | `stock.isCancel` | 只接受明确布尔/已确认枚举 |
### 商品明细
| 规范字段 | ERP 来源 | 规则 |
| --- | --- | --- |
| `external_item_id` | `detail.details[].id` | 必填正整数;在货运单内唯一 |
| `title` | `productTitle`,可核对回退 `detailProductName` | 去首尾空白;空值进入复核 |
| `product_spec` | `productSpec` | 原样保留,不由 VLM 改写 |
| `sku` | 非空 `sku`,否则 `variationSku` | 仍需 Admin 复核;两者都空时阻塞 |
| `quantity` | `productQty` | 必须为正整数,不能使用货运头总数量代替 |
| `product_thumb_ref` | `productThumb` | 当前确认可能为数字 ERP 引用,不是 URL |
| `purchase_status` | `purchaseStatus` | 原值字符串化,允许值另行确认 |
`productThumb` 未解析为可鉴权图片内容前,商品状态必须是 `NEEDS_IMAGE`。系统不得把
数字引用拼接成 URL、抓取未知主机或用其他商品图片补位。
## 规范化与版本
- canonical JSON 固定 UTF-8、字段顺序和空值规则;对最小化对象计算 SHA-256。
- `(creator, SHUNYUNBAO, external_stock_id)` 唯一确定货运单。
- `(freight_order_id, external_item_id)` 唯一确定商品。
- hash 不变是幂等重放;hash 变化递增 revision,不覆盖已生成采购任务。
- 同一响应含重复 external item id 且内容不一致时整批失败,不选择其中一条。
- 缺失详情头、`details` 不是数组或任一商品没有外部 ID时整批失败,不保存半批。
## 数据最小化
以下字段不得进入本项目数据库、业务响应、普通日志、任务、VLM 或 Git:
- `receiver`、`receiverTel`、`receiverAddr` 和其他收件个人信息。
- ERP username/password、验证码、Cookie、JWT、权限和完整用户资料。
- 未裁剪的 `stock`、`detail`、HAR、HTTP body 和 Redis session JSON。
允许保存的审计信息是:source system、外部 ID、规范字段 hash、同步状态、稳定错误码、
数量和时间。错误信息不得拼接 ERP 原始 body。