订单编号

Odoo POS 订单号为什么不是“前台随便递增一下”:device identifier、_get_next_order_refs 与追溯链路讲透

很多人把 POS 订单号理解成一个展示给收银员看的流水号,但 point_of_sale 实际把 device identifier、后台 sequence、tracking number 与多设备追溯需求串成了一条编号链。

POS
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 4 阅读

先说结论

Odoo POS 的订单编号不是“前端来一串自增数字”这么简单。

register_new_device_identifier()_get_next_order_refs(),系统实际在解决三件事:

  1. 每台设备如何获得自己的身份;
  2. 订单如何拿到全局可追溯的后台序列;
  3. 前台和后台如何共享一套既可读又不冲突的引用方式。

所以它的本质不是“显示一个流水号”,而是:

在多设备 POS 场景里,为每张订单建立可定位、可区分、可回查的编号身份。

一、为什么 Odoo 先给设备编号,而不是先给订单编号

源码里有一个非常关键的方法:

  • register_new_device_identifier()

它不是给订单发号,而是先给设备发一个 device_identifier

这说明 Odoo 一开始就承认一个现实:

  • POS 不是单机系统;
  • 同一个配置下可能有多台设备同时开单;
  • 如果订单号里完全看不出设备来源,排错、追单、对账都会更困难。

所以 Odoo 先解决“谁在开单”,再解决“开出了哪张单”。

二、_get_next_order_refs() 真正在拼什么

_get_next_order_refs() 的返回很有意思:

  • 一个主引用字符串;
  • 一个短一点的 tracking_number

主引用格式大致像:

  • 年后两位 + device_identifier - config_id - next_number

这里面至少塞了三层信息:

  1. 时间片段:便于人眼快速识别年份;
  2. 设备片段:便于区分是哪台终端生成;
  3. 后台 sequence:保证全局唯一性和可持续递增。

这就解释了为什么它不是前台自己 +1 就完事。

前台自增能解决“看起来像流水号”,但解决不了:

  • 多设备并发;
  • 后台追溯;
  • 长期唯一性;
  • 配置隔离。

三、为什么还要单独保留 tracking number

很多系统只会保留一个很长的订单引用,但 Odoo 额外给了一个更短的 tracking_number

这背后其实是在平衡两种使用场景:

  • 系统内部需要一个强唯一、结构化、能回查的编号;
  • 人类沟通往往只想要一个更短、更容易报读的小号码。

所以 tracking number 的存在,不是重复,而是把“机器追溯号”和“人工沟通号”拆开了。

这很符合真实门店场景:

  • 收银员、后厨、取餐口、顾客,未必需要看到一整串长引用;
  • 但后台仍然需要一个不易撞号的主键式引用。

四、为什么这套设计比“按会话递增”更稳

很多 POS 定制会想当然地做成:

  • 本会话第 1 单、第 2 单、第 3 单……

这样短期看最直观,但一旦遇到下面这些场景就开始出问题:

  • 多台设备同时工作;
  • 某台设备离线后再回传;
  • 会话重开导致同号;
  • 不同配置之间查账时编号冲突;
  • 顾客拿着小票回来,后台却很难唯一定位原单。

Odoo 之所以把编号设计成“设备身份 + 配置语义 + 后台序列”,就是为了让这些场景都还有解。

五、编号链路为什么其实是在服务排错与同步

乍看起来,订单号只是展示层问题;但在 POS 里,它和同步、排错、售后高度相关。

举几个最常见的情况:

  • 某台设备上传慢了,需要回查是哪台机器开的单;
  • 某个订单在前端和后台表现不一致,需要确认是不是重复提交;
  • 顾客报一个号码,门店要快速定位具体订单;
  • 多设备门店需要看出哪台终端问题频发。

这时,纯粹的“1、2、3、4”几乎没有帮助。

device_identifier 参与订单引用后,问题就容易拆开:

  • 是不是某台设备特有的问题;
  • 是不是某个配置下的序列异常;
  • 是不是同一订单被重复送达。

六、最容易误解的几个点

误解 1:订单号只是给顾客看的

不对。它首先是系统追溯和同步治理的一部分。

误解 2:只要唯一就够了

也不完全对。Odoo 还在追求可读性和设备可区分性。

误解 3:设备身份放进订单号是多余的

不对。多终端门店里,这恰恰是定位问题的捷径。

误解 4:tracking number 和主引用重复

不对。一个偏机器追溯,一个偏人工沟通。

七、做编号定制时最该保留什么

如果你准备改 POS 订单编号,最值得保留的是:

  1. 设备身份与订单身份分层;
  2. 后台 sequence 仍然作为唯一性核心;
  3. 保留一个短编号服务人工沟通,而不是强迫所有人都看长引用。

很多定制喜欢把编号做得“更短更像门店小票号”,结果最后牺牲的是排错能力和跨设备稳定性。

最后一句

理解 Odoo POS 的订单编号,关键不是它长什么样,而是看懂这条主链:

设备先拿 device identifier → 后台 sequence 提供全局递增 → _get_next_order_refs() 组装主引用与 tracking number。

看懂以后你就会知道,Odoo 在生成的不是一个流水号,而是一张订单在多设备环境里的身份卡。

DISCUSSION

评论区

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