先说结论
很多人一提库存可用量,脑子里只有一句话:
- 某仓位里还有多少货
但在 Odoo 里,真正的可用量判断往往更像:
某个产品,在某个位置、某个 lot、某个 package、某个 owner 语义下,还剩多少可以被这次动作合法使用。
所以库存不是一维数字,而是带约束条件的可用性判断。
为什么 location 不是全部
如果只看 location,系统就没必要在 stock.move、stock.move.line、stock.quant 里反复带上:
lot_idpackage_idowner_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
评论区