引言
在 Odoo 中,模型决定了数据在数据库里的组织方式。无论是销售订单、库存调拨,还是仓库作业,所有业务记录都依赖模型来保证数据结构一致,可被系统逻辑识别和处理。
无论是开发人员还是功能顾问,弄清模型如何工作都是上手 Odoo 的先决条件。模型不仅声明字段和相互关系,还封装了业务规则,是系统数据设计的基石。
本文聚焦库存应用中一个核心模型:stock.picking。无论你是在做仓库模块定制、第三方系统对接,还是流程配置,这个模型都是不可避免的工作对象。
什么是 stock.picking 模型
简而言之,stock.picking 用来表示一次货物转移。它是追踪仓库操作的主记录——每条 picking 记录对应一次从源位置到目标位置的库存移动。
在库存模块内,收货、发货与库内调拨都会产生或更新 stock.picking。确认销售发货、验收入库或跨仓移动时,系统就在后台创建或修改相应的 picking 记录。
stock.picking 定义在 stock 模块中,其他模块通过 Odoo 的模型继承机制在其上扩展功能。销售模块会补充与发货相关的字段,采购模块会增加收货流程,制造模块会连结生产物料的消耗与入库,各模块各司其职而不重复核心结构。
该模型继承了 mail.thread 与 mail.activity.mixin,因此可以直接在搬运单上记录变更、发送消息并安排任务,便于协同与跟踪。
模型中的关键字段
下面列出的是使用 stock.picking 时最常接触到的一批字段。理解它们的用途有助于你更精准地操作调拨与库存流程。
1. name(单据编号)
类型:字符。用于存放调拨的唯一参考号,通常由序列自动生成(例如 WH/OUT/00001)。该编号显示在单据抬头,是用户识别该调拨的主要方式。
2. origin(来源单据)
类型:字符。记录此调拨关联的源单号:对出库通常是销售单号,对入库是采购单号。便于追溯业务来源和做审计。
3. state(状态)
类型:选择。反映调拨当前的处理阶段,常见值有 Draft、Waiting Another Operation、Waiting、Ready、Done、Cancelled。状态控制可执行动作,系统也会依据相关 stock.move 计算并更新该字段。
4. picking_type_id(作业类型)
类型:Many2one(stock.picking.type)。定义这是一笔收货、发货还是内部调拨。该类型决定默认的源/目标库位与处理行为,是创建时必须指定的字段。
5. move_ids(库存移动行)
类型:One2many(stock.move)。每条 move 代表一种产品及其移动数量,是调拨的核心行项。可用量预留、分配等逻辑都作用于这些 move。
6. move_line_ids(移动明细)
类型:One2many(stock.move.line)。更细粒度的操作行,存放批次、序列号与具体库位信息,常用于拣货、打包与最终验收。
7. location_id(源库位)
类型:Many2one(stock.location)。货物取出的起始位置。对于出库一般是公司库存;对于入库通常对应供应商位置。该字段为必填项。
8. location_dest_id(目标库位)
类型:Many2one(stock.location)。货物要移入的目标位置。出库通常为客户位置,入库则回到公司库存。该字段决定货物最终归属。
9. partner_id(关联联系人)
类型:Many2one(res.partner)。配送或收货的对象:出货为客户,收货为供应商。用于单据地址、交付凭证和承运商对接。
10. scheduled_date(计划处理时间)
类型:日期时间。标记预计要执行此调拨的时间点,用于排程与优先级排序。手动设置会影响其下属移动的预期时间。
11. date_deadline(承诺/截止日期)
类型:日期时间。通常由销售或采购单传入,用来标识是否逾期以及对外承诺的交付日期。
12. date_done(完成时间)
类型:日期时间。记录调拨被确认完成或取消的时间,只读且由系统在完成时自动填写。
13. priority(优先级)
类型:选择。用于控制库存分配顺序,高优先级的调拨在库存分配时会优先得到物料,适用于紧急订单处理。
14. move_type(出运策略)
类型:选择。决定发货策略,例如立即尽可能发货(允许部分发运)或等所有商品齐备再发(全部或不发)。该策略影响调拨何时能被执行。
15. user_id(负责人)
类型:Many2one(res.users)。分配给负责此调拨的用户,便于任务分配和工作量统计。默认创建者为当前用户。
16. company_id(公司)
类型:Many2one(res.company)。指明此调拨所属的公司,在多公司环境下决定账务与库存归属,通常从 picking type 继承而来。
17. group_id(采购/运单组)
类型:Many2one(procurement.group)。将同一业务产生的多条移动关联在一起,便于把来自同一订单的作业汇总管理。
18. backorder_id(原始单)
类型:Many2one(stock.picking)。当部分验收生成补单时,该字段指向原始单据,便于追踪拆单与后续处理。
19. backorder_ids(后续补单)
类型:One2many(stock.picking)。保存由当前调拨产生的后续补单,用于管理部分完成后的剩余作业。
20. return_id(退货关联)
类型:Many2one(stock.picking)。若此单为退货产生,则指向被退回的原始调拨,支持退货流程管理。
21. note(内部备注)
类型:Html。仓库内部可见的备注区域,可写入特殊操作说明或处理要求,方便作业人员参考。
22. signature(签字图片)
类型:Image。交付时捕获的签收图片,用作送货凭证并以附件形式保存。
23. is_signed(是否已签收)
类型:布尔。由 signature 计算得出,表示该交付单是否已经完成签收。
24. owner_id(物权归属)
类型:Many2one(res.partner)。在代销或第三方持有库存场景下,用来指定物品归属方,验证时可将所有权分配给此人。
25. package_level_ids(包裹层级)
类型:One2many(stock.package_level)。用于打包操作,将多条移动明细组合到包裹层级以便运输与扫描管理。
26. create_date(创建时间)
类型:日期时间。记录此记录何时被创建,由 Odoo 基础模型自动维护。
27. write_date(最后修改时间)
类型:日期时间。记录最近一次修改时间,由系统自动更新,便于审计与同步检查。
28. active(激活标记)
类型:布尔。软删除开关;设为 False 表示归档,记录仍可保留但不会出现在默认列表中。
该模型在企业流程中的应用场景
1. 销售与发货场景
销售订单一旦确认,系统会生成对应的发货单(stock.picking)。仓库按照单据拣货、打包并确认发运,单据状态随流程由草稿走向待处理再到完成。
2. 采购与收货场景
采购订单确认后会产生入库单,供应商发货后仓库接收并把货移入公司库存,partner_id 标识为供应商,确认后库存数量随之变更。
3. 库内调拨
跨库位或仓库的库存移动会生成内部调拨,picking_type_id 的类型通常是 code 为 'internal' 的作业类型,源与目标均为内部库位。
4. 退货与补单
顾客退货会创建退货调拨,并通过 return_id 关联原始出库;若部分验收则会生成补单,backorder_ids 用于保存未完成的剩余作业。
5. 生产与制造场景
在制造流程中,会为原材料的领用和成品的入库各生成对应的 pickings,mrp 模块会在 stock.picking 基础上扩展以实现生产相关的库存流转。
开发者如何扩展此模型
开发者可以通过多种方式扩展 stock.picking,模型继承是最常见且稳定的手段。
模型继承方式
在自定义模块中使用 _inherit = 'stock.picking' 来扩展模型:可以新增字段、覆盖方法或加入约束。通过继承而不是修改原代码,便于后续升级与维护。
新增字段
在继承的模型中声明新的字段,选择合适的字段类型(Char、Many2one、Boolean、Integer、Text、Selection 等)。在多公司环境下考虑 company-dependent 字段的影响。
Python 端扩展
可覆盖方法例如 button_validate、action_assign 或 _create_backorder 来加入业务逻辑,记得在适当位置调用 super(),并小心处理状态变化与移动记录的创建流程。
Odoo Studio 的使用
对于简单的界面字段或注释,Odoo Studio 可以快速完成无代码定制;但涉及复杂逻辑、外部承运对接或长期维护时,建议通过自定义模块实现更可靠的扩展。
最佳实践建议
- 手动创建调拨时务必指定 picking_type_id,因为它决定了默认库位与后续行为。
- 使用 origin 字段记录源单据编号,有助于报表统计与线上问题排查。
- 在做 API 对接时,stock.picking 在 Odoo API 中是可见且可操作的:通过 move_ids 关系创建明细移动。切记不要创建没有任何 move 的空调拨,系统与库存一致性会受影响。
- 合理使用 scheduled_date 进行排程与优先级控制,它会影响物料预留和作业调度。
- 自定义字段请使用 x_ 或模块前缀命名以避免与未来 Odoo 版本的字段冲突。
常见错误与陷阱
- 未在创建时指定 picking_type_id,可能导致默认库位错误或行为不符合预期。
- 在不理解状态机的前提下于确认后随意修改 move_ids,会造成状态不同步或库存异常。
- 忘记为发货单设置 partner_id,会影响承运商计算与单据打印地址等功能。
- 覆盖 button_validate 时不调用 super(),常会破坏补单创建逻辑或影响其他模块的联动。
- 默认假设 move_ids 与 move_line_ids 始终同步是错误的;move_line(明细)通常在预留或使用详细操作时才会被创建。
总结
stock.picking 是 Odoo 库存体系的核心,用来承载转移、发货与收货记录。掌握其关键字段与扩展点,能让你更高效地配置、定制与对接 Odoo。
无论你是负责仓库流程梳理的功能顾问,还是开发定制模块的工程师,熟练掌握 stock.picking 都能节省大量时间并降低实施风险。
准备好优化你的 Odoo 仓库了吗
Dasolo 擅长帮助企业实施、定制与优化 Odoo,尤其是在 API 对接与开发集成方面,我们对 Odoo 的数据架构与核心模型(如 stock.picking)有深入实践经验。
如果你需要在 Odoo 上做仓库模块定制、系统对接或实施支持,我们可以提供专业帮助。 预约演示 与我们讨论你的项目需求。