一张采购订单里的“折上折”,到底怎么算?
© All rights reserved. • 西安知行软件有限公司 • 陕ICP备09022277号
报文摘要
从 ORDERS 原始报文可以先确认四项事实:
- 订单头存在一笔 2% 折扣;
- 第 1 条商品行存在 10% 和 5% 两层折扣;
- 两层商品行折扣分别标记为第 1 步和第 2 步;
- EDI 同时给出折前单价 100.00 和本例净价核对值 83.79。
后续业务解读与计算,都应建立在这些原始报文证据上。
一、先看 ORDERS 报文里实际传了什么
以下内容主要供 EDI 顾问和 ERP 开发参考。业务人员重点看“中文注释”列即可。

| EDI 位置 | 报文值 | 业务解释 | ERP 建议字段 |
|---|---|---|---|
| ALC/5463 | A |
A 表示 Allowance |
indicator |
| ALC/1227 | 1、2 |
同一范围内的计算顺序 | calculationSequenceCode |
| PCD/C501/5245 | 12 |
后面的数值是折扣或附加费百分比 | percentageQualifier |
| PCD/C501/5482 | 10、5、2 |
真正参与计算的百分比 | percentage |
对应的 EDI 片段如下:
ALC+A+++1'
PCD+12:2'
LIN+1++7500000001012:EN'
PRI+AAC:100.00'
PRI+AAA:83.79'
ALC+A+++1'
PCD+12:10'
ALC+A+++2'
PCD+12:5'
可以读成:
订单级:有一笔 2% 的折扣
商品行 1:
- 折前单价 100.00
- 净价 83.79
- 第 1 步折扣 10%
- 第 2 步折扣 5%
注意:
ALC中的1、2是计算顺序,不是折扣类型代码。它们不能说明这笔优惠属于促销折扣、数量折扣、合同折扣或付款折扣。
二、从 EDI 结构判断折扣作用范围
一张采购订单可以同时包含两类折扣。
1. 商品级折扣
只针对某一条商品明细。例如:
- 第 1 件商品先优惠 10%;
- 同一件商品再优惠 5%;
- 其他商品不一定享受相同的两层优惠。
2. 订单级折扣
针对整张订单。例如“全单再优惠 2%”。至于这 2% 如何分摊到各商品行,需要按交易伙伴约定的价格规则处理。

在 EDIFACT ORDERS 报文中,可以根据折扣段出现的位置区分范围:
第一个 LIN 商品行之前的 ALC/PCD → 订单级折扣
某个 LIN 商品行之后的 ALC/PCD → 当前商品行折扣
如果 ERP 把两类折扣混在一起,可能导致商品净价、订单总额和财务对账金额都不正确。
三、站在业务角度解读这张订单
假设订单里有一件原价为 100.00 的商品:
| 要回答的问题 | 这张订单给出的答案 |
|---|---|
| 商品原价是多少? | 100.00 |
| 商品本身有优惠吗? | 有,先优惠 10%,再优惠 5% |
| 整张订单还有优惠吗? | 有,全单再优惠 2% |
| 最终净价是多少? | 83.79 |
业务上可以把它理解为:
商品原价 100.00
↓ 使用“商品九折券”
90.00
↓ 使用“商品九五折券”
85.50
↓ 结账时使用“全单九八折券”
83.79
本例中,折扣按顺序连续作用于价格。订单级折扣是否计入行净价、如何分摊到各商品行,仍以交易伙伴的价格规则为准。
四、本例的折上折为什么不能直接相加

错误算法:把三个折扣直接相加
10% + 5% + 2% = 17%
100.00 × (1 - 17%) = 83.00
该结果与本例的 PRI+AAA:83.79 不一致。
本例的核对算法:每一步都基于上一步价格
以下计算以 PRI+AAA:83.79 为含折扣后的行净价核对值,并假定订单级 2% 已按伙伴规则计入该行。
| 步骤 | 计算方式 | 价格 |
|---|---|---|
| 折前价格 | — | 100.00 |
| 商品行第 1 层优惠 10% | 100.00 × 0.90 |
90.00 |
| 商品行第 2 层优惠 5% | 90.00 × 0.95 |
85.50 |
| 订单级优惠 2% | 85.50 × 0.98 |
83.79 |

两种算法只差 0.79,但当订单数量较多时,差异会累积并影响发票、付款和财务对账。
五、ERP 接口应如何保存这些折扣?
ERP 不应只接收一个“总折扣率”,而应保留每一层折扣。推荐结构如下:
{
"poHeader": {
"allowanceCharge": [
{
"indicator": "A",
"calculationSequenceCode": "1",
"percentageQualifier": "12",
"percentage": "2"
}
],
"poDetail": [
{
"lineNumber": "1",
"grossUnitPrice": "100.00",
"netUnitPrice": "83.79",
"allowanceCharge": [
{
"indicator": "A",
"calculationSequenceCode": "1",
"percentage": "10"
},
{
"indicator": "A",
"calculationSequenceCode": "2",
"percentage": "5"
}
]
}
]
}
}
为什么折扣节点要统一使用数组?
同一个商品行可能只有一层折扣,也可能有两层或更多折扣。如果一条时输出对象、多条时输出数组,ERP 就需要编写两套解析逻辑。
推荐统一为:
一条折扣 → allowanceCharge: [ {...} ]
多条折扣 → allowanceCharge: [ {...}, {...} ]
这样接口结构更稳定,后续新增折扣层级也不需要修改解析方式。
总结
从业务角度看,折上折就是“连续使用多张折扣券”;从 EDI 角度看,它是一条有范围、有顺序的价格条件链。
可靠的 ORDERS 到 ERP 接口不应只传最终折扣率,而应完整保留:
折扣作用范围 + 折扣方向 + 计算顺序 + 折扣百分比
价格计算和订单级折扣分摊,则以交易伙伴规范及金额核对结果为准。


