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 |  206 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 205 insertions(+), 1 deletions(-)

diff --git a/core/WCSCore.cs b/core/WCSCore.cs
index 6423042..f0d8b90 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;
 
@@ -442,12 +446,212 @@
             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 = "";
+
+            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