From e0d89637030791ce1e7dd46ca5fdec9979977960 Mon Sep 17 00:00:00 2001 From: 杨前锦 <1010338399@qq.com> Date: 星期三, 11 六月 2025 17:28:41 +0800 Subject: [PATCH] 印尼佳通-硫化流程出入库流程开发 --- HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs | 320 ++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 233 insertions(+), 87 deletions(-) diff --git a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs index 41ea36e..1758ea2 100644 --- a/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs +++ b/HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs @@ -17,6 +17,7 @@ using static HH.WCS.Mobox3.YNJT_BZP.api.AgvController; using static HH.WCS.Mobox3.YNJT_BZP.api.ApiModel; using static HH.WCS.Mobox3.YNJT_BZP.dispatch.GtDispatch; +using static HH.WCS.Mobox3.YNJT_BZP.util.Settings; namespace HH.WCS.Mobox3.YNJT_BZP.core { internal class WCSCore { @@ -33,16 +34,16 @@ var TN_Task = WCSHelper.GetTask(model.No); if (TN_Task != null) { - bool isExist = WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, model.State); - if (!isExist) + var wmsTask = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE); + if (wmsTask != null && wmsTask.N_B_STATE < 2) { - WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); if (model.State <= 7) { //鏈変换鍔″彿璇锋眰 switch (model.State) { case 1: + TN_Task.S_EQ_NO = model.ForkliftNo; WCSHelper.Begin(TN_Task); break; #region MyRegion @@ -59,21 +60,33 @@ case 6: TaskProcess.OperateStatus(TN_Task, 6); WCSHelper.UpdateStatus(TN_Task, "鍗歌揣瀹屾垚"); + + // AGV鍗歌揣杈撻�绾匡紝瑙﹀彂鍏ュ簱浠诲姟 + if (TN_Task.S_END_LOC != wmsTask.S_END_LOC) + { + LogHelper.Info($"浠诲姟鍙凤細{TN_Task.S_CODE}锛孉GV鍗歌揣杈撻�绾匡紝瑙﹀彂WCS鍏ュ簱浠诲姟", "AGV"); + Container container = ContainerHelper.GetCntr(TN_Task.S_CNTR_CODE); + if (container != null) + { + WCSCore.createLastTask(TN_Task.S_END_LOC, wmsTask, 1); + } + } break; #endregion case 2: WCSHelper.End(TN_Task); var cntrItemRels = ContainerHelper.GetCntrItemRel(TN_Task.S_CNTR_CODE); - if (cntrItemRels.Count > 0) + if (cntrItemRels.Count > 0) { + LogHelper.Info($"浠诲姟鍙凤細{TN_Task.S_CODE}锛孉GV浠诲姟瀹屾垚锛屼换鍔′俊鎭洖鎶T", "AGV"); string shift = ApiHelper.getShift(DateTime.Now.TimeOfDay); string ydate_shiftName = ""; if (shift == "III") { ydate_shiftName = DateTime.Now.AddDays(-1).ToString("yy/MM/dd") + "-" + shift; } - else + else { ydate_shiftName = DateTime.Now.ToString("yy/MM/dd") + "-" + shift; } @@ -92,6 +105,7 @@ } break; case 7: + LogHelper.Info($"浠诲姟鍙凤細{TN_Task.S_CODE}锛孉GV浠诲姟鍙栨秷", "AGV"); //鍒ゆ柇鏄惁鏀跺埌杩囧己鍒跺彇娑堬紝鏈夊氨涓嶅仛浠讳綍澶勭悊 if (!WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 17)) { @@ -101,28 +115,49 @@ break; } } - else if (model.State == 1002) + else if (model.State == 1003) { - //鏌ヨ褰撳墠缁堢偣鏄瓑寰呭尯锛屽垯鏌ヨ鍏ュ簱agv鎺ラ┏浣�+ LogHelper.Info($"浠诲姟鍙凤細{TN_Task.S_CODE}锛孉GV灏忚溅杩涘叆绛夊緟浣嶏細{TN_Task.S_END_LOC}", "AGV"); + // 鍗歌揣鍓嶇瓑寰�+ // 鏌ヨ褰撳墠缁堢偣鏄瓑寰呭尯锛屽垯鏌ヨ鍏ュ簱agv鎺ラ┏浣� var waitLoc = Settings.getAgvWaitLoc(TN_Task.S_END_LOC); if (waitLoc != null) { - string endLoc = AGVApplyEndLoc(model.No); - - + if (TN_Task.S_TYPE.Contains("鍏ュ簱")) + { + var endLoc = AGVApplyEndLoc(model.No); + if (endLoc != null) + { + LogHelper.Info($"浠诲姟鍙凤細{TN_Task.S_CODE}锛孉GV灏忚溅鍙樻洿缁堢偣锛歿endLoc.S_CODE}", "AGV"); + // 閫氱煡AGV鏇存敼缁堢偣 + ChangeParamModel paramModel = new ChangeParamModel() + { + task_no = model.No, + param_no = 0, + param = $"{model.No};{TN_Task.S_START_LOC};{TN_Task.S_END_LOC};0;400;0;2" + }; + LogHelper.Info($"閫氱煡AGV鏇存敼缁堢偣锛屽弬鏁�{paramModel}", "AGV"); + /* NDCApi.ChangeOrderParam(paramModel);*/ + } + } } - - //濡傛灉涓嶆槸绛夊緟鍖鸿揣浣嶏紝鍒欐煡璇㈢粓鐐硅揣浣嶆槸鍚︽槸鍏ュ簱鎺ラ┏浣�+ } + else if (model.State == 1004) + { + LogHelper.Info($"浠诲姟鍙凤細{TN_Task.S_CODE}锛孉GV灏忚溅鍗歌揣鍚庡湪鎺ラ┏浣�{TN_Task.S_END_LOC}绛夊緟", "AGV"); + // 鍗歌揣鍚庣瓑寰�+ // 鏌ヨ缁堢偣璐т綅鏄惁鏄叆搴撴帴椹充綅 var agvJBLoc = Settings.getAgvJBLoc(TN_Task.S_END_LOC); - if (agvJBLoc != null && agvJBLoc.type == 1 && agvJBLoc.action == 1) + if (agvJBLoc != null && agvJBLoc.action == 1) { //鏄垯鏌ヨWCS鐨勪换鍔℃墽琛屾儏鍐�- var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE ,"WCS"); - if (wcsTask != null) + var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE, "WCS" , wmsTask.S_TYPE); + if (wcsTask != null) { bool existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 7); if (existAction) { + LogHelper.Info($"涓嬫父浠诲姟锛歿wcsTask.S_CODE}鍙栨秷鍏ュ簱锛宺fid鏍¢獙澶辫触锛岀敓鎴愭柊浠诲姟鍒板紓甯稿尯", "AGV"); //濡傛灉WCS鍙嶉7鍙栨秷浠诲姟锛屽垯rfid鏍¢獙澶辫触锛岀敓鎴愭柊浠诲姟鍒板紓甯稿尯锛屽苟鍙樻洿agv浠诲姟鍙枫�璧风偣銆佺粓鐐� var mst = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE); var endLoc = WMSHelper.getErrorBufferAreaLoc(); @@ -132,20 +167,43 @@ mst.S_END_LOC = endLoc.S_CODE; mst.S_END_AREA = endLoc.S_AREA_CODE; - WMSHelper.UpdateTaskEnd(mst); - WCSCore.createLastTask(TN_Task.S_END_LOC, mst, 2); + var newWcsTask = WCSCore.createLastTask(TN_Task.S_END_LOC, mst, 2, "鍑哄簱寮傚父鍖轰换鍔�); + LogHelper.Info($"浠诲姟鍙凤細{TN_Task.S_CODE}锛孉GV灏忚溅鏀归亾缁堢偣锛歿newWcsTask.S_END_LOC}", "AGV"); + if (newWcsTask != null) + { + WCSHelper.End(TN_Task); + + // 閫氱煡AGV鏇存敼缁堢偣 + ChangeParamModel paramModel = new ChangeParamModel() + { + task_no = model.No, + param_no = 0, + param = $"{model.No};{newWcsTask.S_START_LOC};{newWcsTask.S_END_LOC};0;0;0;1" + }; + LogHelper.Info($"閫氱煡AGV鏇存敼缁堢偣锛屽弬鏁�{paramModel}", "AGV"); + /*NDCApi.ChangeOrderParam(paramModel);*/ + } + return; } else { - LogHelper.Info("", "AGV"); + LogHelper.Info("寮傚父鍖烘病鏈夌┖璐т綅锛屾棤娉曞叆搴撳紓甯稿尯", "AGV"); } } existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 3); - if (existAction) + if (existAction) { - //WCS鍙嶉3宸插彇璐э紝鍒檃gv浠诲姟姝e父缁撴潫 - + LogHelper.Info($"浠诲姟鍙凤細{TN_Task.S_CODE}锛孯FID妫�祴閫氳繃锛孉GV浠诲姟姝e父瀹屾垚", "AGV"); + //WCS鍙嶉3宸插彇璐э紝鍒檃gv浠诲姟姝e父缁撴潫 锛岄�鐭GV瀹屾垚浠诲姟 + ChangeParamModel paramModel = new ChangeParamModel() + { + task_no = model.No, + param_no = 0, + param = $"{model.No};{TN_Task.S_START_LOC};{TN_Task.S_END_LOC};0;0;0;1" + }; + LogHelper.Info($"閫氱煡AGV瀹屾垚浠诲姟锛屽弬鏁�{paramModel}", "AGV"); + /*NDCApi.ChangeOrderParam(paramModel);*/ } } } @@ -155,6 +213,8 @@ //瀹夊叏璇锋眰绛� TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData); } + + WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData); } } } @@ -172,62 +232,75 @@ /// <param name="mst"></param> /// <param name="actType">1.鍏ュ簱 2.鍑哄簱</param> /// <returns></returns> - public static bool createLastTask(string startLocCode , WMSTask mst ,int actType) + public static WCSTask createLastTask(string startLocCode , WMSTask mst ,int actType ,string typeName = null) { - LogHelper.Info("鍒涘缓涓嬩竴娈典换鍔�, "WMS"); - var startLoc = LocationHelper.GetLoc(startLocCode); - if (startLoc != null) + LogHelper.Info($"浣滀笟鍙凤細{mst.S_CODE}锛屽垱寤轰笅涓�浠诲姟", "WMS"); + var existTask = WCSHelper.GetTaskByStart(startLocCode); + if (existTask == null) { - string cntrCode = ""; - string scheduleType = ""; - if (actType == 1) + var startLoc = LocationHelper.GetLoc(startLocCode); + if (startLoc != null) { - var locCntrRels = LocationHelper.GetLocCntr(startLocCode); - if (locCntrRels.Count > 0) + string cntrCode = ""; + string scheduleType = ""; + if (actType == 1) { - foreach (var cntr in locCntrRels) + var locCntrRels = LocationHelper.GetLocCntr(startLocCode); + if (locCntrRels.Count > 0) { - cntrCode = cntrCode + ","+ cntr.S_CNTR_CODE; + foreach (var cntr in locCntrRels) + { + cntrCode = cntrCode + "," + cntr.S_CNTR_CODE; + } + cntrCode = cntrCode.Substring(1, cntrCode.Length - 1); } - cntrCode = cntrCode.Substring(1, cntrCode.Length-1); + scheduleType = "WCS"; } - scheduleType = "WCS"; - } - if (actType == 2) - { - cntrCode = mst.S_CNTR_CODE; - scheduleType = "AGV"; - } + if (actType == 2) + { + cntrCode = mst.S_CNTR_CODE; + scheduleType = "AGV"; + } + string type = ""; + if (typeName == null) + { + type = mst.S_TYPE + "-2"; + } + else + { + type = typeName; + } - // 鍒涘缓涓�鍏ュ簱浠诲姟 - WCSTask wcsTask = new WCSTask() - { - S_OP_NAME = mst.S_OP_DEF_NAME, - S_OP_CODE = mst.S_CODE, - S_CODE = WCSHelper.GenerateTaskNo(), - S_CNTR_CODE = cntrCode, - S_TYPE = mst.S_TYPE + "-2", - S_START_LOC = startLoc.S_CODE, - S_START_AREA = startLoc.S_AREA_CODE, - S_END_LOC = mst.S_END_LOC, - S_END_AREA = mst.S_END_AREA, - S_SCHEDULE_TYPE = scheduleType, - N_PRIORITY = mst.N_PRIORITY, - T_START_TIME = DateTime.Now, - }; + // 鍒涘缓涓�鍏ュ簱浠诲姟 + WCSTask wcsTask = new WCSTask() + { + S_OP_NAME = mst.S_OP_DEF_NAME, + S_OP_CODE = mst.S_CODE, + S_CODE = WCSHelper.GenerateTaskNo(), + S_CNTR_CODE = cntrCode, + S_TYPE = type, + S_START_LOC = startLoc.S_CODE, + S_START_AREA = startLoc.S_AREA_CODE, + S_END_LOC = mst.S_END_LOC, + S_END_AREA = mst.S_END_AREA, + S_SCHEDULE_TYPE = scheduleType, + N_PRIORITY = mst.N_PRIORITY, + T_START_TIME = DateTime.Now, + }; - if (WCSHelper.CreateTask(wcsTask)) - { - // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�- LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); - LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); + if (WCSHelper.CreateTask(wcsTask)) + { + // 璧风偣銆佹帴椹崇偣銆佺粓鐐瑰姞閿�+ LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); + LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); - WMSHelper.UpdateTaskEnd(mst); - return true; + WMSHelper.UpdateTaskEnd(mst); + return wcsTask; + } } } - return false; + return null; } /// <summary> @@ -250,13 +323,13 @@ } } - + private static readonly object emptyTrayInLock = new object(); // 闈欐�閿佸璞� /// <summary> /// agv鐢宠缁堢偣 /// </summary> /// <param name="taskNo"></param> - public static string AGVApplyEndLoc(string taskNo) + public static Location AGVApplyEndLoc(string taskNo) { LogHelper.Info($"浠诲姟鍙凤細{taskNo},AGV绛夊緟鍖虹敵璇风粓鐐�, "AGV"); var cst = WCSHelper.GetTask(taskNo); @@ -268,20 +341,63 @@ var container = ContainerHelper.GetCntr(cst.S_CNTR_CODE); if (container != null) { - var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE); - if (endLoc != null) + string itemCode = null; + var cntrItemRels = ContainerHelper.GetCntrItemRel(cst.S_CNTR_CODE); + if (cntrItemRels.Count > 0) { - Location agvLoc = null; - var locCodes = Settings.getAgvJBLocList(1, endLoc.N_ROADWAY, 1); - if (locCodes.Count > 0) + // 婊℃枡鎵樼洏鍏ュ簱 + itemCode = cntrItemRels[0].S_ITEM_CODE; + var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, null, 1, itemCode); + if (endLoc != null) { - foreach (var locCode in locCodes) + Location agvLoc = null; + var locCodes = Settings.getAgvJBLocList( endLoc.N_ROADWAY, 1); + if (locCodes.Count > 0) { - agvLoc = LocationHelper.GetLoc(locCode); - if (agvLoc != null && agvLoc.C_ENABLE == "Y") + foreach (var locCode in locCodes) { - cst.S_END_LOC = agvLoc.S_CODE; - cst.S_END_AREA = agvLoc.S_AREA_CODE; + agvLoc = LocationHelper.GetLoc(locCode); + if (agvLoc != null && agvLoc.C_ENABLE == "Y") + { + cst.S_END_LOC = agvLoc.S_CODE; + cst.S_END_AREA = agvLoc.S_AREA_CODE; + WCSHelper.UpdateTaskEnd(cst); + + mst.S_END_LOC = endLoc.S_CODE; + mst.S_END_AREA = endLoc.S_AREA_CODE; + WMSHelper.UpdateTaskEnd(mst); + LocationHelper.LockLoc(endLoc.S_CODE, 1); + + LogHelper.Info($"浠诲姟鍙凤細{taskNo},AGV鐢宠鐨勭粓鐐癸細{agvLoc.S_CODE}", "AGV"); + return agvLoc; + } + } + LogHelper.Info($"浠诲姟鍙凤細{taskNo},鍏ュ簱鎺ラ┏浣嶈揣浣嶉兘宸茬鐢�, "AGV"); + } + else + { + LogHelper.Info($"浠诲姟鍙凤細{taskNo},娌℃湁閰嶇疆绔嬪簱鎺ラ┏浣�, "AGV"); + } + } + else + { + LogHelper.Info($"浠诲姟鍙凤細{taskNo},绔嬪簱娌℃湁婊¤冻鏉′欢鐨勭┖璐т綅", "AGV"); + } + } + else + { + // 绌烘墭鐩樺洖搴�+ lock (emptyTrayInLock) + { + var emptyTrayBuffers = WMSHelper.getEmptyTrayBufferList(); + if (emptyTrayBuffers.Count > 0) + { + var emptyTray = emptyTrayBuffers.Where(a => a.TRAY_TYPE == container.N_TYPE).OrderBy(a => a.T_CREATE).FirstOrDefault(); + if (emptyTray != null) + { + var endLoc = LocationHelper.GetLoc(emptyTray.END_LOC); + cst.S_END_LOC = endLoc.S_CODE; + cst.S_END_AREA = endLoc.S_AREA_CODE; WCSHelper.UpdateTaskEnd(cst); mst.S_END_LOC = endLoc.S_CODE; @@ -289,21 +405,51 @@ WMSHelper.UpdateTaskEnd(mst); LocationHelper.LockLoc(endLoc.S_CODE, 1); - LogHelper.Info($"浠诲姟鍙凤細{taskNo},AGV鐢宠鐨勭粓鐐癸細{agvLoc.S_CODE}", "AGV"); - return agvLoc.S_CODE; + emptyTray.IS_CREATED = "Y"; + WMSHelper.updateEmptyTrayBuffer(emptyTray); } } + else + { + var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, null, 1); + if (endLoc != null) + { + Location agvLoc = null; + var locCodes = Settings.getAgvJBLocList(endLoc.N_ROADWAY, 1); + if (locCodes.Count > 0) + { + foreach (var locCode in locCodes) + { + agvLoc = LocationHelper.GetLoc(locCode); + if (agvLoc != null && agvLoc.C_ENABLE == "Y") + { + cst.S_END_LOC = agvLoc.S_CODE; + cst.S_END_AREA = agvLoc.S_AREA_CODE; + WCSHelper.UpdateTaskEnd(cst); - LogHelper.Info($"浠诲姟鍙凤細{taskNo},鍏ュ簱鎺ラ┏浣嶈揣浣嶉兘宸茬鐢�, "AGV"); + mst.S_END_LOC = endLoc.S_CODE; + mst.S_END_AREA = endLoc.S_AREA_CODE; + WMSHelper.UpdateTaskEnd(mst); + LocationHelper.LockLoc(endLoc.S_CODE, 1); + + LogHelper.Info($"浠诲姟鍙凤細{taskNo},AGV鐢宠鐨勭粓鐐癸細{agvLoc.S_CODE}", "AGV"); + return agvLoc; + } + } + + LogHelper.Info($"浠诲姟鍙凤細{taskNo},鍏ュ簱鎺ラ┏浣嶈揣浣嶉兘宸茬鐢�, "AGV"); + } + else + { + LogHelper.Info($"浠诲姟鍙凤細{taskNo},娌℃湁閰嶇疆绔嬪簱鎺ラ┏浣�, "AGV"); + } + } + else + { + LogHelper.Info($"浠诲姟鍙凤細{taskNo},绔嬪簱娌℃湁婊¤冻鏉′欢鐨勭┖璐т綅", "AGV"); + } + } } - else - { - LogHelper.Info($"浠诲姟鍙凤細{taskNo},娌℃湁閰嶇疆绔嬪簱鎺ラ┏浣�, "AGV"); - } - } - else - { - LogHelper.Info($"浠诲姟鍙凤細{taskNo},绔嬪簱娌℃湁婊¤冻鏉′欢鐨勭┖璐т綅", "AGV"); } } else -- Gitblit v1.9.1