我是如何一步步编码完成万仓网ERP系统的(十二)库存 1.概述
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构)
https://www.cnblogs.com/smh188/p/11534451.html(我是如何一步步编码完成万仓网ERP系统的(二)前端框架)
https://www.cnblogs.com/smh188/p/11535449.html(我是如何一步步编码完成万仓网ERP系统的(三)登录)
https://www.cnblogs.com/smh188/p/11541033.html(我是如何一步步编码完成万仓网ERP系统的(四)登录的具体实现)
https://www.cnblogs.com/smh188/p/11542310.html(我是如何一步步编码完成万仓网ERP系统的(五)产品库设计 1.产品类别)
https://www.cnblogs.com/smh188/p/11546917.html(我是如何一步步编码完成万仓网ERP系统的(六)产品库设计 2.百度Ueditor编辑器)
https://www.cnblogs.com/smh188/p/11572668.html(我是如何一步步编码完成万仓网ERP系统的(七)产品库设计 3.品牌图片跨域上传)
https://www.cnblogs.com/smh188/p/11576543.html(我是如何一步步编码完成万仓网ERP系统的(八)产品库设计 4.品牌类别)
https://www.cnblogs.com/smh188/p/11578185.html(我是如何一步步编码完成万仓网ERP系统的(九)产品库设计 5.产品属性项)
https://www.cnblogs.com/smh188/p/11589264.html(我是如何一步步编码完成万仓网ERP系统的(十)产品库设计 6.属性项和类别关联)
https://www.cnblogs.com/smh188/p/11596459.html(我是如何一步步编码完成万仓网ERP系统的(十一)产品库设计 7.发布商品)
https://www.cnblogs.com/smh188/p/11610960.html(我是如何一步步编码完成万仓网ERP系统的(十二)库存 1.概述)
https://www.cnblogs.com/smh188/p/11669871.html(我是如何一步步编码完成万仓网ERP系统的(十三)库存 2.加权平均价)
https://www.cnblogs.com/smh188/p/11763319.html(我是如何一步步编码完成万仓网ERP系统的(十四)库存 3.库存日志)
万仓网ERP系统不开源,准备做一个系列,讲一讲主要的技术点,这些技术点会有源代码。如果想看所有的源代码,可以打道回府了,没必要再阅读下去了,浪费您宝贵的时间。
接下来的几篇开始说说库存,如何设计一个高效NB的电商库存系统呢?好的电商库存系统有哪些要点呢?
对于用户来说,当然是操作方便;库存账目清晰准确;双11、618大促时能够减少超卖;能够根据现有库存销售数据,预测将来的销售,掌控供应链,提高库存周转率和资金的使用率等。
对于开发设计来说,怎么做才能满足用户的要求?当然是直接借鉴一个成熟的大流量的电商库存系统,那就是亚马逊的Bin系统,网上有很多亚马逊bin系统的介绍,可以搜索关键字进行查询,这里就不过多的介绍了,直接上正文吧。
1. 采用双重的库存架构,第一层是以仓库和SKU为维度的库存结构,主要字段有仓库编码,SKU编码,可订量和库存量等(可以在此基础上进行扩展比如残品可订量,残品库存,锁定可订量(大促前锁定的库存),这里不过多介绍扩展字段,只介绍正品可订量和正品库存)。
可订量就是可供订单(包括调拨单、领用单和采购退货单等)下单的数量,订单进入到ERP系统确认审核后,根据订单明细扣减可订量,这时库存量不变。这样设计能保证大促销时,减少超卖现象,系统可以根据可订量来判断能不能下单,盘亏时可订量可能为负。
库存量就是仓库内实际的商品库存,库存量不能为负。
2. 第二层以货位和SKU为维度的Bin货位库存结构,库房有货架,货架上每个货格称为 “Bin” 货位,这就对库房的工作人员多了一些工作量,需要事先设定好货位,更细致的可以设定货位的长宽高,商品入库时可以根据商品的体积来推荐上架货位。
货位号需要保持全系统唯一,这样能够方便定位检索。
货位类型可以根据存货商品类型和使用方式分为三种:正品货位(细分为正品存货位和正品拣货位)、残品货位和移动货位。正品货位只能存储正品库存,残品货位只能存储残品库存。移动货位作为一种特殊的货位,比如当采购单入库后,采购的货品按照库房的作业应该是先放到托盘上,这时这个托盘就是移动货位,库管拉着托盘去正品货位或残品货位进行上架,这样货位就和SKU进行绑定,接下来就引申出来BinItem(货位库存)。
可以看一下BinItem的表架构,一个货位可以放置多种SKU,这样设计就避免一种SKU占用一个货位,当SKU种类过多时,货位就不够用了,能够合理的使用货位。
可用量就是可以分拣的数量,拿订单来说,订单在占用Storage表可订量时,就需要分拣具体的货位了,根据单据的正残,来分拣正品货位或残品货位。分拣货位时,BinItem表ForUsage就直接扣减(需要记录日志,拣货时按照指定货位拣货),但是货位库存量不变。
拿采购单来说,单据从源头上就要区分是正品还是残品,当然采购单肯定是正品了(一些二手商家会采购一些残品),采购单入库时,Storage库存表可订量和库存量要一同增加,用户在购物网站就可以下单了。同时移动货位的BinItem货位库存表货位库存量要增加,移动货位的可用量不用增加,WHY?因为系统设定,单据拣货时不能分拣到移动货位(单据拣货时从正品货位下架到移动货位,这时单据又分拣到移动货位,造成死循环),那可用量在什么时候增加呢?在库存上架的时候,货位库存从移动货位移动到正品(残品)货位时,正品(残品)货位可用量和货位库存量同时增加,扣减移动货位的库存量,Storage表不进行任何操作。
可以看出Storage库存表的可订量和BinItem货位库存表的可用量并不是实时一致的,订单占用可订量,还没分拣时可用量并没占用。但库存表和货位库存表的库存量是一致的。
两者的库存量在入库或者出库时必须同时增减,对系统的一致性要求极高,可以合理的使用事务来确保两表操作的一致性。
这样设计出来的库存系统可以实现精细化管理,某个商品在哪个货位,库存量、可订量和货位可用量可以方便的查询,由于BinItem表结构设计,当SKU或者货位比较多时,一个SKU可以放置在多个货位,有很频繁的货位移动,数据量会比较大,需要合理的设置索引键,同时对数据库的读写压力也比较大。当然好处也非常多,库房可以上一些现代化的PDA,实现无纸化操作,库房拣货、上架和盘点都可以同时操作。
唠唠叨叨,先说这么多。
PS:客官有时间光临我的小站 万仓网 。
我是如何一步步编码完成万仓网ERP系统的(十二)库存 1.概述的更多相关文章
- 我是如何一步步编码完成万仓网ERP系统的(二)前端框架
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- 我是如何一步步编码完成万仓网ERP系统的(一)系统架构
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- 我是如何一步步编码完成万仓网ERP系统的(三)登录
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- 我是如何一步步编码完成万仓网ERP系统的(四)登录的具体实现
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- 我是如何一步步编码完成万仓网ERP系统的(五)产品库设计 1.产品类别
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- 我是如何一步步编码完成万仓网ERP系统的(六)产品库设计 2.百度Ueditor编辑器
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- 我是如何一步步编码完成万仓网ERP系统的(七)产品库设计 3.品牌图片跨域上传
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- 我是如何一步步编码完成万仓网ERP系统的(八)产品库设计 4.品牌类别
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- 我是如何一步步编码完成万仓网ERP系统的(九)产品库设计 5.产品属性项
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- 我是如何一步步编码完成万仓网ERP系统的(十)产品库设计 6.属性项和类别关联
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
随机推荐
- 全球唯一标识符 System.Guid.NewGuid().ToString()
System.Guid.NewGuid().ToString(); //ToString() 为 null 或空字符串 (""),则使用"D". 结果:8209 ...
- kolla-ansible部署openstack allinone单节点
环境准备 2 network interfaces 8GB main memory 40GB disk space 1.修改hostname hostnamectl set-hostname koll ...
- ulimit 更改 gcc升级 查看显卡状态命令
一.更改ulimit: vim /etc/security/limits.conf 在文件最下方添加以下内容 * soft nofile 65536* hard nofile 65536 二. gcc ...
- uiautomator 调试例子
package com.bing.cn; import com.android.uiautomator.testrunner.UiAutomatorTestCase; public class Dem ...
- redis常用命令手册大全
一.五种数据类型1.Redis字符串StringString 是最简单的类型,你可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个value,其上支持的操作与 Memcache ...
- 【作用域】词法作用域(静态作用域,如:js)、动态作用域(如:.bash脚本)
作用域 作用域是指程序源代码中定义变量的区域. 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript 采用词法作用域(lexical scoping),也就是静态作 ...
- onchange onpropertychange 和 oninput 事件的区别
onchange 事件在内容改变(两次内容有可能还是相等的)且失去焦点时触发. onpropertychange 事件却是实时触发,即每增加或删除一个字符就会触发,通过 js 改变也会触发该事件,但是 ...
- 实现一个new操作符
new 操作符做了这些事: 1.它创建了一个全新的对象: 2.它会被执行[[Prototype]](也就是__proto__)链接: 3.它使this指向新创建的对象: 4.通过new创建的每个对象最 ...
- git clean (11)
#delete untracked files git clean -f # delete untracked files and directories git clean -fd # -n opt ...
- SQL中group by的注意事项
最最最最重要的: group by有一个原则,就是select后面所有的列中,没有使用聚合函数的列,必须出现在group by子句中. group by子句中的注意事项: 1,不能使用别名(因为执行顺 ...