From c9a1df9c19a64844d05d120ff171f523d77e7823 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期六, 25 四月 2026 22:15:36 +0800
Subject: [PATCH] Merge branch 'xiaoyang' into dev

---
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/Siemens/SiemensS7Communicator.cs                      |  106 +
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Abstractions/ISocketClientGateway.cs                |    2 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockService.cs                                        |    7 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs                               |   33 
 Code/测试工具/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/instance-1002/config.json            |    2 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotClientManager.cs                               |    2 
 Code/测试工具/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/instance-1001/config.json            |    2 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs               |   65 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs            |   35 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.cs                              |   18 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Status.cs                  |   90 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs                                |  837 +++++++------
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/HttpEnum/ConfigKey.cs                                       |    7 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockController.cs                        |   11 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs                  |    9 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs                                          |   20 
 Code/测试工具/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/protocol-templates.json              | 1789 +++++++++++++++++++++++++++++
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Receive.cs                 |    9 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ManualInbound/ManualInboundTaskHandler.cs |   14 
 /dev/null                                                                                                |   83 -
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs                       |    3 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_AutoOutbound.cs                       |    3 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/SocketClientGateway.cs                          |    4 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs                         |    6 
 Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Tray.cs                               |   12 
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs      |  382 ------
 Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Messaging.cs                    |   13 
 27 files changed, 2,525 insertions(+), 1,039 deletions(-)

diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/HttpEnum/ConfigKey.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/HttpEnum/ConfigKey.cs
index f170c0a..53d5a3c 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/HttpEnum/ConfigKey.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/HttpEnum/ConfigKey.cs
@@ -92,7 +92,12 @@
         /// <summary>
         /// 鎵归噺缁勭洏纭
         /// </summary>
-        GroupPalletConfirm
+        GroupPalletConfirm,
+
+        /// <summary>
+        /// 鏍规嵁鎵樼洏鍙锋煡璇㈠簱瀛樻槑缁嗘暟閲�
+        /// </summary>
+        GetStockDetailCount
 
         #endregion WMS鎺ュ彛
     }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/Siemens/SiemensS7Communicator.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/Siemens/SiemensS7Communicator.cs
index cdfdee9..c2dfc11 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/Siemens/SiemensS7Communicator.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Communicator/Siemens/SiemensS7Communicator.cs
@@ -1,4 +1,5 @@
 锘�#region << 鐗� 鏈� 娉� 閲� >>
+
 /*----------------------------------------------------------------
  * 鍛藉悕绌洪棿锛歐IDESEAWCS_Communicator
  * 鍒涘缓鑰咃細鑳$搴�
@@ -11,8 +12,9 @@
  * 淇敼鏃堕棿锛�
  * 鐗堟湰锛歏1.0.1
  * 淇敼璇存槑锛�
- * 
+ *
  *----------------------------------------------------------------*/
+
 #endregion << 鐗� 鏈� 娉� 閲� >>
 
 using HslCommunication;
@@ -20,19 +22,12 @@
 using HslCommunication.LogNet;
 using HslCommunication.Profinet.Siemens;
 using Newtonsoft.Json;
-using Newtonsoft.Json.Linq;
-using System;
-using System.Collections;
-using System.Collections.Generic;
 using System.ComponentModel;
 using System.Diagnostics.CodeAnalysis;
-using System.Linq;
 using System.Net;
 using System.Net.NetworkInformation;
 using System.Reflection;
 using System.Text;
-using System.Threading.Tasks;
-using System.Xml.Linq;
 
 namespace WIDESEAWCS_Communicator
 {
@@ -43,6 +38,7 @@
     public class SiemensS7 : BaseCommunicator
     {
         #region Private Member
+
         /// <summary>
         /// HSLCommunication鐨勮タ闂ㄥ瓙鐨凷7鍗忚鐨勯�氳绫�
         /// </summary>
@@ -59,7 +55,7 @@
         private int _port;
 
         /// <summary>
-        /// 褰撳墠閫氳鍣ㄦ槸鍚﹀凡杩炴帴鍒癙LC銆�  
+        /// 褰撳墠閫氳鍣ㄦ槸鍚﹀凡杩炴帴鍒癙LC銆�
         /// </summary>
         private bool _connected;
 
@@ -71,11 +67,13 @@
         private ILogNet _logNet;
 
         private bool _isPing = true;
+
         #endregion Private Member
 
         #region Public Member
-        /// <summary>  
-        /// 鑾峰彇褰撳墠閫氳鍣ㄦ槸鍚﹀凡杩炴帴鍒癙LC銆�  
+
+        /// <summary>
+        /// 鑾峰彇褰撳墠閫氳鍣ㄦ槸鍚﹀凡杩炴帴鍒癙LC銆�
         /// </summary>
         public override bool IsConnected => _connected;
 
@@ -92,10 +90,12 @@
         /// <summary>
         /// 鏄惁鍦ㄥ啓鍏ユ暟鎹悗璇诲彇鏁版嵁纭銆�
         /// </summary>
-        public override bool IsReadAfterWrite { get; set; } = false;
+        public override bool IsReadAfterWrite { get; set; } = true;
+
         #endregion Public Member
 
         #region Constructor Function
+
         /// <summary>
         /// 鏋勯�犲嚱鏁�
         /// </summary>
@@ -118,9 +118,11 @@
             _port = port;//閫氳繃鏋勯�犲嚱鏁拌祴鍊艰繛鎺ヤ娇鐢ㄧ殑绔彛鍙�
             _name = name;
         }
+
         #endregion
 
         #region Private Method
+
         /// <summary>
         /// 浠嶰perateResult瀵硅薄涓幏鍙栬鍙栫殑鏁版嵁銆�
         /// </summary>
@@ -150,7 +152,7 @@
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="operateResult"></param>
@@ -221,25 +223,32 @@
             try
             {
                 Type type = value.GetType();
-
                 switch (Type.GetTypeCode(type))
                 {
                     case TypeCode.Int32:
                         return plc.Write(address, Convert.ToInt32(value));
+
                     case TypeCode.UInt32:
                         return plc.Write(address, Convert.ToUInt32(value));
+
                     case TypeCode.Int16:
                         return plc.Write(address, Convert.ToInt16(value));
+
                     case TypeCode.UInt16:
                         return plc.Write(address, Convert.ToUInt16(value));
+
                     case TypeCode.Single:
                         return plc.Write(address, Convert.ToSingle(value));
+
                     case TypeCode.Boolean:
                         return plc.Write(address, Convert.ToBoolean(value));
+
                     case TypeCode.Byte:
                         return plc.Write(address, Convert.ToByte(value));
+
                     case TypeCode.String:
                         return plc.Write(address, Convert.ToString(value));
+
                     case TypeCode.Char:
                         return plc.Write(address, Convert.ToChar(value));
                     //case TypeCode.arr:
@@ -302,44 +311,53 @@
                             return (int[])GetContent(plc.ReadInt32(address, length), address);
                         else
                             return (int)GetContent(plc.ReadInt32(address), address);
+
                     case TypeCode.UInt32:
                         if (length > 1)
                             return (uint[])GetContent(plc.ReadUInt32(address, length), address);
                         else
                             return (uint)GetContent(plc.ReadUInt32(address), address);
+
                     case TypeCode.Int16:
                         if (length > 1)
                             return (short[])GetContent(plc.ReadInt16(address, length), address);
                         else
                             return (short)GetContent(plc.ReadInt16(address), address);
+
                     case TypeCode.UInt16:
                         if (length > 1)
                             return (ushort[])GetContent(plc.ReadUInt16(address, length), address);
                         else
                             return (ushort)GetContent(plc.ReadUInt16(address), address);
+
                     case TypeCode.Single:
                         if (length > 1)
                             return (float[])GetContent(plc.ReadFloat(address, length), address);
                         else
                             return (float)GetContent(plc.ReadFloat(address), address);
+
                     case TypeCode.Boolean:
                         if (length > 1)
                             return (bool[])GetContent(plc.ReadBool(address, length), address);
                         else
                             return (bool)GetContent(plc.ReadBool(address), address);
+
                     case TypeCode.Byte:
                         if (length > 1)
                             return (byte)GetContent(plc.Read(address, length), address);
                         return (byte)GetContent(plc.ReadByte(address), address);
+
                     case TypeCode.String:
                         if (length > 1)
                             return (string)GetContent(plc.ReadString(address, length), address);
                         else
                             return (string)GetContent(plc.ReadString(address), address);
+
                     case TypeCode.Char:
                         if (length > 1)
                             return Encoding.Default.GetString((byte[])GetContent(plc.Read(address, length), address)).ToArray();
                         return (char)GetContent(plc.ReadByte(address), address);
+
                     default:
                         throw new CommunicationException(string.Format(CommunicationExceptionMessage.DataTypeErrorException, typeCode.ToString(), address), CommunicationErrorType.TypeError);
                 }
@@ -376,14 +394,15 @@
                     }
                 }
             });
-
         }
+
         #endregion
 
         #region Public Method
-        /// <summary>  
+
+        /// <summary>
         /// 杩炴帴鍒癙LC銆�
-        /// </summary>  
+        /// </summary>
         /// <returns>濡傛灉杩炴帴鎴愬姛鍒欒繑鍥瀟rue锛屽惁鍒欒繑鍥瀎alse銆�</returns>
         /// <exception cref="CommunicationException">鑷畾涔夐�氳寮傚父绫�</exception>
         public override bool Connect()
@@ -416,10 +435,10 @@
             }
         }
 
-        /// <summary>  
-        /// 鏂紑涓庡伐涓氳澶囩殑杩炴帴銆�  
-        /// </summary>  
-        /// <returns>濡傛灉鎴愬姛鏂紑杩炴帴鍒欒繑鍥瀟rue锛屽鏋滃凡缁忔槸鏂紑鐘舵�佸垯杩斿洖false銆�</returns>  
+        /// <summary>
+        /// 鏂紑涓庡伐涓氳澶囩殑杩炴帴銆�
+        /// </summary>
+        /// <returns>濡傛灉鎴愬姛鏂紑杩炴帴鍒欒繑鍥瀟rue锛屽鏋滃凡缁忔槸鏂紑鐘舵�佸垯杩斿洖false銆�</returns>
         public override bool Disconnect()
         {
             try
@@ -442,12 +461,13 @@
         }
 
         #region Read
-        /// <summary>  
-        /// 浠嶱LC璇诲彇鏁版嵁銆�  
-        /// </summary>  
-        /// <param name="address">婧愬湴鍧�锛屽叿浣撴牸寮忓彇鍐充簬浣跨敤鐨勫伐涓氬崗璁��</param>  
-        /// <param name="length">瑕佽鍙栫殑鏁版嵁闀垮害銆�</param>  
-        /// <returns>璇诲彇鍒扮殑鏁版嵁锛屽鏋滆鍙栧け璐ュ垯鍙兘杩斿洖null銆佺┖鏁扮粍鎴栨姏鍑鸿嚜瀹氫箟閫氳寮傚父銆�</returns>  
+
+        /// <summary>
+        /// 浠嶱LC璇诲彇鏁版嵁銆�
+        /// </summary>
+        /// <param name="address">婧愬湴鍧�锛屽叿浣撴牸寮忓彇鍐充簬浣跨敤鐨勫伐涓氬崗璁��</param>
+        /// <param name="length">瑕佽鍙栫殑鏁版嵁闀垮害銆�</param>
+        /// <returns>璇诲彇鍒扮殑鏁版嵁锛屽鏋滆鍙栧け璐ュ垯鍙兘杩斿洖null銆佺┖鏁扮粍鎴栨姏鍑鸿嚜瀹氫箟閫氳寮傚父銆�</returns>
         /// <exception cref="CommunicationException">鑷畾涔夐�氳寮傚父绫�</exception>
         public override byte[] Read(string address, int length)
         {
@@ -469,7 +489,7 @@
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="address"></param>
@@ -495,9 +515,11 @@
             else
                 return Read(address, SiemensDBDataType.GetTypeCode(dataType));
         }
+
         #endregion
 
         #region Write
+
         /// <summary>
         /// 鍚慞LC鍐欏叆鏁版嵁銆�
         /// </summary>
@@ -528,7 +550,7 @@
         }
 
         /// <summary>
-        /// 
+        ///
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="address"></param>
@@ -539,7 +561,6 @@
         {
             return GetResult(Write(address, value), address, value);
         }
-
 
         public override bool Write<T>(string address, T[] values)
         {
@@ -573,6 +594,7 @@
                         obj = GetResult(Write(address, writeVal), address, writeVal);
                     }
                     break;
+
                 case SiemensDBDataType.DataType_DW:
                     {
                         uint writeVal;
@@ -587,6 +609,7 @@
                         obj = GetResult(Write(address, writeVal), address, writeVal);
                     }
                     break;
+
                 case SiemensDBDataType.DataType_Int:
                     {
                         short writeVal;
@@ -601,6 +624,7 @@
                         obj = GetResult(Write(address, writeVal), address, writeVal);
                     }
                     break;
+
                 case SiemensDBDataType.DataType_W:
                     {
                         ushort writeVal;
@@ -615,6 +639,7 @@
                         obj = GetResult(Write(address, writeVal), address, writeVal);
                     }
                     break;
+
                 case SiemensDBDataType.DataType_Float:
                     {
                         float writeVal;
@@ -629,6 +654,7 @@
                         obj = GetResult(Write(address, writeVal), address, writeVal);
                     }
                     break;
+
                 case SiemensDBDataType.DataType_Bool:
                     {
                         bool writeVal;
@@ -643,6 +669,7 @@
                         obj = GetResult(Write(address, writeVal), address, writeVal);
                     }
                     break;
+
                 case SiemensDBDataType.DataType_Byte:
                     {
                         byte writeVal;
@@ -657,6 +684,7 @@
                         obj = GetResult(Write(address, writeVal), address, writeVal);
                     }
                     break;
+
                 case SiemensDBDataType.DataType_String:
                     {
                         string writeVal;
@@ -672,6 +700,7 @@
                     }
 
                     break;
+
                 case SiemensDBDataType.DataType_Char:
 
                     break;
@@ -690,14 +719,17 @@
                         obj = GetResult(Write(address, writeVal), address, writeVal);
                     }
                     break;
+
                 default:
                     throw new CommunicationException(string.Format(CommunicationExceptionMessage.DataTypeErrorException, dataType, address), CommunicationErrorType.TypeError);
             }
             return obj;
         }
+
         #endregion
 
         #region ReadCustomer
+
         /// <summary>
         /// 璇诲彇鑷畾涔夌殑鏁版嵁绫诲瀷锛岄渶瑕佺户鎵胯嚜IDataTransfer鎺ュ彛锛岃繑鍥炰竴涓柊鐨勭被鍨嬬殑瀹炰緥瀵硅薄銆�
         /// </summary>
@@ -716,9 +748,11 @@
                 throw new CommunicationException(ex.Message, CommunicationErrorType.ReadException, innerException: ex);
             }
         }
+
         #endregion
 
         #region WriteCustomer
+
         /// <summary>
         /// 鍐欏叆鑷畾涔夌被鍨嬬殑鏁版嵁锛岃绫诲瀷蹇呴』缁ф壙鑷狪DataTransfer鎺ュ彛銆�
         /// </summary>
@@ -785,6 +819,7 @@
                 LogNet.WriteInfo(Name, stringBuilder.ToString());
             }
         }
+
         #endregion
 
         /// <summary>
@@ -829,29 +864,36 @@
                 case TypeCode.Int16:
                     OperateResult<TimeSpan> operateResultShort = plc.Wait(address, Convert.ToInt16(value), readInterval, waitTimeout);
                     return operateResultShort;
+
                 case TypeCode.Int32:
                     OperateResult<TimeSpan> operateResultInt = plc.Wait(address, Convert.ToInt16(value), readInterval, waitTimeout);
                     return operateResultInt;
+
                 case TypeCode.UInt16:
                     OperateResult<TimeSpan> operateResultUShort = plc.Wait(address, Convert.ToInt16(value), readInterval, waitTimeout);
                     return operateResultUShort;
+
                 case TypeCode.UInt32:
                     OperateResult<TimeSpan> operateResultUInt = plc.Wait(address, Convert.ToInt16(value), readInterval, waitTimeout);
                     return operateResultUInt;
+
                 default:
                     throw new NotSupportedException();
             }
         }
+
         #endregion
 
         #region Destruction Function
+
         /// <summary>
-        /// 鏋愭瀯鍑芥暟锛岀‘淇濆湪涓嶅啀闇�瑕佹椂鍏抽棴杩炴帴  
+        /// 鏋愭瀯鍑芥暟锛岀‘淇濆湪涓嶅啀闇�瑕佹椂鍏抽棴杩炴帴
         /// </summary>
         ~SiemensS7()
         {
             Dispose();
         }
+
         #endregion
     }
-}
+}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
index c7d972f..3502c79 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/RobotTaskService.cs
@@ -1,76 +1,77 @@
-锘�#region << 鐗� 鏈� 娉� 閲� >>
-
-/*----------------------------------------------------------------
- * 鍛藉悕绌洪棿锛歐IDESEAWCS_TaskInfoService
- * 鍒涘缓鑰咃細鑳$搴�
- * 鍒涘缓鏃堕棿锛�2024/8/2 16:13:36
- * 鐗堟湰锛歏1.0.0
- * 鎻忚堪锛�
- *
- * ----------------------------------------------------------------
- * 淇敼浜猴細
- * 淇敼鏃堕棿锛�
- * 鐗堟湰锛歏1.0.1
- * 淇敼璇存槑锛�
- *
- *----------------------------------------------------------------*/
-
-#endregion << 鐗� 鏈� 娉� 閲� >>
-
-using MapsterMapper;
-using Microsoft.Extensions.Configuration;
-using Newtonsoft.Json;
-using Serilog;
-using SqlSugar;
-using System.Diagnostics;
-using System.Diagnostics.CodeAnalysis;
-using WIDESEA_Core;
-using WIDESEAWCS_Common.HttpEnum;
-using WIDESEAWCS_Common.TaskEnum;
-using WIDESEAWCS_Core;
-using WIDESEAWCS_Core.BaseServices;
-using WIDESEAWCS_Core.Enums;
-using WIDESEAWCS_Core.Helper;
-using WIDESEAWCS_Core.Utilities;
-using WIDESEAWCS_DTO.Stock;
-using WIDESEAWCS_DTO.TaskInfo;
-using WIDESEAWCS_ITaskInfoRepository;
-using WIDESEAWCS_ITaskInfoService;
-using WIDESEAWCS_Model.Models;
-using WIDESEAWCS_QuartzJob;
-using WIDESEAWCS_QuartzJob.DTO;
-using WIDESEAWCS_Tasks;
-
-namespace WIDESEAWCS_TaskInfoService
-{
-    public class RobotTaskService : ServiceBase<Dt_RobotTask, IRobotTaskRepository>, IRobotTaskService
-    {
-        private readonly IMapper _mapper;
-        private readonly HttpClientHelper _httpClientHelper;
-        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
-        private readonly ILogger _logger;
-
-        private Dictionary<string, OrderByType> _taskOrderBy = new()
-            {
-                {nameof(Dt_RobotTask.RobotGrade),OrderByType.Desc },
-                {nameof(Dt_RobotTask.CreateDate),OrderByType.Asc},
-            };
-
-        public Dictionary<string, OrderByType> TaskOrderBy
-        { get { return _taskOrderBy; } set { _taskOrderBy = value; } }
-
-        public List<int> TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList();
-
-        public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList();
-
-        public List<int> TaskRobotTypes => typeof(TaskOtherTypeEnum).GetEnumIndexList();
-
-        public RobotTaskService(IRobotTaskRepository BaseDal, IMapper mapper, HttpClientHelper httpClientHelper, ITaskExecuteDetailService taskExecuteDetailService, ILogger logger) : base(BaseDal)
-        {
-            _mapper = mapper;
-            _httpClientHelper = httpClientHelper;
-            _taskExecuteDetailService = taskExecuteDetailService;
-            _logger = logger;
+锘�#region << 鐗� 鏈� 娉� 閲� >>
+
+/*----------------------------------------------------------------
+ * 鍛藉悕绌洪棿锛歐IDESEAWCS_TaskInfoService
+ * 鍒涘缓鑰咃細鑳$搴�
+ * 鍒涘缓鏃堕棿锛�2024/8/2 16:13:36
+ * 鐗堟湰锛歏1.0.0
+ * 鎻忚堪锛�
+ *
+ * ----------------------------------------------------------------
+ * 淇敼浜猴細
+ * 淇敼鏃堕棿锛�
+ * 鐗堟湰锛歏1.0.1
+ * 淇敼璇存槑锛�
+ *
+ *----------------------------------------------------------------*/
+
+#endregion << 鐗� 鏈� 娉� 閲� >>
+
+using MapsterMapper;
+using Microsoft.Extensions.Configuration;
+using Newtonsoft.Json;
+using Serilog;
+using SqlSugar;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using WIDESEA_Core;
+using WIDESEAWCS_Common;
+using WIDESEAWCS_Common.HttpEnum;
+using WIDESEAWCS_Common.TaskEnum;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.BaseServices;
+using WIDESEAWCS_Core.Enums;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_Core.Utilities;
+using WIDESEAWCS_DTO.Stock;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_ITaskInfoRepository;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_QuartzJob;
+using WIDESEAWCS_QuartzJob.DTO;
+using WIDESEAWCS_Tasks;
+
+namespace WIDESEAWCS_TaskInfoService
+{
+    public class RobotTaskService : ServiceBase<Dt_RobotTask, IRobotTaskRepository>, IRobotTaskService
+    {
+        private readonly IMapper _mapper;
+        private readonly HttpClientHelper _httpClientHelper;
+        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
+        private readonly ILogger _logger;
+
+        private Dictionary<string, OrderByType> _taskOrderBy = new()
+            {
+                {nameof(Dt_RobotTask.RobotGrade),OrderByType.Desc },
+                {nameof(Dt_RobotTask.CreateDate),OrderByType.Asc},
+            };
+
+        public Dictionary<string, OrderByType> TaskOrderBy
+        { get { return _taskOrderBy; } set { _taskOrderBy = value; } }
+
+        public List<int> TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList();
+
+        public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList();
+
+        public List<int> TaskRobotTypes => typeof(TaskOtherTypeEnum).GetEnumIndexList();
+
+        public RobotTaskService(IRobotTaskRepository BaseDal, IMapper mapper, HttpClientHelper httpClientHelper, ITaskExecuteDetailService taskExecuteDetailService, ILogger logger) : base(BaseDal)
+        {
+            _mapper = mapper;
+            _httpClientHelper = httpClientHelper;
+            _taskExecuteDetailService = taskExecuteDetailService;
+            _logger = logger;
         }
         public override WebResponseContent DeleteData(object[] keys)
         {
@@ -84,330 +85,368 @@
             return WebResponseContent.Instance.OK($"鎴愬姛鍒犻櫎{tasks.Count}鏉℃暟鎹�");
 
         }
-        public bool DeleteRobotTask(int id)
-        {
-            Dt_RobotTask task = BaseDal.QueryFirst(x => x.RobotTaskId == id);
-            return BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
-        }
-
-        public WebResponseContent ReceiveWMSTask([NotNull] WMSTaskDTO taskDTO, StockDTO stockDTO)
-        {
-            WebResponseContent content = new WebResponseContent();
-            try
-            {
-                if (BaseDal.QueryFirst(x => x.RobotTaskNum == taskDTO.TaskNum || x.RobotSourceAddressPalletCode == taskDTO.PalletCode) != null)
-                {
-                    return content.Error("浠诲姟宸插瓨鍦�");
-                }
-
-                Dt_RobotTask task = new Dt_RobotTask
-                {
-                    RobotTaskNum = taskDTO.TaskNum,
-                    RobotSourceAddressLineCode = stockDTO?.SourceLineNo ?? string.Empty,
-                    RobotTargetAddressLineCode = stockDTO?.TargetLineNo ?? string.Empty,
-                    RobotRoadway = stockDTO?.Roadway ?? string.Empty,
-                    RobotSourceAddress = taskDTO.SourceAddress,
-                    RobotTargetAddress = taskDTO.TargetAddress,
-                    RobotSourceAddressPalletCode = stockDTO?.SourcePalletNo ?? string.Empty,
-                    RobotTargetAddressPalletCode = stockDTO?.TargetPalletNo ?? string.Empty,
-                    RobotTaskType = taskDTO.TaskType,
-                    RobotTaskState = taskDTO.TaskStatus,
-                    RobotGrade = taskDTO.Grade,
-                    Creater = "WMS",
-                    RobotTaskTotalNum = taskDTO.TaskQuantity,
-                };
-
-                BaseDal.AddData(task);
-
-                _taskExecuteDetailService.AddTaskExecuteDetail(new List<int> { task.RobotTaskNum }, "鎺ユ敹WMS浠诲姟");
-
-                content = WebResponseContent.Instance.OK("鎴愬姛", task);
-            }
-            catch (Exception ex)
-            {
-                content = WebResponseContent.Instance.Error($"浠诲姟鎺ユ敹閿欒,閿欒淇℃伅:{ex.Message}");
-            }
-            return content;
-        }
-
-        public Dt_RobotTask? QueryRobotCraneTask(string deviceCode)
-        {
-            return BaseDal.QueryFirst(x => x.RobotRoadway == deviceCode && x.RobotTaskState != (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy);
-        }
-
-        public Dt_RobotTask? QueryRobotCraneExecutingTask(string deviceCode)
-        {
-            return BaseDal.QueryFirst(x => x.RobotRoadway == deviceCode && x.RobotTaskState == (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy);
-        }
-
-        public async Task<bool> UpdateRobotTaskAsync(Dt_RobotTask robotTask)
-        {
-            return await BaseDal.UpdateDataAsync(robotTask);
-        }
-
-        /// <summary>
-        /// 鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔�
-        /// </summary>
-        /// <param name="task"></param>
-        /// <returns></returns>
-        public WebResponseContent GetWMSRobotTask(Dt_Task task)
-        {
-            string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
-            StockDTO stock = BuildRobotTaskStock(task, configKey);
-            string requestParam = stock.ToJson();
-            var stopwatch = Stopwatch.StartNew();
-
-            var result = _httpClientHelper.Post<WebResponseContent>(configKey, requestParam);
-            stopwatch.Stop();
-            if (!result.IsSuccess || !result.Data.Status)
-            {
-                QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵configKey}銆�,璇锋眰鍙傛暟:銆恵requestParam}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�", "RobotTaskService");
-                return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,鐩爣鍦板潃:銆恵task.TargetAddress}銆�,鎺ュ彛:銆恵configKey}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
-            }
-
-            QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵configKey}銆�,鍝嶅簲鏁版嵁:銆恵result.Data?.Data}銆�,鑰楁椂:{stopwatch.ElapsedMilliseconds}ms", "RobotTaskService");
-
-            var wMSTask = JsonConvert.DeserializeObject<WMSTaskDTO>(result?.Data?.Data?.ToString() ?? string.Empty);
-            if (wMSTask == null)
-                return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆怶MS鏈繑鍥炴湁鏁堜换鍔℃暟鎹��");
-
-            return ReceiveWMSTask(wMSTask, stock);
-        }
-
-        /// <summary>
-        /// 鍦ㄦ湰鍦扮洿鎺ュ垱寤烘満姊版墜浠诲姟锛屼笉璋冪敤WMS鎺ュ彛銆�
-        /// 鏍规嵁鐩爣鍦板潃瑙f瀽浠诲姟绫诲瀷锛屾瀯寤轰换鍔℃暟鎹苟鍐欏叆鏁版嵁搴撱��
-        /// </summary>
-        /// <param name="task">鍑哄簱浠诲姟瀹炰綋</param>
-        /// <returns>鎿嶄綔缁撴灉</returns>
-        public WebResponseContent CreateLocalRobotTask(Dt_Task task)
-        {
-            WebResponseContent content = new();
-            try
-            {
-                // 鏍规嵁鐩爣鍦板潃瑙f瀽浠诲姟绫诲瀷閰嶇疆閿�
-                string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
-
-                // 鏋勫缓Stock鏁版嵁
-                StockDTO stock = BuildRobotTaskStock(task, configKey);
-
-                // 鑾峰彇鎶撳彇鍜屾斁缃湴鍧�鐨勭嚎浣撻厤缃紙濡傛灉鏈夛級
-                var section = App.Configuration.GetSection("RobotAddressRules").GetSection(stock?.TargetLineNo ?? string.Empty).GetChildren().Select(c => c.Value).ToArray();
-                if (section.Length < 2)
-                    return WebResponseContent.Instance.Error($"鏈壘鍒扮嚎浣揫{stock?.TargetLineNo}]鐨勫湴鍧�閰嶇疆");
-
-                int taskType = MapConfigKeyToRobotTaskType(configKey);
-                // 鍒涘缓鏈湴鏈哄櫒浜轰换鍔�
-                Dt_RobotTask robotTask = new()
-                {
-                    RobotTaskNum = Random.Shared.Next(),
-                    RobotSourceAddress = section[0]!,
-                    RobotTargetAddress = section[1]!,
-                    RobotSourceAddressLineCode = stock?.SourceLineNo ?? string.Empty,
-                    RobotTargetAddressLineCode = stock?.TargetLineNo ?? string.Empty,
-                    RobotRoadway = stock?.TargetLineNo == "11068" ? "娉ㄦ恫缁勭洏鏈烘鎵�" : "鎹㈢洏鏈烘鎵�" ?? string.Empty, // todo
-                    RobotSourceAddressPalletCode = stock?.SourcePalletNo ?? string.Empty,
-                    RobotTargetAddressPalletCode = stock?.TargetPalletNo ?? string.Empty,
-                    RobotTaskType = taskType,
-                    RobotTaskState = (int)TaskRobotStatusEnum.RobotNew,
-                    RobotGrade = task.Grade,
-                    Creater = "WCS_Local",
-                    RobotTaskTotalNum = taskType == (int)RobotTaskTypeEnum.GroupPallet ? 48 : 1,
-                    CreateDate = DateTime.Now
-                };
-
-                BaseDal.AddData(robotTask);
-
-                _taskExecuteDetailService.AddTaskExecuteDetail(new List<int> { robotTask.RobotTaskNum }, "鏈湴鍒涘缓鏈哄櫒浜轰换鍔�");
-
-                QuartzLogHelper.LogInfo(_logger, $"鏈湴鍒涘缓鏈哄櫒浜轰换鍔℃垚鍔�,浠诲姟鍙�:銆恵robotTask.RobotTaskNum}銆�,婧愬湴鍧�:銆恵robotTask.RobotSourceAddress}銆�,鐩爣鍦板潃:銆恵robotTask.RobotTargetAddress}銆�,浠诲姟绫诲瀷:銆恵configKey}銆�", "RobotTaskService");
-
-                content = WebResponseContent.Instance.OK("鏈湴鍒涘缓鏈哄櫒浜轰换鍔℃垚鍔�", robotTask);
-            }
-            catch (Exception ex)
-            {
-                QuartzLogHelper.LogError(_logger, $"鏈湴鍒涘缓鏈哄櫒浜轰换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:{ex.Message}", "RobotTaskService");
-                content = WebResponseContent.Instance.Error($"鏈湴鍒涘缓鏈哄櫒浜轰换鍔″け璐�,閿欒淇℃伅:{ex.Message}");
-            }
-            return content;
-        }
-
-        /// <summary>
-        /// 灏嗛厤缃敭鏄犲皠鍒版満姊版墜浠诲姟绫诲瀷鏋氫妇鍊笺��
-        /// </summary>
-        /// <param name="configKey">閰嶇疆閿悕绉�</param>
-        /// <returns>浠诲姟绫诲瀷鏋氫妇鍊�</returns>
-        public int MapConfigKeyToRobotTaskType(string? configKey)
-        {
-            return configKey switch
-            {
-                nameof(ConfigKey.CreateRobotGroupPalletTask) => (int)RobotTaskTypeEnum.GroupPallet,
-                nameof(ConfigKey.CreateRobotSplitPalletTask) => (int)RobotTaskTypeEnum.SplitPallet,
-                _ => (int)RobotTaskTypeEnum.ChangePallet
-            };
-        }
-
-        /// <summary>
-        /// 鏍规嵁杈撻�佺嚎鐩爣鍦板潃瑙f瀽鏈烘鎵嬩换鍔℃帴鍙c��
-        /// 瑙勫垯锛�
-        /// 1. 浠庨厤缃鍙栫簿纭湴鍧�鏄犲皠锛圓ddressMap锛�
-        /// 2. 鏈懡涓椂榛樿鎹㈢洏
-        /// </summary>
-        public string ResolveRobotTaskConfigKey(string? targetAddress)
-        {
-            string address = (targetAddress ?? string.Empty).Trim();
-            if (string.IsNullOrWhiteSpace(address))
-                return nameof(ConfigKey.CreateRobotChangePalletTask);
-
-            var section = App.Configuration.GetSection("RobotTaskAddressRules");
-            var addressMap = ReadRobotRuleMap(section.GetSection("AddressMap"));
-            if (addressMap.TryGetValue(address, out string? exactTaskType))
-                return MapRobotTaskTypeToConfigKey(exactTaskType);
-
-            return nameof(ConfigKey.CreateRobotChangePalletTask);
-        }
-
-        public int MapWarehouseIdConfigKey(string? targetAddress)
-        {
-            return targetAddress switch
-            {
-                "11068" => 1,
-                "11001" => 3,
-                "11010" => 3,
-                "10010" => 1,
-                "10030" => 1,
-                _ => 1
-            };
-        }
-
-        /// <summary>
-        /// 灏嗛厤缃换鍔$被鍨嬭浆鎹负鎺ュ彛閰嶇疆閿��
-        /// 鏀寔鍊硷細Split/Group/Change锛堝ぇ灏忓啓涓嶆晱鎰燂級
-        /// </summary>
-        public string MapRobotTaskTypeToConfigKey(string? taskType)
-        {
-            string type = (taskType ?? string.Empty).Trim().ToLowerInvariant();
-            return type switch
-            {
-                "split" => nameof(ConfigKey.CreateRobotSplitPalletTask),
-                "group" => nameof(ConfigKey.CreateRobotGroupPalletTask),
-                _ => nameof(ConfigKey.CreateRobotChangePalletTask)
-            };
-        }
-
-        /// <summary>
-        /// 鏍规嵁鎺ュ彛绫诲瀷鏋勫缓鏈烘鎵嬩换鍔″叆鍙傘��
-        /// </summary>
-        public StockDTO BuildRobotTaskStock(Dt_Task task, string configKey)
-        {
-            string targetAddress = task.TargetAddress ?? string.Empty;
-            string roadway = ResolveRobotRuleValue(targetAddress, "AddressRoadwayMap", task.Roadway);
-            string sourceLineNo = ResolveRobotRuleValue(targetAddress, "AddressSourceLineNoMap", task.SourceAddress);
-
-            var stock = new StockDTO
-            {
-                Roadway = roadway,
-                SourceLineNo = sourceLineNo,
-                TargetLineNo = task.TargetAddress,
-                SourcePalletNo = task.PalletCode,
-                TargetPalletNo = task.PalletCode
-            };
-
-            if (configKey == nameof(ConfigKey.CreateRobotSplitPalletTask))
-            {
-                stock.TargetPalletNo = string.Empty;
-            }
-            else if (configKey == nameof(ConfigKey.CreateRobotGroupPalletTask))
-            {
-                stock.SourcePalletNo = string.Empty;
-            }
-            else if (configKey == nameof(ConfigKey.CreateRobotChangePalletTask))
-            {
-                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceLineNo));
-                if (device != null)
-                {
-                    CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
-
-                    DeviceProDTO? devicePro = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(ConveyorLineDBNameNew.Barcode) && x.DeviceChildCode == sourceLineNo);
-                    //ConveyorLineTaskCommandNew command = conveyorLine.ReadCustomer<ConveyorLineTaskCommandNew>(sourceLineNo);  // 娴嬭瘯鐢�
-                    var barcode = conveyorLine.GetValue<ConveyorLineDBNameNew, string>(ConveyorLineDBNameNew.Barcode, sourceLineNo);
-                    stock.SourcePalletNo = string.IsNullOrEmpty(barcode) ? string.Empty : barcode;
-                }
-            }
-
-            return stock;
-        }
-
-        public override WebResponseContent AddData(SaveModel saveModel)
-        {
-            try
-            {
-                if (saveModel == null || saveModel.MainData == null || saveModel.MainData.Count == 0)
-                {
-                    return WebResponseContent.Instance.Error("浼犲弬閿欒,鍙傛暟涓嶈兘涓虹┖");
-                }
-
-                string validResult = typeof(Dt_RobotTask).ValidateDicInEntity(saveModel.MainData, true, TProperties);
-                if (!string.IsNullOrEmpty(validResult))
-                {
-                    return WebResponseContent.Instance.Error(validResult);
-                }
-
-                object? taskNumObj = saveModel.MainData[nameof(Dt_RobotTask.RobotTaskNum)];
-                if (taskNumObj != null)
-                {
-                    int taskNum = Convert.ToInt32(taskNumObj);
-                    if (BaseDal.QueryFirst(x => x.RobotTaskNum == taskNum) != null)
-                    {
-                        return WebResponseContent.Instance.Error($"浠诲姟缂栧彿 {taskNum} 宸插瓨鍦�");
-                    }
-                }
-
-                Dt_RobotTask entity = saveModel.MainData.DicToModel<Dt_RobotTask>();
-                entity.Creater = "鎵嬪姩鍒涘缓";
-                entity.CreateDate = DateTime.Now;
-
-                if (saveModel.DetailData == null || saveModel.DetailData.Count == 0)
-                {
-                    BaseDal.AddData(entity);
-                    return WebResponseContent.Instance.OK("鏂板鎴愬姛", entity);
-                }
-
-                return base.AddData(saveModel);
-            }
-            catch (Exception ex)
-            {
-                return WebResponseContent.Instance.Error($"鏂板澶辫触,閿欒淇℃伅:{ex.Message}");
-            }
-        }
-
-        /// <summary>
-        /// 鏍规嵁鐩爣鍦板潃鎸夈�岀簿纭� > 鍥為��鍊笺�嶈В鏋愯鍒欏�笺��
-        /// </summary>
-        public string ResolveRobotRuleValue(string? targetAddress, string addressSectionName, string? fallback)
-        {
-            string address = (targetAddress ?? string.Empty).Trim();
-            string defaultValue = fallback ?? string.Empty;
-            if (string.IsNullOrWhiteSpace(address))
-                return defaultValue;
-
-            var section = App.Configuration.GetSection("RobotTaskAddressRules");
-            var addressMap = ReadRobotRuleMap(section.GetSection(addressSectionName));
-            if (addressMap.TryGetValue(address, out string? value))
-                return value;
-
-            return defaultValue;
-        }
-
-        /// <summary>
-        /// 璇诲彇瑙勫垯鏄犲皠娈点��
-        /// </summary>
-        private Dictionary<string, string> ReadRobotRuleMap(IConfigurationSection section)
-        {
-            return section
-                .GetChildren()
-                .Where(x => !string.IsNullOrWhiteSpace(x.Key) && !string.IsNullOrWhiteSpace(x.Value))
-                .ToDictionary(x => x.Key.Trim(), x => x.Value!.Trim());
-        }
-    }
+        public bool DeleteRobotTask(int id)
+        {
+            Dt_RobotTask task = BaseDal.QueryFirst(x => x.RobotTaskId == id);
+            return BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+        }
+
+        public WebResponseContent ReceiveWMSTask([NotNull] WMSTaskDTO taskDTO, StockDTO stockDTO)
+        {
+            WebResponseContent content = new WebResponseContent();
+            try
+            {
+                if (BaseDal.QueryFirst(x => x.RobotTaskNum == taskDTO.TaskNum || x.RobotSourceAddressPalletCode == taskDTO.PalletCode) != null)
+                {
+                    return content.Error("浠诲姟宸插瓨鍦�");
+                }
+
+                Dt_RobotTask task = new Dt_RobotTask
+                {
+                    RobotTaskNum = taskDTO.TaskNum,
+                    RobotSourceAddressLineCode = stockDTO?.SourceLineNo ?? string.Empty,
+                    RobotTargetAddressLineCode = stockDTO?.TargetLineNo ?? string.Empty,
+                    RobotRoadway = stockDTO?.Roadway ?? string.Empty,
+                    RobotSourceAddress = taskDTO.SourceAddress,
+                    RobotTargetAddress = taskDTO.TargetAddress,
+                    RobotSourceAddressPalletCode = stockDTO?.SourcePalletNo ?? string.Empty,
+                    RobotTargetAddressPalletCode = stockDTO?.TargetPalletNo ?? string.Empty,
+                    RobotTaskType = taskDTO.TaskType,
+                    RobotTaskState = taskDTO.TaskStatus,
+                    RobotGrade = taskDTO.Grade,
+                    Creater = "WMS",
+                    RobotTaskTotalNum = taskDTO.TaskQuantity,
+                };
+
+                BaseDal.AddData(task);
+
+                _taskExecuteDetailService.AddTaskExecuteDetail(new List<int> { task.RobotTaskNum }, "鎺ユ敹WMS浠诲姟");
+
+                content = WebResponseContent.Instance.OK("鎴愬姛", task);
+            }
+            catch (Exception ex)
+            {
+                content = WebResponseContent.Instance.Error($"浠诲姟鎺ユ敹閿欒,閿欒淇℃伅:{ex.Message}");
+            }
+            return content;
+        }
+
+        public Dt_RobotTask? QueryRobotCraneTask(string deviceCode)
+        {
+            return BaseDal.QueryFirst(x => x.RobotRoadway == deviceCode && x.RobotTaskState != (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy);
+        }
+
+        public Dt_RobotTask? QueryRobotCraneExecutingTask(string deviceCode)
+        {
+            return BaseDal.QueryFirst(x => x.RobotRoadway == deviceCode && x.RobotTaskState == (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy);
+        }
+
+        public async Task<bool> UpdateRobotTaskAsync(Dt_RobotTask robotTask)
+        {
+            return await BaseDal.UpdateDataAsync(robotTask);
+        }
+
+        /// <summary>
+        /// 鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔�
+        /// </summary>
+        /// <param name="task"></param>
+        /// <returns></returns>
+        public WebResponseContent GetWMSRobotTask(Dt_Task task)
+        {
+            string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
+            StockDTO stock = BuildRobotTaskStock(task, configKey);
+            string requestParam = stock.ToJson();
+            var stopwatch = Stopwatch.StartNew();
+
+            var result = _httpClientHelper.Post<WebResponseContent>(configKey, requestParam);
+            stopwatch.Stop();
+            if (!result.IsSuccess || !result.Data.Status)
+            {
+                QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵configKey}銆�,璇锋眰鍙傛暟:銆恵requestParam}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�", "RobotTaskService");
+                return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,鐩爣鍦板潃:銆恵task.TargetAddress}銆�,鎺ュ彛:銆恵configKey}銆�,閿欒淇℃伅:銆恵result.Data?.Message}銆�");
+            }
+
+            QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵configKey}銆�,鍝嶅簲鏁版嵁:銆恵result.Data?.Data}銆�,鑰楁椂:{stopwatch.ElapsedMilliseconds}ms", "RobotTaskService");
+
+            var wMSTask = JsonConvert.DeserializeObject<WMSTaskDTO>(result?.Data?.Data?.ToString() ?? string.Empty);
+            if (wMSTask == null)
+                return WebResponseContent.Instance.Error($"鑾峰彇WMS绯荤粺鏈烘鎵嬩换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,鎵樼洏鍙�:銆恵task.PalletCode}銆�,閿欒淇℃伅:銆怶MS鏈繑鍥炴湁鏁堜换鍔℃暟鎹��");
+
+            return ReceiveWMSTask(wMSTask, stock);
+        }
+
+        /// <summary>
+        /// 鍦ㄦ湰鍦扮洿鎺ュ垱寤烘満姊版墜浠诲姟锛屼笉璋冪敤WMS鎺ュ彛銆�
+        /// 鏍规嵁鐩爣鍦板潃瑙f瀽浠诲姟绫诲瀷锛屾瀯寤轰换鍔℃暟鎹苟鍐欏叆鏁版嵁搴撱��
+        /// </summary>
+        /// <param name="task">鍑哄簱浠诲姟瀹炰綋</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        public WebResponseContent CreateLocalRobotTask(Dt_Task task)
+        {
+            WebResponseContent content = new();
+            try
+            {
+                // 鏍规嵁鐩爣鍦板潃瑙f瀽浠诲姟绫诲瀷閰嶇疆閿�
+                string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
+
+                // 鏋勫缓Stock鏁版嵁
+                StockDTO stock = BuildRobotTaskStock(task, configKey);
+
+                // 鑾峰彇鎶撳彇鍜屾斁缃湴鍧�鐨勭嚎浣撻厤缃紙濡傛灉鏈夛級
+                var section = App.Configuration.GetSection("RobotAddressRules").GetSection(stock?.TargetLineNo ?? string.Empty).GetChildren().Select(c => c.Value).ToArray();
+                if (section.Length < 2)
+                    return WebResponseContent.Instance.Error($"鏈壘鍒扮嚎浣揫{stock?.TargetLineNo}]鐨勫湴鍧�閰嶇疆");
+
+                int taskType = MapConfigKeyToRobotTaskType(configKey);
+                // 鍒涘缓鏈湴鏈哄櫒浜轰换鍔�
+                Dt_RobotTask robotTask = new()
+                {
+                    RobotTaskNum = Random.Shared.Next(),
+                    RobotSourceAddress = section[0]!,
+                    RobotTargetAddress = section[1]!,
+                    RobotSourceAddressLineCode = stock?.SourceLineNo ?? string.Empty,
+                    RobotTargetAddressLineCode = stock?.TargetLineNo ?? string.Empty,
+                    RobotRoadway = stock?.TargetLineNo switch
+                    {
+                        "11068" => "娉ㄦ恫缁勭洏鏈烘鎵�",
+                        "1000" => "鎷嗙洏鏈烘鎵�",
+                        "2000" => "鎴愬搧缁勭洏鏈烘鎵�",
+                        _ => "鎹㈢洏鏈烘鎵�"
+                    },
+                    RobotSourceAddressPalletCode = stock?.SourcePalletNo ?? string.Empty,
+                    RobotTargetAddressPalletCode = stock?.TargetPalletNo ?? string.Empty,
+                    RobotTaskType = taskType,
+                    RobotTaskState = (int)TaskRobotStatusEnum.RobotNew,
+                    RobotGrade = task.Grade,
+                    Creater = "WCS_Local",
+                    RobotTaskTotalNum = GetRobotTaskTotalNum(taskType, stock.SourcePalletNo),
+                    CreateDate = DateTime.Now
+                };
+
+                BaseDal.AddData(robotTask);
+
+                _taskExecuteDetailService.AddTaskExecuteDetail(new List<int> { robotTask.RobotTaskNum }, "鏈湴鍒涘缓鏈哄櫒浜轰换鍔�");
+
+                QuartzLogHelper.LogInfo(_logger, $"鏈湴鍒涘缓鏈哄櫒浜轰换鍔℃垚鍔�,浠诲姟鍙�:銆恵robotTask.RobotTaskNum}銆�,婧愬湴鍧�:銆恵robotTask.RobotSourceAddress}銆�,鐩爣鍦板潃:銆恵robotTask.RobotTargetAddress}銆�,浠诲姟绫诲瀷:銆恵configKey}銆�", "RobotTaskService");
+
+                content = WebResponseContent.Instance.OK("鏈湴鍒涘缓鏈哄櫒浜轰换鍔℃垚鍔�", robotTask);
+            }
+            catch (Exception ex)
+            {
+                QuartzLogHelper.LogError(_logger, $"鏈湴鍒涘缓鏈哄櫒浜轰换鍔″け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:{ex.Message}", "RobotTaskService");
+                content = WebResponseContent.Instance.Error($"鏈湴鍒涘缓鏈哄櫒浜轰换鍔″け璐�,閿欒淇℃伅:{ex.Message}");
+            }
+            return content;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏈烘鎵嬩换鍔℃�绘暟閲忋��
+        /// 缁勭洏浠诲姟鍥哄畾48锛屾崲鐩樺拰鎷嗙洏浠诲姟閫氳繃鎵樼洏鍙锋煡璇MS搴撳瓨鏄庣粏鏁伴噺銆�
+        /// </summary>
+        private int GetRobotTaskTotalNum(int taskType, string? palletCode)
+        {
+            if (taskType == (int)RobotTaskTypeEnum.GroupPallet)
+                return 48;
+
+            if (string.IsNullOrWhiteSpace(palletCode))
+                return 1;
+
+            try
+            {
+                string url = $"{BaseAPI.WMSBaseUrl}Stock/GetStockDetailCount?palletCode={Uri.EscapeDataString(palletCode)}";
+                var result = _httpClientHelper.Get(url);
+                if (!result.IsSuccess || string.IsNullOrEmpty(result.Content))
+                    return 1;
+
+                var response = JsonConvert.DeserializeObject<WebResponseContent>(result.Content);
+                if (response == null || !response.Status)
+                    return 1;
+
+                var detailCount = response.Data?.GetType().GetProperty("DetailCount")?.GetValue(response.Data);
+                return detailCount is int count and > 0 ? count : 1;
+            }
+            catch
+            {
+                return 1;
+            }
+        }
+
+        /// <summary>
+        /// 灏嗛厤缃敭鏄犲皠鍒版満姊版墜浠诲姟绫诲瀷鏋氫妇鍊笺��
+        /// </summary>
+        /// <param name="configKey">閰嶇疆閿悕绉�</param>
+        /// <returns>浠诲姟绫诲瀷鏋氫妇鍊�</returns>
+        public int MapConfigKeyToRobotTaskType(string? configKey)
+        {
+            return configKey switch
+            {
+                nameof(ConfigKey.CreateRobotGroupPalletTask) => (int)RobotTaskTypeEnum.GroupPallet,
+                nameof(ConfigKey.CreateRobotSplitPalletTask) => (int)RobotTaskTypeEnum.SplitPallet,
+                _ => (int)RobotTaskTypeEnum.ChangePallet
+            };
+        }
+
+        /// <summary>
+        /// 鏍规嵁杈撻�佺嚎鐩爣鍦板潃瑙f瀽鏈烘鎵嬩换鍔℃帴鍙c��
+        /// 瑙勫垯锛�
+        /// 1. 浠庨厤缃鍙栫簿纭湴鍧�鏄犲皠锛圓ddressMap锛�
+        /// 2. 鏈懡涓椂榛樿鎹㈢洏
+        /// </summary>
+        public string ResolveRobotTaskConfigKey(string? targetAddress)
+        {
+            string address = (targetAddress ?? string.Empty).Trim();
+            if (string.IsNullOrWhiteSpace(address))
+                return nameof(ConfigKey.CreateRobotChangePalletTask);
+
+            var section = App.Configuration.GetSection("RobotTaskAddressRules");
+            var addressMap = ReadRobotRuleMap(section.GetSection("AddressMap"));
+            if (addressMap.TryGetValue(address, out string? exactTaskType))
+                return MapRobotTaskTypeToConfigKey(exactTaskType);
+
+            return nameof(ConfigKey.CreateRobotChangePalletTask);
+        }
+
+        public int MapWarehouseIdConfigKey(string? targetAddress)
+        {
+            return targetAddress switch
+            {
+                "11068" => 1,
+                "11001" => 3,
+                "11010" => 3,
+                "10010" => 1,
+                "10030" => 1,
+                _ => 1
+            };
+        }
+
+        /// <summary>
+        /// 灏嗛厤缃换鍔$被鍨嬭浆鎹负鎺ュ彛閰嶇疆閿��
+        /// 鏀寔鍊硷細Split/Group/Change锛堝ぇ灏忓啓涓嶆晱鎰燂級
+        /// </summary>
+        public string MapRobotTaskTypeToConfigKey(string? taskType)
+        {
+            string type = (taskType ?? string.Empty).Trim().ToLowerInvariant();
+            return type switch
+            {
+                "split" => nameof(ConfigKey.CreateRobotSplitPalletTask),
+                "group" => nameof(ConfigKey.CreateRobotGroupPalletTask),
+                _ => nameof(ConfigKey.CreateRobotChangePalletTask)
+            };
+        }
+
+        /// <summary>
+        /// 鏍规嵁鎺ュ彛绫诲瀷鏋勫缓鏈烘鎵嬩换鍔″叆鍙傘��
+        /// </summary>
+        public StockDTO BuildRobotTaskStock(Dt_Task task, string configKey)
+        {
+            string targetAddress = task.TargetAddress ?? string.Empty;
+            string roadway = ResolveRobotRuleValue(targetAddress, "AddressRoadwayMap", task.Roadway);
+            string sourceLineNo = ResolveRobotRuleValue(targetAddress, "AddressSourceLineNoMap", task.SourceAddress);
+
+            var stock = new StockDTO
+            {
+                Roadway = roadway,
+                SourceLineNo = sourceLineNo,
+                TargetLineNo = task.TargetAddress,
+                SourcePalletNo = task.PalletCode,
+                TargetPalletNo = task.PalletCode
+            };
+
+            if (configKey == nameof(ConfigKey.CreateRobotSplitPalletTask))
+            {
+                stock.TargetPalletNo = string.Empty;
+            }
+            else if (configKey == nameof(ConfigKey.CreateRobotGroupPalletTask))
+            {
+                stock.SourcePalletNo = string.Empty;
+            }
+            else if (configKey == nameof(ConfigKey.CreateRobotChangePalletTask))
+            {
+                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceLineNo));
+                if (device != null)
+                {
+                    CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
+
+                    DeviceProDTO? devicePro = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(ConveyorLineDBNameNew.Barcode) && x.DeviceChildCode == sourceLineNo);
+                    //ConveyorLineTaskCommandNew command = conveyorLine.ReadCustomer<ConveyorLineTaskCommandNew>(sourceLineNo);  // 娴嬭瘯鐢�
+                    var barcode = conveyorLine.GetValue<ConveyorLineDBNameNew, string>(ConveyorLineDBNameNew.Barcode, sourceLineNo);
+                    stock.SourcePalletNo = string.IsNullOrEmpty(barcode) ? string.Empty : barcode;
+                }
+            }
+
+            return stock;
+        }
+
+        public override WebResponseContent AddData(SaveModel saveModel)
+        {
+            try
+            {
+                if (saveModel == null || saveModel.MainData == null || saveModel.MainData.Count == 0)
+                {
+                    return WebResponseContent.Instance.Error("浼犲弬閿欒,鍙傛暟涓嶈兘涓虹┖");
+                }
+
+                string validResult = typeof(Dt_RobotTask).ValidateDicInEntity(saveModel.MainData, true, TProperties);
+                if (!string.IsNullOrEmpty(validResult))
+                {
+                    return WebResponseContent.Instance.Error(validResult);
+                }
+
+                object? taskNumObj = saveModel.MainData[nameof(Dt_RobotTask.RobotTaskNum)];
+                if (taskNumObj != null)
+                {
+                    int taskNum = Convert.ToInt32(taskNumObj);
+                    if (BaseDal.QueryFirst(x => x.RobotTaskNum == taskNum) != null)
+                    {
+                        return WebResponseContent.Instance.Error($"浠诲姟缂栧彿 {taskNum} 宸插瓨鍦�");
+                    }
+                }
+
+                Dt_RobotTask entity = saveModel.MainData.DicToModel<Dt_RobotTask>();
+                entity.Creater = "鎵嬪姩鍒涘缓";
+                entity.CreateDate = DateTime.Now;
+
+                if (saveModel.DetailData == null || saveModel.DetailData.Count == 0)
+                {
+                    BaseDal.AddData(entity);
+                    return WebResponseContent.Instance.OK("鏂板鎴愬姛", entity);
+                }
+
+                return base.AddData(saveModel);
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error($"鏂板澶辫触,閿欒淇℃伅:{ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁鐩爣鍦板潃鎸夈�岀簿纭� > 鍥為��鍊笺�嶈В鏋愯鍒欏�笺��
+        /// </summary>
+        public string ResolveRobotRuleValue(string? targetAddress, string addressSectionName, string? fallback)
+        {
+            string address = (targetAddress ?? string.Empty).Trim();
+            string defaultValue = fallback ?? string.Empty;
+            if (string.IsNullOrWhiteSpace(address))
+                return defaultValue;
+
+            var section = App.Configuration.GetSection("RobotTaskAddressRules");
+            var addressMap = ReadRobotRuleMap(section.GetSection(addressSectionName));
+            if (addressMap.TryGetValue(address, out string? value))
+                return value;
+
+            return defaultValue;
+        }
+
+        /// <summary>
+        /// 璇诲彇瑙勫垯鏄犲皠娈点��
+        /// </summary>
+        private Dictionary<string, string> ReadRobotRuleMap(IConfigurationSection section)
+        {
+            return section
+                .GetChildren()
+                .Where(x => !string.IsNullOrWhiteSpace(x.Key) && !string.IsNullOrWhiteSpace(x.Value))
+                .ToDictionary(x => x.Key.Trim(), x => x.Value!.Trim());
+        }
+    }
 }
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Receive.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Receive.cs
index 903785a..e419c06 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Receive.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Receive.cs
@@ -1,13 +1,8 @@
-using MapsterMapper;
 using System.Diagnostics.CodeAnalysis;
-using WIDESEA_Core;
 using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core;
-using WIDESEAWCS_Core.Enums;
 using WIDESEAWCS_DTO.TaskInfo;
 using WIDESEAWCS_Model.Models;
-using WIDESEAWCS_QuartzJob;
-using WIDESEAWCS_QuartzJob.Models;
 
 namespace WIDESEAWCS_TaskInfoService;
 
@@ -104,12 +99,16 @@
         {
             case TaskTypeGroup.OutbondGroup:
                 return _outboundTaskFlowService.InitializeOnReceive(task, source);
+
             case TaskTypeGroup.InboundGroup:
                 return _inboundTaskFlowService.InitializeOnReceive(task, source);
+
             case TaskTypeGroup.RelocationGroup:
                 return _relocationTaskFlowService.InitializeOnReceive(task, source);
+
             case TaskTypeGroup.OtherGroup:
                 return _robotTaskFlowService.InitializeOnReceive(task, source);
+
             default:
                 return WebResponseContent.Instance.Error("WCS涓嶅瓨鍦ㄥ綋鍓嶄换鍔$殑浠诲姟绫诲瀷");
         }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Status.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Status.cs
index c760e6f..ad39698 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Status.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService/TaskService.Status.cs
@@ -1,3 +1,4 @@
+using Serilog.Core;
 using System.Diagnostics.CodeAnalysis;
 using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core;
@@ -5,6 +6,7 @@
 using WIDESEAWCS_DTO.TaskInfo;
 using WIDESEAWCS_Model.Models;
 using WIDESEAWCS_QuartzJob.Models;
+using WIDESEAWCS_Tasks;
 
 namespace WIDESEAWCS_TaskInfoService;
 
@@ -92,49 +94,58 @@
     /// <returns></returns>
     public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task)
     {
-        int oldState = task.TaskStatus;
-
-        var result = task.TaskType.GetTaskTypeGroup() switch
+        WebResponseContent content = new WebResponseContent();
+        try
         {
-            TaskTypeGroup.OutbondGroup => _outboundTaskFlowService.MoveToNextStatus(task),
-            TaskTypeGroup.InboundGroup => _inboundTaskFlowService.MoveToNextStatus(task),
-            TaskTypeGroup.RelocationGroup => _relocationTaskFlowService.MoveToNextStatus(task),
-            TaskTypeGroup.OtherGroup => _robotTaskFlowService.MoveToNextStatus(task),
-            _ => WebResponseContent.Instance.Error($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�")
-        };
+            int oldState = task.TaskStatus;
 
-        if (!result.Status)
-            return result;
+            var result = task.TaskType.GetTaskTypeGroup() switch
+            {
+                TaskTypeGroup.OutbondGroup => _outboundTaskFlowService.MoveToNextStatus(task),
+                TaskTypeGroup.InboundGroup => _inboundTaskFlowService.MoveToNextStatus(task),
+                TaskTypeGroup.RelocationGroup => _relocationTaskFlowService.MoveToNextStatus(task),
+                TaskTypeGroup.OtherGroup => _robotTaskFlowService.MoveToNextStatus(task),
+                _ => content.Error($"浠诲姟绫诲瀷閿欒,鏈壘鍒拌浠诲姟绫诲瀷,浠诲姟鍙�:銆恵task.TaskNum}銆�,浠诲姟绫诲瀷:銆恵task.TaskType}銆�")
+            };
 
-        // 鍑哄簱瀹屾垚绾夸綋鑺傜偣鏃讹紝鍙兘闇�瑕佹帴鏀跺叆搴撴柊浠诲姟銆�
-        if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup
-            && result.Data is List<WMSTaskDTO> wmsTasks
-            && wmsTasks.Count > 0)
-        {
-            WebResponseContent content = ReceiveWMSTask(wmsTasks);
-            if (!content.Status)
-                return content;
+            if (!result.Status)
+                return result;
+
+            // 鍑哄簱瀹屾垚绾夸綋鑺傜偣鏃讹紝鍙兘闇�瑕佹帴鏀跺叆搴撴柊浠诲姟銆�
+            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup
+                && result.Data is List<WMSTaskDTO> wmsTasks
+                && wmsTasks.Count > 0)
+            {
+                content = ReceiveWMSTask(wmsTasks);
+                if (!content.Status)
+                    return content;
+            }
+
+            // 鏇存柊浠诲姟鏁版嵁
+            task.ModifyDate = DateTime.Now;
+            task.Modifier = "System";
+            if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish)
+            {
+                BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+            }
+            else
+            {
+                BaseDal.UpdateData(task);
+            }
+
+            // 璁板綍浠诲姟鎵ц璇︽儏
+            string logMessage = App.User.UserId > 0
+                ? $"浜哄伐鎵嬪姩灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戣烦杞埌銆恵task.TaskStatus}銆�"
+                : $"绯荤粺鑷姩娴佺▼锛屼换鍔$姸鎬佷粠銆恵oldState}銆戣浆鍒般�恵task.TaskStatus}銆�";
+            _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, logMessage);
+
+            return content.OK();
         }
-
-        // 鏇存柊浠诲姟鏁版嵁
-        task.ModifyDate = DateTime.Now;
-        task.Modifier = "System";
-        if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish)
+        catch (Exception ex)
         {
-            BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+            QuartzLogHelper.LogError(Logger.None, $"UpdateTaskStatusToNext 鏇存柊灏嗕换鍔$姸鎬佷慨鏀逛负涓嬩竴涓姸鎬佸け璐�,浠诲姟鍙�:銆恵task.TaskNum}銆�,閿欒淇℃伅:銆恵ex.Message}銆�", "UpdateTaskStatusToNext");
+            return content.Error(ex.Message);
         }
-        else
-        {
-            BaseDal.UpdateData(task);
-        }
-
-        // 璁板綍浠诲姟鎵ц璇︽儏
-        string logMessage = App.User.UserId > 0
-            ? $"浜哄伐鎵嬪姩灏嗕换鍔$姸鎬佷粠銆恵oldState}銆戣烦杞埌銆恵task.TaskStatus}銆�"
-            : $"绯荤粺鑷姩娴佺▼锛屼换鍔$姸鎬佷粠銆恵oldState}銆戣浆鍒般�恵task.TaskStatus}銆�";
-        _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, logMessage);
-
-        return WebResponseContent.Instance.OK();
     }
 
     /// <summary>
@@ -171,7 +182,8 @@
         }
         catch (Exception ex)
         {
-            Console.WriteLine($"UpdatePosition 鏇存柊浠诲姟浣嶇疆澶辫触,浠诲姟鍙�:銆恵taskNum}銆�,閿欒淇℃伅:銆恵ex.Message}銆�");
+            QuartzLogHelper.LogError(Logger.None, $"UpdatePosition 鏇存柊浠诲姟浣嶇疆澶辫触,浠诲姟鍙�:銆恵taskNum}銆�,閿欒淇℃伅:銆恵ex.Message}銆�", "UpdatePosition");
+            //Console.WriteLine($"UpdatePosition 鏇存柊浠诲姟浣嶇疆澶辫触,浠诲姟鍙�:銆恵taskNum}銆�,閿欒淇℃伅:銆恵ex.Message}銆�");
         }
         return null;
     }
@@ -208,7 +220,7 @@
         }
         catch (Exception ex)
         {
-            Console.WriteLine($"UpdatePosition 鏇存柊浠诲姟浣嶇疆澶辫触,浠诲姟鍙�:銆恵taskNum}銆�,閿欒淇℃伅:銆恵ex.Message}銆�");
+            QuartzLogHelper.LogError(Logger.None, $"UpdatePosition 鏇存柊浠诲姟浣嶇疆澶辫触,浠诲姟鍙�:銆恵taskNum}銆�,閿欒淇℃伅:銆恵ex.Message}銆�", "UpdatePosition");
         }
         return null;
     }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
index 7372d1a..8b45c00 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/CommonConveyorLineNewJob.cs
@@ -6,6 +6,7 @@
 using Serilog;
 using SqlSugar;
 using WIDESEA_Core;
+using WIDESEAWCS_Common.HttpEnum;
 using WIDESEAWCS_Common.TaskEnum;
 using WIDESEAWCS_Core;
 using WIDESEAWCS_Core.Helper;
@@ -148,15 +149,6 @@
                         return Task.CompletedTask;
                     }
 
-                    // 鍒涘缓骞惰閫夐」锛岄檺鍒舵渶澶у苟鍙戞暟
-                    //var parallelOptions = new ParallelOptions
-                    //{
-                    //    // 闄愬埗骞跺彂鏁帮細瀛愯澶囨暟閲忓拰 CPU 鏍稿績鏁�*2 鐨勮緝灏忓��
-                    //    MaxDegreeOfParallelism = Math.Min(childDeviceCodes.Count, Environment.ProcessorCount * 2),
-                    //};
-
-                    // 骞惰澶勭悊姣忎釜瀛愯澶�
-                    //Parallel.For(0, childDeviceCodes.Count, parallelOptions, i =>
                     foreach (var childDeviceCode in childDeviceCodes)
                     {
                         //string childDeviceCode = childDeviceCodes[i];
@@ -193,8 +185,8 @@
                                 if (command.CV_State == 2)
                                 {
                                     // 妫�鏌ヨ浣嶇疆鏄惁宸叉湁浠诲姟
-                                    var existingTask = _taskService.Db.Queryable<Dt_Task>().First(x => x.TargetAddress == childDeviceCode);
-                                    if (existingTask.IsNullOrEmpty())
+                                    var existingTask = _taskService.Db.Queryable<Dt_Task>().Count(x => x.TargetAddress == childDeviceCode);
+                                    if (existingTask < 5)
                                     {
                                         // 娌℃湁浠诲姟锛屽悜 WMS 璇锋眰鍑哄簱鎵樼洏浠诲姟
                                         var position = checkPalletPositions.FirstOrDefault(x => x.Code == childDeviceCode);
@@ -274,15 +266,16 @@
                                     QuartzLogHelper.LogInfo(_logger, $"澶勭悊浠诲姟 {task.TaskNum}锛岀姸鎬�: {task.TaskStatus}", conveyorLine.DeviceCode);
                                     // 澶勭悊浠诲姟鐘舵�侊紙鏍规嵁鐘舵�佸垎鍙戝埌涓嶅悓鏂规硶锛�
                                     ProcessTaskState(conveyorLine, command, task, childDeviceCode);
-                                    return Task.CompletedTask;
+                                    continue;
                                 }
+                                // Todo锛� 涓嬮潰鐨勯�昏緫涓昏澶勭悊娌℃湁鏌ヨ鍒颁换鍔′絾鏈夋潯鐮佺殑鎯呭喌锛屽彲鑳芥槸闇�瑕佺敓鎴愭満姊版墜浠诲姟鎴栬�呰皟鐢� WMS 鍒涘缓鍏ュ簱浠诲姟 锛堜复鏃朵娇鐢級
                                 else if (!command.Barcode.IsNullOrEmpty() && childDeviceCode == "11068")
                                 {
-                                    var isWcsTask = _taskService.Db.Queryable<Dt_Task>().Any(x => x.PalletCode == command.Barcode && x.TaskStatus == (int)TaskOutStatusEnum.OutNew);
-                                    var isRobotTask = _robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode);
+                                    var isWcsTask = _taskService.Db.Queryable<Dt_Task>().Any(x => x.PalletCode == command.Barcode && (x.TaskStatus == (int)TaskOutStatusEnum.OutNew || x.TaskStatus == (int)TaskInStatusEnum.InNew));
+                                    var isRobotTask = _robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode || x.RobotRoadway == "娉ㄦ恫缁勭洏鏈烘鎵�");
                                     if (isWcsTask || isRobotTask)
                                     {
-                                        return Task.CompletedTask;
+                                        continue;
                                     }
 
                                     // 鐩存帴娣诲姞鏈烘鎵嬬粍鐩樹换鍔�
@@ -306,6 +299,48 @@
                                         conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
                                     }
                                 }
+                                else if (!command.Barcode.IsNullOrEmpty() && (childDeviceCode == "11001" || childDeviceCode == "11010"))
+                                {
+                                    var isWcsTask = _taskService.Db.Queryable<Dt_Task>().Any(x => x.PalletCode == command.Barcode && (x.TaskStatus == (int)TaskOutStatusEnum.OutNew || x.TaskStatus == (int)TaskInStatusEnum.InNew));
+                                    var isRobotTask = _robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode);
+                                    if (isWcsTask || isRobotTask)
+                                    {
+                                        continue;
+                                    }
+
+                                    // 璋冪敤 WMS 鍒涘缓绌烘墭鐩樺叆搴撲换鍔�
+                                    string configKey = nameof(ConfigKey.CreateTaskInboundAsync);
+                                    string requestParam = new CreateTaskDto()
+                                    {
+                                        PalletCode = command.Barcode,
+                                        SourceAddress = childDeviceCode,
+                                        TargetAddress = "GWSC1",  // 鐩爣鍦板潃
+                                        Roadway = "GWSC1",             // 宸烽亾
+                                        WarehouseId = 1,                   // 浠撳簱 ID
+                                        PalletType = 1,                             // 鎵樼洏绫诲瀷锛堥粯璁や负1锛�
+                                        TaskType = TaskTypeEnum.InEmpty.GetHashCode()                         // 浠诲姟绫诲瀷锛堝叆搴�/绌烘墭鐩樺叆搴擄級
+                                    }.Serialize();
+                                    DateTime startTime = DateTime.Now;
+
+                                    var responseResult = _httpClientHelper.Post<WebResponseContent>(configKey, requestParam);
+
+                                    if (responseResult.IsSuccess && responseResult.Data.Status)
+                                    {
+                                        QuartzLogHelper.LogInfo(_logger, $"璋冪敤WMS鎺ュ彛鎴愬姛,鎺ュ彛:銆恵configKey}銆�,璇锋眰鍙傛暟:銆恵requestParam}銆�,鍝嶅簲鏁版嵁:銆恵responseResult.Data?.Data}銆�,鑰楁椂:{(DateTime.Now - startTime).TotalMilliseconds}ms", conveyorLine.DeviceCode);
+                                        var wmsTask = JsonConvert.DeserializeObject<WMSTaskDTO>(responseResult?.Data?.Data?.ToString());
+                                        List<WMSTaskDTO> taskDTOs = new List<WMSTaskDTO> { wmsTask };
+                                        if (wmsTask == null) continue;
+
+                                        if (_taskService.ReceiveWMSTask(taskDTOs).Status)
+                                        {
+                                            conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
+                                        }
+                                    }
+                                    else
+                                    {
+                                        QuartzLogHelper.LogError(_logger, $"璋冪敤WMS鎺ュ彛澶辫触,鎺ュ彛:銆恵configKey}銆�,璇锋眰鍙傛暟:銆恵requestParam}銆�,閿欒淇℃伅:銆恵responseResult.Data?.Message}銆�", conveyorLine.DeviceCode);
+                                    }
+                                }
                             }
                         }
                         catch (Exception innerEx)
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConstraintMachine/ConstraintMachineDBName.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConstraintMachine/ConstraintMachineDBName.cs
deleted file mode 100644
index c24692d..0000000
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConstraintMachine/ConstraintMachineDBName.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-namespace WIDESEAWCS_Tasks
-{
-    /// <summary>
-    /// 鎷樻潫鏈� PLC 瀵勫瓨鍣ㄥ悕绉版灇涓�
-    /// </summary>
-    /// <remarks>
-    /// 瀹氫箟鎷樻潫鏈轰笌 WCS 閫氫俊鏃朵娇鐢ㄧ殑 PLC 瀵勫瓨鍣ㄥ湴鍧�鍚嶇О銆�
-    /// 鎷樻潫鏈烘槸涓�绉嶇敤浜庣數姹犵敓浜х殑璁惧锛岃礋璐e浐瀹�/绾︽潫鐢垫睜鎵樼洏銆�
-    /// 璁惧鏈変笂涓嬩袱灞傜粨鏋勶紝姣忓眰閮芥湁鐙珛鐨勭墿鏂欒姹傚拰鍑烘枡淇″彿銆�
-    /// </remarks>
-    public enum ConstraintMachineDBName
-    {
-        /// <summary>
-        /// 鐗╂祦绾胯繍琛屼俊鍙�
-        /// </summary>
-        /// <remarks>
-        /// 琛ㄧず鐗╂祦绾匡紙杩炴帴鎷樻潫鏈虹殑杈撻�佺嚎锛夋槸鍚﹀湪杩愯銆�
-        /// </remarks>
-        LogisticsLineRunningSignal,
-
-        /// <summary>
-        /// 鎷樻潫鏈鸿繍琛屼俊鍙�
-        /// </summary>
-        /// <remarks>
-        /// 琛ㄧず鎷樻潫鏈烘湰韬殑杩愯鐘舵�併��
-        /// </remarks>
-        ConstraintMachineRunningSignal,
-
-        /// <summary>
-        /// 瑕佹枡璇锋眰-涓婂眰
-        /// </summary>
-        /// <remarks>
-        /// 涓婂眰宸ヤ綅鍚戜笂绾ц澶囧彂鍑虹殑鍘熸枡璇锋眰銆�
-        /// 闈為浂鍊艰〃绀轰笂灞傞渶瑕佽ˉ鍏呯墿鏂欍��
-        /// </remarks>
-        MaterialRequestUpper,
-
-        /// <summary>
-        /// 鎷樻潫鐩樺彲鍑烘枡-涓婂眰
-        /// </summary>
-        /// <remarks>
-        /// WCS 鍐欏叆鐨勪俊鍙凤紝鍛婄煡涓婂眰鎵樼洏鍙互鍑烘枡銆�
-        /// </remarks>
-        ConstraintTrayOutputReadyUpper,
-
-        /// <summary>
-        /// 鍑烘枡璇锋眰-涓婂眰
-        /// </summary>
-        /// <remarks>
-        /// 涓婂眰宸ヤ綅瀹屾垚鍔犲伐鍚庡彂鍑虹殑鍑烘枡璇锋眰銆�
-        /// 闈為浂鍊艰〃绀烘湁鏂欓渶瑕佽緭鍑恒��
-        /// </remarks>
-        OutputRequestUpper,
-
-        /// <summary>
-        /// 瑕佹枡璇锋眰-涓嬪眰
-        /// </summary>
-        /// <remarks>
-        /// 涓嬪眰宸ヤ綅鍚戜笂绾ц澶囧彂鍑虹殑鍘熸枡璇锋眰銆�
-        /// 闈為浂鍊艰〃绀轰笅灞傞渶瑕佽ˉ鍏呯墿鏂欍��
-        /// </remarks>
-        MaterialRequestLower,
-
-        /// <summary>
-        /// 鎷樻潫鐩樺彲鍑烘枡-涓嬪眰
-        /// </summary>
-        /// <remarks>
-        /// WCS 鍐欏叆鐨勪俊鍙凤紝鍛婄煡涓嬪眰鎵樼洏鍙互鍑烘枡銆�
-        /// </remarks>
-        ConstraintTrayOutputReadyLower,
-
-        /// <summary>
-        /// 鍑烘枡璇锋眰-涓嬪眰
-        /// </summary>
-        /// <remarks>
-        /// 涓嬪眰宸ヤ綅瀹屾垚鍔犲伐鍚庡彂鍑虹殑鍑烘枡璇锋眰銆�
-        /// 闈為浂鍊艰〃绀烘湁鏂欓渶瑕佽緭鍑恒��
-        /// </remarks>
-        OutputRequestLower
-    }
-}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
index a567ad2..e875238 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineDispatchHandler.cs
@@ -266,23 +266,46 @@
             }
 
             // 璁剧疆浠诲姟鍙枫�佹墭鐩樻潯鐮併�佺洰鏍囧湴鍧�銆乄CS_ACK
-            conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, childDeviceCode);
-            conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode);
-            conveyorLine.SetValue(ConveyorLineDBNameNew.Target, targetAddress, childDeviceCode);
-            conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
+            var isTaskNoSet = conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, childDeviceCode);
 
+            Thread.Sleep(100); // 纭繚 PLC 鑳芥纭鍙栦换鍔″彿鍚庡啀鍐欏叆鏉$爜
+            var isPalletSet = conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode);
+
+            bool isTargetSet = true;
+            if (targetAddress == "2217" && !isEmptyTask)
+            {
+                QuartzLogHelper.LogDebug(_logger, $"瀛愯澶�: {childDeviceCode}锛屽嚭搴撶洰鏍囧湴鍧�: {targetAddress}", conveyorLine.DeviceCode);
+                Thread.Sleep(100); // 纭繚 PLC 鑳芥纭鍙栦换鍔″彿鍚庡啀鍐欏叆鏉$爜
+                isTargetSet = conveyorLine.SetValue(ConveyorLineDBNameNew.Target, targetAddress, childDeviceCode);
+            }
+            if (!isTargetSet || !isTaskNoSet || !isPalletSet)
+            {
+                QuartzLogHelper.LogError(_logger, $"RequestOutbound锛氫笅鍙戝嚭搴撲换鍔″け璐ワ紝浠诲姟鍙�: {task.TaskNum}锛屽瓙璁惧: {childDeviceCode}", conveyorLine.DeviceCode); 
+                return Task.CompletedTask;
+            }
+
+            bool isWmsResult = false;
             // 鏇存柊浠诲姟鐘舵�佹垨浣嶇疆
             if (isEmptyTask && task.NextAddress == "2217")
             {
                 task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>();
                 task.NextAddress = "2201";
-                _taskService.Repository.UpdateData(task);
+                isWmsResult = _taskService.Repository.UpdateData(task);
             }
             else
             {
-                _taskService.UpdateTaskStatusToNext(task);
+                isWmsResult = _taskService.UpdateTaskStatusToNext(task).Status;
             }
 
+            if(!isWmsResult)
+            {
+                QuartzLogHelper.LogError(_logger, $"RequestOutbound锛氭洿鏂颁换鍔$姸鎬佸け璐ワ紝浠诲姟鍙�: {task.TaskNum}锛屽瓙璁惧: {childDeviceCode}", conveyorLine.DeviceCode);
+                return Task.CompletedTask;
+            }
+
+            Thread.Sleep(100); // 纭繚 PLC 鑳芥纭鍙栦换鍔″彿鍚庡啀鍐欏叆鏉$爜
+            conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
+
             QuartzLogHelper.LogInfo(_logger, "RequestOutbound锛氬嚭搴撲换鍔″凡涓嬪彂锛屼换鍔″彿: {TaskNum}锛屽瓙璁惧: {ChildDeviceCode}", $"鍑哄簱浠诲姟宸蹭笅鍙戯紝浠诲姟鍙�: {task.TaskNum}", conveyorLine.DeviceCode, task.TaskNum, childDeviceCode);
             return Task.CompletedTask;
         }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs
index a950009..e003d18 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ConveyorLineTargetAddressSelector.cs
@@ -4,105 +4,12 @@
 namespace WIDESEAWCS_Tasks
 {
     /// <summary>
-    /// 杈撻�佺嚎鐩爣鍦板潃閫夋嫨鍣� - 澶勭悊鎷樻潫鏈�/鎻掓嫈閽夋満鐨勪笂涓嬪眰璇锋眰
+    /// 杈撻�佺嚎鐩爣鍦板潃閫夋嫨鍣�
     /// </summary>
     /// <remarks>
-    /// 鏍稿績鑱岃矗锛�
-    /// 1. 澶勭悊鍏ュ簱鍦烘櫙鐨勭洰鏍囧湴鍧�閫夋嫨
-    /// 2. 澶勭悊鍑哄簱鍦烘櫙鐨勭洰鏍囧湴鍧�閫夋嫨
-    /// 3. 鍒ゆ柇鎷樻潫鏈哄拰鎻掓嫈閽夋満鐨勭墿鏂欒姹傜姸鎬�
-    /// 4. 鍗忚皟杈撻�佺嚎涓庝笂涓嬪眰璁惧涔嬮棿鐨勭墿鏂欐祦杞�
-    ///
-    /// 鎷樻潫鏈哄拰鎻掓嫈閽夋満閮芥湁涓婁笅涓ゅ眰缁撴瀯锛�
-    /// 姣忓眰閮芥湁鐙珛鐨勭墿鏂欒姹傚拰鍑烘枡淇″彿锛岄渶瑕佸垎鍒鐞嗐��
     /// </remarks>
     public class ConveyorLineTargetAddressSelector
     {
-        /// <summary>
-        /// 璁惧灞傜骇锛堜笂灞�/涓嬪眰锛�
-        /// </summary>
-        /// <remarks>
-        /// 鐢ㄤ簬鍖哄垎鎷樻潫鏈哄拰鎻掓嫈閽夋満鐨勪笂灞傚伐浣嶅拰涓嬪眰宸ヤ綅銆�
-        /// 鍏ュ簱浠诲姟瀵瑰簲涓婂眰锛圡aterialRequestUpper锛夛紝鍑哄簱浠诲姟瀵瑰簲涓嬪眰锛圡aterialRequestLower锛夈��
-        /// </remarks>
-        private enum Layer
-        {
-            /// <summary>
-            /// 涓婂眰宸ヤ綅
-            /// </summary>
-            Upper,
-
-            /// <summary>
-            /// 涓嬪眰宸ヤ綅
-            /// </summary>
-            Lower
-        }
-
-        /// <summary>
-        /// 鐩爣璁惧绫诲瀷鏋氫妇
-        /// </summary>
-        /// <remarks>
-        /// 鐢ㄤ簬鏍规嵁鐩爣鍦板潃缂栫爜璇嗗埆闇�瑕佸鎺ョ殑璁惧绫诲瀷銆�
-        /// </remarks>
-        private enum TargetDeviceType
-        {
-            /// <summary>
-            /// 鏃犳湁鏁堣澶囷紙鍦板潃涓嶅湪宸茬煡鑼冨洿鍐咃級
-            /// </summary>
-            None,
-
-            /// <summary>
-            /// 鎷樻潫鏈�
-            /// </summary>
-            /// <remarks>
-            /// 璐熻矗鍥哄畾/绾︽潫鐢垫睜鎵樼洏鐨勮澶囷紝鏈変笂涓嬩袱灞傘��
-            /// </remarks>
-            ConstraintMachine,
-
-            /// <summary>
-            /// 鎻掓嫈閽夋満
-            /// </summary>
-            /// <remarks>
-            /// 璐熻矗鎻掗拡鍜屾嫈閽堟搷浣滅殑璁惧锛屾湁涓婁笅涓ゅ眰銆�
-            /// </remarks>
-            PinMachine
-        }
-
-        /// <summary>
-        /// 鎷樻潫鏈哄搴旂殑鐐逛綅缂栫爜闆嗗悎
-        /// </summary>
-        /// <remarks>
-        /// 褰撶洰鏍囧湴鍧�鍦ㄨ繖浜涚紪鐮佷腑鏃讹紝琛ㄧず闇�瑕佷笌鎷樻潫鏈轰氦浜掋��
-        /// 浣跨敤 HashSet 淇濊瘉 O(1) 鐨� Contains 鏌ユ壘鎬ц兘銆�
-        /// </remarks>
-        private static readonly HashSet<string> ConstraintMachineCodes = new HashSet<string> { "10180", "20090" };
-
-        /// <summary>
-        /// 鎻掓嫈閽夋満瀵瑰簲鐨勭偣浣嶇紪鐮侀泦鍚�
-        /// </summary>
-        /// <remarks>
-        /// 褰撶洰鏍囧湴鍧�鍦ㄨ繖浜涚紪鐮佷腑鏃讹紝琛ㄧず闇�瑕佷笌鎻掓嫈閽夋満浜や簰銆�
-        /// 浣跨敤 HashSet 淇濊瘉 O(1) 鐨� Contains 鏌ユ壘鎬ц兘銆�
-        /// </remarks>
-        private static readonly HashSet<string> PinMachineCodes = new HashSet<string> { "10190", "20100" };
-
-        /// <summary>
-        /// 鐩爣鍦板潃鍒拌澶囩被鍨嬬殑鏄犲皠
-        /// </summary>
-        /// <remarks>
-        /// 閫氳繃鍗曚竴瀛楀吀瀹炵幇 O(1) 鏌ユ壘锛屾浛浠e師鍏堝垎鍒敤涓や釜 List + Contains + if/else if 鐨勫啓娉曘��
-        /// Key: 鐩爣鍦板潃缂栫爜锛孷alue: 瀵瑰簲鐨勮澶囩被鍨嬨��
-        /// </remarks>
-        private static readonly Dictionary<string, TargetDeviceType> AddressToDeviceType = new Dictionary<string, TargetDeviceType>
-        {
-            // 鎷樻潫鏈虹殑涓や釜鐐逛綅缂栫爜閮芥槧灏勫埌 ConstraintMachine 绫诲瀷
-            { "10180", TargetDeviceType.ConstraintMachine },
-            { "20090", TargetDeviceType.ConstraintMachine },
-            // 鎻掓嫈閽夋満鐨勪袱涓偣浣嶇紪鐮侀兘鏄犲皠鍒� PinMachine 绫诲瀷
-            { "10190", TargetDeviceType.PinMachine },
-            { "20100", TargetDeviceType.PinMachine }
-        };
-
         /// <summary>
         /// 鏃ュ織璁板綍鍣�
         /// </summary>
@@ -134,8 +41,6 @@
         {
             // 璁板綍鍏ュ簱鍦烘櫙鐨勮皟璇曟棩蹇楋紝鍖呭惈瀛愯澶囧拰鐩爣鍦板潃淇℃伅
             WriteDebug(conveyorLine, "鍏ュ簱涓嬩竴鍦板潃", childDeviceCode, nextAddress);
-            // 濮旀墭閫氱敤澶勭悊鏂规硶锛屽叆搴撳搴斾笂灞傦紙isUpper: true锛�
-            //HandleDeviceRequest(conveyorLine, nextAddress, childDeviceCode, Layer.Upper);
 
             var cvState = conveyorLine.GetValue<ConveyorLineDBNameNew, byte>(ConveyorLineDBNameNew.CV_State, nextAddress);
             bool isAvailable = cvState == 2;
@@ -160,8 +65,6 @@
         {
             // 璁板綍鍑哄簱鍦烘櫙鐨勮皟璇曟棩蹇楋紝鍖呭惈瀛愯澶囧拰鐩爣鍦板潃淇℃伅
             WriteDebug(conveyorLine, "鍑哄簱涓嬩竴鍦板潃", childDeviceCode, nextAddress);
-            // 濮旀墭閫氱敤澶勭悊鏂规硶锛屽嚭搴撳搴斾笅灞傦紙isUpper: false锛�
-            //HandleDeviceRequest(conveyorLine, nextAddress, childDeviceCode, Layer.Lower);
 
             var cvState = conveyorLine.GetValue<ConveyorLineDBNameNew, byte>(ConveyorLineDBNameNew.CV_State, nextAddress);
             bool isAvailable = cvState == 2;
@@ -171,289 +74,6 @@
             }
             return false;
         }
-
-        /// <summary>
-        /// 鏍规嵁鐩爣鍦板潃绫诲瀷鍒嗗彂鍒板搴旇澶囧鐞�
-        /// </summary>
-        /// <remarks>
-        /// 閫氳繃 AddressToDeviceType 瀛楀吀灏嗙洰鏍囧湴鍧�鏄犲皠鍒拌澶囩被鍨嬶紝
-        /// 鐒跺悗鍒嗗彂鍒板搴旂殑涓撶敤澶勭悊鏂规硶锛圚andleConstraintMachine / HandlePinMachine锛夈��
-        /// 濡傛灉鐩爣鍦板潃涓嶅湪宸茬煡鏄犲皠琛ㄤ腑锛岀洿鎺ヨ繑鍥烇紝涓嶅仛浠讳綍澶勭悊銆�
-        /// </remarks>
-        /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄锛屼紶閫掑埌鍏蜂綋璁惧澶勭悊鏂规硶</param>
-        /// <param name="nextAddress">鐩爣璁惧缂栫爜锛岄�氳繃瀛楀吀鏌ユ壘璇嗗埆璁惧绫诲瀷</param>
-        /// <param name="childDeviceCode">瀛愯澶囩紪鐮侊紝浼犻�掑埌鍏蜂綋璁惧澶勭悊鏂规硶</param>
-        /// <param name="layer">璁惧灞傜骇锛堜笂灞傛垨涓嬪眰锛夛紝鍐冲畾璇诲彇鍝粍璇锋眰鏍囧織</param>
-        private void HandleDeviceRequest(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode, Layer layer)
-        {
-            // 閫氳繃瀛楀吀鏌ユ壘鐩爣鍦板潃瀵瑰簲鐨勮澶囩被鍨嬶紝濡傛灉鎵句笉鍒板垯 deviceType 涓� None
-            if (!AddressToDeviceType.TryGetValue(nextAddress, out var deviceType) || deviceType == TargetDeviceType.None)
-            {
-                // 鐩爣鍦板潃涓嶅湪宸茬煡鏄犲皠琛ㄤ腑锛岀洿鎺ヨ繑鍥烇紙鍙兘鏄叾浠栫被鍨嬭澶囷級
-                return;
-            }
-
-            // 鏍规嵁璇嗗埆鍑虹殑璁惧绫诲瀷鍒嗗彂鍒板搴旂殑澶勭悊鏂规硶
-            switch (deviceType)
-            {
-                case TargetDeviceType.ConstraintMachine:
-                    // 鎷樻潫鏈哄鐞嗗垎鏀細鑾峰彇鎷樻潫鏈哄疄渚嬪苟澶勭悊鍏朵笂涓嬪眰璇锋眰
-                    HandleConstraintMachine(conveyorLine, childDeviceCode, layer);
-                    break; // 澶勭悊瀹屾瘯锛岃烦鍑� switch
-
-                case TargetDeviceType.PinMachine:
-                    // 鎻掓嫈閽夋満澶勭悊鍒嗘敮锛氳幏鍙栨彃鎷旈拤鏈哄疄渚嬪苟澶勭悊鍏朵笂涓嬪眰璇锋眰
-                    HandlePinMachine(conveyorLine, childDeviceCode, layer);
-                    break; // 澶勭悊瀹屾瘯锛岃烦鍑� switch
-            }
-        }
-
-        /// <summary>
-        /// 澶勭悊鎷樻潫鏈虹殑鐗╂枡/鍑烘枡璇锋眰
-        /// </summary>
-        /// <remarks>
-        /// 鏌ユ壘鎷樻潫鏈鸿澶囷紝鑾峰彇褰撳墠灞傜骇鐨勭墿鏂欒姹傚拰鍑烘枡璇锋眰鐘舵�侊紝
-        /// 鐒跺悗璋冪敤閫氱敤澶勭悊閫昏緫 ProcessDeviceRequest銆�
-        /// </remarks>
-        /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄锛岀敤浜庨�氱煡鐩爣鍦板潃鍜� ACK</param>
-        /// <param name="childDeviceCode">瀛愯澶囩紪鐮侊紝鐢ㄤ簬绮剧‘瀹氫綅</param>
-        /// <param name="layer">璁惧灞傜骇锛屽喅瀹氳鍙栦笂灞傝繕鏄笅灞傜殑璇锋眰鏍囧織</param>
-        private void HandleConstraintMachine(CommonConveyorLine conveyorLine, string childDeviceCode, Layer layer)
-        {
-            // 浠庡叏灞�璁惧鍒楄〃涓煡鎵惧悕涓�"鎷樻潫鏈�"鐨勬嫎鏉熸満璁惧瀹炰緥
-            var constraint = FindDevice<ConstraintMachine>("鎷樻潫鏈�");
-            if (constraint == null)
-            {
-                // 鏈壘鍒版嫎鏉熸満璁惧锛屽凡鍦� FindDevice 涓褰曟棩蹇楋紝姝ゅ鐩存帴杩斿洖
-                return;
-            }
-
-            // 鑾峰彇褰撳墠灞傜骇锛堜笂灞�/涓嬪眰锛夌殑鐗╂枡璇锋眰鏍囧織锛岄潪闆惰〃绀鸿澶囬渶瑕佺墿鏂�
-            bool materialRequest = GetConstraintFlag(constraint, layer, isMaterial: true);
-            // 鑾峰彇褰撳墠灞傜骇锛堜笂灞�/涓嬪眰锛夌殑鍑烘枡璇锋眰鏍囧織锛岄潪闆惰〃绀鸿澶囨湁璐ц鍑�
-            bool outputRequest = GetConstraintFlag(constraint, layer, isMaterial: false);
-
-            // 鏋勯�犺缃緭鍑哄氨缁爣蹇楃殑濮旀墭锛堟牴鎹眰绾у啓鍏� Upper 鎴� Lower 瀵瑰簲鐨勫瘎瀛樺櫒锛�
-            Action<bool> setOutputReady = outputReady =>
-                SetConstraintOutputReady(constraint, layer, outputReady);
-
-            // 璋冪敤閫氱敤璇锋眰澶勭悊閫昏緫锛屼紶鍏ヨ澶囩被鍨嬫弿杩扮敤浜庢棩蹇楄褰�
-            ProcessDeviceRequest(conveyorLine, childDeviceCode, materialRequest, outputRequest, setOutputReady, "鎷樻潫鏈�");
-        }
-
-        /// <summary>
-        /// 澶勭悊鎻掓嫈閽夋満鐨勭墿鏂�/鍑烘枡璇锋眰
-        /// </summary>
-        /// <remarks>
-        /// 鏌ユ壘鎻掓嫈閽夋満璁惧锛岃幏鍙栧綋鍓嶅眰绾х殑鐗╂枡璇锋眰鍜屽嚭鏂欒姹傜姸鎬侊紝
-        /// 鐒跺悗璋冪敤閫氱敤澶勭悊閫昏緫 ProcessDeviceRequest銆�
-        /// </remarks>
-        /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄锛岀敤浜庨�氱煡鐩爣鍦板潃鍜� ACK</param>
-        /// <param name="childDeviceCode">瀛愯澶囩紪鐮侊紝鐢ㄤ簬绮剧‘瀹氫綅</param>
-        /// <param name="layer">璁惧灞傜骇锛屽喅瀹氳鍙栦笂灞傝繕鏄笅灞傜殑璇锋眰鏍囧織</param>
-        private void HandlePinMachine(CommonConveyorLine conveyorLine, string childDeviceCode, Layer layer)
-        {
-            // 浠庡叏灞�璁惧鍒楄〃涓煡鎵惧悕涓�"鎻掓嫈閽夋満"鐨勬彃鎷旈拤鏈鸿澶囧疄渚�
-            var pinMachine = FindDevice<PinMachine>("鎻掓嫈閽夋満");
-            if (pinMachine == null)
-            {
-                // 鏈壘鍒版彃鎷旈拤鏈鸿澶囷紝宸插湪 FindDevice 涓褰曟棩蹇楋紝姝ゅ鐩存帴杩斿洖
-                return;
-            }
-
-            // 鑾峰彇褰撳墠灞傜骇锛堜笂灞�/涓嬪眰锛夌殑鐗╂枡璇锋眰鏍囧織锛岄潪闆惰〃绀鸿澶囬渶瑕佺墿鏂�
-            bool materialRequest = GetPinMachineFlag(pinMachine, layer, isMaterial: true);
-            // 鑾峰彇褰撳墠灞傜骇锛堜笂灞�/涓嬪眰锛夌殑鍑烘枡璇锋眰鏍囧織锛岄潪闆惰〃绀鸿澶囨湁璐ц鍑�
-            bool outputRequest = GetPinMachineFlag(pinMachine, layer, isMaterial: false);
-
-            // 鏋勯�犺缃緭鍑哄氨缁爣蹇楃殑濮旀墭锛堟牴鎹眰绾у啓鍏� Upper 鎴� Lower 瀵瑰簲鐨勫瘎瀛樺櫒锛�
-            Action<bool> setOutputReady = outputReady =>
-                SetPinMachineOutputReady(pinMachine, layer, outputReady);
-
-            // 璋冪敤閫氱敤璇锋眰澶勭悊閫昏緫锛屼紶鍏ヨ澶囩被鍨嬫弿杩扮敤浜庢棩蹇楄褰�
-            ProcessDeviceRequest(conveyorLine, childDeviceCode, materialRequest, outputRequest, setOutputReady, "鎻掓嫈閽夋満");
-        }
-
-        /// <summary>
-        /// 鏌ユ壘鎸囧畾鍚嶇О鐨勮澶�
-        /// </summary>
-        /// <remarks>
-        /// 浠庡叏灞�璁惧鍒楄〃 Storage.Devices 涓�氳繃璁惧绫诲瀷鍜屽悕绉版煡鎵捐澶囧疄渚嬨��
-        /// 杩欐槸涓�涓硾鍨嬫柟娉曪紝鍙互閫傜敤浜� ConstraintMachine銆丳inMachine 绛夊绉嶈澶囩被鍨嬨��
-        /// </remarks>
-        /// <typeparam name="T">璁惧绫诲瀷锛屽繀椤绘槸寮曠敤绫诲瀷锛堝 ConstraintMachine銆丳inMachine锛�</typeparam>
-        /// <param name="deviceName">璁惧鍚嶇О锛岀敤浜庣簿纭尮閰嶈澶囩殑 DeviceName 灞炴��</param>
-        /// <returns>鎵惧埌鐨勮澶囧疄渚嬶紝鏈壘鍒板垯杩斿洖 null</returns>
-        private T? FindDevice<T>(string deviceName) where T : class
-        {
-            // OfType<T>() 绛涢�夊嚭鎸囧畾绫诲瀷鐨勮澶囷紝FirstOrDefault 鎸夊悕绉扮簿纭尮閰�
-            var device = Storage.Devices.OfType<T>().FirstOrDefault(d => GetDeviceName(d) == deviceName);
-            if (device == null)
-            {
-                // 璁惧鏈壘鍒版椂璁板綍璋冭瘯鏃ュ織锛屾柟渚挎帓鏌ラ厤缃棶棰�
-                _logger.Debug("FindDevice锛氭湭鎵惧埌 {DeviceName}", deviceName);
-            }
-            return device; // 鍙兘涓� null锛岀敱璋冪敤鏂硅礋璐� null 妫�鏌�
-        }
-
-        /// <summary>
-        /// 閫氳繃澶氭�佽幏鍙栦换鎰忚澶囩殑鍚嶇О
-        /// </summary>
-        /// <remarks>
-        /// 浣跨敤 switch 琛ㄨ揪寮忔牴鎹澶囩殑鍏蜂綋绫诲瀷鑾峰彇鍏� DeviceName 灞炴�э紝
-        /// 閬垮厤涓烘瘡绉嶈澶囩被鍨嬬紪鍐欑嫭绔嬬殑鍙嶅皠鎴栧睘鎬ц闂唬鐮併��
-        /// 褰撳墠鏀寔 ConstraintMachine 鍜� PinMachine 涓ょ绫诲瀷銆�
-        /// </remarks>
-        /// <typeparam name="T">璁惧绫诲瀷</typeparam>
-        /// <param name="device">璁惧瀹炰緥锛岄潪绌�</param>
-        /// <returns>璁惧鐨勫悕绉板瓧绗︿覆锛屽鏋滅被鍨嬩笉鍖归厤鍒欒繑鍥炵┖瀛楃涓�</returns>
-        private static string GetDeviceName<T>(T device) where T : class
-        {
-            // 妯″紡鍖归厤锛氭牴鎹澶囩殑鍏蜂綋杩愯鏃剁被鍨嬭繑鍥炲搴旂殑 DeviceName
-            return device switch
-            {
-                ConstraintMachine cm => cm.DeviceName, // 鎷樻潫鏈鸿繑鍥炲叾璁惧鍚嶇О
-                PinMachine pm => pm.DeviceName,       // 鎻掓嫈閽夋満杩斿洖鍏惰澶囧悕绉�
-                _ => string.Empty                     // 鏈煡绫诲瀷杩斿洖绌哄瓧绗︿覆锛堢悊璁轰笂涓嶄細璧板埌杩欓噷锛�
-            };
-        }
-
-        /// <summary>
-        /// 鑾峰彇鎷樻潫鏈虹殑璇锋眰鏍囧織锛堢墿鏂欒姹傛垨鍑烘枡璇锋眰锛�
-        /// </summary>
-        /// <remarks>
-        /// 鏍规嵁 isMaterial 鍙傛暟鍐冲畾璇诲彇鐗╂枡璇锋眰杩樻槸鍑烘枡璇锋眰瀵勫瓨鍣紝
-        /// 鍐嶆牴鎹� layer 鍙傛暟鍐冲畾璇诲彇涓婂眰锛圲pper锛夎繕鏄笅灞傦紙Lower锛夊瘎瀛樺櫒銆�
-        /// 杩斿洖鍊艰〃绀鸿姹傛槸鍚︽湁鏁堬紙闈為浂涓烘湁鏁堬級銆�
-        /// </remarks>
-        /// <param name="constraint">鎷樻潫鏈鸿澶囧疄渚嬶紝鐢ㄤ簬璇诲彇 PLC 瀵勫瓨鍣ㄥ��</param>
-        /// <param name="layer">璁惧灞傜骇锛屽喅瀹氳鍙� Upper 杩樻槸 Lower 瀵勫瓨鍣�</param>
-        /// <param name="isMaterial">true=璇诲彇鐗╂枡璇锋眰鏍囧織锛宖alse=璇诲彇鍑烘枡璇锋眰鏍囧織</param>
-        /// <returns>璇锋眰鏍囧織鏄惁鏈夋晥锛坱rue=鏈夎姹傦紝false=鏃犺姹傦級</returns>
-        private bool GetConstraintFlag(ConstraintMachine constraint, Layer layer, bool isMaterial)
-        {
-            // 鏍规嵁 isMaterial 閫夋嫨瀵瑰簲鐨勫瘎瀛樺櫒鍚嶇О瀵癸紙鐗╂枡璇锋眰鎴栧嚭鏂欒姹傦級
-            var (materialKey, outputKey) = isMaterial
-                ? (ConstraintMachineDBName.MaterialRequestUpper, ConstraintMachineDBName.MaterialRequestLower)   // 鐗╂枡璇锋眰
-                : (ConstraintMachineDBName.OutputRequestUpper, ConstraintMachineDBName.OutputRequestLower);        // 鍑烘枡璇锋眰
-
-            // 鏍规嵁 layer 閫夋嫨鍏蜂綋浣跨敤 Upper 杩樻槸 Lower 鐗堟湰鐨勫瘎瀛樺櫒
-            var key = layer == Layer.Upper ? materialKey : outputKey;
-            // 璇诲彇瀵勫瓨鍣ㄥ�硷紝闈為浂琛ㄧず鏈夎姹傦紝杩斿洖甯冨皵鍊�
-            return constraint.GetValue<ConstraintMachineDBName, short>(key) != 0;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鎻掓嫈閽夋満鐨勮姹傛爣蹇楋紙鐗╂枡璇锋眰鎴栧嚭鏂欒姹傦級
-        /// </summary>
-        /// <remarks>
-        /// 涓� GetConstraintFlag 閫昏緫鐩稿悓锛屼絾鎿嶄綔瀵硅薄鏄彃鎷旈拤鏈猴紙PinMachine锛夈��
-        /// 鏍规嵁 isMaterial 鍙傛暟鍐冲畾璇诲彇鐗╂枡璇锋眰杩樻槸鍑烘枡璇锋眰瀵勫瓨鍣紝
-        /// 鍐嶆牴鎹� layer 鍙傛暟鍐冲畾璇诲彇涓婂眰锛圲pper锛夎繕鏄笅灞傦紙Lower锛夊瘎瀛樺櫒銆�
-        /// </remarks>
-        /// <param name="pinMachine">鎻掓嫈閽夋満璁惧瀹炰緥锛岀敤浜庤鍙� PLC 瀵勫瓨鍣ㄥ��</param>
-        /// <param name="layer">璁惧灞傜骇锛屽喅瀹氳鍙� Upper 杩樻槸 Lower 瀵勫瓨鍣�</param>
-        /// <param name="isMaterial">true=璇诲彇鐗╂枡璇锋眰鏍囧織锛宖alse=璇诲彇鍑烘枡璇锋眰鏍囧織</param>
-        /// <returns>璇锋眰鏍囧織鏄惁鏈夋晥锛坱rue=鏈夎姹傦紝false=鏃犺姹傦級</returns>
-        private bool GetPinMachineFlag(PinMachine pinMachine, Layer layer, bool isMaterial)
-        {
-            // 鏍规嵁 isMaterial 閫夋嫨瀵瑰簲鐨勫瘎瀛樺櫒鍚嶇О瀵癸紙鐗╂枡璇锋眰鎴栧嚭鏂欒姹傦級
-            var (materialKey, outputKey) = isMaterial
-                ? (PinMachineDBName.MaterialRequestUpper, PinMachineDBName.MaterialRequestLower)   // 鐗╂枡璇锋眰
-                : (PinMachineDBName.OutputRequestUpper, PinMachineDBName.OutputRequestLower);       // 鍑烘枡璇锋眰
-
-            // 鏍规嵁 layer 閫夋嫨鍏蜂綋浣跨敤 Upper 杩樻槸 Lower 鐗堟湰鐨勫瘎瀛樺櫒
-            var key = layer == Layer.Upper ? materialKey : outputKey;
-            // 璇诲彇瀵勫瓨鍣ㄥ�硷紝闈為浂琛ㄧず鏈夎姹傦紝杩斿洖甯冨皵鍊�
-            return pinMachine.GetValue<PinMachineDBName, short>(key) != 0;
-        }
-
-        /// <summary>
-        /// 璁剧疆鎷樻潫鏈虹殑杈撳嚭灏辩华鏍囧織
-        /// </summary>
-        /// <remarks>
-        /// 鍚戞嫎鏉熸満鐨� PLC 瀵勫瓨鍣ㄥ啓鍏ヨ緭鍑哄氨缁姸鎬侊紝鍛婄煡鎷樻潫鏈哄彲浠ョ户缁嚭鏂欍��
-        /// 鏍规嵁 layer 鍙傛暟鍐冲畾鍐欏叆涓婂眰锛圕onstraintTrayOutputReadyUpper锛夎繕鏄笅灞傦紙ConstraintTrayOutputReadyLower锛夊瘎瀛樺櫒銆�
-        /// </remarks>
-        /// <param name="constraint">鎷樻潫鏈鸿澶囧疄渚嬶紝鐢ㄤ簬鍐欏叆 PLC 瀵勫瓨鍣�</param>
-        /// <param name="layer">璁惧灞傜骇锛屽喅瀹氬啓鍏� Upper 杩樻槸 Lower 瀵勫瓨鍣�</param>
-        /// <param name="outputReady">杈撳嚭灏辩华鐘舵�侊紝true=鍙互鍑烘枡锛宖alse=涓嶈兘鍑烘枡</param>
-        private void SetConstraintOutputReady(ConstraintMachine constraint, Layer layer, bool outputReady)
-        {
-            // 鏍规嵁 layer 閫夋嫨瀵瑰簲鐨勮緭鍑哄氨缁瘎瀛樺櫒锛圲pper 鎴� Lower锛�
-            var key = layer == Layer.Upper
-                ? ConstraintMachineDBName.ConstraintTrayOutputReadyUpper   // 涓婂眰杈撳嚭灏辩华瀵勫瓨鍣�
-                : ConstraintMachineDBName.ConstraintTrayOutputReadyLower;  // 涓嬪眰杈撳嚭灏辩华瀵勫瓨鍣�
-            // 鍚� PLC 鍐欏叆鍊硷紝outputReady 涓� true 鏃跺啓鍏� 1锛屽惁鍒欏啓鍏� 0
-            constraint.SetValue(key, outputReady ? true : false);
-        }
-
-        /// <summary>
-        /// 璁剧疆鎻掓嫈閽夋満鐨勮緭鍑哄氨缁爣蹇�
-        /// </summary>
-        /// <remarks>
-        /// 鍚戞彃鎷旈拤鏈虹殑 PLC 瀵勫瓨鍣ㄥ啓鍏ヨ緭鍑哄氨缁姸鎬侊紝鍛婄煡鎻掓嫈閽夋満鍙互缁х画鍑烘枡銆�
-        /// 鏍规嵁 layer 鍙傛暟鍐冲畾鍐欏叆涓婂眰锛圥lugPinTrayOutputReadyUpper锛夎繕鏄笅灞傦紙PlugPinTrayOutputReadyLower锛夊瘎瀛樺櫒銆�
-        /// </remarks>
-        /// <param name="pinMachine">鎻掓嫈閽夋満璁惧瀹炰緥锛岀敤浜庡啓鍏� PLC 瀵勫瓨鍣�</param>
-        /// <param name="layer">璁惧灞傜骇锛屽喅瀹氬啓鍏� Upper 杩樻槸 Lower 瀵勫瓨鍣�</param>
-        /// <param name="outputReady">杈撳嚭灏辩华鐘舵�侊紝true=鍙互鍑烘枡锛宖alse=涓嶈兘鍑烘枡</param>
-        private void SetPinMachineOutputReady(PinMachine pinMachine, Layer layer, bool outputReady)
-        {
-            // 鏍规嵁 layer 閫夋嫨瀵瑰簲鐨勮緭鍑哄氨缁瘎瀛樺櫒锛圲pper 鎴� Lower锛�
-            var key = layer == Layer.Upper
-                ? PinMachineDBName.PlugPinTrayOutputReadyUpper   // 涓婂眰杈撳嚭灏辩华瀵勫瓨鍣�
-                : PinMachineDBName.PlugPinTrayOutputReadyLower; // 涓嬪眰杈撳嚭灏辩华瀵勫瓨鍣�
-            // 鍚� PLC 鍐欏叆鍊硷紝outputReady 涓� true 鏃跺啓鍏� 1锛屽惁鍒欏啓鍏� 0
-            pinMachine.SetValue(key, outputReady ? true : false);
-        }
-
-        /// <summary>
-        /// 澶勭悊璁惧璇锋眰鐨勬牳蹇冮�昏緫
-        /// </summary>
-        /// <remarks>
-        /// 鏍规嵁鐗╂枡璇锋眰鍜屽嚭鏂欒姹傜殑鐘舵�佸喅瀹氳涓猴細
-        /// - 濡傛灉璁惧闇�瑕佺墿鏂欙紙materialRequest=true锛夛紝璁剧疆杈撻�佺嚎鐨勭洰鏍囧湴鍧�涓� 1锛堟湁鏂欒繘鏉ワ級骞跺洖澶� ACK 纭淇″彿
-        /// - 濡傛灉璁惧涓嶉渶瑕佺墿鏂欙紙materialRequest=false锛夛紝鍒欓�氱煡璁惧鍙互缁х画鍑烘枡锛坰etOutputReady锛�
-        ///
-        /// 杩欐槸鎷樻潫鏈哄拰鎻掓嫈閽夋満鍏辩敤鐨勫鐞嗛�昏緫锛岃澶囩壒鏈夌殑閮ㄥ垎宸插湪姝ゆ柟娉曞灏佽銆�
-        /// </remarks>
-        /// <param name="conveyorLine">杈撻�佺嚎璁惧瀵硅薄锛岀敤浜庡啓鍏ョ洰鏍囧湴鍧�锛圱arget锛夊拰 ACK 淇″彿</param>
-        /// <param name="childDeviceCode">瀛愯澶囩紪鐮侊紝鐢ㄤ簬绮剧‘瀹氫綅鍐欏叆鍝釜瀛愯澶�</param>
-        /// <param name="materialRequest">鐗╂枡璇锋眰鏍囧織锛宼rue=璁惧褰撳墠闇�瑕佽ˉ鍏呯墿鏂�</param>
-        /// <param name="outputRequest">鍑烘枡璇锋眰鏍囧織锛宼rue=璁惧褰撳墠鏈夌墿鏂欓渶瑕佽緭鍑猴紙閰嶅悎 materialRequest=false 鏃朵娇鐢級</param>
-        /// <param name="setOutputReady">璁剧疆璁惧杈撳嚭灏辩华鏍囧織鐨勫鎵橈紝鏍规嵁灞傜骇鍐欏叆 Upper 鎴� Lower 瀵勫瓨鍣�</param>
-        /// <param name="deviceType">璁惧绫诲瀷鎻忚堪瀛楃涓诧紝鐢ㄤ簬鏃ュ織杈撳嚭</param>
-        private void ProcessDeviceRequest(
-            CommonConveyorLine conveyorLine,
-            string childDeviceCode,
-            bool materialRequest,
-            bool outputRequest,
-            Action<bool> setOutputReady,
-            string deviceType)
-        {
-            // 璁板綍褰撳墠璇锋眰鐘舵�佺殑璋冭瘯鏃ュ織锛屼緵鎺掓煡闂浣跨敤
-            QuartzLogHelper.LogDebug(_logger, "ProcessDeviceRequest锛歿DeviceType}锛屽瓙璁惧: {ChildDeviceCode}锛岀墿鏂欒姹�: {MaterialReq}锛屽嚭鏂欒姹�: {OutputReq}", $"ProcessDeviceRequest锛歿deviceType}锛屽瓙璁惧: {childDeviceCode}锛岀墿鏂欒姹�: {materialRequest}锛屽嚭鏂欒姹�: {outputRequest}", conveyorLine.DeviceCode, deviceType, childDeviceCode, materialRequest, outputRequest);
-
-            // 鍒嗘敮鍒ゆ柇锛氳澶囨槸闇�瑕佺墿鏂欒繕鏄渶瑕佸嚭鏂�
-            if (materialRequest)
-            {
-                // 璁惧闇�瑕佺墿鏂� -> 閫氱煡杈撻�佺嚎鏈夋枡杩囨潵
-                // 1. 璁剧疆鐩爣鍦板潃涓� 1锛岃〃绀�"鏈夋枡杩涘叆"
-                conveyorLine.SetValue(ConveyorLineDBNameNew.Target, 1, childDeviceCode);
-                // 2. 鍥炲 ACK 纭淇″彿锛屽憡鐭ヨ澶囧凡鏀跺埌璇锋眰
-                conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode);
-                // 3. 璁板綍淇℃伅鏃ュ織锛岃〃鏄庡凡瀹屾垚鐩爣鍦板潃璁剧疆鍜� ACK 鍥炲
-                QuartzLogHelper.LogInfo(_logger, "ProcessDeviceRequest锛歿DeviceType} 闇�瑕佺墿鏂欙紝宸茶缃洰鏍囧湴鍧�鍜孉CK", $"ProcessDeviceRequest锛歿deviceType} 闇�瑕佺墿鏂欙紝宸茶缃洰鏍囧湴鍧�鍜孉CK", conveyorLine.DeviceCode, deviceType);
-            }
-            else
-            {
-                // 璁惧涓嶉渶瑕佺墿鏂� -> 閫氱煡璁惧鍙互缁х画鍑烘枡锛堟棤璁哄綋鍓嶆槸鍚︽湁璐ц鍑猴紝閮借閫氱煡锛�
-                // outputRequest 琛ㄧず璁惧褰撳墠鏄惁纭疄鏈夎揣锛屽鏋滄病鏈夎揣鍒� outputReady=false锛岃澶囨敹鍒板悗绛夊緟
-                setOutputReady(outputRequest);
-            }
-        }
-
         /// <summary>
         /// 鍐欏叆璋冭瘯鏃ュ織锛堝悓鏃惰緭鍑哄埌涓や釜鏃ュ織绯荤粺锛�
         /// </summary>
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ManualInbound/ManualInboundTaskHandler.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ManualInbound/ManualInboundTaskHandler.cs
index 23adac0..4eed34c 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ManualInbound/ManualInboundTaskHandler.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/ManualInbound/ManualInboundTaskHandler.cs
@@ -56,21 +56,13 @@
                 var isTaskNum = conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, (short)task.TaskNum, childDeviceCode);
                 if (!isTaskNum) return;
                 QuartzLogHelper.LogInfo(_logger, $"浠诲姟鍙峰啓鍏LC鎴愬姛锛屼换鍔″彿銆恵task.TaskNum}銆�", conveyorLine.DeviceCode);
-                Thread.Sleep(500);
-
-                //// 鍐欏叆璧峰鍦板潃
-                //conveyorLine.SetValue(ConveyorLineDBNameNew.Source, short.Parse(task.SourceAddress ?? "0"), childDeviceCode);
-                //QuartzLogHelper.LogInfo(_logger, $"浠诲姟鍙峰啓鍏LC鎴愬姛锛屼换鍔″彿銆恵task.TaskNum}銆�", conveyorLine.DeviceCode);
-                //Thread.Sleep(500);
+                Thread.Sleep(100);
 
                 // 鍐欏叆鐩爣鍦板潃
                 var isTarget = conveyorLine.SetValue(ConveyorLineDBNameNew.Target, short.Parse(task.NextAddress ?? "0"), childDeviceCode);
                 if (!isTarget) return;
                 QuartzLogHelper.LogInfo(_logger, $"鐩爣鍦板潃鍐欏叆PLC鎴愬姛锛岀洰鏍囧湴鍧�銆恵task.NextAddress}銆�", conveyorLine.DeviceCode);
-                Thread.Sleep(500);
-
-                // 鍐欏叆鎵樼洏鍙�
-                //conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode);
+                Thread.Sleep(100);
 
                 // 鏇存柊浠诲姟鐘舵�佸埌涓嬩竴闃舵
                 var updateResult = _taskService.UpdateTaskStatusToNext(task);
@@ -83,7 +75,7 @@
                 // 鍐欏叆ACK鏍囧織
                 conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode);
 
-                QuartzLogHelper.LogInfo(_logger, $"ManualInboundTaskHandler: 鎵嬪姩浠诲姟鍐欏叆PLC鎴愬姛锛屼换鍔″彿銆恵task.TaskNum}銆戯紝婧愬湴鍧�銆恵task.SourceAddress}銆戯紝鐩爣鍦板潃銆恵task.NextAddress}銆�", conveyorLine.DeviceCode);
+                QuartzLogHelper.LogInfo(_logger, $"ManualInboundTaskHandler: 浠诲姟鍐欏叆PLC鎴愬姛锛屼换鍔″彿銆恵task.TaskNum}銆戯紝婧愬湴鍧�銆恵task.SourceAddress}銆戯紝鐩爣鍦板潃銆恵task.NextAddress}銆�", conveyorLine.DeviceCode);
             }
             catch (Exception ex)
             {
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/PinMachine/PinMachineCommand.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/PinMachine/PinMachineCommand.cs
deleted file mode 100644
index b2fa093..0000000
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/PinMachine/PinMachineCommand.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-using WIDESEAWCS_QuartzJob.DeviceBase;
-
-namespace WIDESEAWCS_Tasks
-{
-    /// <summary>
-    /// 鎻掓嫈閽夋満 PLC 閫氫俊鍛戒护鏁版嵁绫�
-    /// </summary>
-    /// <remarks>
-    /// 缁ф壙鑷� DeviceCommand锛岀敤浜庝笌鎻掓嫈閽夋満杩涜 PLC 閫氫俊銆�
-    /// 鍖呭惈璁惧鐨勮繍琛岀姸鎬併�佺墿鏂欒姹傘�佸嚭鏂欒姹傜瓑淇″彿銆�
-    /// </remarks>
-    public class PinMachineCommand : DeviceCommand
-    {
-        /// <summary>
-        /// 鐗╂祦绾胯繍琛屼俊鍙�
-        /// </summary>
-        /// <remarks>
-        /// 琛ㄧず鐗╂祦绾匡紙杩炴帴鎻掓嫈閽夋満鐨勮緭閫佺嚎锛夋槸鍚﹀湪杩愯銆�
-        /// </remarks>
-        public short LogisticsLineRunningSignal { get; set; }
-
-        /// <summary>
-        /// 鎻掓嫈閽夋満杩愯淇″彿
-        /// </summary>
-        /// <remarks>
-        /// 琛ㄧず鎻掓嫈閽夋満鏈韩鐨勮繍琛岀姸鎬併��
-        /// </remarks>
-        public short PlugPinMachineRunningSignal { get; set; }
-
-        /// <summary>
-        /// 瑕佹枡璇锋眰-涓婂眰
-        /// </summary>
-        /// <remarks>
-        /// 涓婂眰宸ヤ綅鍚戜笂绾ц澶囷紙濡傝緭閫佺嚎锛夊彂鍑虹殑鍘熸枡璇锋眰銆�
-        /// 闈為浂鍊艰〃绀洪渶瑕佽ˉ鍏呯墿鏂欍��
-        /// </remarks>
-        public short MaterialRequestUpper { get; set; }
-
-        /// <summary>
-        /// 鍑烘枡璇锋眰-涓婂眰
-        /// </summary>
-        /// <remarks>
-        /// 涓婂眰宸ヤ綅瀹屾垚鍔犲伐鍚庯紝鍚戜笅绾ц澶囧彂鍑虹殑鍑烘枡璇锋眰銆�
-        /// 闈為浂鍊艰〃绀烘湁鏂欓渶瑕佽緭鍑恒��
-        /// </remarks>
-        public short OutputRequestUpper { get; set; }
-
-        /// <summary>
-        /// 鎻掓嫈閽夌洏鍙嚭鏂�-涓婂眰
-        /// </summary>
-        /// <remarks>
-        /// WCS 鍥炲缁欎笂灞傚伐浣嶇殑纭淇″彿銆�
-        /// 鍛婄煡涓婂眰鎵樼洏宸茶鎺ユ敹锛屽彲浠ョ户缁嚭鏂欍��
-        /// </remarks>
-        public short PlugPinTrayOutputReadyUpper { get; set; }
-
-        /// <summary>
-        /// 瑕佹枡璇锋眰-涓嬪眰
-        /// </summary>
-        /// <remarks>
-        /// 涓嬪眰宸ヤ綅鍚戜笂绾ц澶囷紙濡傝緭閫佺嚎锛夊彂鍑虹殑鍘熸枡璇锋眰銆�
-        /// 闈為浂鍊艰〃绀洪渶瑕佽ˉ鍏呯墿鏂欍��
-        /// </remarks>
-        public short MaterialRequestLower { get; set; }
-
-        /// <summary>
-        /// 鍑烘枡璇锋眰-涓嬪眰
-        /// </summary>
-        /// <remarks>
-        /// 涓嬪眰宸ヤ綅瀹屾垚鍔犲伐鍚庯紝鍚戜笅绾ц澶囧彂鍑虹殑鍑烘枡璇锋眰銆�
-        /// 闈為浂鍊艰〃绀烘湁鏂欓渶瑕佽緭鍑恒��
-        /// </remarks>
-        public short OutputRequestLower { get; set; }
-
-        /// <summary>
-        /// 鎻掓嫈閽夌洏鍙嚭鏂�-涓嬪眰
-        /// </summary>
-        /// <remarks>
-        /// WCS 鍥炲缁欎笅灞傚伐浣嶇殑纭淇″彿銆�
-        /// 鍛婄煡涓嬪眰鎵樼洏宸茶鎺ユ敹锛屽彲浠ョ户缁嚭鏂欍��
-        /// </remarks>
-        public short PlugPinTrayOutputReadyLower { get; set; }
-    }
-}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/PinMachine/PinMachineDBName.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/PinMachine/PinMachineDBName.cs
deleted file mode 100644
index 5bf993e..0000000
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineNewJob/PinMachine/PinMachineDBName.cs
+++ /dev/null
@@ -1,83 +0,0 @@
-namespace WIDESEAWCS_Tasks
-{
-    /// <summary>
-    /// 鎻掓嫈閽夋満 PLC 瀵勫瓨鍣ㄥ悕绉版灇涓�
-    /// </summary>
-    /// <remarks>
-    /// 瀹氫箟鎻掓嫈閽夋満涓� WCS 閫氫俊鏃朵娇鐢ㄧ殑 PLC 瀵勫瓨鍣ㄥ湴鍧�鍚嶇О銆�
-    /// 鎻掓嫈閽夋満鏄竴绉嶇敤浜庣數姹犵敓浜х殑璁惧锛岃礋璐f彃閽堝拰鎷旈拡鎿嶄綔銆�
-    /// 璁惧鏈変笂涓嬩袱灞傜粨鏋勶紝姣忓眰閮芥湁鐙珛鐨勭墿鏂欒姹傚拰鍑烘枡淇″彿銆�
-    /// </remarks>
-    public enum PinMachineDBName
-    {
-        /// <summary>
-        /// 鐗╂祦绾胯繍琛屼俊鍙�
-        /// </summary>
-        /// <remarks>
-        /// 琛ㄧず鐗╂祦绾垮綋鍓嶆槸鍚﹀湪杩愯銆�
-        /// </remarks>
-        LogisticsLineRunningSignal,
-
-        /// <summary>
-        /// 鎻掓嫈閽夋満杩愯淇″彿
-        /// </summary>
-        /// <remarks>
-        /// 琛ㄧず鎻掓嫈閽夋満鏈韩鏄惁鍦ㄨ繍琛屻��
-        /// </remarks>
-        PlugPinMachineRunningSignal,
-
-        /// <summary>
-        /// 瑕佹枡璇锋眰-涓婂眰
-        /// </summary>
-        /// <remarks>
-        /// 涓婂眰宸ヤ綅闇�瑕佸師鏂欑殑璇锋眰淇″彿銆�
-        /// 褰撳�间负闈為浂鏃讹紝琛ㄧず涓婂眰闇�瑕佽ˉ鍏呯墿鏂欍��
-        /// </remarks>
-        MaterialRequestUpper,
-
-        /// <summary>
-        /// 鍑烘枡璇锋眰-涓婂眰
-        /// </summary>
-        /// <remarks>
-        /// 涓婂眰宸ヤ綅瀹屾垚鍔犲伐鍚庣殑鍑烘枡璇锋眰淇″彿銆�
-        /// 褰撳�间负闈為浂鏃讹紝琛ㄧず涓婂眰鏈夋枡闇�瑕佽緭鍑恒��
-        /// </remarks>
-        OutputRequestUpper,
-
-        /// <summary>
-        /// 鎻掓嫈閽夌洏鍙嚭鏂�-涓婂眰
-        /// </summary>
-        /// <remarks>
-        /// WCS 鍐欏叆鐨勪俊鍙凤紝鍛婄煡涓婂眰鎵樼洏鍙互鍑烘枡銆�
-        /// 褰� WCS 璁剧疆涓� 1 鏃讹紝琛ㄧず鍏佽涓婂眰鍑烘枡銆�
-        /// </remarks>
-        PlugPinTrayOutputReadyUpper,
-
-        /// <summary>
-        /// 瑕佹枡璇锋眰-涓嬪眰
-        /// </summary>
-        /// <remarks>
-        /// 涓嬪眰宸ヤ綅闇�瑕佸師鏂欑殑璇锋眰淇″彿銆�
-        /// 褰撳�间负闈為浂鏃讹紝琛ㄧず涓嬪眰闇�瑕佽ˉ鍏呯墿鏂欍��
-        /// </remarks>
-        MaterialRequestLower,
-
-        /// <summary>
-        /// 鍑烘枡璇锋眰-涓嬪眰
-        /// </summary>
-        /// <remarks>
-        /// 涓嬪眰宸ヤ綅瀹屾垚鍔犲伐鍚庣殑鍑烘枡璇锋眰淇″彿銆�
-        /// 褰撳�间负闈為浂鏃讹紝琛ㄧず涓嬪眰鏈夋枡闇�瑕佽緭鍑恒��
-        /// </remarks>
-        OutputRequestLower,
-
-        /// <summary>
-        /// 鎻掓嫈閽夌洏鍙嚭鏂�-涓嬪眰
-        /// </summary>
-        /// <remarks>
-        /// WCS 鍐欏叆鐨勪俊鍙凤紝鍛婄煡涓嬪眰鎵樼洏鍙互鍑烘枡銆�
-        /// 褰� WCS 璁剧疆涓� 1 鏃讹紝琛ㄧず鍏佽涓嬪眰鍑烘枡銆�
-        /// </remarks>
-        PlugPinTrayOutputReadyLower
-    }
-}
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Abstractions/ISocketClientGateway.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Abstractions/ISocketClientGateway.cs
index 0d56122..f736b8f 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Abstractions/ISocketClientGateway.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/Abstractions/ISocketClientGateway.cs
@@ -50,6 +50,6 @@
         /// <param name="clientId">瀹㈡埛绔爣璇嗭紙閫氬父鏄� IP 鍦板潃锛�</param>
         /// <param name="cancellationToken">鍙栨秷浠ょ墝</param>
         /// <param name="robotCrane">鏈哄櫒浜虹姸鎬佸璞�</param>
-        Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken, RobotSocketState robotCrane);
+        Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken);
     }
 }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotClientManager.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotClientManager.cs
index c021204..62241f4 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotClientManager.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotClientManager.cs
@@ -146,7 +146,7 @@
 
                     // 寮傛鍚姩瀹㈡埛绔秷鎭鐞嗗惊鐜�
                     // 浣跨敤 TaskContinuationOptions.OnlyOnFaulted 鎹曡幏寮傚父鎯呭喌
-                    _ = _tcpSocket.HandleClientAsync(tcpClient, robotCrane.IPAddress, _tcpSocket._cts.Token, latestStateForSubscribe)
+                    _ = _tcpSocket.HandleClientAsync(tcpClient, robotCrane.IPAddress, _tcpSocket._cts.Token)
                         .ContinueWith(t =>
                         {
                             // 濡傛灉澶勭悊鍑虹幇寮傚父
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
index f0b8b36..838bd20 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/RobotJob/RobotTaskProcessor.cs
@@ -590,39 +590,6 @@
                 return false;
             }
 
-            // 瑙f瀽杩斿洖鐨勪换鍔′俊鎭�
-            //var taskInfos = JsonConvert.DeserializeObject<List<Dt_Task>>(content.Data.ToJson() ?? string.Empty) ?? new List<Dt_Task>();
-            //var taskInfo = taskInfos.FirstOrDefault();
-
-            //// 鑾峰彇婧愬湴鍧�
-            //string sourceAddress = taskDTO.SourceAddress;
-
-            //// 鏌ユ壘婧愬湴鍧�瀵瑰簲鐨勮緭閫佺嚎璁惧
-            //IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceAddress));
-
-            //if (device != null)
-            //{
-            //    // 灏嗚澶囪浆鎹负杈撻�佺嚎绫诲瀷
-            //    CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
-
-            //    // 璁剧疆杈撻�佺嚎鐨勭洰鏍囧湴鍧�
-            //    conveyorLine.SetValue(ConveyorLineDBNameNew.Target, taskInfo.NextAddress, sourceAddress);
-
-            //    // 璁剧疆杈撻�佺嚎鐨勪换鍔″彿
-            //    conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, taskInfo.TaskNum, sourceAddress);
-
-            //    // 瑙﹀彂杈撻�佺嚎寮�濮嬫墽琛岋紙鍐欏叆 WCS_ACK = 1锛�
-            //    conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, sourceAddress);
-
-            //    // 鏇存柊浠诲姟鐘舵�佸埌涓嬩竴闃舵
-            //    if (_taskService.UpdateTaskStatusToNext(taskInfo).Status)
-            //    {
-            //        _logger.LogInformation("HandleInboundTaskAsync锛氬叆搴撲换鍔″鐞嗘垚鍔燂紝浠诲姟鍙�: {TaskNum}", taskInfo.TaskNum);
-            //        QuartzLogger.Info($"HandleInboundTaskAsync锛氬叆搴撲换鍔″鐞嗘垚鍔燂紝浠诲姟鍙�: {taskInfo.TaskNum}", state.RobotCrane?.DeviceName ?? "Unknown");
-            //        return true;
-            //    }
-            //}
-
             return true;
         }
 
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/SocketClientGateway.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/SocketClientGateway.cs
index 7142a7b..bbf3377 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/SocketClientGateway.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/SocketClientGateway.cs
@@ -66,9 +66,9 @@
         /// <param name="cancellationToken">鍙栨秷浠ょ墝</param>
         /// <param name="robotCrane">鏈哄櫒浜虹姸鎬�</param>
         /// <returns>浠诲姟</returns>
-        public Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken, RobotSocketState robotCrane)
+        public Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken)
         {
-            return _tcpSocket.HandleClientAsync(client, clientId, cancellationToken, robotCrane);
+            return _tcpSocket.HandleClientAsync(client, clientId, cancellationToken);
         }
     }
 }
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Messaging.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Messaging.cs
index 62c05dd..6c5b0ef 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Messaging.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Messaging.cs
@@ -23,8 +23,7 @@
         /// <param name="client">TCP 瀹㈡埛绔繛鎺�</param>
         /// <param name="clientId">瀹㈡埛绔敮涓�鏍囪瘑</param>
         /// <param name="cancellationToken">鍙栨秷浠ょ墝</param>
-        /// <param name="robotCrane">鏈哄櫒浜虹姸鎬�</param>
-        public async Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken, RobotSocketState robotCrane)
+        public async Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken)
         {
             using (client)
             using (NetworkStream networkStream = client.GetStream())
@@ -60,10 +59,14 @@
                             break;
                         }
 
-                        if(message == lastMessage)
+                        // 鎸夊鎴风鍘婚噸锛氭鏌ユ槸鍚︿笌璇ュ鎴风涓婃娑堟伅鐩稿悓
+                        lock (_syncRoot)
                         {
-                            // 閲嶅娑堟伅锛屽拷鐣�
-                            continue;
+                            if (_clientLastMessage.TryGetValue(clientId, out var prev) && message == prev)
+                            {
+                                continue;
+                            }
+                            _clientLastMessage[clientId] = message;
                         }
 
                         // 鏇存柊瀹㈡埛绔姸鎬�
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs
index afaa8ec..e72378c 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.Server.cs
@@ -161,6 +161,9 @@
                 // 绉婚櫎娲昏穬鏃堕棿璁板綍
                 _clientLastActive.Remove(clientId);
 
+                // 绉婚櫎涓婃娑堟伅璁板綍
+                _clientLastMessage.Remove(clientId);
+
                 // 绉婚櫎缂栫爜璁板綍
                 _clientEncodings.Remove(clientId);
 
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.cs
index d23fe10..3523884 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SocketServer/TcpSocketServer.cs
@@ -1,13 +1,6 @@
 using Microsoft.Extensions.Options;
-using System;
-using System.Collections.Generic;
-using System.IO;
 using System.Net.Sockets;
 using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-using WIDESEAWCS_Model.Models;
-using WIDESEAWCS_QuartzJob;
 
 namespace WIDESEAWCS_Tasks.SocketServer
 {
@@ -137,9 +130,13 @@
         public bool IsRunning { get; private set; }
 
         /// <summary>
-        /// 涓婃鎺ユ敹娑堟伅婧�
+        /// 姣忎釜瀹㈡埛绔笂娆℃帴鏀剁殑娑堟伅锛岀敤浜庡幓閲�
         /// </summary>
-        public string lastMessage;
+        /// <remarks>
+        /// Key: 瀹㈡埛绔� ID
+        /// Value: 涓婃鎺ユ敹鐨勬秷鎭唴瀹�
+        /// </remarks>
+        public readonly Dictionary<string, string> _clientLastMessage = new();
 
         /// <summary>
         /// 娑堟伅鎺ユ敹浜嬩欢
@@ -200,8 +197,9 @@
         /// <param name="message">鏃ュ織娑堟伅</param>
         private void Log(string message)
         {
+            //Logger.None.Information(message);
             Console.WriteLine(message);
             try { File.AppendAllText(_logFile, message + Environment.NewLine); } catch { }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
index abe9f65..cdd7a09 100644
--- a/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
+++ b/Code/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob/StackerCraneTaskSelector.cs
@@ -203,10 +203,13 @@
         {
             // 鍏堣繘琛屾湰鍦扮珯鍙版鏌ワ紙PLC 璇诲彇锛屽揩閫燂級锛岄伩鍏嶄笉蹇呰鐨� WMS HTTP 璋冪敤
 
-            // 鍒ゆ柇 TargetAddress 杈撻�佺嚎绔欏彴鏄惁绌洪棽
-            if (!IsTargetAddressConveyorStationAvailable(outboundTask))
+            if (outboundTask.TaskType != (int)TaskOutboundTypeEnum.OutEmpty)
             {
-                return null;
+                // 鍒ゆ柇 TargetAddress 杈撻�佺嚎绔欏彴鏄惁绌洪棽
+                if (!IsTargetAddressConveyorStationAvailable(outboundTask))
+                {
+                    return null;
+                }
             }
 
             // 鍒ゆ柇 NextAddress 鍑哄簱绔欏彴鏄惁鍙敤
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockService.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockService.cs
index 6dc1603..27fc74f 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockService.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_IStockService/IStockService.cs
@@ -71,5 +71,12 @@
         /// <param name="deviceName">璁惧鍚嶇О锛堢敤浜庡姩鎬丮ES鍑瘉鏌ヨ锛�</param>
         /// <returns>鎿嶄綔缁撴灉</returns>
         Task<WebResponseContent> GroupPalletConfirmAsync(string palletCode, string deviceName);
+
+        /// <summary>
+        /// 鏍规嵁鎵樼洏鍙锋煡璇㈠簱瀛樻槑缁嗘暟閲�
+        /// </summary>
+        /// <param name="palletCode">鎵樼洏鍙�</param>
+        /// <returns>搴撳瓨鏄庣粏鏁伴噺</returns>
+        Task<WebResponseContent> GetStockDetailCountByPalletCodeAsync(string palletCode);
     }
 }
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
index 03fa684..2a154b9 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
@@ -584,6 +584,26 @@
         }
 
         /// <summary>
+        /// 鏍规嵁鎵樼洏鍙锋煡璇㈠簱瀛樻槑缁嗘暟閲�
+        /// </summary>
+        /// <param name="palletCode">鎵樼洏鍙�</param>
+        /// <returns>搴撳瓨鏄庣粏鏁伴噺</returns>
+        public async Task<WebResponseContent> GetStockDetailCountByPalletCodeAsync(string palletCode)
+        {
+            WebResponseContent content = new WebResponseContent();
+            if (string.IsNullOrWhiteSpace(palletCode))
+                return content.Error("鎵樼洏鍙蜂笉鑳戒负绌�");
+
+            var stockInfo = StockInfoService.Repository.QueryFirst(s => s.PalletCode == palletCode);
+            if (stockInfo == null)
+                return content.Error("鎵樼洏涓嶅瓨鍦�");
+
+            var count = await StockInfoDetailService.Repository.Db.Queryable<Dt_StockInfoDetail>()
+                .CountAsync(d => d.StockId == stockInfo.Id);
+            return content.OK("鏌ヨ鎴愬姛", new { PalletCode = palletCode, DetailCount = count });
+        }
+
+        /// <summary>
         /// 鏍规嵁璁惧鍚嶇О鍜屾墭鐩樺彿瑙f瀽MES璁惧閰嶇疆
         /// </summary>
         /// <param name="deviceName">璁惧鍚嶇О</param>
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs
index 23d3d27..1a240f1 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_GradingMachine.cs
@@ -144,7 +144,7 @@
                     PalletType = stock.PalletType,
                     SourceAddress = stock.LocationCode,
                     CurrentAddress = stock.LocationCode,
-                    NextAddress = TaskAddressConstants.DEFAULT_ADDRESS,
+                    NextAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS,
                     TargetAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS,
                     Roadway = stock.LocationDetails.RoadwayNo,
                     TaskType = TaskOutboundTypeEnum.Outbound.GetHashCode(),
@@ -158,8 +158,8 @@
                 {
                     var result = await BaseDal.AddDataAsync(taskList) > 0;
                     var wmstaskDto = result ? _mapper.Map<WMSTaskDTO>(taskList) : null;
-
-                    var httpResponse = _httpClientHelper.Post<WebResponseContent>("http://logistics-service/api/logistics/notifyoutbound", JsonSerializer.Serialize(wmstaskDto)).Data;
+                    var wmsTaskDtos = new List<WMSTaskDTO> { wmstaskDto };
+                    var httpResponse = _httpClientHelper.Post<WebResponseContent>("http://localhost:9292/api/Task/ReceiveTask", JsonSerializer.Serialize(wmsTaskDtos)).Data;
                     if (result && httpResponse != null)
                     {
                         return content.OK("鍑哄簱璇锋眰鎴愬姛");
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_AutoOutbound.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_AutoOutbound.cs
index bf5137d..6bc8518 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_AutoOutbound.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_AutoOutbound.cs
@@ -33,7 +33,8 @@
                 // 杩囨护鏈変綅缃笖浣嶇疆鏈夊簱瀛樼殑璁板綍
                 expiredStocks = expiredStocks
                     .Where(s => s.LocationDetails != null
-                        && s.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode())
+                        && s.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode()
+                        && s.LocationDetails.EnableStatus != EnableStatusEnum.Disable.GetHashCode())
                     .ToList();
 
                 if (!expiredStocks.Any())
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Tray.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Tray.cs
index 83d8cbc..514fcf9 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Tray.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/WCS/TaskService_Tray.cs
@@ -51,14 +51,14 @@
                 var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode);
                 if (stockInfo == null) return WebResponseContent.Instance.Error("鏈壘鍒板搴斿簱瀛樹俊鎭�");
 
+                stockInfo.LocationCode = location.LocationCode;
+                stockInfo.LocationId = location.Id;
+                stockInfo.StockStatus = StockStatusEmun.绌烘墭鐩樺簱瀛�.GetHashCode();
+
+                location.LocationStatus = LocationStatusEnum.InStock.GetHashCode();
+
                 return await _unitOfWorkManage.BeginTranAsync(async () =>
                 {
-                    stockInfo.LocationCode = location.LocationCode;
-                    stockInfo.LocationId = location.Id;
-                    stockInfo.StockStatus = StockStatusEmun.绌烘墭鐩樺簱瀛�.GetHashCode();
-
-                    location.LocationStatus = LocationStatusEnum.InStock.GetHashCode();
-
                     var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location);
                     var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo);
                     if (!updateLocationResult || !updateStockResult)
diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockController.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockController.cs
index 6fecdfb..d6d062c 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockController.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Controllers/Stock/StockController.cs
@@ -85,5 +85,16 @@
         {
             return await Service.GroupPalletConfirmAsync(dto.PalletCode, dto.DeviceName);
         }
+
+        /// <summary>
+        /// 鏍规嵁鎵樼洏鍙锋煡璇㈠簱瀛樻槑缁嗘暟閲�
+        /// </summary>
+        /// <param name="palletCode">鎵樼洏鍙�</param>
+        /// <returns>搴撳瓨鏄庣粏鏁伴噺</returns>
+        [HttpGet("GetStockDetailCount"), AllowAnonymous]
+        public async Task<WebResponseContent> GetStockDetailCount(string palletCode)
+        {
+            return await Service.GetStockDetailCountByPalletCodeAsync(palletCode);
+        }
     }
 }
diff --git "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/instance-1001/config.json" "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/instance-1001/config.json"
index 798f25c..056b3b9 100644
--- "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/instance-1001/config.json"
+++ "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/instance-1001/config.json"
@@ -2,7 +2,7 @@
   "id": "1001",
   "name": "A\u533A_\u4E00\u6CE8\u8F93\u9001\u7EBF",
   "plcType": "S71500",
-  "port": 103,
+  "port": 102,
   "activationKey": "",
   "autoStart": false,
   "protocolTemplateId": "protocol-1001",
diff --git "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/instance-1002/config.json" "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/instance-1002/config.json"
index 625a805..b1a3d73 100644
--- "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/instance-1002/config.json"
+++ "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/instance-1002/config.json"
@@ -2,7 +2,7 @@
   "id": "1002",
   "name": "A\u533A_\u6362\u76D8\u8F93\u9001\u7EBF",
   "plcType": "S71500",
-  "port": 104,
+  "port": 102,
   "activationKey": "",
   "autoStart": false,
   "protocolTemplateId": "protocol-1002",
diff --git "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/protocol-templates.json" "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/protocol-templates.json"
index b695037..386cf64 100644
--- "a/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/protocol-templates.json"
+++ "b/Code/\346\265\213\350\257\225\345\267\245\345\205\267/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Server/Data/protocol-templates.json"
@@ -2225,5 +2225,1794 @@
         "direction": 2
       }
     ]
+  },
+  {
+    "id": "protocol-1004",
+    "name": "B\u533A_\u5E38\u6E29\u5316\u6210\u8F93\u9001\u7EBF \u534F\u8BAE\u6A21\u677F",
+    "version": "1.0",
+    "fields": [
+      {
+        "fieldKey": "2125_TaskNo",
+        "dbNumber": 50,
+        "offset": 960,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_Source",
+        "dbNumber": 50,
+        "offset": 962,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_Target",
+        "dbNumber": 50,
+        "offset": 964,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_BoxType",
+        "dbNumber": 50,
+        "offset": 966,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_CV_State",
+        "dbNumber": 50,
+        "offset": 967,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 968,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_WCS_STB",
+        "dbNumber": 50,
+        "offset": 969,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 970,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_PLC_STB",
+        "dbNumber": 50,
+        "offset": 971,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 972,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 973,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 974,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_WCS_Special",
+        "dbNumber": 50,
+        "offset": 975,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 976,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_Last_pallet",
+        "dbNumber": 50,
+        "offset": 977,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_Barcode",
+        "dbNumber": 50,
+        "offset": 978,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_Spare_1",
+        "dbNumber": 50,
+        "offset": 998,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2125_Spare_2",
+        "dbNumber": 50,
+        "offset": 999,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_TaskNo",
+        "dbNumber": 50,
+        "offset": 4640,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_Source",
+        "dbNumber": 50,
+        "offset": 4642,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_Target",
+        "dbNumber": 50,
+        "offset": 4644,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_BoxType",
+        "dbNumber": 50,
+        "offset": 4646,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_CV_State",
+        "dbNumber": 50,
+        "offset": 4647,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 4648,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_WCS_STB",
+        "dbNumber": 50,
+        "offset": 4649,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 4650,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_PLC_STB",
+        "dbNumber": 50,
+        "offset": 4651,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 4652,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 4653,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 4654,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_WCS_Special",
+        "dbNumber": 50,
+        "offset": 4655,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 4656,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_Last_pallet",
+        "dbNumber": 50,
+        "offset": 4657,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_Barcode",
+        "dbNumber": 50,
+        "offset": 4658,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_Spare_1",
+        "dbNumber": 50,
+        "offset": 4678,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2217_Spare_2",
+        "dbNumber": 50,
+        "offset": 4679,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_TaskNo",
+        "dbNumber": 50,
+        "offset": 0,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_Source",
+        "dbNumber": 50,
+        "offset": 2,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_Target",
+        "dbNumber": 50,
+        "offset": 4,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_BoxType",
+        "dbNumber": 50,
+        "offset": 6,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_CV_State",
+        "dbNumber": 50,
+        "offset": 7,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 8,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_WCS_STB",
+        "dbNumber": 50,
+        "offset": 9,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 10,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_PLC_STB",
+        "dbNumber": 50,
+        "offset": 11,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 12,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 13,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 14,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_WCS_Special",
+        "dbNumber": 50,
+        "offset": 15,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 16,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_Last_pallet",
+        "dbNumber": 50,
+        "offset": 17,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_Barcode",
+        "dbNumber": 50,
+        "offset": 18,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_Spare_1",
+        "dbNumber": 50,
+        "offset": 38,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2101_Spare_2",
+        "dbNumber": 50,
+        "offset": 39,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_TaskNo",
+        "dbNumber": 50,
+        "offset": 80,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_Source",
+        "dbNumber": 50,
+        "offset": 82,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_Target",
+        "dbNumber": 50,
+        "offset": 84,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_BoxType",
+        "dbNumber": 50,
+        "offset": 86,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_CV_State",
+        "dbNumber": 50,
+        "offset": 87,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 88,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_WCS_STB",
+        "dbNumber": 50,
+        "offset": 89,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 90,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_PLC_STB",
+        "dbNumber": 50,
+        "offset": 91,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 92,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 93,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 94,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_WCS_Special",
+        "dbNumber": 50,
+        "offset": 95,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 96,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_Last_pallet",
+        "dbNumber": 50,
+        "offset": 97,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_Barcode",
+        "dbNumber": 50,
+        "offset": 98,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_Spare_1",
+        "dbNumber": 50,
+        "offset": 118,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2103_Spare_2",
+        "dbNumber": 50,
+        "offset": 119,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_TaskNo",
+        "dbNumber": 50,
+        "offset": 680,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_Source",
+        "dbNumber": 50,
+        "offset": 682,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_Target",
+        "dbNumber": 50,
+        "offset": 684,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_BoxType",
+        "dbNumber": 50,
+        "offset": 686,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_CV_State",
+        "dbNumber": 50,
+        "offset": 687,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 688,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_WCS_STB",
+        "dbNumber": 50,
+        "offset": 689,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 690,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_PLC_STB",
+        "dbNumber": 50,
+        "offset": 691,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 692,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 693,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 694,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_WCS_Special",
+        "dbNumber": 50,
+        "offset": 695,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 696,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_Last_pallet",
+        "dbNumber": 50,
+        "offset": 697,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_Barcode",
+        "dbNumber": 50,
+        "offset": 698,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_Spare_1",
+        "dbNumber": 50,
+        "offset": 718,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2118_Spare_2",
+        "dbNumber": 50,
+        "offset": 719,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_TaskNo",
+        "dbNumber": 50,
+        "offset": 640,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_Source",
+        "dbNumber": 50,
+        "offset": 642,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_Target",
+        "dbNumber": 50,
+        "offset": 644,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_BoxType",
+        "dbNumber": 50,
+        "offset": 646,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_CV_State",
+        "dbNumber": 50,
+        "offset": 647,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 648,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_WCS_STB",
+        "dbNumber": 50,
+        "offset": 649,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 650,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_PLC_STB",
+        "dbNumber": 50,
+        "offset": 651,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 652,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 653,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 654,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_WCS_Special",
+        "dbNumber": 50,
+        "offset": 655,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 656,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_Last_pallet",
+        "dbNumber": 50,
+        "offset": 657,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_Barcode",
+        "dbNumber": 50,
+        "offset": 658,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_Spare_1",
+        "dbNumber": 50,
+        "offset": 678,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2117_Spare_2",
+        "dbNumber": 50,
+        "offset": 679,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_TaskNo",
+        "dbNumber": 50,
+        "offset": 4320,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_Source",
+        "dbNumber": 50,
+        "offset": 4322,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_Target",
+        "dbNumber": 50,
+        "offset": 4324,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_BoxType",
+        "dbNumber": 50,
+        "offset": 4326,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_CV_State",
+        "dbNumber": 50,
+        "offset": 4327,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 4328,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_WCS_STB",
+        "dbNumber": 50,
+        "offset": 4329,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 4330,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_PLC_STB",
+        "dbNumber": 50,
+        "offset": 4331,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 4332,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 4333,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 4334,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_WCS_Special",
+        "dbNumber": 50,
+        "offset": 4335,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 4336,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_Last_pallet",
+        "dbNumber": 50,
+        "offset": 4337,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_Barcode",
+        "dbNumber": 50,
+        "offset": 4338,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_Spare_1",
+        "dbNumber": 50,
+        "offset": 4358,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2209_Spare_2",
+        "dbNumber": 50,
+        "offset": 4359,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_TaskNo",
+        "dbNumber": 50,
+        "offset": 4360,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_Source",
+        "dbNumber": 50,
+        "offset": 4362,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_Target",
+        "dbNumber": 50,
+        "offset": 4364,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_BoxType",
+        "dbNumber": 50,
+        "offset": 4366,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_CV_State",
+        "dbNumber": 50,
+        "offset": 4367,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 4368,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_WCS_STB",
+        "dbNumber": 50,
+        "offset": 4369,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 4370,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_PLC_STB",
+        "dbNumber": 50,
+        "offset": 4371,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 4372,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 4373,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 4374,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_WCS_Special",
+        "dbNumber": 50,
+        "offset": 4375,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 4376,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_Last_pallet",
+        "dbNumber": 50,
+        "offset": 4377,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_Barcode",
+        "dbNumber": 50,
+        "offset": 4378,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_Spare_1",
+        "dbNumber": 50,
+        "offset": 4398,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2210_Spare_2",
+        "dbNumber": 50,
+        "offset": 4399,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_TaskNo",
+        "dbNumber": 50,
+        "offset": 760,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_Source",
+        "dbNumber": 50,
+        "offset": 762,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_Target",
+        "dbNumber": 50,
+        "offset": 764,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_BoxType",
+        "dbNumber": 50,
+        "offset": 766,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_CV_State",
+        "dbNumber": 50,
+        "offset": 767,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 768,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_WCS_STB",
+        "dbNumber": 50,
+        "offset": 769,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 770,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_PLC_STB",
+        "dbNumber": 50,
+        "offset": 771,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 772,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 773,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 774,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_WCS_Special",
+        "dbNumber": 50,
+        "offset": 775,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 776,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_Last_pallet",
+        "dbNumber": 50,
+        "offset": 777,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_Barcode",
+        "dbNumber": 50,
+        "offset": 778,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_Spare_1",
+        "dbNumber": 50,
+        "offset": 798,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2120_Spare_2",
+        "dbNumber": 50,
+        "offset": 799,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_TaskNo",
+        "dbNumber": 50,
+        "offset": 4400,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_Source",
+        "dbNumber": 50,
+        "offset": 4402,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_Target",
+        "dbNumber": 50,
+        "offset": 4404,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_BoxType",
+        "dbNumber": 50,
+        "offset": 4406,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_CV_State",
+        "dbNumber": 50,
+        "offset": 4407,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 4408,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_WCS_STB",
+        "dbNumber": 50,
+        "offset": 4409,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 4410,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_PLC_STB",
+        "dbNumber": 50,
+        "offset": 4411,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 4412,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 4413,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 4414,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_WCS_Special",
+        "dbNumber": 50,
+        "offset": 4415,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 4416,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_Last_pallet",
+        "dbNumber": 50,
+        "offset": 4417,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_Barcode",
+        "dbNumber": 50,
+        "offset": 4418,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_Spare_1",
+        "dbNumber": 50,
+        "offset": 4438,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2211_Spare_2",
+        "dbNumber": 50,
+        "offset": 4439,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_TaskNo",
+        "dbNumber": 50,
+        "offset": 4480,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_Source",
+        "dbNumber": 50,
+        "offset": 4482,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_Target",
+        "dbNumber": 50,
+        "offset": 4484,
+        "bit": 1,
+        "dataType": 1,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_BoxType",
+        "dbNumber": 50,
+        "offset": 4486,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_CV_State",
+        "dbNumber": 50,
+        "offset": 4487,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_CV_ERRCode",
+        "dbNumber": 50,
+        "offset": 4488,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_WCS_STB",
+        "dbNumber": 50,
+        "offset": 4489,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_WCS_ACK",
+        "dbNumber": 50,
+        "offset": 4490,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_PLC_STB",
+        "dbNumber": 50,
+        "offset": 4491,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_PLC_ACK",
+        "dbNumber": 50,
+        "offset": 4492,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_PLC_REQ",
+        "dbNumber": 50,
+        "offset": 4493,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_WCS_ERRCode",
+        "dbNumber": 50,
+        "offset": 4494,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_WCS_Special",
+        "dbNumber": 50,
+        "offset": 4495,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_Equ_Auto",
+        "dbNumber": 50,
+        "offset": 4496,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_Last_pallet",
+        "dbNumber": 50,
+        "offset": 4497,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_Barcode",
+        "dbNumber": 50,
+        "offset": 4498,
+        "bit": 1,
+        "dataType": 0,
+        "length": 20,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_Spare_1",
+        "dbNumber": 50,
+        "offset": 4518,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      },
+      {
+        "fieldKey": "2213_Spare_2",
+        "dbNumber": 50,
+        "offset": 4519,
+        "bit": 1,
+        "dataType": 0,
+        "length": 1,
+        "direction": 2
+      }
+    ]
   }
 ]
\ No newline at end of file

--
Gitblit v1.9.3