From d44e3abf0d51cfea1ed7df510974d69458cf516d Mon Sep 17 00:00:00 2001 From: 杨前锦 <1010338399@qq.com> Date: 星期三, 04 六月 2025 17:11:59 +0800 Subject: [PATCH] 印尼佳通半制品变更需求开发 --- HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs | 341 +++++++++++++++++++++++++++++++++++++------------------- 1 files changed, 226 insertions(+), 115 deletions(-) diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs index e2d0f97..5e8905b 100644 --- a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs +++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/wms/WMSHelper.cs @@ -1,5 +1,6 @@ 锘縰sing HH.WCS.Mobox3.YNJT_BZP_PT.models; using HH.WCS.Mobox3.YNJT_PT.api; +using HH.WCS.Mobox3.YNJT_PT.dispatch; using HH.WCS.Mobox3.YNJT_PT.models; using HH.WCS.Mobox3.YNJT_PT.models.other; using HH.WCS.Mobox3.YNJT_PT.util; @@ -338,7 +339,7 @@ var offLineRecord = db.Queryable<OffLineRecord>().Where(a => a.S_RFID == record.S_RFID).First(); if (offLineRecord != null) { - offLineRecord.S_LOC = record.S_LOC; + offLineRecord.S_DEVICE_NO = record.S_DEVICE_NO; offLineRecord.N_IS_URGENT = record.N_IS_URGENT; offLineRecord.T_OFF_TIME = record.T_OFF_TIME; offLineRecord.N_IS_FULL = record.N_IS_FULL; @@ -386,12 +387,12 @@ /// <summary> /// 鏌ヨ鍏ュ簱缁堢偣璐т綅 /// </summary> - /// <param name="itemCode"></param> /// <param name="locNum">1.鍗曡揣浣�2.鍙岃揣浣�/param> /// <returns></returns> - public static List<Location> getInStockEndLoc(string itemCode, int locNum) + public static EndLocGroup getInStockEndLoc(int locNum) { var db = new SqlHelper<object>().GetInstance(); + EndLocGroup endLocGroup = new EndLocGroup(); List<Location> locations = new List<Location>(); // 1.鎸夊绉巼浠庡ぇ鍒板皬锛屽宸烽亾杩涜鎺掑簭 var roadwayOrderList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y") @@ -401,130 +402,210 @@ .ToList(); // 鏌ヨ鍗曡揣浣�- if (locNum == 1) + foreach (var order in roadwayOrderList) { - foreach (var order in roadwayOrderList) + if (locNum == 1) { - // 1. 鏌ヨ1鍙疯揣浣嶆槸鍚︽湁鐩稿悓鐗╂枡,鏈夛紝鍒欐煡璇㈠搴旂殑2鍙疯揣浣嶆槸鍚︿负绌�- var oneLocList = db.Queryable<Location>() - .LeftJoin<LocCntrRel>((a,b) => a.S_CODE == b.S_LOC_CODE) - .LeftJoin<CntrItemRel>((a,b,c) => b.S_CNTR_CODE == c.S_CNTR_CODE) - .Where((a, b, c) => a.S_AREA_CODE == Settings.stockArea - && a.N_ROADWAY == order.roadway - && a.N_COL % 2 == 1 - && a.N_CURRENT_NUM == 1 - && a.N_LOCK_STATE == 0 - && a.C_ENABLE == "Y" - && c.S_ITEM_CODE == itemCode - ) - .OrderBy(a => a.N_LAYER).OrderBy(a => a.N_COL) - .ToList(); - if (oneLocList.Count > 0) + /*// 鏌ヨ鎵�湁鐩稿悓鐗╂枡璐т綅 + var sameItemLocList = db.Queryable<Location>() + .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE) + .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE) + .Where((a, b, c) => a.S_AREA_CODE == Settings.stockArea + && a.N_ROADWAY == order.roadway + && a.N_CURRENT_NUM == 1 + && a.N_LOCK_STATE == 0 + && a.C_ENABLE == "Y" + && b.S_CNTR_CODE != null + && c.S_ITEM_CODE == itemCode + ) + .OrderBy((a, b, c) => new { a.N_LAYER, a.N_COL }) + .ToList(); + + // 鏌ヨ鐩稿悓鐗╂枡鐨勫乏鍙虫槸鍚︽湁绌鸿揣浣�+ foreach (var loc in sameItemLocList) { - foreach (var loc in oneLocList) + var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); + if (leftLoc != null) { - var twoLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); - if (twoLoc != null) - { - locations.Add(twoLoc); - return locations; - } + locations.Add(leftLoc); + break; } - } - // 2.鏌ヨ2鍙疯揣浣嶆槸鍚︽湁鐩稿悓鐗╂枡锛屾湁锛屽垯鏌ヨ瀵瑰簲鐨�鍙蜂綅鏄惁涓虹┖ - if (locations.Count == 0) + var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); + if (rightLoc != null) + { + locations.Add(leftLoc); + break; + } + }*/ + + // 鏌ヨ绌鸿揣浣�+ var emptyLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).First(); + if (emptyLoc != null) { - var twoLocList = db.Queryable<Location>() - .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE) - .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE) - .Where((a, b, c) => a.S_AREA_CODE == Settings.stockArea - && a.N_ROADWAY == order.roadway - && a.N_COL % 2 == 0 - && a.N_CURRENT_NUM == 1 - && a.N_LOCK_STATE == 0 - && a.C_ENABLE == "Y" - && c.S_ITEM_CODE == itemCode - ) - .OrderBy(a => a.N_LAYER).OrderBy(a => a.N_COL) - .ToList(); - - if (twoLocList.Count > 0) - { - foreach (var loc in twoLocList) - { - var oneLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); - if (oneLoc != null) - { - locations.Add(oneLoc); - return locations; - } - } - } - } - - // 3.娌℃湁鐩稿悓鐗╂枡鐨�浼樺厛鏀剧鐢ㄨ揣浣嶆梺杈癸紙鍗曚竴璐т綅锛�- if (locations.Count == 0) - { - var disableLocList= db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.C_ENABLE == "N").OrderBy(a => a.N_LAYER).ToList(); - foreach (var loc in disableLocList) - { - // 璐т綅涓�鍙蜂綅锛屽垯鏌ヨ瀵瑰簲浜屽彿浣嶆槸鍚︿负绌�- if (loc.N_LAYER % 2 == 1) - { - var twoLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); - if (twoLoc != null) - { - locations.Add(twoLoc); - return locations; - } - } - - // 璐т綅涓�鍙蜂綅锛屽垯鏌ヨ瀵瑰簲涓�彿浣嶆槸鍚︿负绌�- if (loc.N_LAYER % 2 == 0) - { - var oneLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); - if (oneLoc != null) - { - locations.Add(oneLoc); - return locations; - } - } - } - } - - // 4.娌℃湁鐩稿悓鐗╂枡鐨勶紝涓旂鐢ㄨ揣浣嶆梺杈规病鏈夌┖璐т綅锛屽垯浼樺厛鏀�鍙蜂綅 - if (locations.Count == 0) - { - oneLocList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_COL % 2 == 1 && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => a.N_LAYER).OrderByDescending(a => a.N_COL).ToList(); - if (oneLocList.Count > 0) - { - locations.Add(oneLocList[0]); - return locations; - } + locations.Add(emptyLoc); + endLocGroup.endLocList = locations; + return endLocGroup; } } - } - // 鏌ヨ鍙岃揣浣�- if (locNum == 2) - { - foreach (var order in roadwayOrderList) + if (locNum == 2) { - var oneLocList = db.Queryable<Location>().Where( a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_COL % 2 == 1 && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => a.N_LAYER).OrderBy(a => a.N_COL).ToList(); - foreach (var loc in oneLocList) + var emptyLocList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).ToList(); + + if (emptyLocList.Count > 0) { - var twoLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); - if (twoLoc != null) + // 鏌ヨ鍙屾嫋绌鸿揣浣�+ if (locations.Count == 0) + { + foreach (var loc in emptyLocList) + { + var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); + if (leftLoc != null) + { + locations.Add(loc); + locations.Add(leftLoc); + break; + } + + var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); + if (rightLoc != null) + { + locations.Add(loc); + locations.Add(leftLoc); + break; + } + } + + if (locations.Count == locNum) + { + endLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo(); + endLocGroup.endLocList = locations; + return endLocGroup; + } + } + + // 鏌ヨ鍗曟嫋璐т綅 + foreach (var loc in emptyLocList) { locations.Add(loc); - locations.Add(twoLoc); - return locations; + if (locations.Count == locNum) + { + endLocGroup.endLocList = locations; + return endLocGroup; + } + } + } + } + } + return endLocGroup; + } + + public class EndLocGroup + { + public string groupNo { get; set; } + public List<Location> endLocList { get; set; } + } + + /// <summary> + /// 鏌ヨ鍑哄簱寮�璐т綅 + /// 璁$畻锛�.宸烽亾涓嶆姤璀︺�2.鐗╂枡鐘舵�OK銆�.灏忎簬澶辨晥鏃堕棿 澶т簬绛変簬鐢熸晥鏃堕棿 4.鍔犳�鏂欏厛鍑恒�5.鍏堝叆鍏堝嚭锛堢敓浜ф椂闂达級锛夊嚭搴撶墿鏂�+ /// </summary> + /// <param name="itemCode"></param> + /// <param name="locNum"></param> + public static StartLocGroup getOutStockStartLoc(string itemCode, int locNum ) + { + var db = new SqlHelper<object>().GetInstance(); + StartLocGroup startLocGroup = new StartLocGroup(); + + // 1.鏌ヨ锛堢墿鏂欑姸鎬丱K 锛屼笖灏忎簬澶辨晥鏃堕棿锛屽ぇ浜庣瓑浜庣敓鏁堟椂闂达級鍑哄簱鐗╂枡锛屽苟鎸夊姞鎬ユ枡鍏堝嚭锛屽厛鍏ュ厛鍑猴紙鐢熶骇鏃堕棿锛夌殑鍘熷垯杩涜鎺掑簭 + var query = db.Queryable<Location>() + .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE) + .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE) + .Where((a, b, c) => a.S_AREA_CODE == Settings.stockArea + && a.N_CURRENT_NUM == 1 + && a.N_LOCK_STATE == 0 + && a.C_ENABLE == "Y" + && b.S_CNTR_CODE != null + ); + + if (itemCode != null) + { + query = query.Where((a, b, c) => c.S_ITEM_CODE == itemCode + && c.S_ITEM_STATE == "OK" + && SqlFunc.ToDate(c.S_EFFECTIVE_TIME) <= SqlFunc.GetDate() // 鐢熸晥鏃堕棿鏃╀簬褰撳墠鏃堕棿 + && SqlFunc.ToDate(c.S_EXPIRATION_TIME) >= SqlFunc.GetDate() // 澶辨晥鏃堕棿鏅氫簬褰撳墠鏃堕棿 + && c.S_EFFECTIVE_TIME != null + && c.S_EXPIRATION_TIME != null) + .OrderByDescending((a, b, c) => c.N_URGENT_FLAG) + .OrderBy((a, b, c) => c.S_TXNDATE); + } + else + { + query = query.Where((a, b, c) => c.S_ITEM_CODE == itemCode); + } + var outLocList = query.ToList(); + + if (outLocList.Count > 0) + { + foreach (var loc in outLocList) + { + // 鏌ヨ宸烽亾鏄惁姝e父锛屽紓甯歌烦杩�+ var stackerStates = WCSDispatch.getStackerState(loc.N_ROADWAY); + if (stackerStates.Count == 0 || stackerStates[0].roadway_state == "0" || stackerStates[0].roadway_state == "3") + { + continue; + } + + var cntrItemRel = db.Queryable<CntrItemRel>().LeftJoin<LocCntrRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE).Where((a, b) => b.S_LOC_CODE == loc.S_CODE).First(); + if (cntrItemRel != null) + { + startLocGroup.startLocList.Add(loc); + if (locNum == startLocGroup.startLocList.Count) + { + break; + } + + var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == loc.N_ROADWAY && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); + if (leftLoc != null) + { + var locCntrRel = db.Queryable<LocCntrRel>() + .LeftJoin<CntrItemRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE) + .Where((a, b) => a.S_LOC_CODE == leftLoc.S_CODE && b.S_ITEM_CODE == itemCode) + .First(); + if (locCntrRel != null) + { + startLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo(); + startLocGroup.startLocList.Add(leftLoc); + break; + } + } + + var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == loc.N_ROADWAY && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); + if (rightLoc != null && startLocGroup.startLocList.Count == 0) + { + var locCntrRel = db.Queryable<LocCntrRel>() + .LeftJoin<CntrItemRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE) + .Where((a, b) => a.S_LOC_CODE == rightLoc.S_CODE && b.S_ITEM_CODE == itemCode) + .First(); + if (locCntrRel != null) + { + startLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo(); + startLocGroup.startLocList.Add(rightLoc); + break; + } } } } } - return locations; + return startLocGroup; + + } + + public class StartLocGroup + { + public string groupNo { get; set; } + public List<Location> startLocList { get; set; } } /// <summary> @@ -547,13 +628,14 @@ { Location location = new Location(); var db = new SqlHelper<object>().GetInstance(); + var roadwayGroup = db.Queryable<Location>() - .LeftJoin<WCSTask>((a,b) => a.S_CODE == b.S_END_LOC && b.N_B_STATE < 3) - .Where((a, b) => a.S_AREA_CODE == Settings.stockArea && b.S_CODE != null ) - .GroupBy((a, b) => a.N_ROADWAY) - .Select( (a, b) => new { roadway = a.N_ROADWAY , num = SqlFunc.AggregateDistinctCount(a.S_CODE)}) - .OrderBy(a => a.num) - .ToList(); + .LeftJoin<WCSTask>((a, b) => a.S_CODE == b.S_END_LOC && b.N_B_STATE < 3) + .Where((a, b) => a.S_AREA_CODE == Settings.stockArea) + .GroupBy((a, b) => a.N_ROADWAY) + .Select((a, b) => new { roadway = a.N_ROADWAY, num = SqlFunc.AggregateDistinctCount(b.S_CODE != null) }) + .OrderBy(a => a.num) + .ToList(); foreach (var item in roadwayGroup) { @@ -599,6 +681,12 @@ return null; } + /// <summary> + /// 缁戝畾鏉$爜鐗╂枡淇℃伅 + /// </summary> + /// <param name="cntrCode"></param> + /// <param name="greenTireInformation"></param> + /// <returns></returns> public static bool bindBarcodeItemInfo( string cntrCode,GreenTireInformation greenTireInformation) { bool result = false; @@ -655,5 +743,28 @@ } return result; } + + /// <summary> + /// 鏌ヨ纭寲宸ュ崟 + /// </summary> + /// <param name="dateShift"></param> + /// <param name="mcn"></param> + /// <param name="shift"></param> + /// <returns></returns> + public static ProductionShedule getProductionShedule(string dateShift ,string mcn ,string shift) + { + var db = new SqlHelper<object>().GetInstance(); + return db.Queryable<ProductionShedule>().Where(a => a.DATESHIFT == dateShift && a.MCN == mcn && a.SHIFT == shift).First(); + } + + /// <summary> + /// 鏌ヨ鑳氳儙瀹屾垚纭寲鐨勬暟閲�+ /// </summary> + /// <returns></returns> + public static int getEmbryoFinishNum(string dateShift, string mcn, string shift) + { + var db = new SqlHelper<object>().GetInstance(); + return db.Queryable<EmbryoFinishRecord>().Where(a => a.DATE_SHIFT == dateShift && a.CUR_MCN == mcn && a.CUR_SHIFT == shift).Count(); + } } } -- Gitblit v1.9.1