跳至内容

深入解析 Odoo stock.move 模型:库存移动架构详解

开发者与实施顾问必读:Odoo 库存移动模型实战全解析
2026年3月10日
深入解析 Odoo stock.move 模型:库存移动架构详解
Dasolo
| 还没有评论

导言


在 Odoo 中,模型决定了业务数据在数据库里的格式与存放方式。从销售订单、发票到库存移动,所有这些记录都由模型来承载和管理。


无论是开发人员还是功能顾问,理解 Odoo 的模型设计都是必备技能。模型不仅定义字段和关联关系,还封装了关键的业务逻辑,是系统数据结构的基石。


本文聚焦一个在库存管理中至关重要的模型:stock.move。无论你在做仓库定制、外部系统对接还是库存流程配置,这个模型都会频繁出现并影响业务运作。

什么是 stock.move 模型


stock.move 用来表示一次具体的库存移动:某个产品从一个库位移到另一个库位。每当货品出库、在仓间调拨或交付给客户时,系统都会创建对应的 stock.move 记录来追踪这次动作。


库存(Inventory)模块是 stock.move 的主要使用者。销售、采购、生产与电商等功能模块在触发库存操作时都会生成或更新 stock.move。确认交货、收货或完工都会改变这些记录的状态和数量。


stock.move 定义在 stock 模块中,其他模块通过 Odoo 的模型继承对其扩展。比如销售模块会添加 sale_line_id,采购加入 purchase_line_id,制造加入 production_id。这种方式让核心结构保持一致,各模块只补充所需信息。

模型中的重要字段


下面列出 stock.move 中最重要的字段,理解它们能帮助你正确处理库存移动与相关流程。


1. name

类型:字符。用于记录移动的名称或描述,通常包含产品信息与数量。在列表和表单中常作为识别项。


2. product_id

类型:Many2one(product.product)。指明被移动的产品,是必填项。系统依赖此字段做数量统计与库存规则应用。


3. product_uom

类型:Many2one(uom.uom)。表示数量的计量单位,通常为产品默认单位。系统会按此单位校验数量。


4. product_uom_qty

类型:浮点。计划移动的数量(需求量)。实际处理完成后以 quantity_done 为准。


5. quantity

类型:浮点(显示/计算字段)。在界面上用于更友好的数量展示,可能与 product_uom_qty 相同或为换算值。


6. location_id

类型:Many2one(stock.location)。源库位,表示货物来自何处。为必填项,视操作类型可能是仓库存放点或外部地点。


7. location_dest_id

类型:Many2one(stock.location)。目标库位,表示货物要去往何处。为必填项,可能是客户、报废位或仓库位置。


8. picking_id

类型:Many2one(stock.picking)。将移动归并到同一传输单(如发货单、收货单或内部调拨),便于用户操作与追踪。


9. picking_type_id

类型:Many2one(stock.picking.type)。操作类型,决定这是出库、入库还是内部调拨,并驱动默认库位与工作流。


10. state

类型:Selection。记录当前状态,如 draft、waiting、confirmed、assigned、done、cancelled。assigned 表示已预留库存,done 表示已完成。


11. date

类型:Datetime。计划执行日期,用于排程与优先级排序,帮助运营安排拣货和运输。


12. date_deadline

类型:Datetime。执行截止日期,常用于客户承诺的交付日期及紧急度计算。


13. origin

类型:字符。来源单据引用,例如销售单号、采购单号或生产单号,便于追溯移动来源。


14. move_dest_id

类型:Many2one(stock.move)。链式移动的下游记录。当一个移动的输出作为另一个移动的输入时,用此字段关联两者。


15. move_orig_ids

类型:One2many(stock.move)。上游来源移动的集合,是 move_dest_id 的反向关系,用于追踪来源。


16. move_line_ids

类型:One2many(stock.move.line)。移动明细,用于记录批号、序列号、具体库位等处理细节。拣货与保留操作会生成 move lines。


17. partner_id

类型:Many2one(res.partner)。关联的往来方,发货对应客户、收货对应供应商,常用于地址与报表。


18. company_id

类型:Many2one(res.company)。多公司环境下指明记录所属公司,影响可见性和公司间规则。


19. quantity_done

类型:浮点。实际处理的数量。用户在拣货或收货时更新此值,当它等于 product_uom_qty 时,移动可视为完成。


20. reserved_availability

类型:浮点。已为该移动预留的库存数量,在 assigned 状态时尤为重要,显示可用量情况。


21. create_date

类型:Datetime。记录创建时间,由系统自动维护,常用于审计与统计。


22. write_date

类型:Datetime。最后修改时间,由系统自动维护,帮助追踪数据变更。


23. sequence

类型:整数。在同一拣货单内的显示顺序,用于界面排序,数值越小越靠前。


24. priority

类型:Selection。优先级(如普通或紧急),用于调度时提升处理顺序。


25. description_picking

类型:字符。移动的说明或备注,打印在拣货单上以提示特殊处理要求。


26. reference

类型:字符。内部参考或外部映射码,可用于与第三方系统对接。


27. group_id

类型:Many2one(procurement.group)。采购/补货组,用于把同一次采购触发的移动聚合,方便计划与串联。


28. procure_method

类型:Selection。备货方式:按库存发货(make to stock)或按订单触发(make to order),影响是否触发采购或生产。


29. sale_line_id

类型:Many2one(sale.order.line)。由销售模块添加,关联触发该移动的销售订单行,用于追溯与报表。


30. purchase_line_id

类型:Many2one(purchase.order.line)。由采购模块添加,关联采购订单行,常用于收货环节。


31. production_id

类型:Many2one(mrp.production)。制造模块添加,连接到生产单,用于原料消耗与成品入库的关联。


32. active

类型:布尔。软删除标志,设为 False 会在默认视图中隐藏记录,但不会物理删除。

该模型在业务流程中的作用


1. 客户交付

销售确认后,系统为每一销售行生成对应的 stock.move,源为仓库库位,目标为客户库位,这些移动会被归到一个拣货单(picking)。仓库拣货并发货时,会更新 quantity_done,并将移动标记为完成。


2. 供应商收货

采购确认后会生成入库移动,源为供应商位置,目标为仓库存放位,系统把这些移动归为收货单。到货后用户验收并更新 quantity_done。


3. 内部调拨

仓间或库位间调拨也会产生 stock.move,源为发出仓位,目标为接收仓位,常用于补货、平衡库存或多仓管理。


4. 生产制造

生产单通常产生两类移动:原料从库存到产线的出库移动,以及成品从产线入库的入库移动。production_id 将这些移动与生产单关联,move_dest_id 等字段用于把产出链到下游交付。


5. 退货与报废

客户退货会生成反向移动,报废操作会把货移到报废库位。stock.move 在不同场景通过 picking_type_id 驱动相应流程,统一处理这些操作。

开发者如何扩展此模型


开发者可以通过多种方式扩展 stock.move,Odoo 的模型继承是最常用的手段。


模型继承概念

在自定义模块中使用 _inherit = 'stock.move' 来扩展模型,可以新增字段、重写方法或增加约束。通过继承保持改动在独立模块中,便于升级与维护。


添加字段

在继承模型里定义新字段(如 Char、Many2one、Boolean、Integer、Text、Selection 等)。在多公司环境中考虑 company-dependent 字段。常见扩展包括自定义追踪号、承运商参考或批次属性。


Python 层面的扩展

重写关键方法(如 _action_done、_action_assign、_action_cancel)以加入自定义逻辑,同时通过 super() 调用原实现。扩展时需谨慎处理库存变更与移动链关系,避免破坏核心流程。


Odoo Studio

Odoo Studio 可用于无需编码就添加字段或调整表单,适合快速原型与简单定制。复杂的流程或长期维护仍建议通过自定义模块实现。

最佳实践


  • 务必确保 location_id 与 location_dest_id 设置正确,错误的库位会导致库存数量异常。
  • 使用 picking_id 将相关移动归组。属于同次传输的移动不应单独创建而不挂接到 picking。
  • 做 API 对接时,优先使用 XML-RPC 或 JSON-RPC 接口。stock.move 在接口中可访问,但要谨慎映射外部 ID。
  • 为自定义字段使用模块前缀或 x_ 前缀,以减少与未来 Odoo 版本字段冲突的风险。
  • 在编程创建链式移动时,正确设置 move_dest_id 与 move_orig_ids 以保证可追溯性与业务连续性。
  • 在验收或结单时注意 quantity_done 与 product_uom_qty 的差异,系统允许部分交付,需要按业务规则处理。

常见错误


  • 创建移动时使用不正确的库位类型(比如源与目标都为客户位置)会引发业务与会计错误,应避免。
  • 在已有 move.line 的情况下更改 product_uom_qty 可能造成库存不一致;如需变更,优先取消并重建移动。
  • 忽略 origin 字段会使得后续追溯来源单据变得困难,应尽量填写来源引用。
  • 在重写 _action_done 时若不调用 super(),可能会阻断库存更新或影响其他依赖模块。
  • 直接创建移动跳过正确工作流(例如不通过 stock.picking)会破坏预留与分配逻辑,应遵循系统流程。
  • 在拆分或合并移动时忽视 move_dest_id,容易导致链式移动脱节或孤立,影响追溯。

总结


stock.move 是 Odoo 库存管理的核心实体,用于记录每一次货品从一个位置到另一个位置的流动。掌握其关键字段与扩展方式,有助于你更高效地配置、定制与对接 Odoo。


无论你是负责绘制仓库业务流程的功能顾问,还是编写自定义模块的开发者,熟练掌握 stock.move 都会显著减少调试时间与业务错误。

需要 Odoo 实施支持吗?


Dasolo 专注于为企业提供 Odoo 实施、定制与优化服务,我们在 API 集成与 Odoo 数据架构(包括 stock.move 等模型)上具备丰富经验。


如果你需要 Odoo 实施、定制开发或系统集成方面的帮助,我们可以提供支持与咨询。 预约演示 与我们讨论你的项目需求。

深入解析 Odoo stock.move 模型:库存移动架构详解
Dasolo 2026年3月10日
分析这篇文章
登录 留下评论