销售定价

Odoo 价目表为什么不只是“打几折”:Pricelist Rule 和价格计算链到底怎么走

很多人把 Odoo 价目表理解成固定折扣表,但官方源码里的 pricelist 实际是一套规则引擎。本文把规则匹配、基价来源和递归价目表讲清楚。

Odoo 开发 销售
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 37 阅读

先说结论

Odoo 里的 Pricelist 不是“给商品填个折后价”这么简单。

它真正做的是:

先找到当前条件下最合适的一条规则,再按那条规则决定价格是固定、打折、加价,还是继续引用别的价目表。

所以价目表本质上是规则匹配 + 价格计算,不是静态价格表。


为什么它不是普通打折表

如果它只是折扣表,系统根本不需要这么多条件。

product.pricelist.item 里,你能看到很多关键信息:

  • 适用于整个价目表还是某个产品范围
  • 开始/结束时间
  • 最小数量
  • 基价来源
  • 计算方式

这说明 Odoo 处理的是:

  • 什么条件下命中哪条规则
  • 命中后按什么算法出价

不是“产品 A 永远卖 88 折”这么单一。


官方支持哪些定价思路

从源码里可以看出,至少有这些典型方式:

  • Fixed Price:直接给固定价
  • Percentage:按百分比折扣
  • Formula:基于折扣、附加费、舍入、最小/最大边界等算价格
  • Other Pricelist:基于另一张价目表再继续算

这就说明 Odoo 把价目表设计成一套“可组合定价规则”,而不是一张单表。


为什么“基于其他价目表”很关键

base='pricelist'base_pricelist_id 是理解这块的关键。

它表达的是:

我这张价目表不直接从原始售价算,而是先参考另一张价目表,再在它的结果上继续处理。

这特别适合:

  • 批发价在零售价基础上再打折
  • 某客户价继承某区域价再加特殊条件
  • 分层价格体系逐层叠加

但也正因为支持链式引用,源码里还专门做了递归检查,防止价目表互相引用成死循环。


价格为什么有时和你直觉不一样

因为系统不是“看到一个规则就结束”,而是会综合:

  • 数量
  • UoM
  • 日期
  • 产品范围
  • 货币
  • 基价来源

而且规则命中后,价格还会进行货币转换和单位语义处理。

所以你感觉“明明写了折扣,怎么价格还是不对”,很多时候不是计算错,而是:

  • 命中的不是你以为那条规则
  • 基价不是你以为那个字段
  • 或者上层还有别的价目表在参与

新手最容易误解的 4 件事

1. 以为价目表就是折扣

实际上它是一套定价规则系统。

2. 以为固定价和折扣价一定互斥

在不同规则层级里,它们可能都存在,只是最后命中一条。

3. 以为“基于其他价目表”只是复制价格

其实它是链式计算。

4. 以为价格不对就是界面 bug

很多时候只是规则命中顺序、数量门槛或基价来源没想清楚。


一句话记忆法

Pricelist 先决定“命中哪条规则”,再决定“这条规则怎么算价”;它是规则引擎,不是打折表。

DISCUSSION

评论区

想参与讨论?先 登录 再发表评论。
还没有评论,你可以成为第一个留言的人。