库存管理是个难题,涉及到采购、销售、仓储、门店、网站订单各个环节,实物库存和系统库存很难保证完全一致,记得系统刚上线第一天,因为实物库存与导入系统的库存有差异,系统又做了限制系统库存必须大于0才允许销售普通订单,当时头都大了,和业务方商量后,立即决定如果库存不够无法销售就让收银员全部走预售单的流程,先保证系统能正常销售,然后后期盘点库存再做预售单的提货操作,然后第二天直接把库存限制放开,允许门店0库存销售,因为对门店来讲肯定都是客户拿到货了才到收银台结账,不存在没有实物库存的情况,但对库存管理还是要尽可能精准,这涉及到采购成本、财务、商品管控等一系列问题。
一、库存管理业务逻辑
系统中涉及到库存变更的操作主要有如下几种:
-
增加:门店采购商品入库
-
扣减:门店销售扣减出库
-
占用:预售单下单后需要预留库存
-
返还:退货/换货之后返回库存,相当于增加库存
-
调拨:门店之间调出调入库存变化
-
破损:破损审核后库存扣减
-
盘点:盘盈盘亏库存变动
系统中与库存值有关的概念主要有如下几种:
-
门店仓库实际库存
-
门店占用(预留)库存:虚拟库存,预售单占用库存
-
有效库存(门店可销售库存)
-
在途库存:国内打托后发往国外门店未收货及调拨中途的货货。
系统只要保证等式【有效库存 = 实际库存 - 占用库存】一直成立就不会有太大差错。
上面各业务模块都涉及到库存的变更,抽像出来主要有两种类型的库存变更,一种是实际库存和有效库存的变化,另外一种是预售单会额外涉及到预留库存的变化,这个如果写判断逻辑去处理,代码就会比较混乱,所以我们采用策略模式来解决这个问题。
PS:今天看了一篇文章讲到库存管理要分层:分成 销售层、调度层、仓库层,好复杂,我们这样垂直行业应该不需要做得这么复杂。
二、策略模式
策略模式:策略模式是针对一组算法(行为),将每一组算法(行为)封装到具有共同接口的独立的类中,降低代码耦合度。
策略模式的结构:
-
环境角色(Context):用来操作策略的上下文环境。
-
抽像策略角色(Strategy):抽像类给出具体策略所需的接口。
-
具体策略角色(ConcreteStrategy):每一种行为具体的实现。
系统库存策略类图如下:
各业务模块(现在有10来个业务模块入口)统一调用Content类操作库存的变更。如果业务变更或库存模型(比如要引入安全库存什么的)直接调整具体的实现类即可不会相互影响。