From f703b278956736aa14c12d1d25c8e8f23b822760 Mon Sep 17 00:00:00 2001 From: kazelee <1847801760@qq.com> Date: 星期四, 26 六月 2025 17:27:32 +0800 Subject: [PATCH] 优化国自辅助调度和任务推送逻辑 --- core/WCSCore.cs | 527 ++++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 418 insertions(+), 109 deletions(-) diff --git a/core/WCSCore.cs b/core/WCSCore.cs index 5fbf07f..f0d8b90 100644 --- a/core/WCSCore.cs +++ b/core/WCSCore.cs @@ -1,9 +1,12 @@ 锘縰sing System; using System.Collections.Generic; using System.Linq; +using System.Net; +using System.Net.Sockets; using System.Text; using System.Threading.Tasks; +using HH.WCS.Mobox3.DSZSH.api; using HH.WCS.Mobox3.DSZSH.device; using HH.WCS.Mobox3.DSZSH.models; using HH.WCS.Mobox3.DSZSH.process; @@ -12,6 +15,8 @@ using Newtonsoft.Json; +using Swashbuckle.Swagger; + using static HH.WCS.Mobox3.DSZSH.api.ApiModel; namespace HH.WCS.Mobox3.DSZSH.core { @@ -19,27 +24,15 @@ public static ReturnResult OperateAgvTaskStatus(AgvTaskState model) { var result = new ReturnResult(); try { - switch (model.state) { - case 1023: - break; - case 1025: - break; - case 1012: - break; - case 1004: - break; - case 1103: - break; - default: - // AGV 鎵ц浠诲姟鐨勯�杈戝鐞�- if (!AgvTaskProcessOk(model)) { - // 鎵ц涓峅K锛岃鏄庢病鏈夋壘鍒颁换鍔�- result.ResultCode = 1; - result.ResultMsg = $"鏍规嵁Model.No鏈壘鍒板搴旂殑浠诲姟锛寋model.task_no}"; - LogHelper.Info(result.ResultMsg, "API"); - return result; - } - break; + if (model.state > 0) { + // AGV 鎵ц浠诲姟鐨勯�杈戝鐞�+ if (!AgvTaskProcessOk(model)) { + // 鎵ц涓峅K锛岃鏄庢病鏈夋壘鍒颁换鍔�+ result.ResultCode = 1; + result.ResultMsg = $"鏍规嵁Model.No鏈壘鍒板搴旂殑浠诲姟锛寋model.task_no}"; + LogHelper.Info(result.ResultMsg, "API"); + return result; + } } result.ResultCode = 0; @@ -49,7 +42,7 @@ } catch (Exception ex) { result.ResultCode = -1; - result.ResultMsg = $"鍙戠敓浜嗗紓甯革細+{ex.Message}"; + result.ResultMsg = $"鍙戠敓浜嗗紓甯革細{ex.Message}"; LogHelper.Info(result.ResultMsg, "Error"); return result; } @@ -83,9 +76,12 @@ WCSHelper.UpdateStatus(TN_Task, "鍙栬揣瀹屾垚"); // 浠诲姟鐘舵�鏀规垚鍙栬揣瀹屾垚 TaskProcess.OperateStatus(TN_Task, 4); // 璧风偣瀹瑰櫒璐т綅瑙g粦,瑙i攣璧风偣 - if (TN_Task.S_TYPE == TaskName.鎴愬搧鑳跺嚭搴� { + if (TN_Task.S_TYPE == TaskName.C鎴愬搧鑳跺嚭搴� { var nextOutboundTask = Task.Run(() => { UpdateOutboundTaskState(3); + }); + var pickUpReturnErpTask = Task.Run(() => { + PickUpReturnErp(TN_Task); }); } @@ -106,6 +102,10 @@ // }); //} + var recordTask = Task.Run(() => { + RecordTaskTable(TN_Task); + }); + break; case 7: // 寮傚父 TaskProcess.OperateStatus(TN_Task, 7); // 寮傚父澶勭悊 @@ -120,6 +120,88 @@ return true; } + private static void RecordTaskTable(TN_Task task) { + var db = new SqlHelper<object>().GetInstance(); + var info = ""; + + try { + var cgDetail = new TN_CG_Detail(); // 濡傛灉娌℃湁淇℃伅锛岄粯璁ゅ氨鏄┖鍊硷紝鍙互鐩存帴濉叆锛屼笉闇�鍒ゆ柇 + + //var emptyTask = false; // 绌烘墭/绌虹浠诲姟 + if (task.S_TYPE != TaskName.H濂借繍绠盻绌虹涓婄嚎 && task.S_TYPE != TaskName.H濂借繍绠盻绌虹鍏ュ簱 && + task.S_TYPE != TaskName.T鎵樼洏_绌烘墭涓婄嚎 && task.S_TYPE != TaskName.T鎵樼洏_绌烘墭鍏ュ簱) { + // 闈炵┖鎵�绌虹浠诲姟锛堢┖鎵�绌虹浠诲姟鏃犳硶鍦–GDetail鏌ュ埌鐗╂枡淇℃伅锛�+ //emptyTask= true; + cgDetail = db.Queryable<TN_CG_Detail>() + .Where(d => d.S_CNTR_CODE == task.S_CNTR_CODE) + .First(); + + if (cgDetail == null) { + info = $"浠诲姟{task.S_CODE}瀹屾垚锛岃褰曞嚭鍏ュ簱瀛樺湪闂锛氭棤娉曞湪瀹瑰櫒璐у搧鏄庣粏琛ㄤ腑鎵惧埌鎵樼洏{task.S_CNTR_CODE}瀵瑰簲鐨勭墿鏂�; + LogHelper.Info(info); + //return; + cgDetail = new TN_CG_Detail() ; + cgDetail.S_ITEM_CODE = "寮傚父"; + } + } + + var isInbound = false; // 鍏ュ簱绫诲瀷鐨勪换鍔★紙鍖呮嫭绉诲簱绫讳换鍔★級 + var inboundTasks = new List<string> { + TaskName.H濂借繍绠盻婊$涓嬬嚎鍏ュ簱, TaskName.H濂借繍绠盻绌虹鍏ュ簱, TaskName.T鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱, TaskName.T鎵樼洏_绌烘墭鍏ュ簱, + TaskName.C鎶芥_鍚堟牸鍥炲簱, TaskName.C鎶芥_涓嶅悎鏍肩Щ搴� TaskName.Y绉诲簱 + }; + if (inboundTasks.Contains(task.S_TYPE)) { + isInbound= true; + } + + //var needUpdateRecordTable = false; + var record = db.Queryable<TN_Record_Table>() + .Where(r => r.S_TASK_NO == task.S_CODE).First(); + if (record != null) { + //needUpdateRecordTable = true; + info = $"鍑哄叆搴撹褰曡〃涓凡缁忓瓨鍦ㄤ换鍔″彿{task.S_CODE}"; // 闃叉娴嬭瘯鏃跺弽澶嶈皟鐢�34562瀵艰嚧閲嶅璁板綍 + LogHelper.Info(info); + return; + } + + record = new TN_Record_Table { + S_ITEM_CODE = cgDetail.S_ITEM_CODE, + S_BATCH_NO = cgDetail.S_BATCH_NO, + S_ITEM_NAME = cgDetail.S_ITEM_NAME, + S_LOC_CODE = isInbound ? task.S_END_LOC : task.S_START_LOC, // 鍏ュ簱璁板綍缁堢偣璐т綅锛屽嚭搴撹褰曡捣鐐硅揣浣�+ S_CNTR_CODE = task.S_CNTR_CODE, + S_ITEM_SPEC = cgDetail.S_ITEM_SPEC, + S_NET_WEIGHT = cgDetail.S_NET_WEIGHT, + S_QUALITY_GRADE = cgDetail.S_QUALITY_GRADE, + S_STANDARD = cgDetail.S_STANDARD, + S_TASK_NO = task.S_CODE, + T_RECORD_TIME = DateTime.Now, + S_TYPE = task.S_TYPE, + S_BS_CODE = task.S_BS_NO, // ERP鍗曞彿锛岄粯璁や负绌�+ N_QTY = cgDetail.N_ITEM_NUM, + S_NO = task.S_OP_CODE, // 鍑哄簱/鎶芥/绉诲簱鍗�+ }; + + // 鏁版嵁搴撴搷浣�+ if (db.Insertable<TN_Record_Table>(record).ExecuteCommand() <= 0) { + info = "鎻掑叆鍑哄叆搴撹褰曡〃澶辫触锛� + JsonConvert.SerializeObject(record); + LogHelper.Info(info); + return; + } + + info = "鎻掑叆鍑哄叆搴撹褰曡〃鎴愬姛"; + LogHelper.Info(info); + } + catch (Exception ex) { + LogHelper.InfoEx(ex); + } + } + + /// <summary> + /// AGV浜х嚎瀹夊叏浜や簰閫昏緫瀹炵幇 + /// </summary> + /// <param name="model"></param> + /// <returns></returns> public static ReturnResult SafetyInteraction(SafetyInteractionInfo model) { var db = new SqlHelper<object>().GetInstance(); var info = ""; @@ -127,9 +209,19 @@ try { ModbusHelper.Relink(); - var prodLineInfo = Settings.ProductionLines[0]; + //var loc = db.Queryable<TN_Location>() + // .Where(l => l.S_AGV_SITE == model.station_name && Settings.AreaMap[AreaName.鍖呰鍖篯.Contains(l.S_AREA_CODE)) + // .First(); - var prodLineDevice = new ProductionLineDevice(prodLineInfo.PlcIp, prodLineInfo.PlcPort); + if (!Settings.AgvSite_ProdLineCodeMap.TryGetValue(model.station_name, out int prodIndex)) { + info = $"AGV 绔欑偣{model.station_name}涓嶆槸鍚堟硶鐨勪骇绾挎帴椹充綅绔欑偣"; + LogHelper.Info(info); + return NewReturnResult(1, info); + } + + var prodLineInfo = Settings.ProductionLines[prodIndex]; + + var prodLineDevice = new ProductionLineDevice(prodLineInfo); if (!prodLineDevice.LoadDeviceStateOk()) { info = "涓庝骇绾胯澶囬�璁け璐�; LogHelper.Info(info); @@ -155,7 +247,7 @@ return NewReturnResult(3, info); } - if (model.apply_code == "5") { + if (model.apply_code == "5") { // 璇锋眰鍙栬揣 if (prodLineDevice.FullOffline != 1) { info = $"褰撳墠杈撻�绾挎弧鏂欎笅绾夸俊鍙蜂笉涓�锛屾棤娉曞彇璐�; LogHelper.Info(info); @@ -171,9 +263,8 @@ info = $"鍚戣緭閫佺嚎鍐欏叆鍏佽鍙栬揣淇″彿鎴愬姛"; LogHelper.Info(info); return NewReturnResult(0, info); - } - else if (model.apply_code == "1") { + else if (model.apply_code == "1") { // 璇锋眰鍗歌揣 if (prodLineDevice.AllowAgvPlacePallet != 1) { info = $"褰撳墠杈撻�绾垮厑璁告斁鎵樼洏淇″彿涓嶄负1锛屾棤娉曟斁璐�; LogHelper.Info(info); @@ -191,7 +282,7 @@ return NewReturnResult(0, info); } else { - info = $"褰撳墠杈撻�绾垮厑璁�; + info = $"褰撳墠AGV璇锋眰鐮佷笉涓�5鍙栬揣 鎴�1鍗歌揣"; LogHelper.Info(info); return NewReturnResult(8, info); } @@ -205,13 +296,14 @@ } public static void UpdateOutboundTaskState(int spotStateCode) { + var taskName = TaskName.C鎴愬搧鑳跺嚭搴� var db = new SqlHelper<object>().GetInstance(); var detail = db.Queryable<TN_Outbound_Detail>() .First(d => d.N_B_STATE == 2); if (detail == null) { - LogHelper.Info("鍑哄簱--AGV鍙栬揣--鏌ヨDetail锛氬綋鍓嶆病鏈�鎵ц涓�鐨凞etail琛紒"); + LogHelper.Info($"{taskName}锛欰GV鍙栬揣锛氭煡璇㈡槑缁嗗崟锛氬綋鍓嶆病鏈夋墽琛屼腑鐨勬槑缁嗗崟"); return; } @@ -219,14 +311,14 @@ detail.N_B_STATE = spotStateCode; if (db.Updateable<TN_Outbound_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) { tran.RollbackTran(); - LogHelper.Info("鍑哄簱--AGV鍙栬揣锛氫慨鏀笵etail鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�); + LogHelper.Info($"{taskName}锛欰GV鍙栬揣锛氫慨鏀规槑缁嗗崟鐘舵�涓恒�3浠诲姟鎵ц瀹屾垚銆戝け璐ワ紒"); return; } var finishedCount = db.Queryable<TN_Outbound_Detail>().Count(d => d.S_OO_NO == detail.S_OO_NO && d.N_B_STATE == 3); var allCount = db.Queryable<TN_Outbound_Detail>().Count(d => d.S_OO_NO == detail.S_OO_NO); - LogHelper.Info($"鍑哄簱--AGV鍙栬揣--缁熻浠诲姟宸插畬鎴愶細{finishedCount} / {allCount}"); + LogHelper.Info($"{taskName}锛欰GV鍙栬揣锛氱粺璁′换鍔″凡瀹屾垚锛歿finishedCount}/{allCount}"); if (finishedCount == allCount) { // 褰撳墠鍑哄簱鍗曚笅鐨勬墍鏈夋槑缁嗗崟锛屼换鍔¢兘宸茬粡瀹屾垚 @@ -235,7 +327,7 @@ .ExecuteCommand() <= 0) { tran.RollbackTran(); - LogHelper.Info("鍑哄簱--AGV鍙栬揣--鎵�湁浠诲姟瀹屾垚鏃讹細淇敼Order鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�); + LogHelper.Info($"{taskName}锛欰GV鍙栬揣锛氭墍鏈変换鍔″畬鎴愭椂锛氫慨鏀瑰崟鎹姸鎬佷负3浠诲姟鎵ц瀹屾垚--澶辫触锛�); return; } } @@ -244,83 +336,102 @@ } } - public static void UpdateCheckTaskState(int spotStateCode) { + public static void PickUpReturnErp(TN_Task task) { var db = new SqlHelper<object>().GetInstance(); + var info = ""; + var httpH = new HttpHelper(); + + try { + var plan = db.Queryable<TN_Outbound_Plan>() + .Where(p => p.JHDH == task.S_BS_NO) + .First(); - var detail = db.Queryable<TN_Check_Detail>() - .First(d => d.N_B_STATE == 2); + if (plan == null) { + info = $"璁″垝鍗曞彿{task.S_BS_NO}涓嶅瓨鍦紒"; + LogHelper.Info(info); + } - if (detail == null) { - LogHelper.Info("鎶芥--AGV浠诲姟瀹屾垚--鏌ヨDetail锛氬綋鍓嶆病鏈�鎵ц涓�鐨凞etail琛紒"); - return; + var cgDetail = db.Queryable<TN_CG_Detail>() + .Where(d => d.S_CNTR_CODE == task.S_CNTR_CODE) + .First(); + + if (cgDetail == null) { + info = $"鐗╂枡缂栫爜涓嶅瓨鍦紒"; + LogHelper.Info(info); + } + + var model = new OtherModel.PickUpReturnErpInfo { + jhdh = plan.JHDH, // 璁″垝鍗曞彿锛堝敮涓�爣璇嗭級 + ckzt = plan.CKZT, // 鍑哄簱鐘舵�锛堥渶瑕佽繑鍥烇級 + jhlb = plan.JHLB, // 璁″垝绫诲埆 + ckdh = plan.CKDH, // 鍙傝�鍗曞彿 + cph = plan.CPH, // 杞︾墝鍙�+ ysfs = plan.YSFS, // 杩愯緭鏂瑰紡 + cpzt = plan.CPZT, // 浜у搧鐘舵� + mddw = plan.MDDW, // 涔版柇鍗曚綅 + cpdm = plan.CPDM, // 浜у搧浠g爜 + cplb = plan.CPLB, // 浜у搧绫诲埆 + cplbmx = plan.CPLBMX, // 浜у搧绫诲埆鏄庣粏 + pp = plan.PP, // 鍝佺墝 + dj = plan.DJ, // 绛夌骇锛堥渶瑕佽繑鍥烇級 + gh = plan.GH, // 缃愬彿 + ph = plan.PH, // 鎵瑰彿锛堥渶瑕佽繑鍥烇級 + bzlx = plan.BZLX, // 鍖呰绫诲瀷 + pzdh = plan.PZDH, // 娲捐鍗曞彿 + pzd_dw = plan.PZD_DW, // 娲捐鍗曞崟浣�+ pzd_dybh = plan.PZD_DYBH, // 娲捐鍗曡皟杩愮紪鍙�+ pzjs = plan.PZJS, // 娲捐浠舵暟 + pzsl = plan.PZSL, // 娲捐鏁伴噺 + pz_rq = plan.PZ_RQ, // 娲捐鏃ユ湡(yyyy-mm-dd) + pz_czrq = plan.PZ_CZRQ, // 娲捐鎿嶄綔鏃ユ湡 + pz_zfbj = plan.PZ_ZFBJ, // 娲捐浣滃簾鏍囪 + pz_zfrq = plan.PZ_ZFRQ, // 娲捐浣滃簾鏃ユ湡 + pz_bz = plan.PZ_BZ, // 娲捐澶囨敞 + ckdbh = plan.CKDBH, // 鍑哄簱鍗曠紪鍙�+ sfjs = plan.SFJS, // 瀹炲彂浠舵暟锛堥渶瑕佽繑鍥烇級--鏇存柊 + sfsl = plan.SFSL, // 瀹炲彂鏁伴噺锛堥渶瑕佽繑鍥烇級--鏇存柊 + //sfcs = plan.SFCS , // 瀹炲彂杞︽暟锛堥渶瑕佽繑鍥烇級 + //zcsj = plan.ZCSJ , // 瑁呰溅鏃堕棿锛堥渶瑕佽繑鍥烇級 + //jldw = plan.JLDW , // 璁¢噺鍗曚綅锛堥渶瑕佽繑鍥烇級 + //fhrq = plan.FHRQ , // 鍙戣揣鏃ユ湡锛堥渶瑕佽繑鍥烇級 + //ckdm = plan.CKDM , // 浠撳簱浠g爜锛堥渶瑕佽繑鍥烇級 + //fhr = plan.FHR , // 鍙戣揣浜猴紙闇�杩斿洖锛�+ //czydm = plan.CZYDM , // 鎿嶄綔鍛橈紙闇�杩斿洖锛�+ shr_username = plan.SHR_USERNAME, // 瀹℃牳浜�+ shrq = plan.SHRQ, // 瀹℃牳鏃ユ湡 + zfbj = plan.ZFBJ, // 浣滃簾鏍囪 + zfrq = plan.ZFRQ, // 浣滃簾鏃ユ湡 + jsdw = plan.JSDW, // 缁撶畻鍗曚綅 + shdw = plan.SHDW, // 鏀惰揣鍗曚綅 + ysdw = plan.YSDW, // 杩愯緭鍗曚綅 + lxr = plan.LXR, // 鑱旂郴浜�+ //ry_zxg = plan.RY_ZXG , // 瑁呭嵏宸ワ紙闇�杩斿洖锛�+ //ry_ccsj = plan.RY_CCSJ , // 鍙夎溅鍙告満锛堥渶瑕佽繑鍥烇級 + erphx_jhdh = plan.ERPHX_JHDH, // erp浜よ揣鍗曞彿 + erphx_wlbm = plan.ERPHX_WLBM, // erp鐗╂枡缂栫爜 + erphx_wlmc = plan.ERPHX_WLMC, // erp鐗╂枡鍚嶇О + erphx_cjrq = plan.ERPHX_CJRQ, // erp鍒涘缓鏃ユ湡 + hw = plan.HW, // 璐т綅锛堥渶瑕佽繑鍥烇級 + hwzt = plan.HWZT // 璐т綅鐘舵�锛堥渶瑕佽繑鍥烇級 + }; + model.sfjs = cgDetail.N_ITEM_NUM; + model.sfsl = (decimal) cgDetail.F_QTY; // TEMP + model.hwzt = "宸插嚭搴�; + + var jsonInfo = JsonConvert.SerializeObject(model); + var result = httpH.WebPost(Settings.ErpApiUrl + "PickUpReturn", jsonInfo); + + LogHelper.InfoApi($"鍙栬揣瀹屾垚鍙嶉ERP鎺ュ彛锛岀粨鏋�{result}锛岃皟鐢ㄥ弬鏁帮細", model); + + plan.SFJS = model.sfjs; + plan.SFSL = model.sfsl; + plan.HWZT = model.hwzt; + var success = db.Updateable<TN_Outbound_Plan>(plan).UpdateColumns(p => new { p.SFJS, p.SFSL, p.HWZT }).ExecuteCommand() > 0; + info = "鏇存柊鍑哄簱璁″垝鍗曡褰曡〃" + (success ? "鎴愬姛" : "澶辫触"); + LogHelper.Info(info); } - - using (var tran = db.Ado.UseTran()) { - detail.N_B_STATE = spotStateCode; - if (db.Updateable<TN_Check_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) { - tran.RollbackTran(); - LogHelper.Info("鎶芥--AGV浠诲姟瀹屾垚锛氫慨鏀笵etail鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�); - return; - } - - var finishedCount = db.Queryable<TN_Check_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3); - var allCount = db.Queryable<TN_Check_Detail>().Count(d => d.S_NO == detail.S_NO); - - LogHelper.Info($"鎶芥--AGV浠诲姟瀹屾垚锛氱粺璁′换鍔″凡瀹屾垚锛歿finishedCount} / {allCount}"); - - if (finishedCount == allCount) { // 褰撳墠order涓嬬殑detail锛屼换鍔¢兘宸茬粡瀹屾垚 - - if (db.Updateable<TN_Check_Order>().SetColumns(it => it.N_B_STATE == 3) - .Where(it => it.S_NO == detail.S_NO) - .ExecuteCommand() <= 0) { - - tran.RollbackTran(); - LogHelper.Info("鎶芥--AGV浠诲姟瀹屾垚--鎵�湁浠诲姟瀹屾垚鏃讹細淇敼Order鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�); - return; - } - } - - tran.CommitTran(); - } - } - - public static void UpdateShiftTaskState(int spotStateCode) { - var db = new SqlHelper<object>().GetInstance(); - - var detail = db.Queryable<TN_Shift_Detail>() - .First(d => d.N_B_STATE == 2); - - if (detail == null) { - LogHelper.Info("绉诲簱--AGV浠诲姟瀹屾垚--鏌ヨDetail锛氬綋鍓嶆病鏈�鎵ц涓�鐨凞etail琛紒"); - return; - } - - detail.N_B_STATE = spotStateCode; - - var finishedCount = db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO && d.N_B_STATE == 3); - var allCount = db.Queryable<TN_Shift_Detail>().Count(d => d.S_NO == detail.S_NO); - - LogHelper.Info($"绉诲簱--AGV浠诲姟瀹屾垚锛氱粺璁′换鍔″凡瀹屾垚锛歿finishedCount} / {allCount}"); - - using (var tran = db.Ado.UseTran()) { - if (db.Updateable<TN_Shift_Detail>(detail).UpdateColumns(it => it.N_B_STATE).ExecuteCommand() <= 0) { - tran.RollbackTran(); - LogHelper.Info("绉诲簱--AGV浠诲姟瀹屾垚锛氫慨鏀笵etail鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�); - return; - } - - if (finishedCount == allCount) { // 褰撳墠order涓嬬殑detail锛屼换鍔¢兘宸茬粡瀹屾垚 - if (db.Updateable<TN_Shift_Order>().SetColumns(it => it.N_B_STATE == 3) - .Where(it => it.S_NO == detail.S_NO) - .ExecuteCommand() <= 0) { - - tran.RollbackTran(); - LogHelper.Info("绉诲簱--AGV浠诲姟瀹屾垚--鎵�湁浠诲姟瀹屾垚鏃讹細淇敼Order鐘舵� N_B_STATE 涓�3浠诲姟鎵ц瀹屾垚 澶辫触锛�); - return; - } - } - - tran.CommitTran(); + catch (Exception ex) { + LogHelper.InfoEx(ex); } } @@ -335,14 +446,212 @@ if (list.Count > 0) { list.ForEach(task => { //浣跨敤鑷畾涔変换鍔℃帹閫�- TaskProcess.SendTask(task);//璋冨害NDC鎴栨澀濂ユ垨鍥借嚜璁惧 - //TaskProcess.SendGZTask(task);///璋冨害鍥借嚜璁惧 - + //TaskProcess.SendTask(task);//璋冨害NDC鎴栨澀濂ユ垨鍥借嚜璁惧 + TaskProcess.SendNDCTask(task); }); } else { LogHelper.Info("鏆傛棤浠诲姟"); } } + + // TCP 闈炶疆璇㈡柟寮�妯℃嫙浜х嚎涓嬬嚎鐨勫皾璇�+ + public static void StartServer() { + var ListenPort = 6000; + TcpListener listener = new TcpListener(IPAddress.Any, ListenPort); + listener.Start(); + Console.WriteLine($"鍚庡彴鏈嶅姟宸插惎鍔紝鐩戝惉绔彛 {ListenPort}..."); + + while (true) { + try { + // 鎺ュ彈浜х嚎杩炴帴 + System.Net.Sockets.TcpClient client = listener.AcceptTcpClient(); + Console.WriteLine($"浜х嚎瀹㈡埛绔凡杩炴帴: {client.Client.RemoteEndPoint}"); + + // 澶勭悊瀹㈡埛绔姹傦紙浣跨敤Task閬垮厤闃诲涓荤嚎绋嬶級 + Task.Run(() => HandleClientRequest(client)); + } + catch (Exception ex) { + Console.WriteLine($"鏈嶅姟绔紓甯� {ex.Message}"); + } + } + } + + public static void HandleClientRequest(System.Net.Sockets.TcpClient client) { + var db = new SqlHelper<object>().GetInstance(); + using (client) + using (NetworkStream stream = client.GetStream()) { + try { + // 璇诲彇浜х嚎娑堟伅 + byte[] buffer = new byte[1024]; + int bytesRead = stream.Read(buffer, 0, buffer.Length); + string jsonMessage = Encoding.UTF8.GetString(buffer, 0, bytesRead); + + // 瑙f瀽娑堟伅 + var message = JsonConvert.DeserializeObject<ProductCompletedMessage>(jsonMessage); + //Console.WriteLine($"鏀跺埌浜у搧瀹屾垚閫氱煡 - 鐗╂枡锛歿message.ItemCode}锛涙壒娆″彿锛歿message.BatchNo}锛涘鍣ㄥ彿锛歿message.CntrCode}"); + LogHelper.Info($"鏀跺埌浜у搧涓嬬嚎閫氱煡锛�+message); + + string startLocCode = ""; + + // A. 濡傛灉鏄崟涓骇绾縋LC锛岄�杩嘥CP浼犳挱锛岄渶瑕佷紶閫掍骇绾縄D锛屾牴鎹甀D璁$畻璧风偣璐т綅 + //startLocCode = Settings.ProductionLines[message.Id].OffLoc[0]; // 鐞嗚涓婂簲璇ュ彧鏈�涓狾ffLoc锛屽惁鍒欏簲璇ユ敞鏄庢槸鍝竴涓�+ + // B. 濡傛灉鏄瘡鏉′骇绾垮悇涓�釜瀹㈡埛绔紝鏇寸畝鍗曪紝鐩存帴鏍规嵁IP鍦板潃纭畾缁堢偣璐т綅 + // TODO 鍏蜂綋閫昏緫寰呭悗缁‘瀹氭椂琛ュ畬 + + var success = CreateInboundTask(startLocCode, message.CntrCode).Value; + + // 鍙戦�鍝嶅簲 + string response = success ? "ACK: 鏈哄櫒浜哄凡璋冨害" : "NAK: 璋冨害澶辫触"; + byte[] responseData = Encoding.UTF8.GetBytes(response); + stream.Write(responseData, 0, responseData.Length); + } + catch (Exception ex) { + Console.WriteLine($"澶勭悊瀹㈡埛绔姹傚紓甯� {ex.Message}"); + } + } + } + + /// <summary> + /// 鍏ュ簱浣滀笟鍒涘缓鍙帴鏀惰捣鐐硅揣浣嶅拰瀹瑰櫒鍙凤紙鐗╂枡淇℃伅寰呭畾銆侀�杩囦骇绾垮彿璁$畻璧风偣鐨勯�杈戞斁鍦ㄦ柟娉曞锛�+ /// </summary> + /// <param name="startLocCode"></param> + /// <param name="cntrCode"></param> + /// <returns></returns> + public static Result<bool> CreateInboundTask(string startLocCode, string cntrCode) { + var db = new SqlHelper<object>().GetInstance(); + var info = ""; + + const string taskName = TaskName.T鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱; + const string startAreaName = AreaName.B鍖呰鍖� + const string endAreaName = AreaName.M婊℃墭璐ф灦鍖� + const string cntrType = "鎵樼洏"; + + try { + var startLoc = db.Queryable<TN_Location>() + .Where(l => l.S_CODE == startLocCode) + .Where(l => Settings.AreaMap[startAreaName].Contains(l.S_AREA_CODE)) + .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "鏃� && l.C_ENABLE == "Y") + //.Where(l => l.N_CURRENT_NUM == 0) // 缁戝畾鍓�+ .First(); + + if (startLoc == null) { + info = $"鍦�{startAreaName}'涓病鏈夋壘鍒拌捣鐐硅揣浣�{startLocCode}'锛屾垨涓嶆弧瓒宠姹傦細鏈笂閿併�褰撳墠瀹瑰櫒鏁伴噺=0"; + LogHelper.Info(info); + return new Result<bool>(false, info); + } + + var locCntrRelOld = db.Queryable<TN_Loc_Container>() + .Where(c => c.S_CNTR_CODE == cntrCode).First(); + + // 缁戝畾璐т綅鍜屽鍣ㄥ彿 + var locCntrRel = new TN_Loc_Container { + S_LOC_CODE = startLocCode, + S_CNTR_CODE = cntrCode, + S_CNTR_TYPE = cntrType, + }; + + startLoc.N_CURRENT_NUM = 1; // 缁戝畾鍚�+ + var endLoc = db.Queryable<TN_Location>() + .Where(a => Settings.AreaMap[endAreaName].Contains(a.S_AREA_CODE)) + .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "鏃� && a.C_ENABLE == "Y") // 绛涢�锛氭湭涓婇攣 + .Where(a => a.N_CURRENT_NUM == 0) // 绛涢�锛氱┖璐т綅 + .OrderBy(l => l.N_LAYER) + .First(); + + if (endLoc == null) { + info = $"鍦ㄧ粓鐐硅揣鍖�{endAreaName}'涓紝娌℃湁鎵惧埌鍚堥�鐨勩�缁堢偣璐т綅銆戯紝闇�婊¤冻瑕佹眰锛氭湭涓婇攣銆佸綋鍓嶅鍣ㄦ暟閲�0"; + LogHelper.Info(info); + return new Result<bool>(false, info); + } + + var cntId = locCntrRel.S_CNTR_CODE; + var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName); + + LocationHelper.LockStartLoc(ref startLoc); // 璧风偣鍑哄簱閿�+ LocationHelper.LockEndLoc(ref endLoc); // 缁堢偣鍏ュ簱閿�+ + using (var tran = db.Ado.UseTran()) { + if (locCntrRelOld != null) { + if (db.Deleteable<TN_Loc_Container>(locCntrRelOld).ExecuteCommand() <= 0 && + db.Updateable<TN_Location>().SetColumns(l => l.N_CURRENT_NUM == 0).Where(l => l.S_CODE == locCntrRelOld.S_LOC_CODE).ExecuteCommand() <= 0) { + tran.RollbackTran(); + info = $"鍒犻櫎鏃ц揣浣嶅鍣ㄥ叧绯昏〃澶辫触锛氳揣浣嶇紪鐮亄locCntrRelOld.S_LOC_CODE}锛屽鍣ㄧ紪鐮亄locCntrRelOld.S_CNTR_CODE}"; + LogHelper.Info(info); + return new Result<bool>(false, info); + } + } + + if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) { + tran.RollbackTran(); + info = $"鎻掑叆璐т綅瀹瑰櫒鍏崇郴琛ㄥけ璐ワ細璐т綅缂栫爜{locCntrRel.S_LOC_CODE}锛屽鍣ㄧ紪鐮亄locCntrRel.S_CNTR_CODE}"; + LogHelper.Info(info); + return new Result<bool>(false, info); + } + + if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new { + it.N_LOCK_STATE, + it.S_LOCK_STATE, + it.S_LOCK_OP, + it.T_MODIFY, + it.N_CURRENT_NUM, // 璧风偣璐т綅缁戝畾鍚庯紝灏嗚揣浣嶇姸鎬佹洿鏂�+ }).ExecuteCommand() <= 0) { + tran.RollbackTran(); + info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂拌捣鐐硅揣浣峽startLoc.S_CODE}閿佺姸鎬佸け璐�; + LogHelper.Info(info); + return new Result<bool>(false, info); + } + + if (db.Updateable<TN_Location>(endLoc).UpdateColumns(it => new { + it.N_LOCK_STATE, + it.S_LOCK_STATE, + it.S_LOCK_OP, + it.T_MODIFY, + }).ExecuteCommand() <= 0) { + tran.RollbackTran(); + info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛氭洿鏂扮粓鐐硅揣浣峽endLoc.S_CODE}閿佺姸鎬佸け璐�; + LogHelper.Info(info); + return new Result<bool>(false, info); + } + + if (db.Insertable<TN_Task>(task).ExecuteCommand() <= 0) { + tran.RollbackTran(); + info = $"鐢熸垚浠诲姟'{taskName}'澶辫触锛屼换鍔″彿={task.S_CODE}锛屽鍣ㄥ彿={cntId}锛岃捣鐐�{startLoc.S_CODE}锛岀粓鐐�{endLoc.S_CODE}"; + LogHelper.Info(info); + return new Result<bool>(false, info); + } + + tran.CommitTran(); + info = $"鐢熸垚浠诲姟'{taskName}'鎴愬姛锛屼换鍔″彿={task.S_CODE}锛屽鍣ㄥ彿={cntId}锛岃捣鐐�{startLoc.S_CODE}锛岀粓鐐�{endLoc.S_CODE}"; + LogHelper.Info(info); + return new Result<bool>(true, info); + } + } + catch (Exception ex) { + LogHelper.InfoEx(ex); + return new Result<bool>(false, ex.Message); + } + } + + } + + public class ProductCompletedMessage { + public int Id { get; set; } + //public string ItemCode { get; set; } + //public string BatchNo { get; set; } + public string CntrCode { get; set; } + } + + public class Result<T> { + public T Value { get; set; } + public string Content { get; set; } + + public Result(T value, string content) { + Value = value; + Content = content; + } } } -- Gitblit v1.9.1