SKU 在后台显示 Quantity=50,加入购物车或提交订单时却提示 The requested qty is not available。在 MSI 中,后台看到的某个 Source Quantity 不一定属于当前 Website 使用的 Stock;结账检查的是可售数量和销售通道,不是任意一个 Source 的数字。
从发生错误的 Website 反查 Stock
SELECT website_id, code, name
FROM store_website;
SELECT stock_id, type, code
FROM inventory_stock_sales_channel
WHERE type = 'website';
确认当前域名对应的 website code,再找到 stock_id。若 Website 绑定错 Stock,默认库存再多也不会参与当前站点销售。
列出这个 Stock 实际包含哪些 Source
SELECT l.stock_id, l.source_code, s.name, s.enabled
FROM inventory_source_stock_link l
JOIN inventory_source s ON s.source_code = l.source_code
WHERE l.stock_id = 2;
然后只查询这些 Source 上的 SKU:
SELECT sku, source_code, quantity, status
FROM inventory_source_item
WHERE sku = 'SKU-001'
ORDER BY source_code;
Quantity 大于零但 status=0,仍不可售;有数量的 Source 不在 Stock 里,也不会计入。
把 Reservation 加进计算
SELECT stock_id, sku, SUM(quantity) AS reservation_total
FROM inventory_reservation
WHERE sku = 'SKU-001'
GROUP BY stock_id, sku;
例如 Source 可用合计 10,reservation 合计 -8,再考虑 Out-of-Stock Threshold 后,可售量可能只剩 2。购物车要 3 件就会被拒绝。不要删除负 reservation;先确认对应订单仍有效。
检查商品与全局库存配置
后台商品 Advanced Inventory 中的 Manage Stock、Backorders、Minimum Qty、Maximum Qty、Qty Uses Decimals、Out-of-Stock Threshold 都会改变结果。商品若勾选 Use Config Settings,还要核对全局值。Bundle/Configurable 需要继续检查最终子 SKU,而不是只看父商品。
用接口重现,分开“加入购物车”和“下单”
保留一个测试 Cart,先加入 1 件,再逐步增加。若加入购物车成功、place order 失败,说明两次检查之间库存、reservation 或并发发生变化;若一开始就失败,重点查 Stock 映射和阈值。
# 诊断索引状态,名称以 indexer:info 输出为准
bin/magento indexer:info | grep -i inventory
bin/magento indexer:status
bin/magento cron:run --group=index
手动 reindex 后恢复但很快再次失败,说明增量索引/Cron 链路有问题,不是商品数据本身。
最后库存的并发场景
两个客户同时购买最后一件商品时,两边页面都可能先显示可售,但最终只能有一个订单成功。结账阶段必须以权威库存校验为准。不能为了消除提示而跳过最终校验,否则会超卖。
修复后用当前 Website、当前 Stock、目标客户组完成加入购物车、下单、取消和再次下单。四个动作后的 Source、Reservation 与 Salable Quantity 应能逐笔解释。

