仓库表里qty已经是100,前台却仍缺货,后台Salable Quantity甚至显示-6。这通常不是索引没刷新,而是批量脚本只改了source item,没有让MSI的reservation链路保持一致。
先把三个数字摆在一起
SELECT source_code,sku,quantity,status FROM inventory_source_item WHERE sku='SKU-001'; SELECT sku,stock_id,SUM(quantity) reserved FROM inventory_reservation WHERE sku='SKU-001' GROUP BY sku,stock_id; SELECT * FROM inventory_stock_1 WHERE sku='SKU-001';
可售量大致等于分配给该Stock的有效Source数量,加上reservation汇总。reservation里的下单扣减是负数,取消、发货补偿是正数,所以看到负值本身不等于数据错误。
不要手工DELETE,先跑一致性工具
bin/magento inventory:reservation:list-inconsistencies -r bin/magento inventory:reservation:list-inconsistencies -r | bin/magento inventory:reservation:create-compensations bin/magento indexer:reindex inventory bin/magento cache:clean
第一条只读输出必须先保存。确认列出的订单确实已经取消、关闭或完成,且补偿方向正确,再把结果传给create-compensations。生产环境建议先针对少量订单验证,不要把未经检查的整份输出直接执行。
如果命令没有发现不一致
- 检查Source是否分配到当前Website使用的Stock;
- 检查source item的status是否为1,只有quantity没有status仍不可售;
- 确认
inventory.reservations.updateSalabilityStatusConsumer在运行; - 确认批量导入脚本调用SourceItemsSaveInterface,而不是直接写表;
- 多Stock环境不要只查inventory_stock_1。
bin/magento inventory:reservation:list-inconsistencies --help bin/magento queue:consumers:list bin/magento queue:consumers:start inventory.reservations.updateSalabilityStatus --max-messages=10000
修复完成的判定
重新下一个测试订单,观察reservation新增负数;取消订单后应出现等额正数。随后检查前台库存状态、GraphQL的only_x_left_in_stock以及后台Source Selection,三处结果一致才算修好。

