用户付款成功,客服说没货。或者卖了 10 件仓库只有 3 件。超卖投诉从哪来?Tigshop开源商城系统前台库存扣减正常,但 WMS/ERP 回写不同步——两边各算各的,就炸。这不是 Tigshop 没库存,是对接层没把回写当回事。
原则:一个真相源
要么以商城为准,要么以仓库为准。我接的客户以 WMS 为准。商城 product_sku.stock 只展示,实际可售 = WMS 回写值。别两边都能改,改着改着就打架。
回写接口
<?php
namespace app\api\controller\warehouse;
class StockSync
{
public function push()
{
$payload = request()->post();
// 验签略
foreach ($payload['items'] as $item) {
Db::name('product_sku')
->where('sku_sn', $item['sku_sn'])
->update([
'stock' => (int)$item['qty'],
'synced_at' => date('Y-m-d H:i:s'),
]);
}
// 清商品详情缓存
Cache::tag('product')->clear();
return json(['code' => 0]);
}
}
延迟和失败
WMS 推送失败不能静默吞。写 stock_sync_log,后台能看到最后一次成功时间。超过 15 分钟没同步,前台显示「库存更新中」或保守扣减。别装没事。
下单时再校验一次
OrderCheckService 提交前读最新 stock。支付成功后再锁库存扣减。只在前端展示库存不够。支付瞬间被别的渠道卖掉,还要靠二次校验兜底。兜底没有,超卖迟早来。
对账日报
商城可售、WMS 账面、待发货占用,三数对不上就报警。报警了人工介入,别等用户投诉。用户投诉一条,客服成本够你写三天同步代码。
预售和现货
有预售 SKU 的,WMS 回写要分仓。别一个 stock 字段混所有。混了预售现货,超卖和缺货一起来。一起来你就加班。加班没有加班费。只有工单。
缓存
库存变了清商品详情缓存。不清,前台还显示有货。用户下单失败来骂。骂完你清缓存。不如一开始就清。一开始清,省得骂。同步延迟超过 SLA,前台宁可显示「库存更新中」也别显示过期数字。过期数字是超卖的温床。温床你睡不安稳。