深入浅出WMS之出库流程解析

创建出库单

本来打算周末的时候写出库的流程,没想到今天开了一天会,作为项目负责人和各方客户详细的讲解了WMS的流程和各个模块的使用方式,正好趁热打铁的肝篇博客再去EMO,言归正传其实出库单的创建和入库的入库单创建是一样的,无非就是个添加功能。其次现在的智能化仓库都对接ERP系统或者MES系统,对于手动创建单据的需求并没有前几年高了。

出库单管理

在这里插入图片描述
在这里插入图片描述
两张图片对应不同类型的WMS,第一种是药业比较常用的定制化比较多,第二种就比较标准一些。不过第一种是立体库,第二钟是平面库,在流程上也有一些相对区别。在这我拿第二种WMS来讲一下平库和立体库的不同点。

出库单管理-配货

这个功能我愿称之为出库中最重要的一步。大家可以看到在第一种WMS中是有手动配货和自动配货两个不同的操作,这段时间工作比较杂,我还没写自动配货这个功能,不过对于流程来说不影响。个人理解自动配货的话对技术要求还是偏高一点的,所以打算等写个差不多的时候把自动配货和入库的自动分配货位拿出来作为技术点来写。那么接下来我们说一下配货的一个流程。
在这里插入图片描述
我们这边对于页面的要求是点击一条出库单据后,会弹出来一个框,是符合这条出库信息的所有库存,这个时候我们就可以输入要配货的数量,而且是可以进行多选和累加的,比如说我要出一万件物品,但是10货位上只有5000件,所以我们就可以选择10货位上要出库5000件,20货位上出库5000件。而且在页面上可以清晰的让操作人员知道我这条单据配货了多少,未配货数量是多少,每个货位上已配多少,可用数量是多少。
在这里插入图片描述
当我们配货完成后,数量和状态也会有一个相对的改动,而且这个时候会生成相对应的出库任务。这个时候就分两种情况,一种是有设备参与的情况下,另外一种就是人工。那么我们先说一下人工出库,当我们配完货后我们可以知道货位地址和出多少数量,这个时候叉车师傅可以开着叉车去相对应的货位去把货挑出来,然后用手持去扫托盘码来完成出库这个动作。那么对于设备来说,人工操作肯定是不确定因素更多一点。所以也有部分仓库是在叉车上安装车载系统和无线扫描来进行一个确认,这样的话可以一定程度上保证了正确率。那么接下来说一下全程设备参与是怎么样的一个流程,当我们配货完成后,WMS是知道货位地址和要出库数量的,这个时候WMS会向WCS发送指令,然后WCS对调度堆垛机去相对应的货位上取货,当货物到位后,操作人员拿着PDA去扫托盘码,来确认这个托盘是不是有出库任务,如果有的话确认,然后由叉车师傅给挑下来。其实这还分为两种情况,一种是整托出库,另外一种是拣选回库。我刚刚上面说的流程就是整托出库的一个流程,意思就是我要出500个东西,恰好这个托盘上有500个,所以我把整个托盘出库。那么还有一种情况就是我要取出500个东西,我们托盘上有700个,我们取出我们要的500个后,把剩下的200个再入进去。这种叫拣选出库。

出库单管理-关单

那么当我们出库完成后,我们需要手动关单。我们关单是指这个出库的结束,那么我们需要做什么操作呢,我们往下看。
在这里插入图片描述
首先我们关单要进行一系列的验证,首先我们要关单是不是要把这个单据的所有任务都完成,然后这个时候我们的真实出库数量必须和计划出库数量是相等的,这代表的是所有任务都完成了。 然后我们要把出库单据和出库任务给删除掉,其实就是把数据转移到了历史表中方便追溯。

出库任务管理

在这里插入图片描述
这个模块的话相对于入库模块中的入库任务管理要简单一些,因为我们把配货这个工作完成了,所以这个页面的功能就是显示正在出库的任务和待出库的任务。其中可能复杂一点的也就是撤销,因为出库完成的话我们可以用手持来进行确认。那么接下来我们说一下撤销。

出库任务管理-撤销

            //使用事务进行出库任务撤销
            ResultData resultData = new ResultData();
            try
            {
                //LOGOUTTASK lOGOUTTASK1 = await _fsql.Select<LOGOUTTASK>().Where(x => x.ID == Convert.ToDecimal(lOGOUTTASK.ErpoutId)).FirstAsync();
                string palno = lOGOUTTASK.PALNO;
                var ErpOut = await _fsql.Select<LogErpOut>().Where(x => x.ORDNO == lOGOUTTASK.ORDNO && x.ITMNO == lOGOUTTASK.ITMNO).FirstAsync();
                var QuantMstore = await _fsql.Select<LogMstore>().Where(x => x.PALNO == palno).FirstAsync();
                string quant0 =ErpOut.QUANT0;
                string quanout = QuantMstore.QUANTOUT;

                //1.删除出库任务表数据
                _fsql.Transaction(() => {
                    var derows = _fsql.Delete<LOGOUTTASK>().Where(x => x.ID == lOGOUTTASK.ID).ExecuteAffrows();
                    if (derows <= 0) throw new Exception("出库任务撤销失败!");
                    //2.修改库位状态
                    var uprows = _fsql.Update<LOGSTORAGE>().Set(x => x.AFLAG, "F").Where(x => x.ADDRE == lOGOUTTASK.ADDRESRC).ExecuteAffrows();
                    if (uprows <= 0) throw new Exception("库位状态撤销失败!");
                    //3.修改出库单已配货数量
                    quant0 = (Convert.ToDouble(quant0) - Convert.ToDouble(lOGOUTTASK.QUANT)).ToString();
                    var rows = _fsql.Update<LogErpOut>().Set(x => x.QUANT0 == quant0)
                   .Set(x => x.IfDo == "O")
                   .Where(x => x.ORDNO == lOGOUTTASK.ORDNO && x.ITMNO == lOGOUTTASK.ITMNO).ExecuteAffrows();
                    if (rows <= 0) throw new Exception("配货数量回写失败!");
                    //4.修改库存数量
                    quanout = (Convert.ToDouble(quanout) - Convert.ToDouble(lOGOUTTASK.QUANT)).ToString();
                    if (Convert.ToDouble(quanout) < 0) quanout = "0";
                    var mstoreRows = _fsql.Update<LogMstore>().Set(x => x.QUANTOUT == quanout)
                                    .Where(x => x.PALNO == palno).ExecuteAffrows();
                    if (mstoreRows <= 0) throw new Exception("修改库存数量失败!");
                });
            }
            catch (Exception ex)
            {
                resultData.code = 6001;
                resultData.data = ex.Message;
            }
            return resultData;

撤销的话我配合部分代码来进行讲解,撤销这个功能和入库任务的撤销一样为了保证数据的准确性,需要用到事务。那么撤销要做哪些操作呢?
1.删除这条任务;
2.修改库位状态;因为我们出库任务是上一步配货完成后才生成的,所以我们撤销的时候也要把这个库位给释放出来。
3.修改出库单的已配货数量;举个例子我们单据要出库500件货物,然后配货了三个托盘也就是三个出库任务,这个时候我们撤销其中一个任务,是不是这个数量我们要给还原回去。
4.修改库存可用数量;注意我们这里修改的并不是库存数量,因为我们只是生成了这个任务,并没有去执行这个任务,所以库存是不会被扣减的,只有任务完成后或关单后才会扣减掉库存。那么库存的可用数量是什么呢,比如A物品我们库存里有10000件,这个时候可用数量也是10000件,当我们要出500件的时候,是不是库存还是10000件,因为这个任务还没有真正的执行,那可用数量就是10000-500,这个时候比如我们要撤销,那么这个可用数量的话就必须给还回去。

结尾

因为我是以我手里这款项目做了一个演示,而且这个项目还属于开发中其中肯定有一些细致的要求并没有具体写。不过大致的出库流程就是这些,当然其中一定会有很多遗漏,因为我在这个行业也才一年多一点,也不能说特别了解,不过这个出库流程对于想了解WMS的小伙伴还是能提供一定的认知。而且出入库只是WMS中的部分模块,里面肯定还有会质量转换、抽检、盘点等等很多功能,当所有的功能都用到的时候才是一个完整的流程。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晚风偷吻云朵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值