目录
-
- 一、查到一个价格,不代表找到适用价格
- 二、FormId是BD_SAL_PriceList
- 三、先读取表头的业务范围
- 四、明细不仅有物料和价格
- 五、客户和销售员在另外的集合里
- 六、先保留候选规则,别立即压成一个价格
- 七、读取字段存在,不等于保存参数相同
- 八、联调时把价格选错的问题拆开
一、查到一个价格,不代表找到适用价格
对接金蝶云星空销售价目表时,不能只取物料和Price。客户范围、币别、含税口径、数量区间、有效期和组织,都可能影响价格是否适用于当前业务。
本文整理我在2026年9月12日金蝶官方公开体验环境的只读实测记录。涉及的表单和返回字段已经在该环境核对;客户实际账套的字段、权限和价格匹配规则还需要单独确认。
本文没有执行价目表保存,没有新增生产案例,也不把以下字段清单当作完整的价格计算规则。
二、FormId是BD_SAL_PriceList
实测确认的销售价目表标识是:
BD_SAL_PriceList
此前尝试SAL_PriceList,返回:
标识为'SAL_PriceList'的业务对象不存在,或者被删除。
不要根据销售订单SAL_SaleOrder的命名规律,猜价目表也以SAL开头。
想查看一张已知价目表,可以用View。实测记录中的请求形状如下:
{
"formid": "BD_SAL_PriceList",
"data": {
"Number": "TY002"
}
}
TY002是当时体验环境的样本编号,不能直接拿它查询客户账套。调用需要有效会话和对应权限。
formid在顶层。之前把它写进data里,报错为“表单标识为空,请确认接口参数中是否已给单据标识赋值。”后续只读补测发现formid和FormId均能使用,重点是参数所在层级,不应把大小写说成唯一原因。
三、先读取表头的业务范围
View返回完整对象,不是ExecuteBillQuery的二维数组。读取时先确认ResponseStatus,再查看Result中的业务对象。
Result
├─ ResponseStatus
└─ Result:价目表业务对象
实测记录列出的表头字段包括:
| Number、Name | 价目表编号和名称 |
| CurrencyId | 币别 |
| IsIncludedTax | 价格是否含税 |
| EffectiveDate、ExpiryDate | 整表生效期 |
| LimitCustomer | 是否限定客户范围 |
| LimitSalesMan | 是否限定销售员范围 |
| PriceObject | 定价对象 |
| DocumentStatus、AuditStatus | 审核状态 |
| CreateOrgId、UseOrgId | 创建和使用组织 |
同一物料在不同币别、组织或含税口径下的价格,不能只根据数值大小进行替换。
审核状态也要一起看。查到对象并不代表它已经是当前可用的已审核价目表。
四、明细不仅有物料和价格
实测明细集合为SAL_PRICELISTENTRY,包含下面几组字段:
| 定价对象 | MaterialId、MaterialGroupId、MaterialTypeId |
| 价格 | Price、DownPrice |
| 数量区间 | FromQty、ToQty |
| 行级生效期 | EffectiveDate、ExpiryDate |
| 单位与计价 | UnitID、PriceUnitId、PriceBase |
| 业务维度 | AuxPropId、Lot、BomId |
| 行状态 | ForbidStatus、RowAuditStatus |
同一张价目表可以有表头和行级两组日期。读取时把行级日期丢掉,外部系统就可能把过期明细当作可用价格。
数量区间也是如此。只建立“物料编码→价格”的一对一字典,会覆盖同物料的多个区间。
边界到底含不含FromQty或ToQty、多个区间重叠时如何选择,不能仅从字段名推断。这些需要在目标账套按实际规则验证。
五、客户和销售员在另外的集合里
实测记录还有两个集合:
SAL_APPLYCUSTOMER
SAL_APPLYSALESMAN
客户集合包含CustID、CustGroup、CustTypeID和IsDefList。销售员集合包含SalerId、SaleGroupId和DeptId。
这意味着客户条件可能涉及具体客户、客户分组或客户类型,而不只是一个客户编码。
表头的范围开关和这些集合要一起保留。看到客户集合为空,不能直接断言所有客户都适用;需要结合开关与账套规则确认。多张价目表同时命中时的优先级,也需要额外核对。
六、先保留候选规则,别立即压成一个价格
外部缓存可以保留表头上下文和原始明细,避免在读取时丢失定价维度。
下面是一个结构整理示例,输入是View响应中已经取出的价目表业务对象:
function collectPriceRows(bill) {
if (!bill || typeof bill !== 'object') {
throw new Error('价目表业务对象不合法');
}
const rows = bill.SAL_PRICELISTENTRY;
if (!Array.isArray(rows)) {
throw new Error('缺少价目表明细集合');
}
return rows.map((row, index) => ({
priceListNo: bill.Number,
rowIndex: index,
currency: bill.CurrencyId,
includedTax: bill.IsIncludedTax,
effectiveDate: bill.EffectiveDate,
expiryDate: bill.ExpiryDate,
useOrg: bill.UseOrgId,
limitCustomer: bill.LimitCustomer,
limitSalesMan: bill.LimitSalesMan,
customers: bill.SAL_APPLYCUSTOMER,
salesmen: bill.SAL_APPLYSALESMAN,
rawEntry: row
}));
}
这段代码只整理结构,不负责确定成交价;示例尚未作为完整价目表同步功能部署。关联对象的编码、名称和多语言值,需要根据实际返回继续解析。
保留rawEntry,能追查原始数量区间、行日期和单位。缓存主键也不应只使用物料编码,可以结合目标连接、价目表标识和可靠的明细标识设计。rowIndex只是本次数组位置,不适合作为跨版本的稳定明细身份。
七、读取字段存在,不等于保存参数相同
本文字段来自View返回。不能给所有字段随手加F前缀,就认为是Save或ExecuteBillQuery的字段标识。
查询字段、完整对象返回和保存Model是不同的结构。需要写入价目表或在查询接口选择明细字段时,应从实际账套确认元数据及报文定义。
本文确认的是读取结构,不提供未经验证的保存报文,也不声称外部程序已经完整复现了金蝶定价引擎。
八、联调时把价格选错的问题拆开
遇到价格不符合预期,可以按顺序核对:
每一步都保留对应价目表和明细依据,不要只记录“最终单价8元”。金额对不上时,能看到价格从哪条规则来,才容易判断是缓存范围错、匹配规则错,还是业务口径没有确认。
网硕互联帮助中心

评论前必须登录!
注册