引言
在现代供应链与仓库管理中,越来越多企业不仅拥有一个仓库,而是分布多个仓库、多个地点、甚至跨区域、多国运营。面对“一个销售订单可能同时从多个仓库取货”的现实需求,传统“一个仓库→一个发货”的逻辑显得不够灵活。针对这一需求,Odoo 19 的库存模块提供了“虚拟仓库/虚拟地点”(Virtual Locations / Virtual Warehouses)机制,用以将多个真实仓库整合起来,在销售、发货、库存取货环节中支持跨仓库调拨与统一发货视图。
本文将从业务背景、关键概念、系统设置、典型操作流程、注意事项及最佳实践等方面,逐步详解这一功能,帮助你在 Odoo 17/19 等版本中清晰理解并落地执行。
一、业务背景与为何使用虚拟仓库
1. 多仓库运营场景
假设一家企业拥有两个或多个仓库,比如「仓库A」在东京、「仓库B」在大阪,或者「仓库A」负责国内、「仓库B」负责海外。客户下单后,有可能某个产品在仓库A已无库存但在仓库B仍有,或者订单中不同产品分散在多个仓库。为了提升客户交付速度、降低缺货风险,企业希望:
- 当一个仓库无货时自动从另一个仓库调货或直接发货;
- 在销售下单环节,不必手动分拆订单、选仓库,而系统自动处理多个仓库库存;
- 对销售人员与客户而言,仍然表现为“一个仓库/一个销售订单”即可处理,而背后支持多仓库协同。
2. 传统单仓库模式的局限
在只有一个仓库或者简单仓库结构的情况下,销售订单与发货流程通常为:销售 → 选定仓库 →发货。但当有多个仓库时:
- 若客户选“仓库A”但无库存,则订单可能被卡住;
- 若销售员必须手动判断仓库选择,会增加操作复杂度和人为失误;
- 在 ERP 系统中,如果没有统一机制支持“跨仓库取货”,往往会拆单、手工调拨,效率低、易出错。
3. Odoo 的解决方案:虚拟仓库/虚拟地点
Odoo 19 提供“虚拟地点”(Location Type = View/Virtual)与“子仓库归属”机制,结合多步收发货(Multi-Step Routes)及“仓库作为地点层级”的配置,从而实现如下:
- 创建一个“虚拟仓库”作为母级,用于将多个真实仓库整合起来。 (Odoo)
- 将多个实际仓库设为该虚拟仓库的子位置。
- 在销售订单中选定“虚拟仓库”作为发货仓库,则系统可从多个子仓库中取货,以满足订单需求。 (Odoo)
- 对销售人员而言,依旧只在销售订单中选择一个“仓库”字段即可;但后台可跨仓库调度。
这样,既保留了多仓库运营的库存管理优势,又简化了销售与发货流程。
二、关键概念解析
在继续前进之前,我们先理清几个关键概念,以避免后续配置与操作中的混淆。
1. 仓库(Warehouse)
在 Odoo 中,“仓库”表示一个物理地点(或逻辑地点)用于存储产品,具有地址、库存、收发货流程等。 (Odoo)
每个仓库可配置入库/出库流程(1 步、2 步、3 步)及补货规则。
2. 地点(Location)
仓库下可细分为“地点”(Location),比如「货架A」、「冷库区」、「发货区」等。地点类型(Location Type)决定其属性:内部、供应商、客户、虚拟、在途等。 (Odoo)
- Internal:内部存储,计入库存。
- Virtual(或 View):仅用于组织结构,不真实存货。产品通常不能留存于此。 (Odoo)
- Transit、Vendor、Customer 等,分别用于在途中、供应商所在地、客户所在地。
3. 虚拟仓库/虚拟地点(Virtual Warehouse / Virtual Location)
虚拟仓库其实就是一个“仓库”的抽象,用一个 “母级”仓库将多个“子仓库”作为其内部子位置,这个母级仓库所在的 Stock Location 被设定为 Location Type = View(即虚拟、不真实存货存放) 。 (Odoo)
它的功能如下:
- 将多个子仓库的库存以统一视图聚合。
- 在销售订单中作为仓库选择项,使系统从多个子仓库中取货。
- 不用于直接存货,其 Stock 地点被设置为 View 类型。
4. 子仓库(Child Warehouse)
即实际操作中有存货的仓库。它们被配置为虚拟母仓库的子位置。这样,当销售选择母仓库时,系统能从其子仓库中抽货。 (Odoo)
5. “Warehouse”字段在销售订单中的意义
在销售订单(Sales Order)中有一个 “Warehouse” 字段,表示此订单应从哪个仓库发货。若选择的是虚拟仓库,则系统在调拨时会将源地点设为虚拟仓库 Stock 位置,从而触发对多个子仓库的取货。 (Odoo)
三、系统配置步骤(以 Odoo 19 为例)
下面逐步说明如何在 Odoo 19 中配置该功能。建议在测试环境中操作,确认无误后再至生产环境。
步骤 1:启用所需功能
在 Inventory(库存)应用 → Configuration(配置) → Settings(设置)中,需要启用以下两个选项:
- Storage Locations(存储地点)
-
Multi-Step Routes(多步路线)
只有启用这两个功能,才能进行地点、仓库层级、子仓库配置。 (Odoo)
保存设置,系统可能提示更新。
步骤 2:创建虚拟母级仓库
- 进入:Inventory → Configuration → Warehouses(仓库) → 创建新仓库。 (Odoo)
-
在新仓库表单中填写:
- 名称(例如:“VWH – 虚拟仓库”)
- 短名称(例如:“VWH”)
- 地址/公司等信息。
- 保存以后,该仓库生成默认 Stock、Reception、Delivery 地点等。
-
接下来,在 Locations 配置中,将该仓库的 “Stock” 地点修改其 Location Type 为 “View”。也就是说:
- 在 Inventory → Configuration → Locations,找到 VWH/Stock(虚拟仓库的 Stock 地点)
- 点击编辑,在 Additional Information(附加信息)中将 Location Type 从 “Internal” 改为 “View”
- 保存。这样该地点不用于存货,只作为母级结构视图。 (Odoo)
步骤 3:创建子仓库(或已有仓库改为子)
- 若已有多个物理仓库(例如 “WH-A 虚拟A”, “WH-B 虚拟B”),确保它们对应各自 Stock 地点为 Internal。
- 在 Locations 中编辑这些子仓库的 Stock 地点(例如 “WHA/Stock” “WHB/Stock”),将其 Parent Location(上级地点)设置为 虚拟母仓库的 Stock 地点(如 “VWH/Stock”)。 (Odoo)
- 保存。此时,“WHA/Stock” 和 “WHB/Stock” 成为母级 VWH 的子位置。
步骤 4:验证子仓库结构生效
在产品表单中,点击 On Hand(在手)按钮,系统会显示包括所有子仓库在内的库存。通过 “Quantity on hand by Location” 或类似视图,可以看到 WH-A、WH-B 两个仓库的库存。这样,销售选择虚拟仓库后,系统已有多个仓库可用。 (Odoo)
步骤 5:将虚拟仓库设为销售默认仓库(可选)
如果希望所有销售订单默认使用该虚拟仓库,可以在每个销售人员设置中指定 Default Warehouse 为 “VWH”。在 Sales → Configuration → Users & Companies → Employees,选择员工 → Default Warehouse 设置。 (Odoo)
四、典型操作流程:从销售到发货
以下以一个示例说明“从多个仓库取货”的完整流程。
假设场景:
- 产品 “玩具兵” 在 “WHA/Stock” 有库存 1 件,在 “WHB/Stock” 有库存 2 件。
- 已配置 “VWH” 虚拟母仓库,其子仓库为 WHA、WHB。
- 客户下单购买 “玩具兵” 2 件。
操作流程:
- 在 Sales(销售)应用中新建报价单 → 添加客户 → 添加产品 “玩具兵” 数量 2。
- 在 Other Info(其他信息)选项卡中,将 Warehouse 字段设为 “VWH – 虚拟仓库”。
- 确认报价单 → 转为销售订单。
- 点击 “Delivery” 智能按钮,进入发货单。检查发货单的 Source Location(来源地点)是否为 “VWH/Stock”。如果不是,则可能配置有误。 (Odoo)
- 在发货单的 “Detailed Operations”(详细操作)选项卡中,可看到两个取货行:一行从 “WHA/Stock” 取 1 件,另一行从 “WHB/Stock” 取 1 件(假设系统自动决定如何分配库存)——这样即使用两个子仓库完成一个销售订单的发货。 (Odoo)
- 验证发货后,返回销售订单页面点击 “Create Invoice” 开发票。
通过这一流程,销售订单只选了“VWH”仓库,后台却自动从多个仓库完成发货,实现多仓协同。
五、注意事项与限制说明
在实际运用中,有一些重要的限制和注意点,不能忽视。
- 虚拟仓库地址在文档上可能被当作 Source Location 的地址。也就是说,在发货、包装、快递单据中,可能显示的是虚拟仓库的地址,而非实际子仓库的物理地址。对此必须确认流程是否允许。 (Odoo)
- 对于两步/三步收发货流程,使用虚拟仓库可能导致“输出区”或“打包区”显示为母仓库地址,这是系统当前机制的限制。 (Odoo)
- 虚拟仓库 Stock 地点被设置为 View 类型,其本身不能储存产品库存。因此必须将真实库存存放于子仓库。否则,会导致库存显示异常。 (Odoo)
- 销售订单中的 Warehouse 字段必须选为虚拟仓库,否则系统不会触发跨仓库取货逻辑。若选错,将只从单一仓库取货。 (Odoo)
- 若在发货单中 Source Location 不是虚拟仓库 Stock 地点,会导致系统无法自动从多个仓库调货。必要时可在发货单上手动点击 “Check Availability” 或运行调度器(Inventory → Operations → Run Scheduler)重试。 (Odoo)
- 虚拟仓库视为母级层级,仅用于逻辑结构,不建议将 “存货收货” 放在其上操作,否则可能造成混淆。
六、最佳实践建议
结合上述流程与注意事项,以下为一些实践层面的建议,便于企业顺畅落地多仓协同。
- 明确仓库层级结构:建议在组织内部画出仓库结构图,明确母仓库(虚拟)与子仓库(物理)关系,并标识子仓库存货情况。
- 维护库存准确性:子仓库的库存状态必须保持准确,以便系统在销售发货时正确分仓。错误库存会导致订单延迟。
- 销售人员培训:让销售了解“当选仓库为虚拟仓库”意味着系统可自动分仓,避免手动选错但仍限制为单仓。
- 检测发货地址显示:确认快递单据、包装证明、发货通知中显示的地址是否为真实仓库地址,若仍显示母仓库地址,应评估企业流程是否接受。
- 测试多步流程:如果企业启用了两步/三步收发货流程,应先在测试环境试用虚拟仓库模式,观察是否存在地址、物流路径、操作中的不合理。
- 调整默认仓库设置:如多数销售都应使用多仓模式,则可将虚拟仓库设为默认仓库,减少销售人员手动选仓库的风险。
- 监控库存调拨日志:建议在 Inventory → Reporting 中查看 Moves History(移动历史)报表,观察是否有跨仓库取货情况,并及时处理异常。
- 持续优化仓库结构:随着运营升级,可能需要增减仓库、调整子仓库关系,此时应及时维护母仓库结构。
七、总结
通过本文,我们梳理了 Odoo 19 中“利用虚拟地点从多个仓库销售库存产品”功能的原理、配置步骤、操作流程、注意事项及最佳实践。其核心价值在于:
- 支持多个物理仓库协同取货,提高库存调度效率;
- 简化销售订单流程,销售人员只需选择“一个仓库”(即虚拟母仓库)即可;
- 在后台自动将库存从多个子仓库抽取,提升客户交付能力。
如下为实现的效果:


