为什么它排第一 物料不在 SRM 主数据里,选料、缺口补货、询价→PO 物料轴全部不可用——不是不好用,是做不到。 这一个接口卡住,下游一半功能无法验证。
POSThttps://xj-api.forming-ai.com.cn/api/erp/materials/import
⚠️ 该端点地址在联调启动前最终确认,字段表与口径已定稿、不会变 ⇒ 推送程序可以照本文先写,届时只改一个 URL。
// 请求体 { "source": "ERP_PUSH", "dryRun": false, "rows": [ { "materialCode": "MAT-SYRUP-055", "materialName": "F55 果葡糖浆", "unit": "吨", "materialSpec": "浓度 77%,槽车", "categoryCode": "CAT-RAW-01", "categoryName": "原料/糖类", "costPrice": 3850.00, "active": true } ] }
| 字段 | 类型 | 必填 | 长度 | 说明 |
|---|---|---|---|---|
source | string | — | 32 | 固定 ERP_PUSH |
dryRun | bool | — | — | true = 只校验不落库。联调期建议先用它试跑 |
materialCode | string | ✅ | 64 | 物料编码,唯一键 |
materialName | string | ✅ | 255 | 物料名称 |
unit | string | ⚠️ | 32 | 计量单位。新物料必填;已有物料不给=不修改 |
materialSpec | string | — | 255 | 规格型号 |
categoryCode / categoryName | string | — | 64/255 | 品类编码 / 名称 |
costPrice | number | — | — | 标准成本价 |
active | bool | — | — | 停用必须显式给 false,见下方陷阱 1 |
单次上限 5000 行,超出整批拒收,请分批。
三条口径陷阱
1我方是 upsert,绝不全量覆盖。「这次没给的料」不会被删、也不会被停用。
那些料正被历史请购单 / 询价单 / 采购订单引用,删掉不报错, 历史单据会指向一个不存在的物料,而界面上只显示成空白。
⇒ 要停用某个物料,请显式给 "active": false,不要靠「这次不推它」。
2只覆盖本次给了值的字段,没给的保留原值。
好处:可以只推变更列。代价:「把某个字段改成空」做不到——这是刻意取舍,真要清空请单独告知。
3
批内同一个 materialCode 出现两行 → 整批报错,不静默取最后一条。
静默取最后一条会给出一个确定的错答案,而两行往往正是「改了一半」的证据。
联调验收用例
# 用例 1:dryRun 试跑 —— 应回 ok:true,且库里无变化 curl -X POST https://xj-api.forming-ai.com.cn/api/erp/materials/import \ -H 'Content-Type: application/json' -H 'X-Erp-Secret: <密钥>' \ -d '{"source":"ERP_PUSH","dryRun":true,"rows":[ {"materialCode":"TEST-001","materialName":"联调测试料","unit":"个"}]}' # 用例 2:缺 unit 的新物料 → 应回 ok:false 并点名第几行 # 用例 3:同批两行同编码 → 应回 ok:false 并指出重复 # 用例 4:正式导入后重放同一批 → created:0 / updated:N(证明幂等)