WMS手動(dòng)配貨和自動(dòng)配貨的區(qū)別-創(chuàng)新互聯(lián)

手動(dòng)配貨

不知道配貨流程的朋友可以看一下前面的文章鏈接: 深入淺出WMS之出庫(kù)流程里面有對(duì)出庫(kù)的解釋說明,其中也有對(duì)配貨的解釋。前端頁(yè)面也可以在前面的那篇文章中看到,這里我們來說一下后端部分。

成都創(chuàng)新互聯(lián)公司于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元河間做網(wǎng)站,已為上家服務(wù),為河間各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792查

手動(dòng)配貨是選中出庫(kù)單的某條數(shù)據(jù),然后點(diǎn)擊手動(dòng)配貨,這個(gè)時(shí)候前端會(huì)把這個(gè)出庫(kù)單的guid傳給后端,這個(gè)時(shí)候我們有g(shù)uid了,就可以去出庫(kù)單表里去找到這條數(shù)據(jù),取出其中的訂單號(hào)、批次號(hào)等等信息。這個(gè)時(shí)候我們要做的就很簡(jiǎn)單,去庫(kù)存里找符合我們可以出庫(kù)的信息。

public async TaskQueryPeiH(int pages, int limit, string matno, string batch, string cflag)
        {PageData pageData = new PageData();
            var list = _fsql.Select()
                .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);
            }
            //在這里添加我們對(duì)庫(kù)存信息的限制條件
            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;
        }

當(dāng)我們查到所有符合條件的庫(kù)存信息后,把數(shù)據(jù)返回給前端。這個(gè)時(shí)候也就是當(dāng)前端選中出庫(kù)單點(diǎn)擊手動(dòng)配貨按鈕時(shí),會(huì)彈出一個(gè)頁(yè)面,也就是我們上面執(zhí)行的查詢結(jié)果。這個(gè)時(shí)候又操作人員來進(jìn)行貨位分配。例如我們要出750個(gè)A貨物,然后有符合出庫(kù)的8個(gè)托盤,每個(gè)托盤上有100個(gè)A物品,這個(gè)時(shí)候我們手動(dòng)配貨是可以選擇每個(gè)托盤出多少的,比如說第一個(gè)托盤出90個(gè),第二個(gè)托盤出80等。當(dāng)配完貨后會(huì)生成相對(duì)應(yīng)的出庫(kù)任務(wù),那么接下來我們看一下這個(gè)業(yè)務(wù)是怎么用代碼來實(shí)現(xiàn)的。

[HttpPost]
        public async TaskQueryPeiH(ListlogMstores)
        {return Ok(await _erpOutService.PeiHuo2(logMstores));
        }

這個(gè)是我們的配貨接口,這個(gè)時(shí)候前端會(huì)發(fā)一個(gè)list過來,寫list的目的是為了把配貨的數(shù)據(jù)一次性發(fā)給后端,而不是一直調(diào)用接口。
這個(gè)時(shí)候可以看到我們調(diào)用了server層。我們來看一下server層對(duì)業(yè)務(wù)的處理。

public async TaskPeiHuo2(ListlogMstores)
        {try
            {//循環(huán)list
                LOGOUTTASK 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;
                    //通過訂單號(hào)和行號(hào)查詢出庫(kù)表
                    var ErpOut = await _erpOutRepository.QueryMI(ordno, itmno);
                    //通過托盤號(hào)查詢庫(kù)存表
                    var OutMstore = await _mstoreRepository.QueryPalno(palno);
                    #region 賦值給出庫(kù)任務(wù)做添加
                    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;
                    #endregion
                    if (Convert.ToDouble(OutMstore.QUANT)throw new Exception("庫(kù)存數(shù)量不足!");
                    }
                    if (await _erpOutRepository.PeiHuo(lOGOUTTASK) == 0)
                    {resultData.code = 0;
                        resultData.message = "配貨成功!";
                    }
                  
                }
            }
            catch (Exception ex)
            {resultData.code = 1;
                resultData.message = ex.Message;
            }
            return resultData;
        }

在這里面我們又調(diào)用了一層,因?yàn)檫@層是處理業(yè)務(wù)的,會(huì)有另外一層專門寫增刪改查等操作,這樣的話也是為了提高代碼的利用率,這也符合我們寫代碼的原則“高內(nèi)聚,低耦合”。

public async TaskPeiHuo(LOGOUTTASK lOGOUTTASK)
        {try
            {var ErpOut = await _fsql.Select().Where(x =>x.ORDNO == lOGOUTTASK.ORDNO && x.ITMNO == lOGOUTTASK.ITMNO).FirstAsync();
                string quant0 = ErpOut.QUANT0;
                var Pdian = await _fsql.Select().Where(x =>x.ADDRE == lOGOUTTASK.ADDRESRC).FirstAsync();
                if (Pdian.PkFlag == "PK") return 6001;
                quant0 = (Convert.ToDouble(quant0) + Convert.ToDouble(lOGOUTTASK.QUANT)).ToString();
                _fsql.Transaction(() =>{//添加出庫(kù)任務(wù)
                    var inrows = _fsql.Insert(lOGOUTTASK).ExecuteAffrows();
                    if (inrows<= 0) throw new Exception("出庫(kù)任務(wù)添加失??!");

                    //var erpin = _fsql.Select().Where(x =>x.Id == Convert.ToDecimal(lOGOUTTASK.ErpoutId)).First();
                    //修改出庫(kù)單已配貨數(shù)量
                    var uprows = _fsql.Update().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("配貨數(shù)量回寫失敗!");
                    //庫(kù)存表可用數(shù)量加上

                });
                return 0;
            }
            catch (Exception ex)
            {return 1;
            }
        }

這里我們需要使用到事務(wù),以防數(shù)據(jù)出現(xiàn)錯(cuò)誤。手動(dòng)配貨的相比較自動(dòng)配貨來說比較簡(jiǎn)單,了解業(yè)務(wù)之后就可以一步一步的往下寫。而且一般來說不會(huì)出現(xiàn)什么錯(cuò)誤,只需要多注意數(shù)據(jù)的增減。例如配貨成功后出庫(kù)單的已配貨數(shù)量,未配貨數(shù)量,出庫(kù)任務(wù)的出庫(kù)數(shù)量,庫(kù)存的剩余數(shù)量,可用數(shù)量等等。假如對(duì)這個(gè)配貨還不太懂的話,可以看一下前面的文章,里面有出庫(kù)的整個(gè)流程,其中對(duì)配貨也有一定說明。接下來我們來說一下重點(diǎn)-自動(dòng)配貨。

自動(dòng)配貨

自動(dòng)配貨前端寫起來比較簡(jiǎn)單,因?yàn)橹恍枰獙懸粋€(gè)按鈕就可以。自動(dòng)配貨相對(duì)手動(dòng)配貨來說第一步的查詢是一樣的,只不過區(qū)別是手動(dòng)配貨需要我們把查出來的數(shù)據(jù)返回給前端,讓操作人員進(jìn)行分配,然后再把分配完的數(shù)據(jù)再傳給后端。自動(dòng)配貨的話就是我們查出來數(shù)據(jù)后,我們后端自己處理。
在這里插入圖片描述
上面的是我初次寫的自動(dòng)配貨,如今已棄用,下面的是優(yōu)化過的。還是那么一個(gè)簡(jiǎn)簡(jiǎn)單單的接口,只需要前端給我們傳一個(gè)guid,我們就去server層自己玩。說明我寫在下面代碼的注釋里,方便大家了解流程。

public async TaskAutomaticPicking(string guid)
        {ResultData resultData = new ResultData()
            {code = 0,
                message = "success",
            };
            try
            {ListlogMstores = new List();
                var ErpOut = await _erpOutRepository.Queryguid(guid);//根據(jù)guid查詢出庫(kù)單
                string quantout = ErpOut.QUANT;//出庫(kù)單計(jì)劃出庫(kù)數(shù)量
                string matno = ErpOut.MATNO;
                string batch = ErpOut.BATCH;
                string cflag = ErpOut.CFLAG;
                //查詢符合條件的庫(kù)存信息
                var logmstore = await _mstoreRepository.QueryZiDong(1, 20, matno, batch, cflag);
                //序列化查詢符合條件的庫(kù)存信息
                var json = JsonConvert.SerializeObject(logmstore.pageData, Formatting.Indented);
                var newdynamicData = JsonConvert.DeserializeObject>(json);
                //未配貨數(shù)量 = 計(jì)劃數(shù)量 - 已配貨數(shù)量
                Double UnshippedQuantity = Convert.ToDouble(ErpOut.QUANT) - Convert.ToDouble(ErpOut.QUANT0);
                //符合條件的數(shù)據(jù)循環(huán)插入到List集合中
                for (int i = 0; i< newdynamicData.Count; i++)
                {//如果大于0說明是整托出庫(kù),例如750個(gè)的貨,每個(gè)托盤100個(gè),那么前7個(gè)托盤就是整托出庫(kù),最后的一個(gè)托盤就是揀選出庫(kù),因?yàn)槲覀冎恍枰?0,剩下的50還需要再回庫(kù)。
                    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,//批次號(hào)
                            CFLAG = newdynamicData[i].CFLAG,
                            DEMO1 = ErpOut.ORDNO,//訂單號(hào)
                            DEMO2 = ErpOut.ITMNO,//行號(hào)
                            MATNO = newdynamicData[i].MATNO,//物料編碼
                            PALNO = newdynamicData[i].PALNO,
                            QUDAT = newdynamicData[i].QUDAT,
                            SECTN = newdynamicData[i].SECTN,
                            //QUANT = newdynamicData[i].QUANT //庫(kù)存數(shù)量
                            QUANTOUT = newdynamicData[i].QUANT
                        });
                    }
                    else
                    {
                        logMstores.Add(new LogMstore
                        {ADDRE = newdynamicData[i].ADDRE,//貨位地址
                            BATCH = newdynamicData[i].BATCH,//批次號(hào)
                            CFLAG = newdynamicData[i].CFLAG,
                            DEMO1 = ErpOut.ORDNO,//訂單號(hào)
                            DEMO2 = ErpOut.ITMNO,//行號(hào)
                            MATNO = newdynamicData[i].MATNO,//物料編碼
                            PALNO = newdynamicData[i].PALNO,
                            QUDAT = newdynamicData[i].QUDAT,
                            SECTN = newdynamicData[i].SECTN,
                            //QUANT = newdynamicData[i].QUANT //庫(kù)存數(shù)量
                            QUANTOUT = UnshippedQuantity.ToString()
                        });
                        break;
                    }                   
                }
               await ZiDong(logMstores);//這一步和手動(dòng)配貨一樣
            }
            catch (Exception ex)
            {resultData.code = 1;
                resultData.message = ex.Message;
            }
            return resultData;
        }

自動(dòng)配貨的話一般有先入先出原則,也有隨機(jī)出庫(kù)原則等等,這個(gè)都是根據(jù)甲方需求來寫。先入先出原則比較簡(jiǎn)單,查詢的時(shí)候按時(shí)間進(jìn)行排序查詢結(jié)果就可以。這里我們用的也是先入先出原則。自動(dòng)配貨的話一般來說比較常用。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

新聞標(biāo)題:WMS手動(dòng)配貨和自動(dòng)配貨的區(qū)別-創(chuàng)新互聯(lián)
鏈接URL:http://bm7419.com/article34/hecse.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、手機(jī)網(wǎng)站建設(shè)小程序開發(fā)、企業(yè)建站、云服務(wù)器、外貿(mào)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)