From dcbd4934d063f471c01cbcf93574c2e2ac5f16b5 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 27 三月 2026 09:37:36 +0800
Subject: [PATCH] feat: 提交WCS与WMS代码调整

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs |  150 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 145 insertions(+), 5 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
index b344986..f696a30 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Workflow/RobotWorkflowOrchestrator.cs
@@ -1,5 +1,6 @@
 using WIDESEA_Core;
 using WIDESEAWCS_Common.TaskEnum;
+using WIDESEAWCS_Core.LogHelper;
 using WIDESEAWCS_ITaskInfoService;
 using WIDESEAWCS_Model.Models;
 using WIDESEAWCS_Tasks.Workflow.Abstractions;
@@ -7,15 +8,62 @@
 namespace WIDESEAWCS_Tasks.Workflow
 {
     /// <summary>
-    /// RobotJob 流程编排器:迁移原 RobotJob 状态机分支,降低 Job 类复杂度。
+    /// 鏈哄櫒浜轰换鍔$紪鎺掑櫒 - 璐熻矗 RobotJob 涓殑鐘舵�佹満娴佽浆鍜屾墽琛屾楠ょ紪鎺�
     /// </summary>
+    /// <remarks>
+    /// 杩佺Щ鍘� RobotJob 鐘舵�佹満娴佽浆鏀寔锛岄檷浣� Job 灞傜殑澶嶆潅搴︺��
+    ///
+    /// 鏍稿績鑱岃矗锛�
+    /// 1. 鏍规嵁鏈哄櫒浜哄綋鍓嶇姸鎬佸拰浠诲姟鐘舵�侊紝鍐冲畾涓嬩竴姝ュ姩浣�
+    /// 2. 澶勭悊鍙栬揣瀹屾垚鍚庣殑鏀捐揣鎸囦护涓嬪彂
+    /// 3. 澶勭悊鏀捐揣瀹屾垚鍚庣殑鍙栬揣鎸囦护涓嬪彂锛堢粍鐩樺満鏅級
+    ///
+    /// 鐘舵�佹満娴佽浆瑙勫垯锛�
+    /// - 鏉′欢锛歊obotRunMode == 2锛堣嚜鍔ㄦā寮忥級涓� RobotControlMode == 1锛堝鎴风鎺у埗锛変笖 OperStatus != "Running"
+    /// - 鍙栬揣瀹屾垚 -> 鏀捐揣锛歅ickFinished + RobotArmObject == 1 + RobotPickFinish -> 鍙戦�� Putbattery
+    /// - 鏀捐揣瀹屾垚 -> 鍙栬揣锛歅utFinished + Homed + RobotArmObject == 0 -> 鍙戦�� Pickbattery锛堢粍鐩�/鎹㈢洏鍦烘櫙锛�
+    /// </remarks>
     public class RobotWorkflowOrchestrator : IRobotWorkflowOrchestrator
     {
+        /// <summary>
+        /// 鏈烘鎵嬬姸鎬佺鐞嗗櫒
+        /// </summary>
+        /// <remarks>
+        /// 鐢ㄤ簬璇诲彇鍜屾洿鏂版満鍣ㄤ汉鐨勭姸鎬併��
+        /// </remarks>
         private readonly RobotStateManager _stateManager;
+
+        /// <summary>
+        /// 鏈烘鎵嬪鎴风绠$悊鍣�
+        /// </summary>
+        /// <remarks>
+        /// 鐢ㄤ簬鍚戞満鍣ㄤ汉瀹㈡埛绔彂閫佹寚浠ゃ��
+        /// </remarks>
         private readonly RobotClientManager _clientManager;
+
+        /// <summary>
+        /// 浠诲姟澶勭悊鍣�
+        /// </summary>
+        /// <remarks>
+        /// 鐢ㄤ簬鎵ц浠诲姟鐩稿叧鐨勪笟鍔¢�昏緫锛屽鍙戦�佸彇璐ф寚浠ゃ��
+        /// </remarks>
         private readonly RobotTaskProcessor _taskProcessor;
+
+        /// <summary>
+        /// 鏈哄櫒浜轰换鍔℃湇鍔�
+        /// </summary>
+        /// <remarks>
+        /// 鐢ㄤ簬鏇存柊浠诲姟鐘舵�併��
+        /// </remarks>
         private readonly IRobotTaskService _robotTaskService;
 
+        /// <summary>
+        /// 鏋勯�犲嚱鏁�
+        /// </summary>
+        /// <param name="stateManager">鐘舵�佺鐞嗗櫒</param>
+        /// <param name="clientManager">瀹㈡埛绔鐞嗗櫒</param>
+        /// <param name="taskProcessor">浠诲姟澶勭悊鍣�</param>
+        /// <param name="robotTaskService">浠诲姟鏈嶅姟</param>
         public RobotWorkflowOrchestrator(
             RobotStateManager stateManager,
             RobotClientManager clientManager,
@@ -28,81 +76,173 @@
             _robotTaskService = robotTaskService;
         }
 
+        /// <summary>
+        /// 鎵ц浠诲姟缂栨帓娴佺▼
+        /// </summary>
+        /// <remarks>
+        /// 鏍规嵁鏈哄櫒浜哄綋鍓嶇姸鎬佸拰浠诲姟鐘舵�侊紝鍐冲畾鏄惁涓嬪彂鎸囦护銆�
+        ///
+        /// 鎵ц鏉′欢锛�
+        /// 1. 鏈哄櫒浜哄浜庤嚜鍔ㄦā寮忥紙RobotRunMode == 2锛�
+        /// 2. 鏈哄櫒浜哄浜庡鎴风鎺у埗妯″紡锛圧obotControlMode == 1锛�
+        /// 3. 鏈哄櫒浜轰笉鍦ㄨ繍琛屼腑锛圤perStatus != "Running"锛�
+        ///
+        /// 娴佽浆閫昏緫锛�
+        /// - 鍙栬揣瀹屾垚涓旀墜鑷傛湁璐� -> 鍙戦�佹斁璐ф寚浠わ紙Putbattery锛�
+        /// - 鏀捐揣瀹屾垚涓旀墜鑷傛棤璐� -> 鍙戦�佸彇璐ф寚浠わ紙Pickbattery锛�
+        /// </remarks>
+        /// <param name="latestState">鏈哄櫒浜烘渶鏂扮姸鎬�</param>
+        /// <param name="task">寰呮墽琛岀殑鏈哄櫒浜轰换鍔�</param>
+        /// <param name="ipAddress">鏈哄櫒浜� IP 鍦板潃</param>
         public async Task ExecuteAsync(RobotSocketState latestState, Dt_RobotTask task, string ipAddress)
         {
-            // 保持原有分支判定条件不变,确保行为一致。
+            // 鎸夊師鏂规鍒嗘敮鍒ゆ柇锛岀‘淇濋�昏緫涓�鑷�
+            // 妫�鏌ユ槸鍚︽弧瓒宠嚜鍔ㄦ帶鍒舵潯浠讹細
+            // 1. 杩愯妯″紡涓鸿嚜鍔紙2锛�
+            // 2. 鎺у埗妯″紡涓哄鎴风鎺у埗锛�1锛�
+            // 3. 杩愯鐘舵�佷笉鏄� Running锛堣鏄庡凡瀹屾垚褰撳墠鍔ㄤ綔锛�
             if (latestState.RobotRunMode == 2 && latestState.RobotControlMode == 1 && latestState.OperStatus != "Running")
             {
+                // ========== 鍙栬揣瀹屾垚鍚庣殑鏀捐揣澶勭悊 ==========
+                // 鏉′欢锛�
+                // - 褰撳墠鍔ㄤ綔鏄� PickFinished 鎴� AllPickFinished锛堝彇璐у畬鎴愶級
+                // - 鎵嬭噦涓婃湁鐗╂枡锛圧obotArmObject == 1锛�
+                // - 浠诲姟鐘舵�佷负 RobotPickFinish锛堝凡璁板綍鍙栬揣瀹屾垚锛�
                 if ((latestState.CurrentAction == "PickFinished" || latestState.CurrentAction == "AllPickFinished")
                     && latestState.RobotArmObject == 1
                     && task.RobotTaskState == TaskRobotStatusEnum.RobotPickFinish.GetHashCode())
                 {
+                    // 鍙戦�佹斁璐ф寚浠�
                     await HandlePickFinishedStateAsync(task, ipAddress);
                 }
-                else if ((latestState.CurrentAction == "PutFinished" || latestState.CurrentAction == "AllPutFinished")
+                // ========== 鏀捐揣瀹屾垚鍚庣殑鍙栬揣澶勭悊 ==========
+                // 鏉′欢锛�
+                // - 褰撳墠鍔ㄤ綔鏄� PutFinished銆丄llPutFinished 鎴� null锛堟斁璐у畬鎴愶級
+                // - 杩愯鐘舵�佷负 Homed锛堝凡褰掍綅锛�
+                // - 鎵嬭噦涓婃棤鐗╂枡锛圧obotArmObject == 0锛�
+                // - 浠诲姟鐘舵�佷负 RobotPutFinish 鎴栦笉鏄� RobotExecuting
+                else if ((latestState.CurrentAction == "PutFinished" || latestState.CurrentAction == "AllPutFinished" || latestState.CurrentAction == null)
                     && latestState.OperStatus == "Homed"
                     && latestState.RobotArmObject == 0
                     && (task.RobotTaskState == TaskRobotStatusEnum.RobotPutFinish.GetHashCode()
                     || task.RobotTaskState != TaskRobotStatusEnum.RobotExecuting.GetHashCode()))
                 {
+                    // 鍙戦�佸彇璐ф寚浠�
                     await HandlePutFinishedStateAsync(task, ipAddress);
                 }
             }
         }
 
+        /// <summary>
+        /// 澶勭悊鍙栬揣瀹屾垚鍚庣殑鏀捐揣鎸囦护
+        /// </summary>
+        /// <remarks>
+        /// 褰撳彇璐у畬鎴愬悗锛屽悜鏈哄櫒浜哄彂閫佹斁璐ф寚浠わ紙Putbattery锛夈��
+        /// 鏈哄櫒浜烘敹鍒版寚浠ゅ悗浼氬皢璐х墿鏀剧疆鍒扮洰鏍囧湴鍧�銆�
+        ///
+        /// 鎸囦护鏍煎紡锛歅utbattery,{鐩爣鍦板潃}
+        /// 渚嬪锛歅utbattery,B01 琛ㄧず灏嗚揣鐗╂斁缃埌 B01 浣嶇疆
+        /// </remarks>
+        /// <param name="task">褰撳墠浠诲姟</param>
+        /// <param name="ipAddress">鏈哄櫒浜� IP 鍦板潃</param>
         private async Task HandlePickFinishedStateAsync(Dt_RobotTask task, string ipAddress)
         {
+            // 鏋勫缓鏀捐揣鎸囦护锛屾牸寮忥細Putbattery,{鐩爣鍦板潃}
             string taskString = $"Putbattery,{task.RobotTargetAddress}";
+
+            // 閫氳繃瀹㈡埛绔鐞嗗櫒鍙戦�佹寚浠ゅ埌鏈哄櫒浜�
             bool result = await _clientManager.SendToClientAsync(ipAddress, taskString);
+
             if (result)
             {
+                // 鍙戦�佹垚鍔燂紝璁板綍鏃ュ織
+                QuartzLogger.Info($"涓嬪彂鏀捐揣鎸囦护锛屾寚锟�?: {taskString}", task.RobotRoadway);
+
+                // 鏇存柊浠诲姟鐘舵�佷负"鏈哄櫒浜烘墽琛屼腑"
                 task.RobotTaskState = TaskRobotStatusEnum.RobotExecuting.GetHashCode();
 
+                // 鑾峰彇鏈�鏂扮姸鎬佸苟鏇存柊浠诲姟鍏宠仈
                 var stateToUpdate = _stateManager.GetState(ipAddress);
                 if (stateToUpdate != null)
                 {
                     stateToUpdate.CurrentTask = task;
+
+                    // 瀹夊叏鏇存柊鐘舵�佸埌 Redis
                     if (_stateManager.TryUpdateStateSafely(ipAddress, stateToUpdate))
                     {
+                        // 鐘舵�佹洿鏂版垚鍔熷悗锛屾洿鏂颁换鍔¤褰�
                         await _robotTaskService.UpdateRobotTaskAsync(task);
                     }
                 }
             }
         }
 
+        /// <summary>
+        /// 澶勭悊鏀捐揣瀹屾垚鍚庣殑鍙栬揣鎸囦护
+        /// </summary>
+        /// <remarks>
+        /// 褰撴斁璐у畬鎴愬悗锛屾牴鎹换鍔$被鍨嬪喅瀹氫笅涓�姝ワ細
+        ///
+        /// 1. 濡傛灉涓嶆槸鎷嗙洏涔熶笉鏄粍鐩橈紙鏅�氫换鍔★級锛�
+        ///    - 鐩存帴鍙戦�佸彇璐ф寚浠�
+        ///
+        /// 2. 濡傛灉鏄粍鐩樻垨鎹㈢洏浠诲姟锛�
+        ///    - 鐢熸垚鏂扮殑鎵樼洏鏉$爜
+        ///    - 灏嗘潯鐮佹坊鍔犲埌鐘舵�佷腑
+        ///    - 鍙戦�佸彇璐ф寚浠�
+        ///
+        /// 缁勭洏浠诲姟鐨勬潯鐮佺敤浜庢爣璇嗘柊鐢熸垚鐨勬墭鐩橈紝
+        /// 鍚庣画鏀捐揣鏃朵細鐢ㄥ埌杩欎簺鏉$爜淇℃伅銆�
+        /// </remarks>
+        /// <param name="task">褰撳墠浠诲姟</param>
+        /// <param name="ipAddress">鏈哄櫒浜� IP 鍦板潃</param>
         private async Task HandlePutFinishedStateAsync(Dt_RobotTask task, string ipAddress)
         {
+            // 鑾峰彇鏈�鏂扮姸鎬�
             var stateForUpdate = _stateManager.GetState(ipAddress);
             if (stateForUpdate == null)
             {
                 return;
             }
 
+            // 濡傛灉鐘舵�佷腑杩樻病鏈夎缃换鍔$被鍨嬫爣蹇楋紝鏍规嵁浠诲姟绫诲瀷璁剧疆
             if (!stateForUpdate.IsSplitPallet && !stateForUpdate.IsGroupPallet)
             {
+                // 鍒ゆ柇浠诲姟绫诲瀷骞惰缃浉搴旂殑鏍囧織
                 stateForUpdate.IsSplitPallet = task.RobotTaskType == RobotTaskTypeEnum.SplitPallet.GetHashCode();
                 stateForUpdate.IsGroupPallet = task.RobotTaskType == RobotTaskTypeEnum.GroupPallet.GetHashCode()
                     || task.RobotTaskType == RobotTaskTypeEnum.ChangePallet.GetHashCode();
             }
 
+            // 濡傛灉鏄粍鐩樹换鍔★紙鍖呮嫭鎹㈢洏锛�
             if (task.RobotTaskType == RobotTaskTypeEnum.GroupPallet.GetHashCode())
             {
+                // 鐢熸垚鎵樼洏鏉$爜鍓嶇紑
                 const string prefix = "TRAY";
+
+                // 鐢熸垚涓や釜鎵樼洏鏉$爜锛堢敤浜庣粍鐩樻搷浣滐級
                 string trayBarcode1 = RobotBarcodeGenerator.GenerateTrayBarcode(prefix);
                 string trayBarcode2 = RobotBarcodeGenerator.GenerateTrayBarcode(prefix);
+
+                // 濡傛灉鏉$爜鐢熸垚鎴愬姛
                 if (!string.IsNullOrEmpty(trayBarcode1) && !string.IsNullOrEmpty(trayBarcode2))
                 {
+                    // 灏嗘潯鐮佹坊鍔犲埌鐘舵�佷腑锛屼緵鍚庣画鏀捐揣鏃朵娇鐢�
                     stateForUpdate.CellBarcode.Add(trayBarcode1);
                     stateForUpdate.CellBarcode.Add(trayBarcode2);
+
+                    // 璁板綍鏃ュ織
+                    QuartzLogger.Info($"取锟斤拷锟斤拷锟斤拷锟叫撅拷牛锟斤拷锟叫�: {trayBarcode1}+{trayBarcode2}", stateForUpdate.RobotCrane.DeviceName);
+
+                    // 鍙戦�佸彇璐ф寚浠�
                     await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate);
                 }
             }
             else
             {
+                // 闈炵粍鐩樹换鍔★紝鐩存帴鍙戦�佸彇璐ф寚浠�
                 await _taskProcessor.SendSocketRobotPickAsync(task, stateForUpdate);
             }
         }
     }
 }
-
-

--
Gitblit v1.9.3