From 6e380a6002fb7675f8795d8c223801cf6ec67347 Mon Sep 17 00:00:00 2001
From: huangxiaoqiang <1247017146@qq.com>
Date: 星期三, 26 三月 2025 09:22:21 +0800
Subject: [PATCH] 修改化成实框与空框去静置逻辑

---
 CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerJZCrane.cs         |  501 ++++++++++++++++++++
 CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerJZJob/CommonStackerJZCraneJob.cs                 |  505 +++++++++++++++++++++
 /dev/null                                                                                                     |  341 --------------
 CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_Tasks/obj/Debug/net6.0/WIDESEA_Tasks.csproj.FileListAbsolute.txt |   11 
 CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs                       |    2 
 CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Const/SysConfigKeyConst.cs                             |    2 
 CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs                |    2 
 CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/WIDESEA_StorageTaskServices.csproj           |    3 
 CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj.user                          |    2 
 CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs                  |   25 
 CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml.user   |    4 
 CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs                                |    2 
 12 files changed, 1,048 insertions(+), 352 deletions(-)

diff --git a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Const/SysConfigKeyConst.cs b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Const/SysConfigKeyConst.cs
index 390e0cb..dee45b4 100644
--- a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Const/SysConfigKeyConst.cs
+++ b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Common/Const/SysConfigKeyConst.cs
@@ -87,6 +87,6 @@
         /// </summary>
         public const string SetEmptyOutbyInToOutOneAsync = "SetEmptyOutbyInToOutOneAsync";
 
-        public const string GetJZStockInfo = "GetJZStockInfo";
+        public const string QueryStockInfoForRealTrayJZAsync = "QueryStockInfoForRealTrayJZAsync";
     }
 }
\ No newline at end of file
diff --git a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerJZCrane.cs b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerJZCrane.cs
new file mode 100644
index 0000000..b5b5595
--- /dev/null
+++ b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerJZCrane.cs
@@ -0,0 +1,501 @@
+锘�#region << 鐗� 鏈� 娉� 閲� >>
+/*----------------------------------------------------------------
+ * 鍛藉悕绌洪棿锛歐IDESEAWCS_QuartzJob
+ * 鍒涘缓鑰咃細鑳$搴�
+ * 鍒涘缓鏃堕棿锛�2024/8/2 16:13:36
+ * 鐗堟湰锛歏1.0.0
+ * 鎻忚堪锛氫竴鑸爢鍨涙満瀹炵幇绫伙紝瀹炵幇鍫嗗灈鏈烘帴鍙e眰
+ *
+ * ----------------------------------------------------------------
+ * 淇敼浜猴細
+ * 淇敼鏃堕棿锛�
+ * 鐗堟湰锛歏1.0.1
+ * 淇敼璇存槑锛�
+ * 
+ *----------------------------------------------------------------*/
+#endregion << 鐗� 鏈� 娉� 閲� >>
+
+using HslCommunication;
+using Microsoft.AspNetCore.Http;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEAWCS_Communicator;
+using WIDESEAWCS_Core.Enums;
+using WIDESEAWCS_QuartzJob.DeviceBase;
+using WIDESEAWCS_QuartzJob.DTO;
+using WIDESEAWCS_QuartzJob.StackerCrane;
+using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
+
+namespace WIDESEAWCS_QuartzJob
+{
+    /// <summary>
+    /// 涓�鑸爢鍨涙満瀹炵幇绫伙紝瀹炵幇鍫嗗灈鏈烘帴鍙e眰
+    /// </summary>
+    [Description("鍫嗗灈鏈�")]
+    public class CommonStackerJZCrane : IStackerCrane
+    {
+        #region Private Member
+
+
+        /// <summary>
+        /// 瀹屾垚淇″彿绛夊緟鏃堕棿
+        /// </summary>
+        private const int WaitTimeout = 20 * 6000;
+
+        /// <summary>
+        /// 瀹屾垚淇″彿璇诲彇棰戠巼
+        /// </summary>
+        private const int ReadTimeout = 100;
+
+        /// <summary>
+        /// 鍫嗗灈鏈洪�氳瀵硅薄
+        /// </summary>
+        private BaseCommunicator _communicator;
+        /// <summary>
+        /// 鍫嗗灈鏈哄崗璁俊鎭�
+        /// </summary>
+        private readonly List<DeviceProDTO> _deviceProDTOs;
+        /// <summary>
+        /// 鍫嗗灈鏈哄崗璁槑缁嗕俊鎭�
+        /// </summary>
+        private readonly List<DeviceProtocolDetailDTO> _deviceProtocolDetailDTOs;
+        /// <summary>
+        /// 璁惧缂栧彿
+        /// </summary>
+        public readonly string _deviceCode;
+        /// <summary>
+        /// 璁惧鍚嶇О
+        /// </summary>
+        public readonly string _deviceName;
+        /// <summary>
+        /// 涓婁竴娆′换鍔″彿
+        /// </summary>
+        private int _lastTaskNum;
+
+        private bool _isChecked = false;
+
+        private bool _heartStatr = true;
+
+        private bool _isConnected = true;
+        #endregion Private Member
+
+        #region Public Member
+        /// <summary>
+        /// 鍫嗗灈鏈洪�氳瀵硅薄
+        /// </summary>
+        public BaseCommunicator Communicator => _communicator;
+
+        /// <summary>
+        /// 鍫嗗灈鏈哄崗璁俊鎭�
+        /// </summary>
+        public List<DeviceProDTO> DeviceProDTOs => _deviceProDTOs;
+
+        /// <summary>
+        /// 鍫嗗灈鏈哄崗璁槑缁嗕俊鎭�
+        /// </summary>
+        public List<DeviceProtocolDetailDTO> DeviceProtocolDetailDTOs => _deviceProtocolDetailDTOs;
+
+        /// <summary>
+        /// 璁惧鐘舵��(绌洪棽/杩愯涓�...)
+        /// </summary>
+        public DeviceStatus Status => GetStatus();
+
+        /// <summary>
+        /// 涓婁竴娆℃墽琛岀殑浠诲姟鍙�
+        /// </summary>
+        public int LastTaskNum => _lastTaskNum;
+
+        /// <summary>
+        /// 褰撳墠姝e湪鎵ц鐨勪换鍔″彿
+        /// </summary>
+        public int CurrentTaskNum => GetCurrentTaskNum();
+
+        /// <summary>
+        /// 鍫嗗灈鏈虹姸鎬�
+        /// </summary>
+        public StackerCraneStatus StackerCraneStatusValue => GetStackerCraneStatus();
+
+        /// <summary>
+        /// 鍫嗗灈鏈虹姸鎬佷腑鏂囪鏄�
+        /// </summary>
+        public string StackerCraneStatusDes => GetEnumDes(StackerCraneStatusValue);
+
+        /// <summary>
+        /// 鎵嬭嚜鍔ㄧ姸鎬�
+        /// </summary>
+        public StackerCraneAutoStatus StackerCraneAutoStatusValue => GetStackerCraneAutoStatus();
+
+        /// <summary>
+        /// 鎵嬭嚜鍔ㄧ姸鎬佷腑鏂囪鏄�
+        /// </summary>
+        public string StackerCraneAutoStatusDes => GetEnumDes(StackerCraneAutoStatusValue);
+
+        /// <summary>
+        /// 浣滀笟鐘舵��
+        /// </summary>
+        public StackerCraneWorkStatus StackerCraneWorkStatusValue => GetStackerCraneWorkStatus();
+
+        /// <summary>
+        /// 浣滀笟鐘舵�佷腑鏂囪鏄�
+        /// </summary>
+        public string StackerCraneWorkStatusDes => GetEnumDes(StackerCraneWorkStatusValue);
+
+        /// <summary>
+        /// 璁惧缂栧彿
+        /// </summary>
+        public string DeviceCode => _deviceCode;
+
+        /// <summary>
+        /// 璁惧鍚嶇О
+        /// </summary>
+        public string DeviceName => _deviceName;
+
+        /// <summary>
+        /// 鍫嗗灈鏈烘槸鍚︽湁鏁呴殰
+        /// </summary>
+        public bool IsFault => StackerCraneStatusValue == StackerCraneStatus.Fault;
+
+        /// <summary>
+        /// 閫氳鏄惁宸茶繛鎺�
+        /// </summary>
+        public bool IsConnected => Communicator.IsConnected && _isConnected;
+
+        /// <summary>
+        /// 鍫嗗灈鏈轰换鍔″畬鎴愪簨浠�
+        /// </summary>
+        public event EventHandler<StackerCraneTaskCompletedEventArgs> StackerCraneTaskCompletedEventHandler;
+
+        /// <summary>
+        /// 鍫嗗灈鏈轰换鍔″懡浠ゅ璞�
+        /// </summary>
+        public object StackerCraneTaskCommand { get; set; }
+
+        /// <summary>
+        /// 鍫嗗灈鏈哄畬鎴愪簨浠舵槸鍚﹀凡璁㈤槄
+        /// </summary>
+        public bool IsEventSubscribed => StackerCraneTaskCompletedEventHandler != null;
+
+        /// <summary>
+        /// 鍫嗗灈鏈轰笌MOM杩炴帴鐘舵��
+        /// </summary>
+        public bool StackerOnline { get; set; } = false;
+
+        public int? LastTaskType { get; set; } = null;
+        #endregion
+
+        #region Constructor Function
+        /// <summary>
+        /// 鏋勯�犲嚱鏁�
+        /// </summary>
+        /// <param name="communicator">鍫嗗灈鏈洪�氳瀵硅薄</param>
+        /// <param name="deviceProDTOs">鍫嗗灈鏈哄崗璁俊鎭�</param>
+        /// <param name="deviceProtocolDetailDTOs">鍫嗗灈鏈哄崗璁槑缁嗕俊鎭�</param>
+        /// <param name="deviceCode">璁惧缂栧彿</param>
+        /// <param name="deviceName">璁惧鍚嶇О</param>
+        public CommonStackerJZCrane(BaseCommunicator communicator, List<DeviceProDTO> deviceProDTOs, List<DeviceProtocolDetailDTO> deviceProtocolDetailDTOs, string deviceCode, string deviceName)
+        {
+            _communicator = communicator;
+            _deviceProDTOs = deviceProDTOs;
+            _deviceProtocolDetailDTOs = deviceProtocolDetailDTOs;
+            _deviceCode = deviceCode;
+            _deviceName = deviceName;
+            CheckConnect();
+        }
+        #endregion
+
+        #region Private Method
+        /// <summary>
+        /// 鏍规嵁鍗忚璇诲彇鍫嗗灈鏈虹姸鎬�
+        /// </summary>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        private DeviceStatus GetStatus()
+        {
+            if (IsFault)
+            {
+                return DeviceStatus.Fault;
+            }
+            else if (!IsConnected)
+            {
+                return DeviceStatus.Offline;
+            }
+            if (StackerCraneStatusValue == StackerCraneStatus.Normal && StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic)
+            {
+                if (StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
+                {
+                    return DeviceStatus.Idle;
+                }
+                else if (StackerCraneWorkStatusValue == StackerCraneWorkStatus.Putting || StackerCraneWorkStatusValue == StackerCraneWorkStatus.PickUp || StackerCraneWorkStatusValue == StackerCraneWorkStatus.PickUpCompleted || StackerCraneWorkStatusValue == StackerCraneWorkStatus.PutCompleted)
+                {
+                    return DeviceStatus.Working;
+                }
+            }
+            return DeviceStatus.Unkonw;
+        }
+
+        private int GetCurrentTaskNum()
+        {
+            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CurrentTaskNum));
+            return devicePro == null ? throw new Exception() : (int)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍫嗗灈鏈鸿澶囩姸鎬�
+        /// </summary>
+        /// <returns></returns>
+        private StackerCraneStatus GetStackerCraneStatus()
+        {
+            return Enum.Parse<StackerCraneStatus>(GetStatus(nameof(StackerCraneStatus)));
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍫嗗灈鏈烘墜鑷姩鐘舵��
+        /// </summary>
+        /// <returns></returns>
+        private StackerCraneAutoStatus GetStackerCraneAutoStatus()
+        {
+            return Enum.Parse<StackerCraneAutoStatus>(GetStatus(nameof(StackerCraneAutoStatus)));
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍫嗗灈鏈哄伐浣滅姸鎬�
+        /// </summary>
+        /// <returns></returns>
+        private StackerCraneWorkStatus GetStackerCraneWorkStatus()
+        {
+            return Enum.Parse<StackerCraneWorkStatus>(GetStatus(nameof(StackerCraneWorkStatus)));
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏋氫妇璇存槑
+        /// </summary>
+        /// <typeparam name="T">鏋氫妇娉涘瀷</typeparam>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        private string GetEnumDes<T>(T value) where T : Enum
+        {
+            FieldInfo? fieldInfo = typeof(T).GetField(value.ToString());
+            if (fieldInfo != null)
+            {
+                DescriptionAttribute? descriptionAttribute = fieldInfo.GetCustomAttribute<DescriptionAttribute>();
+                if (descriptionAttribute != null)
+                {
+                    return descriptionAttribute.Description;
+                }
+                return "鏈畾涔�";
+            }
+            return "鏈煡";
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍗忚鍙傛暟绫诲瀷鑾峰彇鐘舵��
+        /// </summary>
+        /// <param name="protocolParamType">鍗忚鍙傛暟绫诲瀷</param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        private string GetStatus(string protocolParamType)
+        {
+            if (Communicator.IsConnected)
+            {
+                List<DeviceProDTO> devicePros = _deviceProDTOs.Where(x => x.DeviceProParamType == protocolParamType).ToList();
+                if (devicePros.Count == 0)
+                {
+                    throw new Exception("鏈幏鍙栧埌鍗忚淇℃伅");
+                }
+                for (int i = 0; i < devicePros.Count; i++)
+                {
+                    object readStatus = Communicator.ReadAsObj(devicePros[i].DeviceProAddress, devicePros[i].DeviceDataType);
+                    //todo 鍗忚鏄庣粏淇℃伅鏈幏鍙栧埌鏃舵姏鍑哄紓甯�
+                    DeviceProtocolDetailDTO? deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePros[i].DeviceProParamName) ?? throw new Exception();
+                    deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePros[i].DeviceProParamType && x.ProtocalDetailValue.Equals(readStatus.ToString()));
+                    if (deviceProtocolDetail != null)
+                    {
+                        return deviceProtocolDetail.ProtocolDetailType;
+                    }
+                    return StackerCraneStatus.Unkonw.ToString();
+                }
+            }
+            //todo 閫氳鏈繛鎺ユ椂鎶涘嚭寮傚父
+            return StackerCraneStatus.Unkonw.ToString();
+        }
+
+        /// <summary>
+        /// 姣旇緝涓や釜鍊兼槸鍚︾浉绛夈��
+        /// </summary>
+        /// <param name="value">绗竴涓�笺��</param>
+        /// <param name="paramValue">绗簩涓�笺��</param>
+        /// <returns>杩斿洖姣旇緝缁撴灉銆�</returns>
+        private bool Compare(object value, object paramValue)
+        {
+            return value.Equals(paramValue);
+        }
+
+        private void CheckConnect()
+        {
+            Task.Run(() =>
+            {
+                while (_heartStatr)
+                {
+                    try
+                    {
+                        DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault();
+                        if (devicePro == null)
+                            _isConnected = false;
+                        else
+                            Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
+                        _isConnected = true;
+                    }
+                    catch (Exception ex)
+                    {
+                        _isConnected = false;
+                    }
+                    Thread.Sleep(500);
+                }
+            });
+        }
+        #endregion
+
+        #region Public Method
+        /// <summary>
+        /// 鍙戦�佷换鍔″懡浠�
+        /// </summary>
+        /// <param name="command">浠诲姟鍛戒护</param>
+        /// <returns></returns>
+        public bool SendCommand<T>(T command) where T : IDataTransfer, new()
+        {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
+            DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
+            if (devicePro == null)
+            {
+                return false;
+            }
+            if (Communicator.WriteCustomer(devicePro.DeviceProAddress, command))
+            {
+                StackerCraneTaskCommand = command;
+                CheckStackerCraneTaskCompleted();
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 鐩戞祴鍫嗗灈鏈轰换鍔℃槸鍚﹀畬鎴�(闃叉浠诲姟瀹屾垚浜嬩欢鐩戞祴瓒呮椂锛屽畾涔夋墜鍔ㄨЕ鍙戝姛鑳�)
+        /// </summary>
+        public void CheckStackerCraneTaskCompleted()
+        {
+            if (_isChecked)
+                return;
+
+            Task.Run(() =>
+            {
+                _isChecked = true;
+                try
+                {
+                    DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(StackerCraneWorkStatus));
+                    if (devicePro != null)
+                    {
+                        DeviceProtocolDetailDTO? deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePro.DeviceProParamName && x.ProtocolDetailType == StackerCraneWorkStatus.WorkCompleted.ToString());
+                        if (deviceProtocolDetail != null)
+                        {
+                            OperateResult<TimeSpan> operateResult = new OperateResult<TimeSpan>();
+                            TypeCode typeCode = SiemensDBDataType.GetTypeCode(devicePro.DeviceDataType);
+                            switch (typeCode)
+                            {
+                                case TypeCode.Boolean:
+                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue));
+                                    break;
+                                case TypeCode.Byte:
+                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue));
+                                    break;
+                                case TypeCode.Int16:
+                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue));
+                                    break;
+                                case TypeCode.Int32:
+                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue));
+                                    break;
+                                case TypeCode.UInt16:
+                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue));
+                                    break;
+                                case TypeCode.UInt32:
+                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToUInt32(deviceProtocolDetail.ProtocalDetailValue));
+                                    break;
+                                default:
+                                    break;
+                            }
+                            int taskNum = CurrentTaskNum;
+                            if (operateResult.IsSuccess /*&& LastTaskNum != taskNum*/)
+                            {
+                                StackerCraneTaskCompletedEventArgs args = new(taskNum);
+                                StackerCraneTaskCompletedEventHandler?.Invoke(this, args);
+                                _lastTaskNum = taskNum;
+                            }
+                        }
+                    }
+                }
+                catch (Exception ex)
+                {
+
+                }
+                finally
+                {
+                    _isChecked = false;
+                }
+            });
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍙傛暟鍚嶇О璇诲彇鍫嗗灈鏈哄搴旂殑鏁版嵁銆�
+        /// </summary>
+        /// <typeparam name="TEnum">鍙傛暟鍚嶇О鏋氫妇绫诲瀷銆�</typeparam>
+        /// <typeparam name="TRsult">璇诲彇缁撴灉鐨勮繑鍥炲�肩被鍨嬨��</typeparam>
+        /// <param name="value">鍙傛暟鍚嶇О銆�</param>
+        /// <returns>杩斿洖璇诲彇鍒扮殑鏁版嵁銆�</returns>
+        /// <exception cref="Exception"></exception>
+        public TRsult GetValue<TEnum, TRsult>(TEnum value) where TEnum : Enum
+        {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
+            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == value.ToString());
+            return devicePro == null ? throw new Exception() : (TRsult)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
+        }
+
+        /// <summary>
+        /// 涓庤澶囩殑蹇冭烦
+        /// </summary>
+        public void Heartbeat()
+        {
+
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍙傛暟鍚嶇О鍐欏叆鍫嗗灈鏈哄搴旂殑鏁版嵁銆�
+        /// </summary>
+        /// <typeparam name="TEnum">鍙傛暟鍚嶇О鏋氫妇绫诲瀷銆�</typeparam>
+        /// <typeparam name="TValue">瑕佸啓鍏ョ殑鏁版嵁绫诲瀷銆�</typeparam>
+        /// <param name="enum">鍙傛暟鍚嶇О銆�</param>
+        /// <param name="value">瑕佸啓鍏ョ殑鏁版嵁銆�</param>
+        /// <returns>杩斿洖鍐欏叆鎴愬姛鎴栧け璐�</returns>
+        /// <exception cref="Exception"></exception>
+        public bool SetValue<TEnum, TValue>(TEnum @enum, TValue value)
+            where TEnum : Enum
+            where TValue : notnull
+        {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
+            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == @enum.ToString());
+            return devicePro == null ? throw new Exception() : Communicator.WriteObj(devicePro.DeviceProAddress, devicePro.DeviceDataType, value);
+        }
+
+        public void Dispose()
+        {
+            _heartStatr = false;
+            _communicator.Dispose();
+            GC.SuppressFinalize(this);
+        }
+        #endregion
+    }
+}
diff --git a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
index cd8c5d1..ea18105 100644
--- a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
+++ b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_TaskInfoService/TaskService.cs
@@ -93,7 +93,7 @@
                     if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
                     {
                         // 鍒ゆ柇浠诲姟鐩爣鍦板潃鍜岃矾寰勬槸鍚︽弧瓒崇壒瀹氭潯浠�
-                        if ((task.TargetAddress == "002-021-001" || task.TargetAddress == "001-021-001") && task.Roadway.Contains("JZ"))
+                        if ((task.TargetAddress == "002-061-003" || task.TargetAddress == "001-061-003") && task.Roadway.Contains("JZ"))
                         {
                             // 璁剧疆浠诲姟鐘舵�佷负鍑哄簱鏂板缓
                             task.TaskState = (int)TaskOutStatusEnum.OutNew;
diff --git a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
index b3c67f3..f8e5d93 100644
--- a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
+++ b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
@@ -851,6 +851,7 @@
 
                 // 瑙f瀽浠诲姟鏁版嵁
                 taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString());
+                WriteInfo("鍑哄簱", $"銆恵JsonConvert.SerializeObject(taskDTO)}銆�");
 
                 #endregion 璋冪敤WMS鑾峰彇鍑哄簱浠诲姟
 
@@ -865,6 +866,7 @@
         public WebResponseContent CreateAndSendTask(WMSTaskDTO taskDTO)
         {
             var content = _taskService.ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
+            WriteInfo("鍑哄簱", $"銆恵JsonConvert.SerializeObject(content)}銆�");
             if (content.Status)
             {
                 Console.WriteLine($"{taskDTO.TargetAddress}鍛煎彨鎴愬姛");
diff --git a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs
index 8a99dbb..914c7c6 100644
--- a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs
+++ b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/Task/RequestInbound.cs
@@ -1,6 +1,8 @@
 锘縰sing HslCommunication;
 using Mapster;
 using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
+using Microsoft.CodeAnalysis;
+using Microsoft.VisualBasic;
 using Newtonsoft.Json;
 using System.Text.RegularExpressions;
 using System.Threading.Tasks;
@@ -388,7 +390,6 @@
             #endregion
         }
 
-
         /// <summary>
         /// 鎴愬寲鍏ラ潤缃�
         /// </summary>
@@ -419,7 +420,7 @@
                 ConsoleHelper.WriteSuccessLine($"MOM鏁版嵁寮傚父,閫佽嚦浜屽皝銆恵resultTrayCellsStatus.ProductionLine}銆戝紓甯稿彛銆恵Convert.ToInt32(platform.Capacity)}銆�");
                 return;
             }
-            if (resultTrayCellsStatus.SerialNos.Count < 0)
+            if (resultTrayCellsStatus.SerialNos.Count == 0)
             {
                 var Traycontent = await _taskService.RequestWMSTask(command.Barcode, childDeviceCode);
                 if (Traycontent.Status)
@@ -433,13 +434,13 @@
             {
                 var configz = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
                 var wmsbase = configz.Where(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE).FirstOrDefault()?.ConfigValue;
-                var address = configz.Where(x => x.ConfigKey == SysConfigKeyConst.GetJZStockInfo).FirstOrDefault()?.ConfigValue;
+                var address = configz.Where(x => x.ConfigKey == SysConfigKeyConst.QueryStockInfoForRealTrayJZAsync).FirstOrDefault()?.ConfigValue;
                 if (wmsbase == null || address == null)
                 {
                     throw new InvalidOperationException("WMS IP 鏈厤缃�");
                 }
                 var wmsIpAddrss = wmsbase + address;
-                var result = await HttpHelper.PostAsync(wmsIpAddrss);
+                var result = await HttpHelper.PostAsync(wmsIpAddrss, new { ProductLine = resultTrayCellsStatus.ProductionLine }.ToJsonString());
                 var StockInfocontent = JsonConvert.DeserializeObject<WebResponseContent>(result);
                 if (StockInfocontent.Status)
                 {
@@ -470,12 +471,19 @@
                         }
                         else
                         {
-                            ExecuteConveyorLineTask(conveyorLine, command, ProtocalDetailValue, childDeviceCode);
+                            var Task = await _taskService.RequestWMSTask(command.Barcode, childDeviceCode);
+                            if (Task.Status)
+                            {
+                                ExecuteConveyorLineTask(conveyorLine, command, ProtocalDetailValue, childDeviceCode);
+                            }
                             return;
                         }
                     }
                     else
+                    {
                         WriteInfo(conveyorLine.DeviceName, Taskcontent.Message);
+                        return;
+                    }
                 }
                 else
                 {
@@ -519,6 +527,11 @@
                     }
                     else
                     {
+                        var Task = await _taskService.RequestWMSTask(command.Barcode, childDeviceCode);
+                        if (Task.Status)
+                        {
+                            ExecuteConveyorLineTask(conveyorLine, command, ProtocalDetailValue, childDeviceCode);
+                        }
                         ConsoleHelper.WriteWarningLine("浜屽皝缂撳瓨浣嶅凡婊�");
                         return;
                     }
@@ -537,7 +550,7 @@
                 {
                     conveyorLine.SetValue(ConveyorLineDBName.WriteConveyorLineTargetAddress, "1000", childDeviceCode);
 
-                    var log = $"銆恵conveyorLine._deviceName}銆戜换鍔″彿锛氥�恵task.TaskNum}銆�,鎵樼洏鏉$爜锛氥�恵task.PalletCode}銆戝凡鍒拌揪銆恵childDeviceCode}銆戣姹傛壂鐮佸叆搴�(瀹炵洏),涓嬩竴鐩爣鍦板潃銆恵1000}銆�";
+                    var log = $"銆恵conveyorLine._deviceName}銆戜换鍔″彿锛氥�恵task.TaskNum}銆�,鎵樼洏鏉$爜锛氥�恵task.PalletCode}銆戝凡鍒拌揪銆恵childDeviceCode}銆戣姹傛壂鐮佸叆搴�(瀹炵洏or绌虹洏),涓嬩竴鐩爣鍦板潃銆恵1000}銆�";
                     ConsoleHelper.WriteWarningLine(log);
 
                     _noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" });
diff --git a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerJZJob/CommonStackerJZCraneJob.cs b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerJZJob/CommonStackerJZCraneJob.cs
new file mode 100644
index 0000000..161de73
--- /dev/null
+++ b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerJZJob/CommonStackerJZCraneJob.cs
@@ -0,0 +1,505 @@
+锘縰sing Mapster;
+using Newtonsoft.Json;
+using Quartz;
+using System.Diagnostics.CodeAnalysis;
+using System.Text;
+using WIDESEAWCS_BasicInfoRepository;
+using WIDESEAWCS_Common;
+using WIDESEAWCS_Common.TaskEnum;
+using WIDESEAWCS_Core.Caches;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_Core.HttpContextUser;
+using WIDESEAWCS_IProcessRepository;
+using WIDESEAWCS_ISystemServices;
+using WIDESEAWCS_ITaskInfo_HtyRepository;
+using WIDESEAWCS_ITaskInfoRepository;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_QuartzJob;
+using WIDESEAWCS_QuartzJob.DeviceBase;
+using WIDESEAWCS_QuartzJob.Models;
+using WIDESEAWCS_QuartzJob.Service;
+using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
+using WIDESEAWCS_SignalR;
+using WIDESEAWCS_Tasks.ConveyorLineJob;
+using WIDESEAWCS_Tasks.StackerCraneJob;
+using WIDESEA_Services;
+
+namespace WIDESEAWCS_Tasks
+{
+    [DisallowConcurrentExecution]
+    public class CommonStackerJZCraneJob : JobBase, IJob
+    {
+        private readonly ITaskService _taskService;
+        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
+        private readonly ITaskRepository _taskRepository;
+        private readonly IRouterService _routerService;
+        private readonly IProcessRepository _processRepository;
+        private readonly ICacheService _cacheService;
+        private readonly INoticeService _noticeService;
+        private readonly IDt_StationManagerRepository _stationManagerRepository;
+        private readonly ITask_HtyRepository _htyRepository;
+        private readonly ISys_ConfigService _sys_ConfigService;
+        private static List<string>? userTokenIds;
+        private static List<int>? userIds;
+
+        public CommonStackerJZCraneJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IProcessRepository processRepository, ICacheService cacheService, INoticeService noticeService, IDt_StationManagerRepository stationManagerRepository, ITask_HtyRepository htyRepository, ISys_ConfigService sys_ConfigService)
+        {
+            _taskService = taskService;
+            _taskExecuteDetailService = taskExecuteDetailService;
+            _taskRepository = taskRepository;
+            _routerService = routerService;
+            _processRepository = processRepository;
+            _cacheService = cacheService;
+            _noticeService = noticeService;
+            _stationManagerRepository = stationManagerRepository;
+            _htyRepository = htyRepository;
+            _sys_ConfigService = sys_ConfigService;
+        }
+
+        public Task Execute(IJobExecutionContext context)
+        {
+            try
+            {
+                CommonStackerJZCrane commonStackerCrane = (CommonStackerJZCrane)context.JobDetail.JobDataMap.Get("JobParams");
+                if (commonStackerCrane != null)
+                {
+                    //EqptAlive(commonStackerCrane);
+                    //Console.Out.WriteLine(commonStackerCrane.DeviceName);
+                    if (!commonStackerCrane.IsEventSubscribed)
+                    {
+                        commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//璁㈤槄浠诲姟瀹屾垚浜嬩欢
+                    }
+
+                    if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal)
+                    {
+                        commonStackerCrane.CheckStackerCraneTaskCompleted();//闃叉浠诲姟瀹屾垚浜嬩欢鐩戞祴瓒呮椂锛屽啀鎵嬪姩瑙﹀彂涓�娆�
+
+                        if (commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
+                        {
+                            Dt_Task? task = null;
+                            if (StaticVariable.isLineRun)
+                            {
+                                StaticVariable.isStackerRun = false;
+                                task = GetTask(commonStackerCrane);
+                            }
+                            if (task != null)
+                            {
+                                StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task);
+                                if (stackerCraneTaskCommand != null)
+                                {
+                                    Thread.Sleep(1000);
+                                    bool sendFlag = commonStackerCrane.SendCommand(stackerCraneTaskCommand);
+                                    if (sendFlag)
+                                    {
+                                        StringBuilder builder = new StringBuilder();
+                                        builder.AppendLine();
+                                        builder.AppendLine($"銆恵commonStackerCrane.DeviceName}銆戝爢鍨涙満鐘舵�侊細銆恵commonStackerCrane.StackerCraneStatusDes}銆�,鏃堕棿锛氥�恵DateTime.Now}銆�");
+                                        builder.AppendLine($"銆恵commonStackerCrane.DeviceName}銆戞墜鑷姩鐘舵�侊細銆恵commonStackerCrane.StackerCraneAutoStatusDes}銆�,鏃堕棿锛氥�恵DateTime.Now}銆�");
+                                        builder.AppendLine($"銆恵commonStackerCrane.DeviceName}銆戜綔涓氱姸鎬侊細銆恵commonStackerCrane.StackerCraneWorkStatusDes}銆�,鏃堕棿锛氥�恵DateTime.Now}銆�");
+                                        builder.AppendLine($"銆恵commonStackerCrane.DeviceName}銆戜笅鍙戜换鍔℃垚鍔�,銆恵JsonConvert.SerializeObject(stackerCraneTaskCommand, Formatting.Indented)}銆�");
+                                        builder.AppendLine($"鏃堕棿锛氥�恵DateTime.Now}銆�");
+                                        builder.AppendLine();
+                                        ConsoleHelper.WriteColorLine(builder, ConsoleColor.Blue);
+                                        commonStackerCrane.LastTaskType = task.TaskType;
+                                        _taskService.UpdateTaskStatusToNext(task.TaskNum);
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    #region 璋冪敤浜嬩欢鎬荤嚎閫氱煡鍓嶇
+
+                    var tokenInfos = _cacheService.Get<List<UserInfo>>("Cache_UserToken");
+                    if (tokenInfos == null || !tokenInfos.Any())
+                    {
+                        //throw new Exception(commonStackerCrane.DeviceName + "缂撳瓨涓湭鎵惧埌Token缂撳瓨");
+                        return Task.CompletedTask;
+                    }
+                    var userTokenIds = tokenInfos?.Select(x => x.Token_ID).ToList();
+                    var userIds = tokenInfos?.Select(x => x.UserId).ToList();
+
+                    object obj = new
+                    {
+                        commonStackerCrane.StackerCraneStatusDes,
+                        commonStackerCrane.StackerCraneAutoStatusDes,
+                        commonStackerCrane.StackerCraneWorkStatusDes,
+                        commonStackerCrane.DeviceCode,
+                        commonStackerCrane.DeviceName,
+                        commonStackerCrane.CurrentTaskNum,
+                        commonStackerCrane.LastTaskNum,
+                    };
+                    _noticeService.StackerData(userIds?.FirstOrDefault(), userTokenIds, new { commonStackerCrane.DeviceName, data = obj });
+
+                    #endregion 璋冪敤浜嬩欢鎬荤嚎閫氱煡鍓嶇
+                }
+            }
+            catch (Exception ex)
+            {
+                WriteError("CommonStackerStationCraneJob", "test", ex);
+                //Console.WriteLine(nameof(CommonStackerCraneJob) + ":" + ex.ToString());
+            }
+            finally
+            {
+                StaticVariable.isStackerRun = true;
+            }
+            //WriteDebug("CommonStackerStationCraneJob", "test");
+            return Task.CompletedTask;
+        }
+
+        /// <summary>
+        /// 浠诲姟瀹屾垚浜嬩欢璁㈤槄鐨勬柟娉�
+        /// </summary>
+        /// <param name="sender"></param>
+        /// <param name="e"></param>
+        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, WIDESEAWCS_QuartzJob.StackerCrane.StackerCraneTaskCompletedEventArgs e)
+        {
+            CommonStackerJZCrane? commonStackerCrane = sender as CommonStackerJZCrane;
+            if (commonStackerCrane != null)
+            {
+                if (commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5)
+                {
+                    ConsoleHelper.WriteColorLine($"銆恵commonStackerCrane.DeviceName}銆戝爢鍨涙満浣滀笟鐘舵�侊細銆恵(int)commonStackerCrane.StackerCraneWorkStatusValue}銆戞椂闂淬�恵DateTime.Now}銆�", ConsoleColor.Magenta);
+
+                    string str = $"銆恵commonStackerCrane.DeviceName}銆戜换鍔″畬鎴�,浠诲姟鍙凤細銆恵e.TaskNum}銆戞椂闂淬�恵DateTime.Now}銆�";
+                    WriteInfo(commonStackerCrane.DeviceName, str);
+                    ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue);
+                    var task = _taskRepository.QueryFirst(x => x.TaskNum == e.TaskNum);
+
+                    if (task == null) commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
+
+                    if (commonStackerCrane.DeviceCode.Contains("GW") && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
+                    {
+                        var station = _stationManagerRepository.QueryFirst(x => x.stationChildCode == task.TargetAddress);
+
+                        IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == station.stationPLC);
+                        if (device != null)
+                        {
+                            CommonConveyorLine_GW conveyorLine = (CommonConveyorLine_GW)device;
+                            var isResult = conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, task.PalletCode, task.TargetAddress);
+                            if (!isResult)
+                            {
+                                var result = conveyorLine.GetValue<ConveyorLineDBName_After, string>(ConveyorLineDBName_After.ConveyorLineBarcode, task.TargetAddress);
+                                if (result != task.PalletCode)
+                                {
+                                    conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, task.PalletCode, task.TargetAddress);
+                                }
+                            }
+                        }
+                        else
+                            return;
+                    }
+
+                    var content = _taskService.StackCraneTaskCompleted(e.TaskNum);
+                    if (commonStackerCrane.DeviceCode.Contains("CH") && task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
+                    {
+                        task = _taskRepository.QueryFirst(x => x.TaskNum == e.TaskNum);
+                        Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
+                    }
+                    if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup && (task.TargetAddress == "002-021-001" || task.TargetAddress == "001-021-001"))
+                    {
+                        var TASKHTY = task.Adapt<Dt_Task_Hty>();
+                        _taskRepository.DeleteData(task);
+                        _htyRepository.AddData(TASKHTY);
+                    }
+                    var isWorkType = commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
+                    str = $"{commonStackerCrane.DeviceName}銆慦MS|WCS浠诲姟瀹屾垚锛氥�恵content.Status}銆�,鍫嗗灈鏈哄畬鎴愪俊鍙峰啓鍏ワ細銆恵isWorkType}銆�,浠诲姟鍙凤細銆恵e.TaskNum}銆戞椂闂淬�恵DateTime.Now}銆�";
+                    WriteInfo(commonStackerCrane.DeviceName, str);
+                    ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇浠诲姟
+        /// </summary>
+        /// <param name="commonStackerCrane">鍫嗗灈鏈哄璞�</param>
+        /// <returns></returns>
+        private Dt_Task? GetTask(CommonStackerJZCrane commonStackerCrane)
+        {
+            Dt_Task task;
+
+            if (commonStackerCrane.LastTaskType == null)
+            {
+                task = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode);
+            }
+            else
+            {
+                if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
+                {
+                    task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
+                    if (task == null)
+                    {
+                        var taskLinInExecuting = _taskService.QueryStackerLineExecutingTask(commonStackerCrane.DeviceCode);
+                        if(taskLinInExecuting == null)
+                        {
+                            task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
+                        }
+                        else
+                        {
+                            task = null;
+                        }
+                        
+                    }
+                }
+                else
+                {
+                    task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
+                }
+            }
+
+            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
+            {
+                // 妫�鏌ュ綋鍓嶅嚭搴撲换鍔$珯鍙版槸鍚﹀厑璁告斁璐�
+                var occupiedStation = OutTaskStationIsOccupied(task);
+                if (occupiedStation == null)
+                {
+                    // 濡傛灉褰撳墠鍑哄簱浠诲姟绔欏彴涓嶅厑璁告斁璐э紝鎺掗櫎褰撳墠浠诲姟锛屾煡鎵惧叾浠栧嚭搴撲换鍔�
+                    ConsoleHelper.WriteErrorLine($"浠诲姟鍙凤細銆恵task.TaskNum}銆戝嚭搴撳湴鍧�锛氥�恵task.NextAddress}銆戜笉鍏佽鏀捐揣");
+                    task = FindAnotherOutboundTask(commonStackerCrane.DeviceCode, task);
+                }
+                else
+                {
+                    return task;
+                }
+
+                if (task == null)
+                {
+                    task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
+                }
+            }
+            else if (task == null)
+            {
+                task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
+            }
+
+            return task;
+        }
+
+        /// <summary>
+        /// 鍑哄簱浠诲姟鍒ゆ柇鍑哄簱绔欏彴鏄惁琚崰鐢�
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋</param>
+        /// <returns>濡傛灉鏈鍗犵敤锛岃繑鍥炰紶鍏ョ殑浠诲姟淇℃伅锛屽惁鍒欙紝杩斿洖null</returns>
+        private Dt_Task? OutTaskStationIsOccupied([NotNull] Dt_Task task)
+        {
+            var stationinfo = _stationManagerRepository.QueryFirst(x => x.stationLocation == task.TargetAddress && x.Roadway == task.Roadway);
+            IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationinfo.stationPLC);
+            if (device != null)
+            {
+                CommonConveyorLine_After conveyorLine = (CommonConveyorLine_After)device;
+                if (conveyorLine.IsOccupied(stationinfo.stationChildCode))//鍑哄簱绔欏彴鏈鍗犵敤
+                {
+                    return task;
+                }
+            }
+            else
+            {
+                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒板嚭搴撶珯鍙般�恵task.NextAddress}銆戝搴旂殑閫氳瀵硅薄锛屾棤娉曞垽鏂嚭搴撶珯鍙版槸鍚﹁鍗犵敤");
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 鏌ユ壘鍏朵粬鍑哄簱浠诲姟鐨勮緟鍔╂柟娉曪紙鎺掗櫎涓嶅彲鍑虹殑鍑哄簱鍙d换鍔★級
+        /// </summary>
+        /// <param name="deviceCode">璁惧浠g爜</param>
+        /// <param name="excludedTaskId">瑕佹帓闄ょ殑浠诲姟ID</param>
+        /// <returns></returns>
+        private Dt_Task? FindAnotherOutboundTask(string deviceCode, Dt_Task task)
+        {
+            // 鍏堣幏鍙栨墍鏈夌鍚堟潯浠讹紙鎺掗櫎涓嶅彲鍑虹殑锛夌殑鍑哄簱浠诲姟鍒楄〃
+            var allOutboundTasks = _taskService.QueryAllOutboundTasks(deviceCode);
+            Console.WriteLine(allOutboundTasks.Count);
+            var availableTasks = allOutboundTasks?.Where(t => t.TargetAddress != task.TargetAddress && t.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup).ToList();
+
+            Console.WriteLine("鍏朵粬鍑哄簱鍙d换鍔★細" + availableTasks?.Count);
+
+            if (availableTasks == null || availableTasks.Count == 0)
+            {
+                return null;
+            }
+
+            // 閬嶅巻鍙敤浠诲姟鍒楄〃锛屾鏌ヤ换鍔$珯鍙版槸鍚﹀厑璁告斁璐э紝鎵惧埌绗竴涓厑璁告斁璐х殑浠诲姟灏辫繑鍥�
+            foreach (var candidateTask in availableTasks)
+            {
+                var occupiedStation = OutTaskStationIsOccupied(candidateTask);
+                if (occupiedStation != null)
+                {
+                    return candidateTask;
+                }
+                ConsoleHelper.WriteErrorLine($"浠诲姟鍙凤細銆恵candidateTask.TaskNum}銆戝嚭搴撳湴鍧�锛氥�恵candidateTask.NextAddress}銆戜笉鍏佽鏀捐揣");
+            }
+
+            return null;
+        }
+
+        /// <summary>
+        /// 浠诲姟瀹炰綋杞崲鎴愬懡浠odel
+        /// </summary>
+        /// <param name="task">浠诲姟瀹炰綋</param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public StackerCraneTaskCommand? ConvertToStackerCraneTaskCommand([NotNull] Dt_Task task)
+        {
+            StackerCraneTaskCommand stackerCraneTaskCommand = new StackerCraneTaskCommand();
+
+            stackerCraneTaskCommand.Barcode = task.PalletCode;
+            stackerCraneTaskCommand.TaskNum = task.TaskNum;
+            stackerCraneTaskCommand.WorkType = 1;
+            stackerCraneTaskCommand.TrayType = 0;
+            stackerCraneTaskCommand.StartCommand = 1;
+            if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)//鍒ゆ柇鏄惁鏄叆搴撲换鍔�
+            {
+                var value = _sys_ConfigService.GetByConfigKey(CateGoryConst.CONFIG_SYS_InStation, SysConfigKeyConst.JZNGInBoundStation).ConfigValue;
+                var valueList = value.Split(',').ToList();
+                if (valueList.Contains(task.SourceAddress) && (task.Roadway.Contains("CH") || task.Roadway.Contains("JZ")))
+                {
+                    string[] souredCodes = task.CurrentAddress.Split("-");
+                    if (souredCodes.Length == 3)
+                    {
+                        stackerCraneTaskCommand.StartRow = Convert.ToInt16(souredCodes[0]);
+                        stackerCraneTaskCommand.StartColumn = Convert.ToInt16(souredCodes[1]);
+                        stackerCraneTaskCommand.StartLayer = Convert.ToInt16(souredCodes[2]);
+                    }
+                    else
+                    {
+                        //鏁版嵁閰嶇疆閿欒
+                        _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍏ュ簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
+                        return null;
+                    }
+                    string[] targetCodes = task.NextAddress.Split("-");
+                    if (targetCodes.Length == 3)
+                    {
+                        stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]) % 2 != 0 ? (short)1 : (short)2;
+                        stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]);
+                        stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]);
+                    }
+                    else
+                    {
+                        //鏁版嵁閰嶇疆閿欒
+                        _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍏ュ簱浠诲姟缁堢偣閿欒锛岃捣鐐癸細銆恵task.NextAddress}銆�");
+                        return null;
+                    }
+                }
+                else
+                {
+                    List<Dt_Router> routers = _routerService.QueryNextRoutes(task.CurrentAddress, task.Roadway);
+                    if (routers.Count > 0)
+                    {
+                        stackerCraneTaskCommand.StartRow = Convert.ToInt16(routers.FirstOrDefault().SrmRow);
+                        stackerCraneTaskCommand.StartColumn = Convert.ToInt16(routers.FirstOrDefault().SrmColumn);
+                        stackerCraneTaskCommand.StartLayer = Convert.ToInt16(routers.FirstOrDefault().SrmLayer);
+
+                        string[] targetCodes = task.NextAddress.Split("-");
+                        if (targetCodes.Length == 3)
+                        {
+                            stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]) % 2 != 0 ? (short)1 : (short)2;
+                            stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]);
+                            stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]);
+                        }
+                        else
+                        {
+                            //鏁版嵁閰嶇疆閿欒
+                            _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍏ュ簱浠诲姟缁堢偣閿欒锛岃捣鐐癸細銆恵task.NextAddress}銆�");
+                            return null;
+                        }
+                    }
+                    else
+                    {
+                        _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.NextAddress}銆戜俊鎭紝鏃犳硶鑾峰彇瀵瑰簲鐨勫爢鍨涙満鍙栬揣绔欏彴淇℃伅");
+                        return null;
+                    }
+                }
+            }
+            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
+            {
+                if (task.Roadway.Contains("GW"))
+                {
+                    string[] endCodes = task.NextAddress.Split("-");
+                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(endCodes[0]);
+                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(endCodes[1]);
+                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(endCodes[2]);
+                    string[] sourceCodes = task.SourceAddress.Split("-");
+                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]) % 2 != 0 ? (short)1 : (short)2;
+                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]);
+                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]);
+                }
+                else
+                {
+                    if ((task.TargetAddress == "002-021-001" || task.TargetAddress == "001-021-001") && task.Roadway.Contains("JZ"))
+                    {
+                        string[] endCodes = task.NextAddress.Split("-");
+                        stackerCraneTaskCommand.EndRow = Convert.ToInt16(endCodes[0]);
+                        stackerCraneTaskCommand.EndColumn = Convert.ToInt16(endCodes[1]);
+                        stackerCraneTaskCommand.EndLayer = Convert.ToInt16(endCodes[2]);
+                        string[] sourceCodes = task.SourceAddress.Split("-");
+                        stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]) % 2 != 0 ? (short)1 : (short)2;
+                        stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]);
+                        stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]);
+                    }
+                    else
+                    {
+                        List<Dt_Router> routers = _routerService.QueryNextRoutes(task.Roadway, task.TargetAddress);
+                        if (routers.Count > 0)
+                        {
+                            stackerCraneTaskCommand.EndRow = Convert.ToInt16(routers.FirstOrDefault().SrmRow);
+                            stackerCraneTaskCommand.EndColumn = Convert.ToInt16(routers.FirstOrDefault().SrmColumn);
+                            stackerCraneTaskCommand.EndLayer = Convert.ToInt16(routers.FirstOrDefault().SrmLayer);
+
+                            string[] sourceCodes = task.CurrentAddress.Split("-");
+                            if (sourceCodes.Length == 3)
+                            {
+                                stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]) % 2 != 0 ? (short)1 : (short)2;
+                                stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]);
+                                stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]);
+                            }
+                            else
+                            {
+                                //鏁版嵁閰嶇疆閿欒
+                                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鍑哄簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
+                                return null;
+                            }
+                        }
+                        else
+                        {
+                            _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.NextAddress}銆戜俊鎭紝鏃犳硶鑾峰彇瀵瑰簲鐨勫爢鍨涙満鏀捐揣绔欏彴淇℃伅");
+                            return null;
+                        }
+                    }
+                }
+            }
+            else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup)
+            {
+                string[] targetCodes = task.NextAddress.Split("-");
+                if (targetCodes.Length == 3)
+                {
+                    stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[0]) % 2 != 0 ? (short)1 : (short)2;
+                    stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]);
+                    stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]);
+                }
+                else
+                {
+                    //鏁版嵁閰嶇疆閿欒
+                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"绉诲簱浠诲姟缁堢偣閿欒锛岃捣鐐癸細銆恵task.NextAddress}銆�");
+                    return null;
+                }
+                string[] sourceCodes = task.CurrentAddress.Split("-");
+                if (sourceCodes.Length == 3)
+                {
+                    stackerCraneTaskCommand.StartRow = Convert.ToInt16(sourceCodes[0]) % 2 != 0 ? (short)1 : (short)2;
+                    stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]);
+                    stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]);
+                }
+                else
+                {
+                    //鏁版嵁閰嶇疆閿欒
+                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"绉诲簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
+                    return null;
+                }
+            }
+            return stackerCraneTaskCommand;
+        }
+    }
+}
\ No newline at end of file
diff --git a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerJZJob/CommonStackerStationCraneJob.cs b/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerJZJob/CommonStackerStationCraneJob.cs
deleted file mode 100644
index ca9174b..0000000
--- a/CodeManagement/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerJZJob/CommonStackerStationCraneJob.cs
+++ /dev/null
@@ -1,341 +0,0 @@
-锘縰sing HslCommunication;
-using Newtonsoft.Json;
-using Quartz;
-using System.Diagnostics.CodeAnalysis;
-using System.Text;
-using System.Threading.Tasks;
-using WIDESEAWCS_BasicInfoRepository;
-using WIDESEAWCS_Common.TaskEnum;
-using WIDESEAWCS_Core.Caches;
-using WIDESEAWCS_Core.Helper;
-using WIDESEAWCS_Core.HttpContextUser;
-using WIDESEAWCS_DTO.MOM;
-using WIDESEAWCS_IProcessRepository;
-using WIDESEAWCS_ITaskInfoRepository;
-using WIDESEAWCS_ITaskInfoService;
-using WIDESEAWCS_Model;
-using WIDESEAWCS_Model.Models;
-using WIDESEAWCS_QuartzJob;
-using WIDESEAWCS_QuartzJob.DeviceBase;
-using WIDESEAWCS_QuartzJob.Models;
-using WIDESEAWCS_QuartzJob.Service;
-using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
-using WIDESEAWCS_SignalR;
-using WIDESEAWCS_Tasks.StackerCraneJob;
-using WIDESEAWCS_Common;
-
-namespace WIDESEAWCS_Tasks
-{
-    [DisallowConcurrentExecution]
-    public class CommonStackerJZCraneJob : JobBase, IJob
-    {
-        private readonly ITaskService _taskService;
-        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
-        private readonly ITaskRepository _taskRepository;
-        private readonly IProcessRepository _processRepository;
-        private readonly IDt_StationManagerRepository _stationManagerRepository;
-        private readonly ICacheService _cacheService;
-        private readonly INoticeService _noticeService;
-
-        public CommonStackerJZCraneJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IProcessRepository processRepository, IDt_StationManagerRepository stationManagerRepository, ICacheService cacheService, INoticeService noticeService)
-        {
-            _taskService = taskService;
-            _taskExecuteDetailService = taskExecuteDetailService;
-            _taskRepository = taskRepository;
-            _processRepository = processRepository;
-            _stationManagerRepository = stationManagerRepository;
-            _cacheService = cacheService;
-            _noticeService = noticeService;
-        }
-
-        public Task Execute(IJobExecutionContext context)
-        {
-            try
-            {
-                CommonStackerStationCrane commonStackerCrane = (CommonStackerStationCrane)context.JobDetail.JobDataMap.Get("JobParams");
-                if (commonStackerCrane != null)
-                {
-                    //EqptAlive(commonStackerCrane);
-                    //Console.Out.WriteLine(commonStackerCrane.DeviceName);
-                    if (!commonStackerCrane.IsEventSubscribed)
-                    {
-                        commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//璁㈤槄浠诲姟瀹屾垚浜嬩欢
-                    }
-
-                    if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal)
-                    {
-                        commonStackerCrane.CheckStackerCraneTaskCompleted();//闃叉浠诲姟瀹屾垚浜嬩欢鐩戞祴瓒呮椂锛屽啀鎵嬪姩瑙﹀彂涓�娆�
-
-                        if (commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby)
-                        {
-                            Dt_Task? task = null;
-                            if (StaticVariable.isLineRun)
-                            {
-                                StaticVariable.isStackerRun = false;
-                                task = GetTask(commonStackerCrane);
-                            }
-                            if (task != null)
-                            {
-                                StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task);
-                                if (stackerCraneTaskCommand != null)
-                                {
-                                    Thread.Sleep(1000);
-                                    bool sendFlag = commonStackerCrane.SendCommand(stackerCraneTaskCommand);
-                                    if (sendFlag)
-                                    {
-                                        StringBuilder builder = new StringBuilder();
-                                        builder.AppendLine();
-                                        builder.AppendLine($"銆恵commonStackerCrane.DeviceName}銆戝爢鍨涙満鐘舵�侊細銆恵commonStackerCrane.StackerCraneStatusDes}銆�,鏃堕棿锛氥�恵DateTime.Now}銆�");
-                                        builder.AppendLine($"銆恵commonStackerCrane.DeviceName}銆戞墜鑷姩鐘舵�侊細銆恵commonStackerCrane.StackerCraneAutoStatusDes}銆�,鏃堕棿锛氥�恵DateTime.Now}銆�");
-                                        builder.AppendLine($"銆恵commonStackerCrane.DeviceName}銆戜綔涓氱姸鎬侊細銆恵commonStackerCrane.StackerCraneWorkStatusDes}銆�,鏃堕棿锛氥�恵DateTime.Now}銆�");
-                                        builder.AppendLine($"銆恵commonStackerCrane.DeviceName}銆戜笅鍙戜换鍔℃垚鍔�,銆恵JsonConvert.SerializeObject(stackerCraneTaskCommand, Formatting.Indented)}銆�");
-                                        builder.AppendLine($"鏃堕棿锛氥�恵DateTime.Now}銆�");
-                                        builder.AppendLine();
-                                        ConsoleHelper.WriteColorLine(builder, ConsoleColor.Blue);
-                                        commonStackerCrane.LastTaskType = task.TaskType;
-                                        _taskService.UpdateTaskStatusToNext(task.TaskNum);
-                                    }
-                                }
-                            }
-                        }
-                    }
-
-                    #region 璋冪敤浜嬩欢鎬荤嚎閫氱煡鍓嶇
-
-                    var tokenInfos = _cacheService.Get<List<UserInfo>>("Cache_UserToken");
-                    if (tokenInfos == null || !tokenInfos.Any())
-                    {
-                        //throw new Exception(commonStackerCrane.DeviceName + "缂撳瓨涓湭鎵惧埌Token缂撳瓨");
-                        return Task.CompletedTask;
-                    }
-                    var userTokenIds = tokenInfos?.Select(x => x.Token_ID).ToList();
-                    var userIds = tokenInfos?.Select(x => x.UserId).ToList();
-
-                    object obj = new
-                    {
-                        commonStackerCrane.StackerCraneStatusDes,
-                        commonStackerCrane.StackerCraneAutoStatusDes,
-                        commonStackerCrane.StackerCraneWorkStatusDes,
-                        commonStackerCrane.DeviceCode,
-                        commonStackerCrane.DeviceName,
-                        commonStackerCrane.CurrentTaskNum,
-                        commonStackerCrane.LastTaskNum,
-                    };
-                    _noticeService.StackerData(userIds?.FirstOrDefault(), userTokenIds, new { commonStackerCrane.DeviceName, data = obj });
-
-                    #endregion 璋冪敤浜嬩欢鎬荤嚎閫氱煡鍓嶇
-                }
-            }
-            catch (Exception ex)
-            {
-                WriteError("CommonStackerStationCraneJob", "test", ex);
-                //Console.WriteLine(nameof(CommonStackerCraneJob) + ":" + ex.ToString());
-            }
-            finally
-            {
-                StaticVariable.isStackerRun = true;
-            }
-            //WriteDebug("CommonStackerStationCraneJob", "test");
-            return Task.CompletedTask;
-        }
-
-        /// <summary>
-        /// 浠诲姟瀹屾垚浜嬩欢璁㈤槄鐨勬柟娉�
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, WIDESEAWCS_QuartzJob.StackerCrane.StackerCraneTaskCompletedEventArgs e)
-        {
-            CommonStackerStationCrane? commonStackerCrane = sender as CommonStackerStationCrane;
-            if (commonStackerCrane != null)
-            {
-                if (commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5)
-                {
-                    ConsoleHelper.WriteColorLine($"銆恵commonStackerCrane.DeviceName}銆戝爢鍨涙満浣滀笟鐘舵�侊細銆恵(int)commonStackerCrane.StackerCraneWorkStatusValue}銆戞椂闂淬�恵DateTime.Now}銆�", ConsoleColor.Magenta);
-
-                    string str = $"銆恵commonStackerCrane.DeviceName}銆戜换鍔″畬鎴�,浠诲姟鍙凤細銆恵e.TaskNum}銆戞椂闂淬�恵DateTime.Now}銆�";
-                    WriteInfo(commonStackerCrane.DeviceName, str);
-                    ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue);
-
-                    var content = _taskService.StackCraneTaskCompletedByStation(e.TaskNum);
-                    commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
-
-                    var isWorkType = commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5);
-                    str = $"{commonStackerCrane.DeviceName}銆慦MS|WCS浠诲姟瀹屾垚锛氥�恵content.Status}銆�,鍫嗗灈鏈哄畬鎴愪俊鍙峰啓鍏ワ細銆恵isWorkType}銆�,浠诲姟鍙凤細銆恵e.TaskNum}銆戞椂闂淬�恵DateTime.Now}銆�";
-                    WriteInfo(commonStackerCrane.DeviceName, str);
-                    ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue);
-                }
-            }
-        }
-
-        /// <summary>
-        /// 鑾峰彇浠诲姟
-        /// </summary>
-        /// <param name="commonStackerCrane">鍫嗗灈鏈哄璞�</param>
-        /// <returns></returns>
-        private Dt_Task? GetTask(CommonStackerStationCrane commonStackerCrane)
-        {
-            Dt_Task task;
-
-            if (commonStackerCrane.LastTaskType == null)
-            {
-                task = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode);
-            }
-            else
-            {
-                if (commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
-                {
-                    task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
-                    if (task == null)
-                    {
-                        var taskLinInExecuting = _taskService.QueryStackerLineExecutingTask(commonStackerCrane.DeviceCode);
-                        if(taskLinInExecuting == null)
-                        {
-                            task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
-                        }
-                        else
-                        {
-                            task = null;
-                        }
-                        
-                    }
-                }
-                else
-                {
-                    task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
-                }
-            }
-
-            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
-            {
-                // 妫�鏌ュ綋鍓嶅嚭搴撲换鍔$珯鍙版槸鍚﹀厑璁告斁璐�
-                var occupiedStation = OutTaskStationIsOccupied(task);
-                if (occupiedStation == null)
-                {
-                    // 濡傛灉褰撳墠鍑哄簱浠诲姟绔欏彴涓嶅厑璁告斁璐э紝鎺掗櫎褰撳墠浠诲姟锛屾煡鎵惧叾浠栧嚭搴撲换鍔�
-                    ConsoleHelper.WriteErrorLine($"浠诲姟鍙凤細銆恵task.TaskNum}銆戝嚭搴撳湴鍧�锛氥�恵task.NextAddress}銆戜笉鍏佽鏀捐揣");
-                    task = FindAnotherOutboundTask(commonStackerCrane.DeviceCode, task);
-                }
-                else
-                {
-                    return task;
-                }
-
-                if (task == null)
-                {
-                    task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
-                }
-            }
-            else if (task == null)
-            {
-                task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
-            }
-
-            return task;
-        }
-
-        /// <summary>
-        /// 鍑哄簱浠诲姟鍒ゆ柇鍑哄簱绔欏彴鏄惁琚崰鐢�
-        /// </summary>
-        /// <param name="task">浠诲姟瀹炰綋</param>
-        /// <returns>濡傛灉鏈鍗犵敤锛岃繑鍥炰紶鍏ョ殑浠诲姟淇℃伅锛屽惁鍒欙紝杩斿洖null</returns>
-        private Dt_Task? OutTaskStationIsOccupied([NotNull] Dt_Task task)
-        {
-            var stationinfo = _stationManagerRepository.QueryFirst(x => x.stationLocation == task.TargetAddress && x.Roadway == task.Roadway);
-            IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationinfo.stationPLC);
-            if (device != null)
-            {
-                CommonConveyorLine_After conveyorLine = (CommonConveyorLine_After)device;
-                if (conveyorLine.IsOccupied(stationinfo.stationChildCode))//鍑哄簱绔欏彴鏈鍗犵敤
-                {
-                    return task;
-                }
-            }
-            else
-            {
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒板嚭搴撶珯鍙般�恵task.NextAddress}銆戝搴旂殑閫氳瀵硅薄锛屾棤娉曞垽鏂嚭搴撶珯鍙版槸鍚﹁鍗犵敤");
-            }
-            return null;
-        }
-
-        /// <summary>
-        /// 鏌ユ壘鍏朵粬鍑哄簱浠诲姟鐨勮緟鍔╂柟娉曪紙鎺掗櫎涓嶅彲鍑虹殑鍑哄簱鍙d换鍔★級
-        /// </summary>
-        /// <param name="deviceCode">璁惧浠g爜</param>
-        /// <param name="excludedTaskId">瑕佹帓闄ょ殑浠诲姟ID</param>
-        /// <returns></returns>
-        private Dt_Task? FindAnotherOutboundTask(string deviceCode, Dt_Task task)
-        {
-            // 鍏堣幏鍙栨墍鏈夌鍚堟潯浠讹紙鎺掗櫎涓嶅彲鍑虹殑锛夌殑鍑哄簱浠诲姟鍒楄〃
-            var allOutboundTasks = _taskService.QueryAllOutboundTasks(deviceCode);
-            Console.WriteLine(allOutboundTasks.Count);
-            var availableTasks = allOutboundTasks?.Where(t => t.TargetAddress != task.TargetAddress && t.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup).ToList();
-
-            Console.WriteLine("鍏朵粬鍑哄簱鍙d换鍔★細" + availableTasks?.Count);
-
-            if (availableTasks == null || availableTasks.Count == 0)
-            {
-                return null;
-            }
-
-            // 閬嶅巻鍙敤浠诲姟鍒楄〃锛屾鏌ヤ换鍔$珯鍙版槸鍚﹀厑璁告斁璐э紝鎵惧埌绗竴涓厑璁告斁璐х殑浠诲姟灏辫繑鍥�
-            foreach (var candidateTask in availableTasks)
-            {
-                var occupiedStation = OutTaskStationIsOccupied(candidateTask);
-                if (occupiedStation != null)
-                {
-                    return candidateTask;
-                }
-                ConsoleHelper.WriteErrorLine($"浠诲姟鍙凤細銆恵candidateTask.TaskNum}銆戝嚭搴撳湴鍧�锛氥�恵candidateTask.NextAddress}銆戜笉鍏佽鏀捐揣");
-            }
-
-            return null;
-        }
-
-        /// <summary>
-        /// 浠诲姟瀹炰綋杞崲鎴愬懡浠odel
-        /// </summary>
-        /// <param name="task">浠诲姟瀹炰綋</param>
-        /// <returns></returns>
-        /// <exception cref="Exception"></exception>
-        public StackerCraneTaskCommand? ConvertToStackerCraneTaskCommand([NotNull] Dt_Task task)
-        {
-            StackerCraneTaskCommand stackerCraneTaskCommand = new StackerCraneTaskCommand();
-
-            stackerCraneTaskCommand.Barcode = task.PalletCode;
-            stackerCraneTaskCommand.TaskNum = task.TaskNum;
-            stackerCraneTaskCommand.WorkType = 1;
-            stackerCraneTaskCommand.TrayType = 0;
-            stackerCraneTaskCommand.StartCommand = 1;
-
-            string[] sourceCodes = task.SourceAddress.Split("-");
-            if (sourceCodes.Length == 3)
-            {
-                stackerCraneTaskCommand.StartRow = (short)(Convert.ToInt16(sourceCodes[0]) % 2 == 0 ? 2 : 1);
-                stackerCraneTaskCommand.StartColumn = Convert.ToInt16(sourceCodes[1]);
-                stackerCraneTaskCommand.StartLayer = Convert.ToInt16(sourceCodes[2]);
-            }
-            else
-            {
-                //鏁版嵁閰嶇疆閿欒
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"绉诲簱浠诲姟璧风偣閿欒锛岃捣鐐癸細銆恵task.CurrentAddress}銆�");
-                return null;
-            }
-            string[] targetCodes = task.TargetAddress.Split("-");
-            if (targetCodes.Length == 3)
-            {
-                stackerCraneTaskCommand.EndRow = (short)(Convert.ToInt16(targetCodes[0]) % 2 == 0 ? 2 : 1);
-                stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[1]);
-                stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[2]);
-            }
-            else
-            {
-                //鏁版嵁閰嶇疆閿欒
-                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"浠诲姟缁堢偣閿欒锛岃捣鐐癸細銆恵task.NextAddress}銆�");
-                return null;
-            }
-
-            return stackerCraneTaskCommand;
-        }
-    }
-}
\ No newline at end of file
diff --git a/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs b/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
index 357ff61..f4d878c 100644
--- a/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
+++ b/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -3,11 +3,13 @@
 using SqlSugar;
 using System.Text.RegularExpressions;
 using WIDESEA_Cache;
+using WIDESEA_Core;
 using WIDESEA_Core.Const;
 using WIDESEA_DTO.MOM;
 using WIDESEA_DTO.WMS;
 using WIDESEA_IServices;
 using WIDESEA_IStoragIntegrationServices;
+using WIDESEA_Model.Models;
 using WIDESEAWCS_BasicInfoRepository;
 using WIDESEAWCS_QuartzJob.Models;
 
diff --git a/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/WIDESEA_StorageTaskServices.csproj b/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/WIDESEA_StorageTaskServices.csproj
index 1c51ae2..0e8e507 100644
--- a/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/WIDESEA_StorageTaskServices.csproj
+++ b/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/WIDESEA_StorageTaskServices.csproj
@@ -17,10 +17,13 @@
   <ItemGroup>
     <ProjectReference Include="..\LogLibrary\LogLibrary.csproj" />
     <ProjectReference Include="..\WIDESEA_Cache\WIDESEA_Cache.csproj" />
+    <ProjectReference Include="..\WIDESEA_Core\WIDESEA_Core.csproj" />
+    <ProjectReference Include="..\WIDESEA_DTO\WIDESEA_DTO.csproj" />
     <ProjectReference Include="..\WIDESEA_IBusinessServices\WIDESEA_IBusinessServices.csproj" />
     <ProjectReference Include="..\WIDESEA_IStorageBasicService\WIDESEA_IStorageBasicServices.csproj" />
     <ProjectReference Include="..\WIDESEA_IStorageOutOrderService\WIDESEA_IStorageOutOrderServices.csproj" />
     <ProjectReference Include="..\WIDESEA_IStorageTaskService\WIDESEA_IStorageTaskServices.csproj" />
+    <ProjectReference Include="..\WIDESEA_Model\WIDESEA_Model.csproj" />
     <ProjectReference Include="..\WIDESEA_StoragIntegrationServices\WIDESEA_StoragIntegrationServices.csproj" />
   </ItemGroup>
 
diff --git a/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_Tasks/obj/Debug/net6.0/WIDESEA_Tasks.csproj.FileListAbsolute.txt b/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_Tasks/obj/Debug/net6.0/WIDESEA_Tasks.csproj.FileListAbsolute.txt
index ed225ec..77803b7 100644
--- a/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_Tasks/obj/Debug/net6.0/WIDESEA_Tasks.csproj.FileListAbsolute.txt
+++ b/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_Tasks/obj/Debug/net6.0/WIDESEA_Tasks.csproj.FileListAbsolute.txt
@@ -9,3 +9,14 @@
 E:\GIT\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\refint\WIDESEA_Tasks.dll
 E:\GIT\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\WIDESEA_Tasks.pdb
 E:\GIT\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\ref\WIDESEA_Tasks.dll
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\bin\Debug\net6.0\WIDESEA_Tasks.deps.json
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\bin\Debug\net6.0\WIDESEA_Tasks.dll
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\bin\Debug\net6.0\WIDESEA_Tasks.pdb
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\WIDESEA_Tasks.GeneratedMSBuildEditorConfig.editorconfig
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\WIDESEA_Tasks.AssemblyInfoInputs.cache
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\WIDESEA_Tasks.AssemblyInfo.cs
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\WIDESEA_Tasks.csproj.CoreCompileInputs.cache
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\WIDESEA_Tasks.dll
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\refint\WIDESEA_Tasks.dll
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\WIDESEA_Tasks.pdb
+E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_Tasks\obj\Debug\net6.0\ref\WIDESEA_Tasks.dll
diff --git a/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml.user b/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml.user
index 4acf29a..431186d 100644
--- a/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml.user
+++ b/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/Properties/PublishProfiles/FolderProfile.pubxml.user
@@ -4,8 +4,8 @@
 -->
 <Project>
   <PropertyGroup>
-    <_PublishTargetUrl>D:\Git\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_WMSServer\bin\Debug\net6.0\publish\</_PublishTargetUrl>
-    <History>True|2025-03-24T07:27:15.6778099Z||;True|2025-03-23T18:45:49.3752329+08:00||;True|2025-03-23T18:11:49.6069594+08:00||;True|2025-03-22T16:16:20.5712808+08:00||;True|2025-03-22T15:56:49.6683132+08:00||;True|2025-03-22T15:52:31.0442028+08:00||;True|2025-03-22T14:58:24.6661971+08:00||;True|2025-03-22T14:31:25.6401220+08:00||;True|2025-03-17T22:20:55.9814492+08:00||;True|2025-03-17T20:18:58.8930513+08:00||;True|2025-03-15T14:49:54.7776092+08:00||;True|2025-03-04T14:56:36.8156516+08:00||;True|2025-03-04T14:03:01.4762153+08:00||;True|2025-03-01T13:25:40.8549456+08:00||;True|2025-03-01T12:40:52.0649831+08:00||;True|2025-03-01T11:33:13.7154636+08:00||;True|2025-02-28T16:49:28.9187049+08:00||;True|2025-02-28T16:43:17.5832178+08:00||;True|2025-02-28T16:09:20.8077956+08:00||;True|2025-02-27T13:41:44.5879735+08:00||;True|2025-02-21T10:33:09.7726538+08:00||;True|2025-02-20T23:51:32.1400389+08:00||;True|2025-02-20T23:43:38.4536482+08:00||;True|2025-02-18T15:09:13.0567844+08:00||;True|2025-02-18T10:30:45.6690625+08:00||;True|2025-02-17T00:17:57.1953767+08:00||;True|2025-02-17T00:08:49.8489825+08:00||;True|2025-02-17T00:00:57.5511029+08:00||;True|2025-02-15T14:45:50.0466371+08:00||;True|2025-02-15T14:26:18.9252196+08:00||;True|2025-02-15T14:22:56.6840183+08:00||;True|2025-02-15T13:37:28.7588867+08:00||;True|2025-02-15T13:11:23.1821094+08:00||;True|2025-02-14T14:03:21.8968201+08:00||;True|2025-02-10T16:52:59.9322253+08:00||;</History>
+    <_PublishTargetUrl>E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_WMSServer\bin\Debug\net6.0\publish\</_PublishTargetUrl>
+    <History>True|2025-03-25T06:55:09.5690375Z||;True|2025-03-25T12:26:15.5805042+08:00||;True|2025-03-24T15:27:15.6778099+08:00||;True|2025-03-23T18:45:49.3752329+08:00||;True|2025-03-23T18:11:49.6069594+08:00||;True|2025-03-22T16:16:20.5712808+08:00||;True|2025-03-22T15:56:49.6683132+08:00||;True|2025-03-22T15:52:31.0442028+08:00||;True|2025-03-22T14:58:24.6661971+08:00||;True|2025-03-22T14:31:25.6401220+08:00||;True|2025-03-17T22:20:55.9814492+08:00||;True|2025-03-17T20:18:58.8930513+08:00||;True|2025-03-15T14:49:54.7776092+08:00||;True|2025-03-04T14:56:36.8156516+08:00||;True|2025-03-04T14:03:01.4762153+08:00||;True|2025-03-01T13:25:40.8549456+08:00||;True|2025-03-01T12:40:52.0649831+08:00||;True|2025-03-01T11:33:13.7154636+08:00||;True|2025-02-28T16:49:28.9187049+08:00||;True|2025-02-28T16:43:17.5832178+08:00||;True|2025-02-28T16:09:20.8077956+08:00||;True|2025-02-27T13:41:44.5879735+08:00||;True|2025-02-21T10:33:09.7726538+08:00||;True|2025-02-20T23:51:32.1400389+08:00||;True|2025-02-20T23:43:38.4536482+08:00||;True|2025-02-18T15:09:13.0567844+08:00||;True|2025-02-18T10:30:45.6690625+08:00||;True|2025-02-17T00:17:57.1953767+08:00||;True|2025-02-17T00:08:49.8489825+08:00||;True|2025-02-17T00:00:57.5511029+08:00||;True|2025-02-15T14:45:50.0466371+08:00||;True|2025-02-15T14:26:18.9252196+08:00||;True|2025-02-15T14:22:56.6840183+08:00||;True|2025-02-15T13:37:28.7588867+08:00||;True|2025-02-15T13:11:23.1821094+08:00||;True|2025-02-14T14:03:21.8968201+08:00||;True|2025-02-10T16:52:59.9322253+08:00||;</History>
     <LastFailureDetails />
   </PropertyGroup>
 </Project>
\ No newline at end of file
diff --git a/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj.user b/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj.user
index 0401cb9..83f331d 100644
--- a/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj.user
+++ b/CodeManagement/WMS/WIDESEA_WMSServer/WIDESEA_WMSServer/WIDESEA_WMSServer.csproj.user
@@ -1,6 +1,6 @@
 锘�<?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
-    <NameOfLastUsedPublishProfile>D:\Git\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_WMSServer\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
+    <NameOfLastUsedPublishProfile>E:\GET\BaiBuSanlou\CodeManagement\WMS\WIDESEA_WMSServer\WIDESEA_WMSServer\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
   </PropertyGroup>
 </Project>
\ No newline at end of file

--
Gitblit v1.9.3