用途:面向 Spree 6 的库存模块,说明库存如何按 variant 与 location 跟踪、如何通过安全方式调整库存,以及结账、调拨、采购等流程中的库存行为。
主要能力:Spree::StockLevel 保存每个 location 的库存,区分 count_on_hand(在架实物)、allocated_count(已下单未发货)、reserved_count(结账中预留)、incoming_count(在途/已订购)、派生 available_count 与 purchasable_count,以及 backorderable。Spree::StockMovement 为不可变流水,类型为 received、allocated、shipped、released、adjusted。下订单不减 count_on_hand,而是在完成时分配,发货时才实际出库;超卖表现为 allocated_count 大于 count_on_hand。
使用方式:库存变更应经 location 方法 restock、adjust、allocate、release、unstock 或服务/Admin API,不要直接改写计数列。Admin API 提供 stock_levels 的 list/update/bulk_upsert、stock_movements、stock_reservations、stock_locations,以及 stock_transfers、purchase_orders、stock_receipts、suppliers 相关端点。批量同步可用 bulk_upsert,逐条 PATCH 效率低。
适用场景:多店或多 location 的库存管理、结账预留、缺货补货与 PO/调拨入库、ERP/WMS 库存同步、缺货通知。
限制:预留过期任务 ExpireJob 需自行调度(如 config/recurring.yml),否则行与 reserved_count 会滞留;修正计数可用 spree rake spree:stock:recount_levels,但仅修复 reserved/incoming;计数列不可直接改写;多店场景须用 for_store 限定范围;外部库存系统需本地快照或库存提供者契约。