先说结论
在 Odoo 里,reservation method 配置的不是“预留功能开不开”,而是:
系统应该在什么时间点,开始把需求真正推向库存锁定。
所以 At Confirmation、Manual、By Date 的区别,不只是操作习惯不同,而是三种完全不同的时间语义:
- 一确认就抢库存
- 人工决定什么时候抢
- 先等到更接近计划日期再抢
这也是为什么同样一张出库单,换个 reservation method,用户体感会完全不同。
为什么很多人把预留方法看成“小配置”
因为大家更容易关注:
_action_assign()有没有成功- 为什么有货却没分配上
- 哪些 quant 被选中了
但这些更像“一旦开始预留之后,系统怎么干活”。
reservation method 解决的却是更前面的问题:
- 系统什么时候才应该开始干这件事
这比“怎么分配”还更接近业务节奏。
例如:
- 电商仓希望一确认就尽早锁货
- 计划型仓库可能希望临近发货再锁,避免过早占用
- 某些场景则希望由仓库主管手工统一放行
所以这个配置影响的是库存竞争发生的时点。
At Confirmation:最积极的语义
它的核心意思很简单:
- 单据一确认
- 系统就尽快尝试预留
这个模式适合:
- 周转快
- 订单量大
- 希望尽早暴露缺货
- 谁先确认谁先锁货的业务规则比较明确
它的优点是反应快,缺点也很明显:
- 可能过早占住库存
- 后面更紧急的单据反而得不到货
- 计划日期还很远,但库存已经被前面的订单先吃住
所以它不是“更先进”,只是“更积极”。
Manual:把时机交还给人
Manual 的真实含义不是“系统不会预留”,而是:
- 系统默认不主动在确认时做
- 要由用户或后续动作明确触发
这种模式适合:
- 现场需要统一波次放货
- 仓库经理想先看全局,再决定抢货顺序
- 某些订单虽然确认了,但并不意味着立即进入执行
它的优势是控制感强;代价是:
- 更依赖人
- 如果团队纪律不稳,容易出现单据一直没进预留的灰区
By Date:不是慢一点,而是“按计划窗口再出手”
By Date 最容易被低估。
很多人以为它只是:
- 比 At Confirmation 晚一点
其实它背后多了一层计划逻辑。
源码里可以看到,当 picking type 切到 by_date 时,系统会去处理 move 的 reservation_date,通常是根据:
- move 的计划日期 / 预期日期
- operation type 上的提前天数
- 优先级
做一个倒推。
也就是说,系统不是“随便拖后”,而是在表达:
这张需求离真正执行还有多远,应该在什么时候进入锁货竞争。
这对计划型仓库特别重要。
为什么 reservation_date 是这个话题真正的关键
很多人只看到了 reservation_method 三个选项,却忽略了 reservation_date 才是把“策略”变成“具体时点”的桥。
你可以把它理解成:
- reservation method 决定“采用哪种时机规则”
- reservation_date 决定“这张 move 具体哪天该开始抢库存”
所以在 by_date 模式下,真正被排进库存竞争队列的,不只是单据确认时间,而是:
- 计划日期
- 提前量
- 优先级共同推导出的 reservation_date
这就是它和“确认就抢”的根本区别。
为什么它会显著改变用户体感
因为用户感受到的“有货 / 没货”,很多时候并不只是物理库存问题,而是:
- 谁先进入预留
- 谁被允许提前锁货
- 谁要等到窗口临近
同样 100 件货,三张单据都要抢:
- At Confirmation 会让先确认的人先占
- Manual 会让调度人决定谁先进场
- By Date 会让更接近执行窗口的需求先进入竞争
所以 reservation method 不是技术细枝末节,而是库存公平性和执行节奏的规则开关。
实战里最容易出现的误判
1. 以为“没自动预留”就是 bug
如果是 Manual 或 By Date,这往往根本不是 bug,而是配置语义如此。
2. 以为预留失败只和 quant 有关
很多时候不是 quant 不够,而是还没到 reservation_date。
3. 以为换成 At Confirmation 就一定更好
它会更快暴露问题,也会更快制造库存占用冲突。
4. 只盯着 picking,不看 operation type
预留时机很多时候是 picking type 级别的制度,不是单张单据自己的小动作。
选型时可以怎么想
如果你希望尽早暴露缺货
优先考虑 At Confirmation。
如果你希望仓库统一调度
优先考虑 Manual。
如果你希望库存更贴近执行窗口再被占用
优先考虑 By Date。
关键不是哪个“高级”,而是哪个更符合你的履约节奏。
一句话记忆法
在 Odoo 里,reservation method 决定的不是“预留要不要做”,而是“库存竞争从什么时候开始”;
reservation_date则把这种策略真正落成每一笔 move 的入场时间。
DISCUSSION
评论区