先说结论
Odoo POS 的订单编号不是“前端来一串自增数字”这么简单。
从 register_new_device_identifier() 到 _get_next_order_refs(),系统实际在解决三件事:
- 每台设备如何获得自己的身份;
- 订单如何拿到全局可追溯的后台序列;
- 前台和后台如何共享一套既可读又不冲突的引用方式。
所以它的本质不是“显示一个流水号”,而是:
在多设备 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
这里面至少塞了三层信息:
- 时间片段:便于人眼快速识别年份;
- 设备片段:便于区分是哪台终端生成;
- 后台 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 订单编号,最值得保留的是:
- 设备身份与订单身份分层;
- 后台 sequence 仍然作为唯一性核心;
- 保留一个短编号服务人工沟通,而不是强迫所有人都看长引用。
很多定制喜欢把编号做得“更短更像门店小票号”,结果最后牺牲的是排错能力和跨设备稳定性。
最后一句
理解 Odoo POS 的订单编号,关键不是它长什么样,而是看懂这条主链:
设备先拿 device identifier → 后台 sequence 提供全局递增 →
_get_next_order_refs()组装主引用与 tracking number。
看懂以后你就会知道,Odoo 在生成的不是一个流水号,而是一张订单在多设备环境里的身份卡。
DISCUSSION
评论区