WMS手动配货和自动配货的区别

news/2024/5/9 8:31:14/文章来源:https://blog.csdn.net/qq_43434929/article/details/128162420

手动配货

不知道配货流程的朋友可以看一下前面的文章链接: 深入浅出WMS之出库流程里面有对出库的解释说明,其中也有对配货的解释。前端页面也可以在前面的那篇文章中看到,这里我们来说一下后端部分。

手动配货是选中出库单的某条数据,然后点击手动配货,这个时候前端会把这个出库单的guid传给后端,这个时候我们有guid了,就可以去出库单表里去找到这条数据,取出其中的订单号、批次号等等信息。这个时候我们要做的就很简单,去库存里找符合我们可以出库的信息。

 public async Task<PageData> QueryPeiH(int pages, int limit, string matno, string batch, string cflag){PageData pageData = new PageData();var list = _fsql.Select<LogMstore, LOGMATERIAL,LOGSTORAGE>().LeftJoin((a, b, c) => a.MATNO == b.MATNO).LeftJoin((a, b, c) => a.ADDRE == c.ADDRE);if (!string.IsNullOrWhiteSpace(matno)){list = list.Where((a,b,c) => a.MATNO == matno);}if (!string.IsNullOrWhiteSpace(batch)){list = list.Where((a, b, c) => a.BATCH == batch);}if (!string.IsNullOrWhiteSpace(cflag)){list = list.Where((a, b, c) => a.CFLAG == cflag);}//在这里添加我们对库存信息的限制条件list = list.Where((a, b, c) => Convert.ToDouble(a.QUANT) - Convert.ToDouble(a.QUANTOUT) > 0);list = list.Where((a, b, c) => c.PkFlag != "PK");//if (limit <= 0){//pageData.pageData = await list.Count(out var total).ToListAsync();//pageData.total = (int)total;pageData.pageData = await list.Count(out var total).ToListAsync((a, b, c) => new {a.MATNO,b.MNAME,b.SZNO,a.BATCH,keyong = Convert.ToDouble(a.QUANT) - Convert.ToDouble(a.QUANTOUT),a.ADDRE,a.PALNO,a.SECTN,a.CFLAG});pageData.total = (int)total;}else{pageData.pageData = await list.Count(out var total).Skip((pages - 1) * limit).Take(limit).ToListAsync((a, b, c) => new {a.MATNO,b.MNAME,b.SZNO,a.BATCH,keyong = Convert.ToDouble(a.QUANT) - Convert.ToDouble(a.QUANTOUT),a.ADDRE,a.PALNO,a.SECTN,a.CFLAG});pageData.total = (int)total;}return pageData;}

当我们查到所有符合条件的库存信息后,把数据返回给前端。这个时候也就是当前端选中出库单点击手动配货按钮时,会弹出一个页面,也就是我们上面执行的查询结果。这个时候又操作人员来进行货位分配。例如我们要出750个A货物,然后有符合出库的8个托盘,每个托盘上有100个A物品,这个时候我们手动配货是可以选择每个托盘出多少的,比如说第一个托盘出90个,第二个托盘出80等。当配完货后会生成相对应的出库任务,那么接下来我们看一下这个业务是怎么用代码来实现的。

        [HttpPost]public async Task<IActionResult> QueryPeiH(List<LogMstore> logMstores){return Ok(await _erpOutService.PeiHuo2(logMstores));}

这个是我们的配货接口,这个时候前端会发一个list过来,写list的目的是为了把配货的数据一次性发给后端,而不是一直调用接口。
这个时候可以看到我们调用了server层。我们来看一下server层对业务的处理。

public async Task<ResultData> PeiHuo2(List<LogMstore> logMstores){try{//循环listLOGOUTTASK lOGOUTTASK = new LOGOUTTASK();for (int i = 0; i < logMstores.Count; i++){string quant = logMstores[i].QUANTOUT;string palno = logMstores[i].PALNO;string ordno = logMstores[i].DEMO1;string itmno = logMstores[i].DEMO2;string keyong = logMstores[i].DEMO3;//通过订单号和行号查询出库表var ErpOut = await _erpOutRepository.QueryMI(ordno, itmno);//通过托盘号查询库存表var OutMstore = await _mstoreRepository.QueryPalno(palno);#region 赋值给出库任务做添加lOGOUTTASK.ErpoutId = ErpOut.Id.ToString();lOGOUTTASK.TICNO = "";lOGOUTTASK.SEQNO = "";lOGOUTTASK.INTASKID = OutMstore.INTASKID;lOGOUTTASK.ORDNO = ordno;lOGOUTTASK.ITMNO = itmno;lOGOUTTASK.RECTYPE = ErpOut.RECTYPE;lOGOUTTASK.MATNO = ErpOut.MATNO;lOGOUTTASK.MUNIT = ErpOut.MUNIT;lOGOUTTASK.QUANT = quant;lOGOUTTASK.QUANT0 = keyong;lOGOUTTASK.QuantQy = "0";lOGOUTTASK.JIAN = ErpOut.JIAN;lOGOUTTASK.STANO = "0";lOGOUTTASK.ADDRESRC = OutMstore.ADDRE;lOGOUTTASK.ADDREDESC = "-";lOGOUTTASK.PALNO = OutMstore.PALNO;lOGOUTTASK.MstoreId = OutMstore.MstoreId.ToString();lOGOUTTASK.CFLAG = ErpOut.CFLAG;lOGOUTTASK.BATCH = ErpOut.BATCH;lOGOUTTASK.LOTNO = ErpOut.LOTNO;lOGOUTTASK.CUSTOM = ErpOut.CUSTOM;lOGOUTTASK.CustAddress = "-";lOGOUTTASK.WORKS = "-";lOGOUTTASK.STORE = ErpOut.STORE;lOGOUTTASK.VCDSCR = ErpOut.VCDSCR;lOGOUTTASK.PONO = ErpOut.PONO;lOGOUTTASK.POITEM = ErpOut.POITEM;lOGOUTTASK.STYPE = "N";lOGOUTTASK.ATTACHMENT = "N";lOGOUTTASK.SECTN = ErpOut.SECTN;lOGOUTTASK.PRDAT = ErpOut.PRDAT;lOGOUTTASK.QUDAT = ErpOut.QUDAT;lOGOUTTASK.PRICE = "-";lOGOUTTASK.KEEPER = "-";lOGOUTTASK.PRNNO = "-";lOGOUTTASK.TKDAT = DateTime.Now;lOGOUTTASK.COMDAT = DateTime.Now;lOGOUTTASK.IFDO = "O";lOGOUTTASK.OPUSER = ErpOut.OPUSER;lOGOUTTASK.USERID = "";lOGOUTTASK.OutPort = "";lOGOUTTASK.OutportJ = "";lOGOUTTASK.Deviceno = "";lOGOUTTASK.DEMO1 = ordno;lOGOUTTASK.DEMO2 = itmno;lOGOUTTASK.DEMO3= logMstores[i].DEMO3;lOGOUTTASK.Tasktype = "N";lOGOUTTASK.DEMO19 = "自建";lOGOUTTASK.DEMO24 = ErpOut.DEMO24;#endregionif (Convert.ToDouble(OutMstore.QUANT) <Convert.ToDouble(quant)){throw new Exception("库存数量不足!");}if (await _erpOutRepository.PeiHuo(lOGOUTTASK) == 0){resultData.code = 0;resultData.message = "配货成功!";}}}catch (Exception ex){resultData.code = 1;resultData.message = ex.Message;}return resultData;}

在这里面我们又调用了一层,因为这层是处理业务的,会有另外一层专门写增删改查等操作,这样的话也是为了提高代码的利用率,这也符合我们写代码的原则“高内聚,低耦合”。

        public async Task<int> PeiHuo(LOGOUTTASK lOGOUTTASK){try{var ErpOut = await _fsql.Select<LogErpOut>().Where(x => x.ORDNO == lOGOUTTASK.ORDNO && x.ITMNO == lOGOUTTASK.ITMNO).FirstAsync();string quant0 = ErpOut.QUANT0;var Pdian = await _fsql.Select<LOGSTORAGE>().Where(x => x.ADDRE == lOGOUTTASK.ADDRESRC).FirstAsync();if (Pdian.PkFlag == "PK") return 6001;quant0 = (Convert.ToDouble(quant0) + Convert.ToDouble(lOGOUTTASK.QUANT)).ToString();_fsql.Transaction(() => {//添加出库任务var inrows = _fsql.Insert(lOGOUTTASK).ExecuteAffrows();if (inrows <= 0) throw new Exception("出库任务添加失败!");//var erpin = _fsql.Select<LogErpOut>().Where(x => x.Id == Convert.ToDecimal(lOGOUTTASK.ErpoutId)).First();//修改出库单已配货数量var uprows = _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 (uprows <= 0) throw new Exception("配货数量回写失败!");//库存表可用数量加上});return 0;}catch (Exception ex){return 1;}}

这里我们需要使用到事务,以防数据出现错误。手动配货的相比较自动配货来说比较简单,了解业务之后就可以一步一步的往下写。而且一般来说不会出现什么错误,只需要多注意数据的增减。例如配货成功后出库单的已配货数量,未配货数量,出库任务的出库数量,库存的剩余数量,可用数量等等。假如对这个配货还不太懂的话,可以看一下前面的文章,里面有出库的整个流程,其中对配货也有一定说明。接下来我们来说一下重点-自动配货。

自动配货

自动配货前端写起来比较简单,因为只需要写一个按钮就可以。自动配货相对手动配货来说第一步的查询是一样的,只不过区别是手动配货需要我们把查出来的数据返回给前端,让操作人员进行分配,然后再把分配完的数据再传给后端。自动配货的话就是我们查出来数据后,我们后端自己处理。
在这里插入图片描述
上面的是我初次写的自动配货,如今已弃用,下面的是优化过的。还是那么一个简简单单的接口,只需要前端给我们传一个guid,我们就去server层自己玩。说明我写在下面代码的注释里,方便大家了解流程。

public async Task<ResultData> AutomaticPicking(string guid){ResultData resultData = new ResultData(){code = 0,message = "success",};try{List<LogMstore> logMstores = new List<LogMstore>();var ErpOut = await _erpOutRepository.Queryguid(guid);//根据guid查询出库单string quantout = ErpOut.QUANT;//出库单计划出库数量string matno = ErpOut.MATNO;string batch = ErpOut.BATCH;string cflag = ErpOut.CFLAG;//查询符合条件的库存信息var logmstore = await _mstoreRepository.QueryZiDong(1, 20, matno, batch, cflag);//序列化查询符合条件的库存信息var json = JsonConvert.SerializeObject(logmstore.pageData, Formatting.Indented);var newdynamicData = JsonConvert.DeserializeObject<List<dynamic>>(json);//未配货数量 = 计划数量 - 已配货数量Double UnshippedQuantity = Convert.ToDouble(ErpOut.QUANT) - Convert.ToDouble(ErpOut.QUANT0);//符合条件的数据循环插入到List集合中for (int i = 0; i < newdynamicData.Count; i++){//如果大于0说明是整托出库,例如750个的货,每个托盘100个,那么前7个托盘就是整托出库,最后的一个托盘就是拣选出库,因为我们只需要50,剩下的50还需要再回库。if((UnshippedQuantity - Convert.ToDouble(newdynamicData[i].QUANT)) >= 0){UnshippedQuantity = UnshippedQuantity - Convert.ToDouble(newdynamicData[i].QUANT);logMstores.Add(new LogMstore{ADDRE = newdynamicData[i].ADDRE,//货位地址BATCH = newdynamicData[i].BATCH,//批次号CFLAG = newdynamicData[i].CFLAG,DEMO1 = ErpOut.ORDNO,//订单号DEMO2 = ErpOut.ITMNO,//行号MATNO = newdynamicData[i].MATNO,//物料编码PALNO = newdynamicData[i].PALNO,QUDAT = newdynamicData[i].QUDAT,SECTN = newdynamicData[i].SECTN,//QUANT = newdynamicData[i].QUANT //库存数量QUANTOUT = newdynamicData[i].QUANT});}else{logMstores.Add(new LogMstore{ADDRE = newdynamicData[i].ADDRE,//货位地址BATCH = newdynamicData[i].BATCH,//批次号CFLAG = newdynamicData[i].CFLAG,DEMO1 = ErpOut.ORDNO,//订单号DEMO2 = ErpOut.ITMNO,//行号MATNO = newdynamicData[i].MATNO,//物料编码PALNO = newdynamicData[i].PALNO,QUDAT = newdynamicData[i].QUDAT,SECTN = newdynamicData[i].SECTN,//QUANT = newdynamicData[i].QUANT //库存数量QUANTOUT = UnshippedQuantity.ToString()});break;}                   }await ZiDong(logMstores);//这一步和手动配货一样}catch (Exception ex){resultData.code = 1;resultData.message = ex.Message;}return resultData;}

自动配货的话一般有先入先出原则,也有随机出库原则等等,这个都是根据甲方需求来写。先入先出原则比较简单,查询的时候按时间进行排序查询结果就可以。这里我们用的也是先入先出原则。自动配货的话一般来说比较常用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_229714.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyQt5基础练习1

0. 本文学习地址 1. PyQt5是由一系列Python模块组成 超过620个类&#xff0c;6000函数和方法。能在诸如Unix、Windows和Mac OS等主流操作系统上运行。 1.1 PyQt5有两种证书 GPL商业证书 2. 实验1 实现简单的窗体 2.1 完整代码 #!/usr/bin/python3 # -*- coding: utf-8 -*…

零基础学习软件测试,掌握四点就够了

近年来越来越多的人转行到软件测试这一领域&#xff0c;对于很多外行的人来说&#xff0c;肯定对这一行业有很多不了解&#xff0c;对于这一职业的职责以及要求都会不清楚&#xff0c;那么我们今天就来梳理一下关于软件测试行业的信息。 一、软件测试的主要职责你知道吗&#x…

[附源码]计算机毕业设计学生疫情防控信息填报系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

16.前端笔记-CSS-学成在线案例

1、CSS属性书写顺序 &#xff08;1&#xff09;布局定位属性 display/position/float/clear/visibility/overflow(建议display第一个写&#xff0c;关系到模式) &#xff08;2&#xff09;自身属性 width/height/margin/padding/border/background &#xff08;3&#xff09;文…

[附源码]计算机毕业设计springboot项目管理系统的专家评审模块

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

“极致成本向左,本质安全向右”-谈谈锂电池储能系统的发展趋势

极致成本 or 本质安全? 1 快速增长的电化学储能电站 根据CNESA全球储能项目库的不完全统计,截至 2021 年底,全球已投运电力储能项目累计装机规模 209.4GW, 同比增长 9%。其中,抽水蓄能的累计装机规模占比首次低于 90%,比去年同期下降4.1个百分点;新型储能的累计装机规模…

30张图 讲清楚Redis Cluster

今天下午和一位同学聊Redis集群&#xff0c;这玩意真没那么简单&#xff0c;内容非常多。 Redis Cluster是Redis官方提供的Redis集群功能。 1.为什么要实现Redis Cluster 1.主从复制不能实现高可用 2.随着公司发展&#xff0c;用户数量增多&#xff0c;并发越来越多&#x…

【人工智能/算法】搜索求解(Solving Problems by Searching)

文章目录一、求解与搜索二、盲目式搜索1. 深度优先搜索&#xff08;Depth First Search, DFS&#xff09;回溯搜索&#xff08;Backtracking Search&#xff09;2. 广度优先搜索&#xff08;Breadth First Search, BFS&#xff09;一致代价搜索&#xff08;Uniform-cost Search…

BBR 数学模型直观展示

看 BBR 的理想图示&#xff1a; 但现实中数据包到达并非绝对均匀&#xff0c;考虑统计突发&#xff0c;实际情况如下&#xff1a; ​后文将 Delivery Rate 设为 B(Bandwidth)&#xff0c;将 RTT 设为 D(Delay)。 B/inflt 曲线一定上凸&#xff0c;可想象 1 个 inflt 只有一种…

北京一互联网公司被端,所有开发被全部带走!

△Hollis, 一个对Coding有着独特追求的人△这是Hollis的第 407 篇原创分享作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;近日&#xff0c;北京市朝阳公安分局对外公开&#xff0c;按照公安部“净网”专项行动整体部署&#xff0c;朝阳警方深入…

学习二十大奋进新征程线上知识答题活动回顾

学习二十大奋进新征程线上知识答题活动回顾 活动背景 开展直播宣讲、组织知识竞赛答题……各地通过多种形式广泛开展学习宣传活动&#xff0c;一起学。 为深入学习宣传贯彻二十大精神&#xff0c;近日&#xff0c;我市开展“奋进新征程&#xff0c;共创强国业”学习二十大精神…

Spring MVC统一异常处理的3种方式(附带实例)

在 Spring MVC 应用的开发中&#xff0c;不管是对底层数据库操作&#xff0c;还是业务层或控制层操作&#xff0c;都会不可避免地遇到各种可预知的、不可预知的异常需要处理。 如果每个过程都单独处理异常&#xff0c;那么系统的代码耦合度高&#xff0c;工作量大且不好统一&a…

SAS,Stata,HLM,R,SPSS和Mplus分层线性模型HLM分析学生受欢迎程度数据

全文链接&#xff1a;http://tecdat.cn/?p10809本文用于比较六个不同统计软件程序&#xff08;SAS&#xff0c;Stata&#xff0c;HLM&#xff0c;R&#xff0c;SPSS和Mplus&#xff09;的两级分层线性模型的过程和输出&#xff08;点击文末“阅读原文”获取完整代码数据&#…

2021.06青少年软件编程(Python)等级考试试卷(三级)

2021.06青少年软件编程(Python)等级考试试卷(三级) 一、单选题(共25题,每题2分,共50分) 1.关于open()函数的参数,下列描述正确的是?( D ) A. "w+" 以十六进制格式打开一个文件只用于写入 B. "r+"打开一个文件用于读写。文件指针将会放在文件…

视觉SLAM十四讲ch4笔记——李群与李代数

文章目录视觉SLAM十四讲ch4——李群与李代数4.1 李群李代数基础4.2 指数映射和对数映射4.2.1 so(3)↔SO(3)so(3) \leftrightarrow SO(3)so(3)↔SO(3)4.2.2 se(3)↔SE(3)se(3) \leftrightarrow SE(3)se(3)↔SE(3)4.2.3 小总结&#xff1a;so(3)↔SO(3)so(3) \leftrightarrow SO(…

slam学习 - 基本VO代码学习

本打算学习 orb -slam3 源码&#xff0c;但还是先把《slam 14》上的代码看完再说&#xff0c;至少把整个流程走一遍。 相关参考 https://blog.csdn.net/weixin_44684139/article/details/105305564 https://blog.csdn.net/qq_35590091/article/details/97111744 代码需求分析…

耗时大半个月收整全套「Java架构进阶pdf」

花了我大半个月时间收整了全套的「Java架构进阶pdf」&#xff0c;这一波下来&#xff0c;刷完你就会知道&#xff0c;真真香啊&#xff0c;我的心血果然&#xff0c;没白费&#xff01; 请注意&#xff1a;关于全套的「Java架构进阶pdf」&#xff0c;我会从面试-筑基-框架-分布…

npm vue 路由之一级路由(npm默认已经集成了vue)

npm vue 路由之一级路由&#xff08;npm默认已经集成了vue&#xff09; 文档https://v3.router.vuejs.org/zh/installation.html npm install vue-router3.5.2 --save 1.在App.vue上面添加 <router-view></router-view>2.在main.js上面添加 import VueRouter fro…

Lattice库联合ModelSim仿真FIFO

Lattice联合ModelSim仿真FIFO前言一、添加IP二、库文件添加&#xff08;一&#xff09;方式一&#xff1a;添加器件库到ModelSim&#xff08;二&#xff09;方法二&#xff1a;直接添加器件库到Libray,和tb.v在同一个目录下仿真三、仿真&#xff08;一&#xff09;仿真文件&…

[附源码]Python计算机毕业设计Django基于java的社区管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…