仓库表里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.updateSalabilityStatus Consumer在运行;
  • 确认批量导入脚本调用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,三处结果一致才算修好。