库存边界

Odoo 库存可用量为什么不只是按仓位算:Owner、Package 和可用量判断到底怎么卡边界

很多人查库存只盯 location 和 on hand,但 Odoo 在保留和可用量里还会看 owner、package、lot 等维度。本文把这套边界讲透。

Odoo 开发 库存
进阶 开发者 1 分钟阅读
0 评论 0 点赞 0 收藏 5 阅读

先说结论

很多人一提库存可用量,脑子里只有一句话:

  • 某仓位里还有多少货

但在 Odoo 里,真正的可用量判断往往更像:

某个产品,在某个位置、某个 lot、某个 package、某个 owner 语义下,还剩多少可以被这次动作合法使用。

所以库存不是一维数字,而是带约束条件的可用性判断。


为什么 location 不是全部

如果只看 location,系统就没必要在 stock.movestock.move.linestock.quant 里反复带上:

  • lot_id
  • package_id
  • owner_id

这些字段。

这些维度一直被带着走,说明 Odoo 根本不是在算“仓里总共有多少”,而是在算:

  • 这批货是谁的
  • 在哪个包装单元里
  • 属于哪个 lot / serial
  • 这次保留能不能动到它

owner_id 为什么特别重要

源码里 _get_available_quantity()_update_reserved_quantity() 这些方法都支持 owner_id

这说明 Odoo 把“货是谁的”当成可用量边界的一部分。

这在寄售 / consignment 场景尤其关键:

货在你仓里,不代表货就是你的,也不代表任何出库都能随便占用它。

所以 owner 不是附加信息,而是库存所有权边界。


package_id 为什么不是物流显示字段

很多人第一次看 package,会觉得它只是仓库操作员看的包装信息。

但源码里 package 会进入:

  • quant 分组
  • 保留逻辑
  • move line 同步
  • result package 目的包装关系

这说明 package 不是“界面标签”,而是会影响:

  • 你到底占用了哪一包货
  • 同包货能不能整包走
  • 包装层级下的库存怎么追

所以 package 是库存结构的一部分。


strict 为什么很值得理解

很多底层方法都会带 strict=True/False

它表达的其实是:

这次取货是不是必须严格匹配 lot/package/owner 等条件,还是允许更宽松地在相关范围内找可用量。

这会直接影响:

  • 保留成功还是失败
  • 系统是精确匹配还是广义搜货
  • 为什么你看着“有货”,动作却说“不足”

很多库存疑难问题,最后都不是数量错,而是匹配边界不一致。


新手最容易误解的 4 件事

1. 以为有 on hand 就一定能保留

实际还要看 owner、lot、package 等条件。

2. 以为 owner 只是备注

在寄售场景,它直接影响合法可用量。

3. 以为 package 只影响拣货展示

它也会影响 reserving 和 quant 结构。

4. 以为系统说没货就是总库存没货

也可能只是这次动作要求的边界下没货。


一句话记忆法

Odoo 的可用量不是“仓里还剩多少”,而是“在当前所有权、包装、批次和位置条件下,还剩多少能合法动用”。

DISCUSSION

评论区

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