From d20ce230b49932d39ee4ce25e39fd78368c3b28a Mon Sep 17 00:00:00 2001 From: kazelee <1847801760@qq.com> Date: 星期五, 27 六月 2025 17:26:04 +0800 Subject: [PATCH] 优化配置文件和部分日志打印信息 --- core/WCSCore.cs | 233 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 222 insertions(+), 11 deletions(-) diff --git a/core/WCSCore.cs b/core/WCSCore.cs index 6423042..72fe0ce 100644 --- a/core/WCSCore.cs +++ b/core/WCSCore.cs @@ -1,6 +1,8 @@ 锘縰sing System; using System.Collections.Generic; using System.Linq; +using System.Net; +using System.Net.Sockets; using System.Text; using System.Threading.Tasks; @@ -12,6 +14,8 @@ using HH.WCS.Mobox3.DSZSH.wms; using Newtonsoft.Json; + +using Swashbuckle.Swagger; using static HH.WCS.Mobox3.DSZSH.api.ApiModel; @@ -72,7 +76,7 @@ WCSHelper.UpdateStatus(TN_Task, "鍙栬揣瀹屾垚"); // 浠诲姟鐘舵�鏀规垚鍙栬揣瀹屾垚 TaskProcess.OperateStatus(TN_Task, 4); // 璧风偣瀹瑰櫒璐т綅瑙g粦,瑙i攣璧风偣 - if (TN_Task.S_TYPE == TaskName.C鎴愬搧鑳跺嚭搴� { + if (TN_Task.S_TYPE == ETask.C鎴愬搧鑳跺嚭搴�Name()) { var nextOutboundTask = Task.Run(() => { UpdateOutboundTaskState(3); }); @@ -124,8 +128,8 @@ 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鎵樼洏_绌烘墭鍏ュ簱) { + if (task.S_TYPE != ETask.K绌烘墭涓婄嚎鍑哄簱.Name() && task.S_TYPE != ETask.K绌烘墭鍏ュ簱.Name() && + task.S_TYPE != ETask.K绌虹涓婄嚎鍑哄簱.Name() && task.S_TYPE != ETask.K绌虹鍏ュ簱.Name()) { // 闈炵┖鎵�绌虹浠诲姟锛堢┖鎵�绌虹浠诲姟鏃犳硶鍦–GDetail鏌ュ埌鐗╂枡淇℃伅锛� //emptyTask= true; cgDetail = db.Queryable<TN_CG_Detail>() @@ -143,8 +147,8 @@ var isInbound = false; // 鍏ュ簱绫诲瀷鐨勪换鍔★紙鍖呮嫭绉诲簱绫讳换鍔★級 var inboundTasks = new List<string> { - TaskName.H濂借繍绠盻婊$涓嬬嚎鍏ュ簱, TaskName.H濂借繍绠盻绌虹鍏ュ簱, TaskName.T鎵樼洏_婊℃墭涓嬬嚎鍏ュ簱, TaskName.T鎵樼洏_绌烘墭鍏ュ簱, - TaskName.C鎶芥_鍚堟牸鍥炲簱, TaskName.C鎶芥_涓嶅悎鏍肩Щ搴� TaskName.Y绉诲簱 + ETask.M婊℃墭涓嬬嚎鍏ュ簱.Name(), ETask.K绌虹鍏ュ簱.Name(), ETask.M婊℃墭涓嬬嚎鍏ュ簱.Name(), ETask.K绌烘墭鍏ュ簱.Name(), + ETask.C鎶芥鍚堟牸鍥炲簱.Name(), ETask.C鎶芥涓嶅悎鏍肩Щ搴�Name(), ETask.Y绉诲簱.Name() }; if (inboundTasks.Contains(task.S_TYPE)) { isInbound= true; @@ -205,11 +209,17 @@ try { ModbusHelper.Relink(); - //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 BZQ = Settings.GetTaskInfo(ETask.M婊℃墭涓嬬嚎鍏ュ簱).StartAreas; + var loc = db.Queryable<TN_Location>() + .Where(l => BZQ.Contains(l.S_AREA_CODE) && l.S_AGV_SITE == model.station_name).First(); - if (!Settings.AgvSite_ProdLineCodeMap.TryGetValue(model.station_name, out int prodIndex)) { + if (loc == null) { + info = $"AGV 绔欑偣{model.station_name}涓嶆槸鍚堟硶鐨勪骇绾挎帴椹充綅绔欑偣"; + LogHelper.Info(info); + return NewReturnResult(1, info); + } + + if (!Settings.LocProdIdMap.TryGetValue(loc.S_CODE, out var prodIndex)) { info = $"AGV 绔欑偣{model.station_name}涓嶆槸鍚堟硶鐨勪骇绾挎帴椹充綅绔欑偣"; LogHelper.Info(info); return NewReturnResult(1, info); @@ -292,7 +302,7 @@ } public static void UpdateOutboundTaskState(int spotStateCode) { - var taskName = TaskName.C鎴愬搧鑳跺嚭搴� + var taskName = ETask.C鎴愬搧鑳跺嚭搴�Name(); var db = new SqlHelper<object>().GetInstance(); var detail = db.Queryable<TN_Outbound_Detail>() @@ -442,12 +452,213 @@ if (list.Count > 0) { list.ForEach(task => { //浣跨敤鑷畾涔変换鍔℃帹閫�- TaskProcess.SendTask(task);//璋冨害NDC鎴栨澀濂ユ垨鍥借嚜璁惧 + //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 = ""; + + var taskInfo = Settings.GetTaskInfo(ETask.M婊℃墭涓嬬嚎鍏ュ簱); + var taskName = taskInfo.TaskName; + var startAreas = taskInfo.StartAreas; + var endAreas = taskInfo.EndAreas; + const string cntrType = "鎵樼洏"; + + try { + var startLoc = db.Queryable<TN_Location>() + .Where(l => l.S_CODE == startLocCode) + .Where(l => startAreas.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 = $"娌℃湁鎵惧埌璧风偣璐т綅'{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 => endAreas.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 = $"娌℃湁鎵惧埌鍚堥�鐨勩�缁堢偣璐т綅銆戯紝闇�婊¤冻瑕佹眰锛氭湭涓婇攣銆佸綋鍓嶅鍣ㄦ暟閲�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