我们以几个典型的业务场景来说明三层库存运用。
库存模型自上而下变动场景:下单支付
履约单:中央库存核心单据。买家支付后,订单模块派单给库存中心。 调度层先生成履约单。履约单的作用
1 一个订单可能分多次履约。每一次履约生成一次发货单。可能存在部分有货的场景,分批次发货
2 存在超卖的业务场景。买家支付后可能没有货发。先生成履约单,等有货后,再发货。
3 削峰。双十一买家支付的并发很高,履约的业务流程很长,扛不住双十一的业务高峰。 先建履约单,再异步生成发货通知单。
库存模型自下而上变动场景:调拨业务
库存调拨就是两个仓库之间的货物相互调配。对于存在多个仓库或分支机构的企业来说,将货品在不同仓库之间进行调拨。
- 发起调拨申请的时候,可能调出的仓库没货,要过几天有货了才会执行调拨。
- 调出方可能要分批次出库。
(1)锁定销售库存(?)
是否要锁定销售库?取决于调拨是否对下单产生影响。取决于平台是否支持超卖(仓库没货也可以售卖),是否限定某区域买家只能从某个区域仓库发货,
不锁定销售库存场景
某平台全国有华南仓库和总仓。买家下单选择就近仓库发货,如果就近仓库无货从总仓发货。平台允许超卖。平台发起手机从总仓调出1000台到华南仓库。 在这种场景下,销售库存不需要锁定。
调拨不锁定销售库存,物品导出仓库出库后不需要扣减销售库存,调入仓库签收入库后,也不需要增加销售。
需要锁定销售库存场景
某平台限制书籍类目仅支持区域库存发货,而且不允许超卖。某平台有华南仓库和北方仓库。平台从华南仓库调拨1000本书到北方仓库。发起调拨业务,需要锁定华南仓库对应的销售库存,华南仓库出库需要扣减对应的销售库存。 北方仓库签收入库需要增加北方仓库对应的销售库存。
(2)履约
需要履约单的原因:
a 调拨单审批通过后仓库可能没货,需要等有货再给仓库发调拨指令。
b 仓库可能货没有那么充足,需要分多次履约(出库)。
(3-4). 【WMS】出库,生成出库单。发货生成物流运单。消息通知调度层:1 调出方仓库锁定的库存扣减出库的部分,增加调入方的在途库存。2 销售库存占用转扣减。
(5). 【WMS】调入库存签收。做入库操作,增加实物库存的库存数。通知调度层。调度层处理:1 调入仓库在途减少。2 调入仓库库存增加。 (销售库存是否变动参考(1))
统一语言
业务对象 | 英文 | 概念解释 |
---|---|---|
销售库存 | sales_inventory | 销售库存层。 |
履约单 | fullfillment_order | 调度层 |
仓库库存 | inventory | 调度层 |
在途库存 | 调度层 | |
发货通知单 | delivery_order | 调度层. 用来通知仓库执行出库操作的单据,是实物库存的单据。 |
调拨通知单 | transfer_order | 调度层 |
出库单 | waybill | WMS |
运单 | WMS |
物理模型
1个履约单对应1到N个发货(通知)单
存在从多个仓库的发货的场景,所以1个履约单对应1,n发货通知单。
1个履约单对应1到N个调拨(通知)单
存在调拨业务的时候,可能调出的仓库货物不足,允许分多次调拨。
fullfillment_order (履约单)
属性名 | 数据类型 | 说明 |
---|---|---|
id | bigint | 主键非空 |
code | string | 非空 |
source_order_id | bigint | 源订单号 |
type | string | 销售订单, 调拨单 |
status | string | 进行中,完成 |
delivery_order (发货单)
属性名 | 数据类型 | 说明 |
---|---|---|
id | bigint | 主键非空 |
code | string | 非空 |
fullfillment_order_id | bigint | 履约单id |
delivery_depot_id | bigint | 发货仓库id |
delivery_address | string | 收货地址。实际项目中需要对收货地址单独建模,因为不是核心模型,这里有string代替 |
total_quantity | int | 总数量 |
outbound_quantity | int | 累计出货数量 |
delegate_type | string | 委托类型:0-普通,1-委托方,2-受托方。 订单委托发货场景使用。当为委托方,仓库做虚拟发货处理,不会真实发货。 |
status | string | 状态:待发货 发货中 已完成 已关闭 |