跳转至

SO 接口规格变更逐字段对照表(9/21 → 10/12)

最后变更:2026-10-12 15:22

给开发的一句话:操作判别从「字段」改为「端点」,Request 微调,Response 完全重做。Host/凭据不变,三操作三个 URL。 依据:Loi 2026-10-12 交付 txt(Integration Suite - SO Creation_20261012.txt)vs 9/21 六份 JSON 样本,逐字段脚本 diff,非肉眼比对。

0. 不变的部分

项 值
Host (Dev) https://dev-cqg6dbov.it-cpi012-rt.cfapps.ap21.hana.ondemand.com
Auth Basic(凭据见 txt,Dev 环境)
Method 全部 POST
ItemNumber 格式 请求仍发 000010(6 位),TPM 侧归一化逻辑保留
日期格式 ISO 2026-04-29

1. 端点变化(核心)

操作 9/21 旧版 10/12 新版
Create /http/TPM/SO_CREATE + 请求头 OrderStatus="01" /http/TPM/SO_CREATE,无判别字段
Change 同一 URL + OrderStatus="02" /http/TPM/SO_CHANGE
Reject 同一 URL + OrderStatus="03" /http/TPM/SO_REJECT

⚠️ 命名陷阱(务必周知团队):Loi/Eko 口中的 "Order Type" 指请求类型判别,其 JSON 字段名实际是 OrderStatus(已移除)。请求体里另有 OrderType(SAP 单据类型,ZF00/ZF01…)是另一个东西:Create 请求仍必须传,照字面删掉 SAP 定不了单据类型。

✅ 2026-10-12 11:49 已闭环:Eve 邮件质疑「Order TYPE 是建单必要条件」后,Loi 邮件书面改口「对不起。Eve 说的对。不是 OrderType。是 OrderStatus=01/02/03 已被移除」。Eve 的表述同时印证本表 §2.1/§2.2(Create 带 OrderType、Change 不带)。

2. Request 逐字段对照

2.1 Create SO(SO_CREATE)

变化 字段 说明
❌ 移除 头 OrderStatus 判别改由端点承担
❌ 移除 Item ConfirmQuantity / MessageType / MessageText / RejectReason 9/21 样本混入的响应字段,正式版清除
➕ 新增 头 FlexibleField4 / FlexibleField5 启用范围待与 SAP 对齐
➕ 新增 Item CrmSalesOrderNumber Item 层冗余携带 TPM 单号
➕ 新增 Item Currency 行级币别
✅ 保留 头 OrderType(ZF00)及其余全部头字段 单据类型照传

2.2 Change SO(SO_CHANGE)——瘦身最多

变化 字段 说明
❌ 移除 头 OrderStatus、OrderType 端点定操作;改单不允许换单据类型(语义合理)
❌ 移除 头 SalesOrganization / DistributionChannel / Division / ReferenceSalesDocument 销售组织等创建后不可改,改单不再携带
❌ 移除 Item SoldTo 改单不可换售达方;ShipTo/Payer/BillTo 保留
❌ 移除 Item ConfirmQuantity / MessageType / MessageText / RejectReason 同 Create
➕ 新增 头 FlexibleField4 / FlexibleField5;Item Currency、SapSalesOrderNumber Item 层冗余携带 SAP 单号

2.3 Reject SO(SO_REJECT)

变化 字段 说明
❌ 移除 头 OrderStatus 判别改由端点承担
➕ 新增 Item SapSalesOrderNumber 行级冗余携带 SAP 单号
✅ 保留 头 SapSalesOrderNumber + Item ItemNumber/RejectReason 极轻结构不变

3. Response:三操作统一重做(变化最大)

9/21 版 Response = 整包回显请求(全部头/行字段 + RequestNumber + SAP__Messages);10/12 版改为瘦回执 + 消息明细:

{
  "@odata.context": "...",
  "@odata.metadataEtag": "W/\"20261009063751\"",
  "LogId": "000d3a08-...",              // ➕ 新增:本次调用日志 ID
  "SapSalesOrderNumber": "IX1D000222",  // ✅ 保留:成功回 SAP 单号
  "MessageType": "S|E|W",               // ✅ 保留:整单结果
  "MessageText": "...",
  "_MsgItem": [                          // ➕ 全新:逐条消息明细
    { "LogId": "...", "Sequence": "1", "MessageType": "S",
      "MessageId": "V4", "MessageNo": "233", "MessageText": "..." }
  ]
}
变化 字段 对开发的影响
❌ 移除 整包请求回显(头+行全部字段) 旧解析代码全部作废
❌ 移除 RequestNumber(头+行)、SoDeletionFlag、SAP__Messages 不再有
➕ 新增 LogId(头级+行级)、_MsgItem[](Sequence/MessageType/MessageId/MessageNo/MessageText) TPM 落库建议:LogId+全部 _MsgItem 存表,报错时凭 LogId 找 SAP 查日志
⚠️ 语义 MessageType=E 时 SapSalesOrderNumber 为空串 判空逻辑保留

消息明细样式(10/12 样本实测,V1=MessageId、239=MessageNo): E V1 239 "Condition ZP01 cannot be entered manually" / E V1 415 "Reason for rejection Z2 is not defined"。

4. 联调前必须 SAP 关闭的两个配置问题(样本实测报错)

# 报错 影响 状态
1 Condition ZP01 cannot be entered manually(V1 239,Create/Change 都报) 0903 映射要求 TPM 传 ZP01 出厂价,当前定价过程禁手工录入。等 SAP 答复:改定价配置 or 改传参 🔴 开放项
2 Reason for rejection Z2 is not defined(V1 415,Reject 报) S/4 未配 Z2 拒绝原因,值表也未交付 🔴 开放项

5. 状态查询(#6,新增交付)

  • 端点:/http/TPM/GET_DO_BILLING(POST)
  • 入参:SapSalesOrderNumber + CrmSalesOrderNumber
  • 回参:CreditCheckStatus / DeliveryBlockStatus / DeliveryStatus / DelRelBillgStatus + _Items[](SO 确认数量 / FreightOrderNumber / DONumber / DeliveryQty / PGITime / BillingNumber / InvoicedQty / 逐行 Message)
  • 样本即信用冻结场景(CreditCheckStatus="B",确认量 0)——TPM 侧按「W/E 均阻断取消」处理

6. 样本与依据文件

文件 说明
Integration Suite - SO Creation_20261012.txt 三端点+样本(本表唯一依据)
Integration Suite - DO & Billing Status_20261012.txt #6 查询端点+样本
Create/Change/Reject SO Request|Response.txt(9/21 版) 旧版对照基准
Eko_OrderType澄清截图_20261012.jpg "Order Type=请求类型判别" 口语佐证(早期 IM 证据)
Loi 2026-10-12 11:49 邮件改口 书面确认:移除的是 OrderStatus,OrderType 保留(见 §1 命名陷阱闭环)

🔗 关联