客户在华东下单,系统却建议从华南仓发货;或者明明 A 仓有库存,创建 shipment 时只列出 B 仓。MSI 中“可售”和“从哪个 Source 扣减”是两步。前者由销售渠道关联的 Stock 聚合并结合 reservation 得到,后者由 Source Selection Algorithm 在发货阶段给出分配建议。

先确认订单属于哪个 Stock

Website 通过 sales channel 关联到一个 Stock,Stock 再关联多个 Source。商品在某个 Source 有数量,不等于当前网站能使用它。检查后台 Stores → Inventory → Stocks 与 Sources,确认网站没有绑到测试 Stock,Source 也没有被禁用。

SELECT stock_id, type, code
FROM inventory_stock_sales_channel
WHERE type = 'website';

SELECT link.stock_id, link.source_code, link.priority
FROM inventory_source_stock_link AS link
ORDER BY link.stock_id, link.priority;

不同版本表字段可能存在差异,查询前先看结构。这里只做读取,不要直接改 link 表;库存配置应通过后台或服务接口保存,使索引和缓存同步更新。

Priority 算法只认识顺序与可用数量

按优先级选择时,算法从优先级高的 Source 开始满足请求,必要时拆分。若优先级配置与业务理解相反,结果就会“选错”。还要检查 source item 的 status,不是只有 quantity 大于零就能用。

SELECT source_code, sku, quantity, status
FROM inventory_source_item
WHERE sku = 'SKU-001'
ORDER BY source_code;

Source 本身启用、商品 source item 启用、数量足够,三者缺一不可。Threshold 与 reservation 影响 salable quantity,但 SSA 读取的数据与前台可售判断并非完全同一个简单字段。

Distance 算法依赖可解析的地址

距离算法可能使用 Google Maps 或离线 geonames,取决于安装与配置。收货地址缺少国家、邮编、城市,仓库经纬度或地址错误,API key 无权限或配额耗尽,都会导致无法正确计算。检查日志中地理编码请求与回退行为,并确认隐私政策允许把必要地址发送给外部服务。

不要拿直线距离代替运输成本的全部含义。偏远地区、跨境清关、仓库截单时间和承运商服务范围都可能让“最近仓”不是最佳仓。若业务规则更复杂,需要自定义算法或在 WMS 中决策,而不是强行修改 source priority。

Reservation 解释了“看起来有货”

下单时 MSI 通常写 reservation,实际 Source quantity 在 shipment/deduction 时变化。未完成订单、取消补偿失败或导入脚本绕过库存服务,可能造成 salable quantity 与物理数量差异。使用官方命令检查库存不一致并在确认后补偿,不能随意删除 reservation 表记录。

bin/magento inventory:reservation:list-inconsistencies -r
bin/magento inventory:reservation:create-compensations

第二条命令需要把审查过的输出作为输入流程的一部分,不能空跑后假定安全。先备份并核对订单状态。

谁最终覆盖了算法建议

SSA 返回的是建议,管理员创建 shipment 时可以调整,ERP/WMS 扩展也可能重新分配。记录订单号、算法名称、输入地址、候选 Source、建议数量和最终 shipment source。若数据库中的 shipment 已是错误仓,要查调用链而非只改算法配置。

构造边界测试

至少测试单仓足量、多个仓拆单、最高优先级缺货、地址缺邮编、Source 被禁用、取消订单后 reservation 补偿六种情况。每次先记录 salable quantity,再运行选择并创建测试 shipment。只有建议结果和最终扣减都符合预期,才能确认多仓链路已修复。