From d7fe0f4c66b134fca43bca44b1161c0e4aa28bcb Mon Sep 17 00:00:00 2001 From: chengsc <11752@DESKTOP-DS49RCP> Date: 星期一, 10 三月 2025 15:27:52 +0800 Subject: [PATCH] 修改入库问题 --- Wms/WMS.BLL/Logic/AllotLocation.cs | 256 ++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 222 insertions(+), 34 deletions(-) diff --git a/Wms/WMS.BLL/Logic/AllotLocation.cs b/Wms/WMS.BLL/Logic/AllotLocation.cs index 9462f76..8d1ca0a 100644 --- a/Wms/WMS.BLL/Logic/AllotLocation.cs +++ b/Wms/WMS.BLL/Logic/AllotLocation.cs @@ -1,5 +1,6 @@ 锘縰sing System; using System.Collections.Generic; +using System.IO; using System.Linq; using Model.ModelDto.SysDto; using SqlSugar; @@ -7,6 +8,7 @@ using WMS.Entity.BllAsnEntity; using WMS.Entity.Context; using WMS.Entity.DataEntity; +using WMS.Entity.LogEntity; using WMS.Entity.SysEntity; namespace WMS.BLL.Logic @@ -16,6 +18,178 @@ /// </summary> public class AllotLocation { + + + /// <summary> + /// 鑾峰彇瀵嗛泦搴撳悎閫傜殑宸烽亾锛堥�傜敤椤圭洰锛欽C34锛� + /// </summary> + /// <param name="roadways">宸烽亾闆嗗悎</param> + /// <param name="areaList">鍖哄煙闆嗗悎</param> + /// <param name="lotNo">鎵规鍙�</param> + /// <returns></returns> + public string GetMiJiSuiTableRoad(string house, List<string> roadways, List<string> areaList, string sku, string lotNo = "") + { + + var db = DataContext.Db; + + var dataStock = db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.WareHouseNo == house && m.SkuNo == sku); + if (!string.IsNullOrWhiteSpace(lotNo)) + { + dataStock = dataStock.Where(m => m.LotNo == lotNo); + } + //搴撳瓨鏌ユ壘鐩稿悓鐗╂枡/鎵规鐨勫贩閬� + var yiYouRoad = dataStock.GroupBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).OrderBy(m => m).ToList(); + foreach (var l in yiYouRoad) + { + // 鍒ゆ柇褰撳墠宸烽亾(缁�)鏄惁鏈夌┖浣欏偍浣� + + var locateCount = db.Queryable<SysStorageLocat>().Count(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo) && m.RoadwayNo == l); + + var bindNum = db.Queryable<LogTask>().Where(m => m.IsDel == "0" && (m.Status == "0" || m.Status == "1") && m.EndRoadway == l) + .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); + if (locateCount - bindNum > 0) + { + return l; + } + + } + //鑾峰彇搴撳瓨鍐呭凡鏈夌墿鏂欑殑宸烽亾 + var dataStockRoad = db.Queryable<DataStockDetail>().Where(m => m.IsDel == "0" && m.WareHouseNo == house).GroupBy(m => m.RoadwayNo).OrderBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).ToList(); + //鎺掗櫎鎺夊凡鏈夌墿鏂欑殑宸烽亾 + + roadways = roadways.Where(m => !dataStockRoad.Contains(m)).ToList(); + foreach (var l in roadways) + { + var bl = true; + //鍒ゆ柇褰撳墠宸烽亾(缁�)鏄惁鏈変换鍔� + var taskList = db.Queryable<LogTask>().Where(m => m.IsDel == "0" && m.EndRoadway == l && (m.Status == "0" || m.Status == "1")).ToList(); + if (taskList.Count > 0) + { + //鍒ゆ柇鐗╂枡鎵规鏄惁鍜屽綋鍓嶄竴鑷� + foreach (var item in taskList) + { + var palletBind = db.Queryable<BllPalletUpShelf>().First(m => m.IsDel == "0" && m.TaskNo == item.TaskNo); + if (palletBind != null) + { + if (palletBind.SkuNo !=sku || palletBind.LotNo != lotNo) + { + bl = false; + continue; + } + + } + } + if (bl) + { + // 鍒ゆ柇褰撳墠宸烽亾(缁�)鏄惁鏈夌┖浣欏偍浣� + + var locateCount = db.Queryable<SysStorageLocat>().Count(m => m.Status == "0" && m.Flag == "0" && areaList.Contains(m.AreaNo) && m.RoadwayNo == l); + + var bindNum = db.Queryable<LogTask>().Where(m => m.IsDel == "0" && (m.Status == "0" || m.Status == "1") && m.EndRoadway == l) + .GroupBy(m => m.PalletNo).Select(m => m.PalletNo).Count(); + if (locateCount - bindNum > 0) + { + return l; + } + } + } + } + return ""; + + } + + /// <summary> + /// 鑾峰彇瀵嗛泦搴撳悎閫傜殑鍌ㄤ綅锛堥�傜敤椤圭洰锛欽C34锛� + /// </summary> + /// <param name="roadways">宸烽亾闆嗗悎</param> + /// <param name="areaList">鍖哄煙闆嗗悎</param> + /// <param name="lotNo">鎵规鍙�</param> + /// <returns></returns> + public SysStorageLocat GetMiJiSuiTableLocate(SysStorageRoadway roadway, List<string> areaList, string sku, string lotNo = "") + { + + var db = DataContext.Db; + + // 鍒ゆ柇褰撳墠宸烽亾(缁�)鏄惁鏈夌┖浣欏偍浣� + var locateList = db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.RoadwayNo == roadway.RoadwayNo && areaList.Contains(m.AreaNo)).ToList(); + if (locateList.Count(m => m.Status == "0") > 0) + { + var bl = GetLocateASCOrDesc(roadway.RoadwayNo); + + var locate = locateList.OrderBy(m => m.LocatNo).First(); + + if (bl) + { + locate = locateList.OrderByDescending(m => m.LocatNo).First(); + } + var bl2 = MiJiLocateIsOk(locate, bl); //楠岃瘉鍌ㄤ綅鏄惁鍙叆搴撴柟娉� + if (bl2) + { + return locate; + } + } + + + return null; + + } + + /// <summary> + /// 鑾峰彇鍌ㄤ綅鐨勬帓鍒楅『搴� + /// </summary> + /// <param name="roadStr"></param> + /// <returns>true锛歞esc鍊掑簭 false锛歛sc姝e簭</returns> + public bool GetLocateASCOrDesc(string roadStr) + { + var db = DataContext.Db; + + var locate = db.Queryable<SysStorageLocat>().First(m => m.IsDel == "0" && m.RoadwayNo == roadStr); + var a = locate.LocatNo.Substring(2,2);//鍌ㄤ綅鍒� + var b = locate.AisleOne.Substring(2, 2);//閫氶亾鍙e垪 + return int.Parse(a) < int.Parse(b); + } + + /// <summary> + /// 楠岃瘉鍌ㄤ綅鏄惁鍙叆搴� + /// </summary> + /// <param name="locate"></param> + /// <returns></returns> + private bool MiJiLocateIsOk(SysStorageLocat locate,bool bl) + { + + var db = DataContext.Db; + var a = int.Parse(locate.LocatNo.Substring(2, 2));//鍌ㄤ綅鍒� + var b = int.Parse(locate.AisleOne.Substring(2, 2));//閫氶亾鍙e垪 + var str1 = new List<string>() { "0", "3", "5" }; + var str2 = new List<string>() { "1", "2", "4" }; + var locatList1 = db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.RoadwayNo == locate.RoadwayNo && m.Column < a).ToList(); + var locatList2 = db.Queryable<SysStorageLocat>().Where(m => m.IsDel == "0" && m.RoadwayNo == locate.RoadwayNo && m.Column > a).ToList(); + if (bl) + { + if (locatList1.Count(m => str1.Contains(m.Status)) > 0) + { + return false; + } + if (locatList2.Count(m => str2.Contains(m.Status)) > 0) + { + return false; + } + } + else + { + if (locatList1.Count(m => str2.Contains(m.Status)) > 0) + { + return false; + } + if (locatList2.Count(m => str1.Contains(m.Status)) > 0) + { + return false; + } + } + return true; + + } + /// <summary> /// 鑾峰彇鍚堥�傜殑搴撲綅 /// </summary> @@ -44,7 +218,7 @@ var dic = db.Queryable<SysDictionary>().First(m => m.Id.ToString() == house.Type); switch (dic.DictName) { - //鏄惁鎸囧畾宸烽亾 + //鎸囧畾宸烽亾 case "绔嬩綋搴�" when !string.IsNullOrWhiteSpace(roadwayNo): { var roadwayList = new List<SysStorageRoadway>(); @@ -65,7 +239,7 @@ //鏌ヨ璇ュ贩閬撳苟涓旀爣蹇椾负姝e父鐨勭殑鍌ㄤ綅 roadwayList.Add(roadway); - var locate = GetLocateByRoadways(roadwayList,areaList,true); + var locate = GetLocateByRoadways(roadwayList,areaList,true,houseNo); if (locate == null) { throw new Exception($"{roadwayNo}宸烽亾娌℃湁鍚堥�傜殑绌哄偍浣�"); @@ -77,7 +251,7 @@ { var roadwayList = db.Queryable<SysStorageRoadway>().Where(m => m.WareHouseNo == houseNo && m.Status == "0" && roadList.Contains(m.RoadwayNo)).OrderBy(m => new { m.Priority, m.RoadwayNo }).ToList(); - var locate = GetLocateByRoadways(roadwayList,areaList); + var locate = GetLocateByRoadways(roadwayList,areaList,false, houseNo); if (locate == null) { throw new Exception($"{houseNo}浠撳簱宸插惎鐢ㄧ殑宸烽亾涓病鏈夊悎閫傜殑绌哄偍浣�"); @@ -111,7 +285,7 @@ /// <param name="areaList">鍖哄煙闆嗗悎</param> /// <param name="isRoadway">鏄惁鎸囧畾宸烽亾</param> /// <returns></returns> - private SysStorageLocat GetLocateByRoadways(List<SysStorageRoadway> roadways,List<string> areaList,bool isRoadway = false) + private SysStorageLocat GetLocateByRoadways(List<SysStorageRoadway> roadways,List<string> areaList,bool isRoadway = false ,string houseNo = "W01") { try { @@ -176,14 +350,14 @@ SysStorageLocat locate = null; // 鍌ㄤ綅淇℃伅 //SysStorageLocat log = db.Ado.SqlQuerySingle<SysStorageLocat>("select * from SysStorageLocat where LocatNo = (select Top(1) LocatNo from BllPalletBind order by CreateTime desc)"); //宸烽亾鏈�鍚庝竴娆′娇鐢ㄨ褰� - SysRoadwayUseLog log= db.Ado.SqlQuerySingle<SysRoadwayUseLog>("select Top(1) * from SysRoadwayUseLog where IsDel=0 order by CreateTime desc"); //宸烽亾鏈�鍚庝竴娆′娇鐢ㄨ褰� + SysRoadwayUseLog log= db.Ado.SqlQuerySingle<SysRoadwayUseLog>($"select Top(1) * from SysRoadwayUseLog where IsDel=0 and WareHouseNo ='{houseNo}' order by CreateTime desc"); //宸烽亾鏈�鍚庝竴娆′娇鐢ㄨ褰� if (laneAllot == 0)//璺冲贩閬撳钩鍧囧垎閰� { //濡傛灉鍚岀骇宸烽亾鏈夊鏉″垯鏌ヤ笂娆′綅缃棩蹇� if (roadways.Count > 1) { - log = db.Queryable<SysRoadwayUseLog>().OrderByDescending(l => l.Id).First(); + log = db.Queryable<SysRoadwayUseLog>().Where(m=>m.WareHouseNo == houseNo).OrderByDescending(l => l.Id).First(); } //鍙栧悇宸烽亾鎵�鏈夋帓绗竴涓悎閫備綅 foreach (var l in roadways) @@ -203,21 +377,25 @@ locate = GetLocateByRoadway(l.RoadwayNo, topOrBom, leftOrRight, areaList, list, ref count); if (locate != null) { - list.Add(locate.LocatNo); - var isOk = LocateIsOk(locate); - if (!isOk) - { - locate = null; - } - if (isOk) - { - break; - } + break; + //list.Add(locate.LocatNo); + //var isOk = LocateIsOk(locate); + //if (!isOk) + //{ + // locate = null; + //} + //if (isOk) + //{ + // break; + //} } } while (count != 0 && locate == null);//褰撴煡璇㈠偍浣嶆暟閲忎笉绛�0 骞朵笖鍌ㄤ綅涓虹┖鏃讹紝鍐嶆寰幆宸烽亾銆佸尯鍩熸煡鎵惧偍浣� - + if (locate!=null) + { + break; + } } //濡傛灉璺冲贩閬撳苟涓旀湭鎵惧埌鍚堥�傜┖鍌ㄤ綅,鍒欒烦鍒版渶鍚庝竴娆′娇鐢ㄧ殑宸烽亾鏌ヨ if (!isRoadway) @@ -233,12 +411,13 @@ locate = GetLocateByRoadway(log.RoadwayNo, topOrBom, leftOrRight, areaList, list, ref count); if (locate != null) { - list.Add(locate.LocatNo); - var isOk = LocateIsOk(locate); - if (!isOk) - { - locate = null; - } + break; + //list.Add(locate.LocatNo); + //var isOk = LocateIsOk(locate); + //if (!isOk) + //{ + // locate = null; + //} } @@ -260,21 +439,25 @@ locate = GetLocateByRoadway(item.RoadwayNo, topOrBom, leftOrRight, areaList, list, ref count); if (locate != null) { - list.Add(locate.LocatNo); - var isOk = LocateIsOk(locate); - if (!isOk) - { - locate = null; - } - if (isOk) - { - break; - } + break; + //list.Add(locate.LocatNo); + //var isOk = LocateIsOk(locate); + //if (!isOk) + //{ + // locate = null; + //} + //if (isOk) + //{ + // break; + //} } } while (count != 0 && locate == null);//褰撴煡璇㈠偍浣嶆暟閲忎笉绛�0 骞朵笖鍌ㄤ綅涓虹┖鏃讹紝鍐嶆寰幆宸烽亾銆佸尯鍩熸煡鎵惧偍浣� - + if (locate != null) + { + break; + } } } @@ -340,6 +523,11 @@ } + /// <summary> + /// 楠岃瘉鍌ㄤ綅鏄惁鍙叆搴� 鍙屾繁浣嶉獙璇� + /// </summary> + /// <param name="locate"></param> + /// <returns></returns> private bool LocateIsOk(SysStorageLocat locate) { try -- Gitblit v1.8.0