退款时勾选了Return to Stock,后台Source Item数量没变化,Salable Quantity也没增加。MSI下要先区分“退回来源库存”与“释放预留”两条链,缺少shipment/source信息时Magento并不知道该退到哪个Source。

先把现象钉死

先用一个真实失败样本复现,不要一上来全量重建。把请求、实体ID和时间记下来,后面的SQL与日志才能对得上。

现场检查

  • 确认订单是否已发货:未发货取消主要生成补偿reservation,已发货退款才涉及source item回补。
  • 检查shipment item是否保存source_code,以及自定义发货模块有没有绕过Source Deduction。
bin/magento inventory:reservation:list-inconsistencies -r
mysql -e "SELECT sku,source_code,quantity,status FROM inventory_source_item WHERE sku='SKU-1';"
mysql -e "SELECT stock_id,sku,quantity,metadata FROM inventory_reservation WHERE sku='SKU-1' ORDER BY reservation_id DESC LIMIT 10;"

为了避免把环境差异当成根因,我会先在预发布或数据库副本复现;涉及订单、库存和支付的操作,正式环境只做只读核对,修复脚本必须带明确的订单号或SKU范围。

实际修复

已发货订单应使用标准Credit Memo并勾选Return to Stock,确保SourceSelection与shipment source_code完整。历史订单缺source_code时,先按发货记录确定真实来源,再通过SourceItemsSaveInterface回补指定Source;随后运行reservation inconsistency补偿命令处理可销售量,不要同时再手工加两次。

实施时的顺序

  • 先在单个SKU、单个订单或单个Store验证。
  • 保留可回退的旧配置,不覆盖原始证据。
  • 需要批量处理时分批提交并输出成功/失败清单。

怎么确认没有假好

  • Source Item物理数量增加正确值
  • reservation只增加必要的补偿项
  • indexer后Salable Quantity正确
  • 同一Credit Memo不能重复回补

验收不只看后台提示“成功”。我还会从前台/API再走一次真实链路,并在下一轮cron、索引或缓存命中后重复检查,确认不是短暂正常。

留一个坑位提醒

直接修改inventory_stock_1等视图或索引表会在下次索引时消失。