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 |  234 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 222 insertions(+), 12 deletions(-)

diff --git a/core/WCSCore.cs b/core/WCSCore.cs
index e7b3f66..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,13 +452,213 @@
             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 = "";
+
+            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