From fd18eaba5e1c086a588509371f91310e7aafff9c Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期三, 08 四月 2026 22:06:59 +0800
Subject: [PATCH] refactor: 升级多个项目目标框架至.NET 8.0

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs |  385 ++++++++++++++++++++----------------------------------
 1 files changed, 142 insertions(+), 243 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
index 36b521f..081bfd4 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotMessageHandler.cs
@@ -1,275 +1,174 @@
+using Microsoft.Extensions.Logging;
 using System.Net.Sockets;
 using WIDESEAWCS_Common;
-using WIDESEAWCS_Common.HttpEnum;
-using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core.Caches;
-using WIDESEAWCS_Core.Helper;
-using WIDESEAWCS_DTO.Stock;
-using WIDESEAWCS_DTO.TaskInfo;
-using WIDESEAWCS_ITaskInfoService;
-using WIDESEAWCS_Model.Models;
-using WIDESEAWCS_Tasks.SocketServer;
+using WIDESEAWCS_Core.LogHelper;
+using WIDESEAWCS_Tasks.Workflow.Abstractions;
 
 namespace WIDESEAWCS_Tasks
 {
     /// <summary>
-    /// 鏈烘鎵嬫秷鎭鐞嗗櫒 - 璐熻矗澶勭悊鏉ヨ嚜TCP瀹㈡埛绔殑娑堟伅
+    /// 鏈哄櫒浜烘秷鎭鐞嗗櫒 - 娑堟伅璺敱鍏ュ彛
     /// </summary>
-    public class RobotMessageHandler
+    /// <remarks>
+    /// 鏍稿績鑱岃矗锛�
+    /// 1. 缂撳瓨鐘舵�佽鍙栵細浠� Redis 涓幏鍙栨満鍣ㄤ汉鏈�鏂扮殑鐘舵��
+    /// 2. 鍛戒护鍒嗗彂锛氭牴鎹秷鎭被鍨嬪垎鍙戠粰涓嶅悓鐨勫鐞嗗櫒
+    ///    - 绠�鍗曞懡浠わ紙濡� homing銆乺unning锛夛細鐢� <see cref="IRobotSimpleCommandHandler"/> 澶勭悊
+    ///    - 鍓嶇紑鍛戒护锛堝 pickfinished銆乸utfinished锛夛細鐢� <see cref="IRobotPrefixCommandHandler"/> 澶勭悊
+    /// 3. 鍥炲寘瑙﹀彂锛氬皢鍘熷娑堟伅鍥炲啓鍒板鎴风
+    ///
+    /// 杩欐槸娑堟伅澶勭悊绠¢亾鐨勫叆鍙g偣锛岀敱 TcpSocketServer 鐨� MessageReceived 浜嬩欢瑙﹀彂銆�
+    /// </remarks>
+    public class RobotMessageHandler : IRobotMessageRouter
     {
-        private readonly TcpSocketServer _tcpSocket;
-        private readonly RobotStateManager _stateManager;
-        private readonly ICacheService _cache;
-        private readonly IRobotTaskService _robotTaskService;
-        private readonly RobotTaskProcessor _taskProcessor;
+        /// <summary>
+        /// Socket 瀹㈡埛绔綉鍏虫帴鍙�
+        /// </summary>
+        /// <remarks>
+        /// 鐢ㄤ簬鍚戝鎴风鍙戦�佸搷搴旀秷鎭��
+        /// </remarks>
+        private readonly ISocketClientGateway _socketClientGateway;
 
+        /// <summary>
+        /// 鏈烘鎵嬬姸鎬佺鐞嗗櫒
+        /// </summary>
+        /// <remarks>
+        /// 鐢ㄤ簬璇诲彇鍜屾洿鏂版満鍣ㄤ汉鐨勭姸鎬併��
+        /// </remarks>
+        private readonly RobotStateManager _stateManager;
+
+        /// <summary>
+        /// 缂撳瓨鏈嶅姟
+        /// </summary>
+        /// <remarks>
+        /// 鐩存帴浣跨敤缂撳瓨鏈嶅姟妫�鏌ョ姸鎬佹槸鍚﹀瓨鍦ㄣ��
+        /// </remarks>
+        private readonly ICacheService _cache;
+
+        /// <summary>
+        /// 绠�鍗曞懡浠ゅ鐞嗗櫒
+        /// </summary>
+        /// <remarks>
+        /// 澶勭悊绠�鍗曠殑鐘舵�佹洿鏂板懡浠わ紝濡傝繍琛岀姸鎬併�佹ā寮忓垏鎹㈢瓑銆�
+        /// </remarks>
+        private readonly IRobotSimpleCommandHandler _simpleCommandHandler;
+
+        /// <summary>
+        /// 鍓嶇紑鍛戒护澶勭悊鍣�
+        /// </summary>
+        /// <remarks>
+        /// 澶勭悊甯﹀弬鏁扮殑鍓嶇紑鍛戒护锛屽 pickfinished锛堝彇璐у畬鎴愶級銆乸utfinished锛堟斁璐у畬鎴愶級銆�
+        /// </remarks>
+        private readonly IRobotPrefixCommandHandler _prefixCommandHandler;
+
+        /// <summary>
+        /// 鏃ュ織璁板綍鍣�
+        /// </summary>
+        private readonly ILogger<RobotJob> _logger;
+
+        /// <summary>
+        /// 鏋勯�犲嚱鏁�
+        /// </summary>
+        /// <param name="socketClientGateway">Socket 缃戝叧</param>
+        /// <param name="stateManager">鐘舵�佺鐞嗗櫒</param>
+        /// <param name="cache">缂撳瓨鏈嶅姟</param>
+        /// <param name="simpleCommandHandler">绠�鍗曞懡浠ゅ鐞嗗櫒</param>
+        /// <param name="prefixCommandHandler">鍓嶇紑鍛戒护澶勭悊鍣�</param>
+        /// <param name="logger">鏃ュ織璁板綍鍣�</param>
         public RobotMessageHandler(
-            TcpSocketServer tcpSocket,
+            ISocketClientGateway socketClientGateway,
             RobotStateManager stateManager,
             ICacheService cache,
-            IRobotTaskService robotTaskService,
-            RobotTaskProcessor taskProcessor)
+            IRobotSimpleCommandHandler simpleCommandHandler,
+            IRobotPrefixCommandHandler prefixCommandHandler,
+            ILogger<RobotJob> logger)
         {
-            _tcpSocket = tcpSocket;
+            _socketClientGateway = socketClientGateway;
             _stateManager = stateManager;
             _cache = cache;
-            _robotTaskService = robotTaskService;
-            _taskProcessor = taskProcessor;
+            _simpleCommandHandler = simpleCommandHandler;
+            _prefixCommandHandler = prefixCommandHandler;
+            _logger = logger;
         }
 
         /// <summary>
         /// 澶勭悊鎺ユ敹鍒扮殑娑堟伅
         /// </summary>
+        /// <remarks>
+        /// 澶勭悊娴佺▼锛�
+        /// 1. 璁板綍鏃ュ織锛堣褰曞師濮嬫秷鎭唴瀹癸級
+        /// 2. 楠岃瘉缂撳瓨涓槸鍚﹀瓨鍦ㄨ璁惧鐨勭姸鎬�
+        /// 3. 灏濊瘯鐢ㄧ畝鍗曞懡浠ゅ鐞嗗櫒澶勭悊锛堢姸鎬佹洿鏂扮被鍛戒护锛�
+        ///    - 濡傛灉澶勭悊鎴愬姛锛屽洖鍐欏師娑堟伅骞舵洿鏂扮姸鎬�
+        /// 4. 濡傛灉涓嶆槸绠�鍗曞懡浠わ紝妫�鏌ユ槸鍚︽槸鍓嶇紑鍛戒护锛坧ickfinished/putfinished锛�
+        ///    - 濡傛灉鏄紝璋冪敤鍓嶇紑鍛戒护澶勭悊鍣ㄥ鐞�
+        /// 5. 淇濇寔鍘熸湁琛屼负锛氱畝鍗曞懡浠ゅ拰鍓嶇紑鍛戒护閮藉洖鍐欏師娑堟伅
+        ///
+        /// 娉ㄦ剰锛氭鏂规硶鍙兘鍦� TCP 娑堟伅鎺ユ敹鐨勪笂涓嬫枃涓棰戠箒璋冪敤锛岄渶娉ㄦ剰鎬ц兘銆�
+        /// </remarks>
+        /// <param name="message">鍘熷娑堟伅瀛楃涓�</param>
+        /// <param name="isJson">娑堟伅鏄惁涓� JSON 鏍煎紡锛堝綋鍓嶆湭浣跨敤锛�</param>
+        /// <param name="client">TCP 瀹㈡埛绔繛鎺�</param>
+        /// <param name="state">鏈哄櫒浜哄綋鍓嶇姸鎬�</param>
+        /// <returns>鍝嶅簲娑堟伅锛屽鏋滄棤闇�鍥炲鍒欒繑鍥� null</returns>
         public async Task<string?> HandleMessageReceivedAsync(string message, bool isJson, TcpClient client, RobotSocketState state)
         {
-            if (!(_cache?.TryGetValue($"{RedisPrefix.Code}:{RedisName.SocketDevices}:{client.Client.RemoteEndPoint}", out state)) ?? false)
-                return null;
+            // 璁板綍鎺ユ敹鍒扮殑娑堟伅鏃ュ織
+            _logger.LogInformation($"鎺ユ敹鍒板鎴风銆恵state.RobotCrane.DeviceName}銆戝彂閫佹秷鎭�恵message}銆�");
+            QuartzLogger.Info($"鎺ユ敹鍒板鎴风娑堟伅銆恵message}銆�", state.RobotCrane.DeviceName);
 
+            // 妫�鏌ヤ换鍔℃�绘暟鏄惁鏈揪鍒颁笂闄�
+            if (state.RobotTaskTotalNum > RobotConst.MaxTaskTotalNum)
+            {
+                // 璁板綍鎺ユ敹鍒扮殑娑堟伅鏃ュ織
+                _logger.LogInformation($"鎺ユ敹鍒板鎴风銆恵state.RobotCrane.DeviceName}銆戝彂閫佹秷鎭�恵message}銆�");
+                QuartzLogger.Info($"鎺ユ敹鍒板鎴风娑堟伅銆恵message}銆�", state.RobotCrane.DeviceName);
+                // 澶勭悊鎴愬姛鍚庯紝灏嗗師娑堟伅鍥炲啓鍒板鎴风锛堜繚鎸佸師鏈夎涓猴級
+                await _socketClientGateway.SendMessageAsync(client, message);
+                return null;
+            }
+
+            // 鏋勫缓缂撳瓨閿紝妫�鏌� Redis 涓槸鍚﹀瓨鍦ㄨ璁惧鐨勭姸鎬�
+            var cacheKey = $"{RedisPrefix.Code}:{RedisName.SocketDevices}:{client.Client.RemoteEndPoint}";
+
+            // 濡傛灉缂撳瓨涓笉瀛樺湪鎴栫姸鎬佷负 null锛屽拷鐣ユ娑堟伅
+            if (!_cache.TryGetValue(cacheKey, out RobotSocketState? cachedState) || cachedState == null)
+            {
+                return null;
+            }
+
+            // 浣跨敤缂撳瓨涓幏鍙栫殑鐘舵��
+            var activeState = cachedState;
+
+            // 灏嗘秷鎭浆鎹负灏忓啓锛堢敤浜庣畝鍗曞懡浠ゅ尮閰嶏級
             string messageLower = message.ToLowerInvariant();
 
-            if (await IsSimpleCommandAsync(messageLower, state))
+            // 灏濊瘯鐢ㄧ畝鍗曞懡浠ゅ鐞嗗櫒澶勭悊
+            // 绠�鍗曞懡浠ゅ寘鎷細homing銆乭omed銆乺unning銆乸ausing銆乺unmode銆乧ontrolmode 绛�
+            if (await _simpleCommandHandler.HandleAsync(messageLower, activeState))
             {
-                await _tcpSocket.SendMessageAsync(client, message);
-                if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
-                    return null;
-            }
-            else if (IsPrefixCommand(messageLower))
-            {
-                await HandlePrefixCommandAsync(message, state, client);
+                // 澶勭悊鎴愬姛鍚庯紝灏嗗師娑堟伅鍥炲啓鍒板鎴风锛堜繚鎸佸師鏈夎涓猴級
+                await _socketClientGateway.SendMessageAsync(client, message);
+                _logger.LogInformation($"鍙戦�佹秷鎭�恵message}銆�");
+                QuartzLogger.Info($"鍙戦�佹秷鎭細銆恵message}銆�", state.RobotCrane.DeviceName);
+
+                // 瀹夊叏鏇存柊鐘舵�佸埌 Redis
+                _stateManager.TryUpdateStateSafely(activeState.IPAddress, activeState);
+                return null;
             }
 
+            // 濡傛灉涓嶆槸绠�鍗曞懡浠わ紝妫�鏌ユ槸鍚︽槸鍓嶇紑鍛戒护
+            // 鍓嶇紑鍛戒护鍖呮嫭锛歱ickfinished銆乸utfinished锛堝悗闈㈣窡閫楀彿鍒嗛殧鐨勪綅缃弬鏁帮級
+            if (_prefixCommandHandler.IsPrefixCommand(messageLower))
+            {
+                // 璋冪敤鍓嶇紑鍛戒护澶勭悊鍣�
+                // 鍓嶇紑鍛戒护澶勭悊鍣ㄤ細瑙f瀽浣嶇疆鍙傛暟骞舵洿鏂扮姸鎬�
+                await _prefixCommandHandler.HandleAsync(message, activeState, client);
+            }
+
+            // 榛樿杩斿洖 null锛屼笉浜х敓鍝嶅簲娑堟伅
             return null;
         }
-
-        /// <summary>
-        /// 澶勭悊鍓嶇紑鍛戒护锛坧ickfinished, putfinished锛�
-        /// </summary>
-        private async Task HandlePrefixCommandAsync(string message, RobotSocketState state, TcpClient client)
-        {
-            try
-            {
-                var parts = message.Split(',');
-                if (parts.Length >= 1 && state.CurrentTask != null)
-                {
-                    var cmd = parts[0].ToLowerInvariant();
-                    int[] positions = parts.Skip(1)
-                       .Select(p => int.TryParse(p, out int value) ? value : (int?)null)
-                       .Where(v => v.HasValue && v.Value != 0)
-                       .Select(v => v!.Value)
-                       .ToArray();
-
-                    var task = await _robotTaskService.Repository.QueryFirstAsync(x => x.RobotTaskId == state.CurrentTask.RobotTaskId);
-
-                    if (cmd.StartsWith("pickfinished"))
-                    {
-                        await HandlePickFinishedAsync(state, positions, task, client);
-                    }
-                    else if (cmd.StartsWith("putfinished"))
-                    {
-                        await HandlePutFinishedAsync(state, positions, task, client);
-                    }
-
-                    await _tcpSocket.SendMessageAsync(client, message);
-                }
-            }
-            catch (Exception ex)
-            {
-                Console.WriteLine($"RobotJob MessageReceived Error: {ex.Message}");
-            }
-        }
-
-        /// <summary>
-        /// 澶勭悊鍙栬揣瀹屾垚鍛戒护
-        /// </summary>
-        private async Task HandlePickFinishedAsync(RobotSocketState state, int[] positions, Dt_RobotTask? task, TcpClient client)
-        {
-            if (state.IsSplitPallet)
-            {
-                var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions);
-                state.LastPickPositions = positions;
-
-                var result = _taskProcessor.PostSplitPalletAsync(stockDTO);
-
-                if (result.Data.Status && result.IsSuccess)
-                {
-                    state.CurrentAction = "PickFinished";
-                }
-            }
-            else
-            {
-                state.CurrentAction = "PickFinished";
-            }
-
-            state.LastPickPositions = positions;
-            if (task != null)
-            {
-                task.RobotTaskState = TaskRobotStatusEnum.RobotPickFinish.GetHashCode();
-                if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
-                    await _robotTaskService.Repository.UpdateDataAsync(task);
-            }
-        }
-
-        /// <summary>
-        /// 澶勭悊鏀捐揣瀹屾垚鍛戒护
-        /// </summary>
-        private async Task HandlePutFinishedAsync(RobotSocketState state, int[] positions, Dt_RobotTask? task, TcpClient client)
-        {
-            bool putSuccess = true;
-            if (state.IsGroupPallet)
-            {
-                state.LastPutPositions = positions;
-                var stockDTO = RobotTaskProcessor.BuildStockDTO(state, positions);
-                var configKey = state.CurrentTask?.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode()
-                    ? nameof(ConfigKey.ChangePalletAsync) : nameof(ConfigKey.GroupPalletAsync);
-
-                var result = _taskProcessor.PostGroupPalletAsync(configKey, stockDTO);
-                putSuccess = result.Data.Status && result.IsSuccess;
-            }
-
-            if (putSuccess)
-            {
-                state.CurrentAction = "PutFinished";
-                state.RobotTaskTotalNum += positions.Length;
-                if (task != null)
-                {
-                    task.RobotTaskTotalNum += positions.Length;
-                }
-            }
-
-            if (task != null)
-            {
-                task.RobotTaskState = TaskRobotStatusEnum.RobotPutFinish.GetHashCode();
-                if (_stateManager.TryUpdateStateSafely(state.IPAddress, state))
-                    await _robotTaskService.Repository.UpdateDataAsync(task);
-            }
-        }
-
-        /// <summary>
-        /// 鏈烘鎵嬬畝鍗曞懡浠ゅ鐞�
-        /// </summary>
-        private async Task<bool> IsSimpleCommandAsync(string message, RobotSocketState state)
-        {
-            RobotTaskTypeEnum? GetRobotTaskType() => state.CurrentTask != null ? (RobotTaskTypeEnum)state.CurrentTask.RobotTaskType : null;
-            switch (message)
-            {
-                case "homing":
-                    state.OperStatus = "Homing";
-                    return true;
-
-                case "homed":
-                    state.OperStatus = "Homed";
-                    return true;
-
-                case "picking":
-                    state.CurrentAction = "Picking";
-                    return true;
-
-                case "puting":
-                    state.CurrentAction = "Putting";
-                    return true;
-
-                case "allpickfinished": // 鍙栬揣瀹屾垚
-                    state.CurrentAction = "AllPickFinished";
-                    var robotTaskType = GetRobotTaskType();
-
-                    if (robotTaskType == RobotTaskTypeEnum.SplitPallet || robotTaskType == RobotTaskTypeEnum.ChangePallet)
-                    {
-                        if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: true))
-                        {
-                            _taskProcessor.DeleteTask(state.CurrentTask.RobotTaskId);
-                            return true;
-                        }
-                    }
-                    return false;
-
-                case "allputfinished": // 鏀捐揣瀹屾垚
-                    state.CurrentAction = "AllPutFinished";
-                    robotTaskType = GetRobotTaskType();
-
-                    if (robotTaskType == RobotTaskTypeEnum.GroupPallet || robotTaskType == RobotTaskTypeEnum.ChangePallet)
-                    {
-                        if (await _taskProcessor.HandleInboundTaskAsync(state, useSourceAddress: false))
-                        {
-                            _taskProcessor.DeleteTask(state.CurrentTask.RobotTaskId);
-                            state.CurrentTask = null;
-                            state.RobotTaskTotalNum = 0;
-                            state.CellBarcode = new List<string>();
-                            return true;
-                        }
-                    }
-                    return false;
-
-                case "running":
-                    state.OperStatus = "Running";
-                    return true;
-
-                case "pausing":
-                    state.OperStatus = "Pausing";
-                    return true;
-
-                case "warming":
-                    state.OperStatus = "Warming";
-                    return true;
-
-                case "emstoping":
-                    state.OperStatus = "Emstoping";
-                    return true;
-
-                case "runmode,1":
-                    state.RobotRunMode = 1;
-                    return true;
-
-                case "runmode,2":
-                    state.RobotRunMode = 2;
-                    return true;
-
-                case "controlmode,1":
-                    state.RobotControlMode = 1;
-                    return true;
-
-                case "controlmode,2":
-                    state.RobotControlMode = 2;
-                    return true;
-
-                case "armobject,1":
-                    state.RobotArmObject = 1;
-                    return true;
-
-                case "armobject,0":
-                    state.RobotArmObject = 0;
-                    return true;
-
-                default:
-                    return false;
-            }
-        }
-
-        /// <summary>
-        /// 鍒ゆ柇鏄惁涓哄墠缂�鍛戒护
-        /// </summary>
-        private static bool IsPrefixCommand(string message)
-        {
-            return message.StartsWith("pickfinished") || message.StartsWith("putfinished");
-        }
     }
-}
+}
\ No newline at end of file

--
Gitblit v1.9.3