我是如何一步步编码完成万仓网ERP系统的(十二)库存 1.概述

时间:2023-01-24 15:20:30

  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系统的(十二)库存 1.概述

  可订量就是可供订单(包括调拨单、领用单和采购退货单等)下单的数量,订单进入到ERP系统确认审核后,根据订单明细扣减可订量,这时库存量不变。这样设计能保证大促销时,减少超卖现象,系统可以根据可订量来判断能不能下单,盘亏时可订量可能为负。

   库存量就是仓库内实际的商品库存,库存量不能为负。

  2. 第二层以货位和SKU为维度的Bin货位库存结构,库房有货架,货架上每个货格称为 “Bin” 货位,这就对库房的工作人员多了一些工作量,需要事先设定好货位,更细致的可以设定货位的长宽高,商品入库时可以根据商品的体积来推荐上架货位。

  我是如何一步步编码完成万仓网ERP系统的(十二)库存 1.概述

  货位号需要保持全系统唯一,这样能够方便定位检索。

   货位类型可以根据存货商品类型和使用方式分为三种:正品货位(细分为正品存货位和正品拣货位)、残品货位和移动货位。正品货位只能存储正品库存,残品货位只能存储残品库存。移动货位作为一种特殊的货位,比如当采购单入库后,采购的货品按照库房的作业应该是先放到托盘上,这时这个托盘就是移动货位,库管拉着托盘去正品货位或残品货位进行上架,这样货位就和SKU进行绑定,接下来就引申出来BinItem(货位库存)。

  我是如何一步步编码完成万仓网ERP系统的(十二)库存 1.概述

  可以看一下BinItem的表架构,一个货位可以放置多种SKU,这样设计就避免一种SKU占用一个货位,当SKU种类过多时,货位就不够用了,能够合理的使用货位。

   可用量就是可以分拣的数量,拿订单来说,订单在占用Storage表可订量时,就需要分拣具体的货位了,根据单据的正残,来分拣正品货位或残品货位。分拣货位时,BinItem表ForUsage就直接扣减(需要记录日志,拣货时按照指定货位拣货),但是货位库存量不变。

   拿采购单来说,单据从源头上就要区分是正品还是残品,当然采购单肯定是正品了(一些二手商家会采购一些残品),采购单入库时,Storage库存表可订量和库存量要一同增加,用户在购物网站就可以下单了。同时移动货位的BinItem货位库存表货位库存量要增加,移动货位的可用量不用增加,WHY?因为系统设定,单据拣货时不能分拣到移动货位(单据拣货时从正品货位下架到移动货位,这时单据又分拣到移动货位,造成死循环),那可用量在什么时候增加呢?在库存上架的时候,货位库存从移动货位移动到正品(残品)货位时,正品(残品)货位可用量和货位库存量同时增加,扣减移动货位的库存量,Storage表不进行任何操作。

  可以看出Storage库存表的可订量和BinItem货位库存表的可用量并不是实时一致的,订单占用可订量,还没分拣时可用量并没占用。但库存表和货位库存表的库存量是一致的。

  两者的库存量在入库或者出库时必须同时增减,对系统的一致性要求极高,可以合理的使用事务来确保两表操作的一致性。

  这样设计出来的库存系统可以实现精细化管理,某个商品在哪个货位,库存量、可订量和货位可用量可以方便的查询,由于BinItem表结构设计,当SKU或者货位比较多时,一个SKU可以放置在多个货位,有很频繁的货位移动,数据量会比较大,需要合理的设置索引键,同时对数据库的读写压力也比较大。当然好处也非常多,库房可以上一些现代化的PDA,实现无纸化操作,库房拣货、上架和盘点都可以同时操作。

  唠唠叨叨,先说这么多。

  

PS:客官有时间光临我的小站 万仓网 。 

我是如何一步步编码完成万仓网ERP系统的(十二)库存 1.概述的更多相关文章

  1. 我是如何一步步编码完成万仓网ERP系统的(二)前端框架

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  2. 我是如何一步步编码完成万仓网ERP系统的(一)系统架构

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  3. 我是如何一步步编码完成万仓网ERP系统的(三)登录

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  4. 我是如何一步步编码完成万仓网ERP系统的(四)登录的具体实现

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  5. 我是如何一步步编码完成万仓网ERP系统的(五)产品库设计 1.产品类别

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  6. 我是如何一步步编码完成万仓网ERP系统的(六)产品库设计 2.百度Ueditor编辑器

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  7. 我是如何一步步编码完成万仓网ERP系统的(七)产品库设计 3.品牌图片跨域上传

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  8. 我是如何一步步编码完成万仓网ERP系统的(八)产品库设计 4.品牌类别

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  9. 我是如何一步步编码完成万仓网ERP系统的(九)产品库设计 5.产品属性项

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

  10. 我是如何一步步编码完成万仓网ERP系统的(十)产品库设计 6.属性项和类别关联

    https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...

随机推荐

  1. Python Day03

    set Collections系列: Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等, collections模块在这些内置数据类型的基础上,提供了几 ...

  2. dp88dp6最靠谱的网络赚钱方法

    (本文非原创,转载自http://mt.sohu.com/20160131/n436463696.shtml) 1.卖产品 最靠谱的当然是自己卖产品,可以先去淘宝.阿里巴巴.百度找到一款你认为有前景的 ...

  3. Java Data Type

    官方文档:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html 转载地址:http://blog.csdn.n ...

  4. SQL Server如何删除多余tempDB文件

    某时,创建了多个tempDB文件,已经超过了服务器核心数,现象删除tempDB文件,使其保持与CPU核心数相同.但是在删除的时候,发现无法删除,报出错误:无法删除文件“tempdev3”,因为它不能为 ...

  5. 简单dp的状态转移方程集合

    1.对于任一种N的排列A,定义它的E值为序列中满足A[i]>i的数的个数.给定N和K(K<=N<=1000),问N的排列中E值为K的个数. dp[i][j]表示i个数的排列中E值为j ...

  6. Serializable序列化

    对象的输入输出流 package file; import java.io.File; import java.io.FileInputStream; import java.io.FileOutpu ...

  7. HDU 1264 Counting Squares&lpar;模拟&rpar;

    题目链接 Problem Description Your input is a series of rectangles, one per line. Each rectangle is speci ...

  8. java线程 — 创建和启动线程

    创建和启动线程,传统有两种方式: 方式1:继承Thread类: 方式2:实现Runnable接口: 线程类(java.lang.Thread):Thread类和Thread的子类才能称之为线程类.阅读 ...

  9. &lbrack;Aaronyang&rsqb; 写给自己的WPF4&period;5 笔记11&lbrack;自定义控件-AyImageButton的过程 1&sol;4&rsqb;

    我的文章一定要对读者负责-否则不是好文章  ----       www.ayjs.net  aaronyang技术分享 文章导航: 介绍vs2013 WPF开发,属性代码相关技巧 实战AyImage ...

  10. python&lowbar;super注意事项

    class room: def __init__(self,area=120,usedfor='sleep'): self.area = area self.usedfor = usedfor def ...