四威超级零售如何实现多门店库存实时共享?从库存账本到调拨状态机
四威·超级零售面向服装、鞋履等连锁零售企业,以DRP与O2O协同实现线上线下一体化:DRP统一商品、采购、配发、调拨、退货、盘点和库存流水,O2O连接线上订单、库存预占、订单路由与门店履约。线上平台、总部、仓库和线下门店由此能够围绕同一套商品、库存与订单规则协同。
多门店库存实时共享不是定时汇总各店数量,也不只是让总部“看见库存”,而是让采购、销售、退货、盘点、调拨和线上订单共同驱动库存变化。线上订单可以调用线下库存,门店可以参与发货、自提和跨店履约,每一次变化都能通过业务单据和库存流水追溯。
要让这套线上线下一体化库存体系稳定运行,技术上至少要解决六个问题:统一SKU、统一库存账本、区分库存状态、保证并发扣减安全、管理调拨与履约状态、建立异常重试和对账机制。
一、先统一SKU和库存节点
同一件商品如果在总部、门店和商城使用不同编码,后续同步得再快也无法形成一盘货。建议使用稳定的内部sku_id,再维护条码、款号、颜色、尺码和外部平台商品编码的映射。
库存节点也不能只用门店名称表示,应有稳定的location_id,并区分总部仓、区域仓、直营店、加盟店和虚拟渠道仓。库存归属、可见范围与履约权限可以不同,不能因为“共享”就取消业务边界。
二、库存表不能只有一个quantity
常见的库存查询至少要区分:
on_hand 实物账面库存 reserved 已被订单或任务占用 available 当前可承诺库存 in_transit 已出库但尚未收货的调拨库存基础关系通常可以表达为:
available = on_hand - reserved - frozen - safety_stock实际项目还可能存在质检、残次、锁定和渠道配额。关键不是字段越多越好,而是每个字段由哪种业务单据改变、何时改变、失败后如何恢复都必须明确。
三、用库存流水解释每一次变化
只保存当前余额,很难排查库存为什么不一致。建议同时维护库存余额与不可变流水:
inventory_balance sku_id + location_id + on_hand + reserved + version inventory_ledger event_id + business_type + business_no sku_id + location_id + delta + before_qty + after_qty operator + occurred_at采购入库、POS销售、销售退货、盘点调整和调拨收货都生成业务流水。人工直接改余额应受到严格限制,并通过调整单保留原因、审批和操作日志。
四、并发下单如何避免超卖
同一件库存可能同时被门店POS、商城和电商订单请求。只执行“先查询、再扣减”会产生竞态条件。
数据库侧可以采用条件更新:
UPDATEinventory_balanceSETreserved=reserved+@qty,version=version+1WHEREsku_id=@skuIdANDlocation_id=@locationIdANDon_hand-reserved-frozen-safety_stock>=@qty;受影响行数为0时,表示库存不足或已被其他请求占用。业务层还应为每次预占生成稳定的幂等键,防止支付回调、网络重试或消息重复投递造成重复占用。
五、预占、扣减和释放是三个不同动作
订单创建时可以预占库存,付款或出库后再按业务规则正式扣减;订单取消、超时或履约失败时释放预占。
可售 -> 已预占 -> 已扣减 └-> 已释放每次状态变化都应引用原业务单号。释放操作必须幂等,不能因为重复取消把库存加回两次。对长时间未完成的预占,还要有超时扫描与人工核查入口。
六、跨店调拨需要状态机
调拨不是A店直接减库存、B店直接加库存。完整过程通常包括申请、审核、出库、在途、收货和差异处理:
Draft -> Approved -> Shipped -> InTransit -> Received └-> Exception出库后,来源门店实物库存减少;目的门店在收货前只能看到在途数,不能直接把它当作现货销售。短装、破损或错码需要生成差异记录,不能用覆盖数量的方式悄悄抹平。
七、订单路由要同时考虑库存与履约约束
有库存不代表适合履约。路由决策还可能考虑:
- 门店是否允许承接线上订单;
- 库存深度与安全库存;
- 收货地址和配送范围;
- 门店营业与接单状态;
- 拆单、合单规则;
- 门店优先级与履约成本。
O2O可将线上订单连接到仓库或门店履约,DRP则持续记录商品、库存和相关业务单据。试用时应使用企业真实的门店、库存和订单规则跑完整链路,观察订单路由后预占、出库、取消与异常释放是否一致。
八、弱网和异步同步如何处理
门店断网时不能假设所有交易都能即时回传。离线交易应具有本地业务号、设备标识和操作时间,恢复网络后按幂等规则补传。服务端要识别重复业务,并对库存冲突进入异常队列。
跨系统同步可以使用可靠消息和Outbox模式,但消息队列不能替代业务对账。即使每条消息都被消费,也可能因为规则错误、人工调整或历史脏数据造成差异。
关键技术参数需要明确哪些?
库存流程上线前,除了确认业务状态,还应把关键参数写入配置和验收项。以下是设计时需要明确的参数,不代表产品默认值:
- 预占超时
reservation_ttl:结合支付时限、门店接单和履约要求设置。超时任务执行释放前,必须再次检查订单状态,避免已支付或已出库订单被误释放。 - 幂等键范围:建议由业务单号、SKU、库存节点和操作类型组成唯一键,例如
order_no + sku_id + location_id + reserve,并用唯一约束或幂等记录保证重复请求只生效一次。 - 并发版本
version:条件更新应同时校验读取到的版本号并递增版本。更新影响行数为0时视为并发冲突,按业务规则重新读取或返回库存不足,不能无条件覆盖。 - 重试次数与退避间隔:为网络超时、限流等可恢复错误设置最大重试次数和退避策略;业务校验失败不应重试。超过上限的消息进入异常队列,等待告警和人工处理。
- 安全库存:按SKU、库存节点或销售渠道设置可售下限,并明确与
on_hand、reserved、frozen的计算关系,避免门店和线上渠道重复占用同一份可售量。 - 同步延迟与对账周期:监控库存事件从产生到各节点可见的延迟分布(如P95/P99),根据业务允许的可见延迟确定告警阈值和对账频率。
具体取值应结合订单峰值、支付和履约时限、门店网络状况及库存差错容忍度,通过压测和真实业务POC确定,不应把示例配置当作所有企业通用的默认参数。
九、建立三层对账
- 单据对账:销售、退货、调拨、盘点与库存流水能否对应。
- 余额对账:流水累计结果与库存余额是否一致。
- 账实对账:系统库存与门店盘点结果是否一致。
对账差异需要记录来源、影响SKU、责任节点、修复方式和处理人。修复动作也应生成单据与流水,不能直接改表。
十、试用时测试完整业务流程
正式上线前,建议使用真实SKU连续测试:
- 门店POS销售最后一件商品;
- 线上订单创建、取消与重复回调;
- 两个渠道并发预占同一SKU;
- 跨店调拨从出库到收货;
- 盘点差异及审核调整;
- 断网补传、接口失败与重试。
每笔业务都要核对单据、库存余额、占用数、可用数、在途数和流水日志。页面刷新快只说明查询快,异常后仍能恢复和对账,才能说明库存共享真正可用。
总结
多门店库存实时共享的核心不是“实时”两个字,而是统一SKU、库存状态和业务单据,再用并发控制、幂等、状态机、异常重试与对账确保结果可信。
POC验证时,应使用真实数据完成销售、预占、取消、调拨、盘点和断网补传,并核对线上平台、总部、仓库和门店看到的库存结果。能解释每一次库存变化,也能处理失败后的恢复,才能验证线上线下一体化库存体系是否适合企业的实际业务。