先说结论
在 Odoo 里,出库时系统不是“随便挑一批现有库存”。
更常见的真实机制是:
- 先看可用库存
- 再按某种移除策略决定优先拿哪层
- 最后把结果落实到具体保留 / move line / lot 上
这条链路里,removal strategy 很关键。
为什么这个问题经常被误会成随机行为
因为用户最直观看到的是:
- 为什么系统先挑了这一批,而不是另一批?
如果不理解库存层选择逻辑,就很容易觉得:
- 系统在随机选
- 系统没按我的直觉拿货
但很多时候它其实是在严格执行:
- FIFO
- FEFO
- 或其他出库优先规则
也就是说,看起来像随机,背后往往是规则命中了你没注意的维度。
removal strategy 真正在决定什么
它更像:
当多层库存都可用时,先消耗哪一层。
它不只是“仓库偏好”,而是在决定:
- 先出旧货还是新货
- 先出更早到期的批次还是别的批次
- 在多 lot / 多包装下优先怎么拿
所以它直接影响实际出库行为。
FIFO 和 FEFO 为什么不能混着理解
因为它们关注的维度不同:
- FIFO 更偏时间先后 / 先入先出
- FEFO 更偏到期先后 / 先过期先出
如果你脑子里只剩一句“都是先出老的”,很多批次问题就会看错。
尤其在有 lot、有效期、保质期管理时,FEFO 的意义就会非常明显。
为什么出库策略不只是仓库管理细节
因为它会影响很多后果:
- 实际拿的是哪批货
- lot / serial 怎么被分配
- 保质期风险怎么控制
- 成本层消费如何和业务动作对上
所以 removal strategy 不是“仓库里随便配一下”的小选项,而是履约规则的一部分。
为什么它常和 reservation / move line 一起看
因为策略只是决定“应该优先拿哪层”,真正落地还要进入执行层:
- reservation
- move line 分配
- lot / package 具体落定
所以出库问题常常不能只看策略名字,还要继续看:
- 实际预留到了什么
- move line 最后怎么生成
这也是为什么策略层和执行层经常要一起排查。
实战里最容易踩的 5 个坑
1. 以为系统在随机挑库存
其实是没看到策略维度。
2. 把 FIFO 和 FEFO 混成一回事
一有 lot / expiry 就容易判断错。
3. 只看策略配置,不看最终 reservation 结果
链路会查不全。
4. 只按仓库直觉理解,不按系统层次理解
会和实际行为总对不上。
5. lot / package / 有效期都存在时,还只按“数量先后”思维看问题
很容易误判。
一句话记忆法
把它记成一句话:
removal strategy 负责决定多层库存里先消耗谁,FIFO 偏入库先后,FEFO 偏到期先后,而真正落地还要看 reservation 和 move line 怎么把它执行出来。
理解这一句,很多出库批次问题就不会再像黑箱。
DISCUSSION
评论区