退款时勾选了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等视图或索引表会在下次索引时消失。

