导言
在 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 实施、定制开发或系统集成方面的帮助,我们可以提供支持与咨询。 预约演示 与我们讨论你的项目需求。