From 8ae1a147aefadbb255edde088e7c12535c5f02d4 Mon Sep 17 00:00:00 2001
From: huangxiaoqiang <huangxiaoqiang@hnkhzn.com>
Date: 星期三, 08 十月 2025 20:35:51 +0800
Subject: [PATCH] 完善输送线和堆垛机任务处理逻辑在CommonConveyorLine_NewCW.cs`中添加版本注释和设备属性定义,增强设备连接状态检查与命令发送逻辑。 修改 CommonConveyorLine_GWJob.cs`的任务查询逻辑,确保在特定条件下不下发新任务。在CommonConveyorLine_NewCWJob.cs中实现请求入库和出库的处理逻辑,确保任务状态更新。在 RequestInbound.cs中添加出库任务和新任务的处理逻辑,增强异常处理。 在CommonStackerCrane_NewCWJob.cs中实现堆垛机任务完成事件的处理,确保状态更新和前端通知。新增设备型号修改相关常量和 DTO 类,更新服务接口和实现逻辑,确保设备型号修改请求的正确处理。修改 Dt_TaskService.cs中的任务处理逻辑,确保出库任务的库存判断和状态更新。

---
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MOM/AgingInOrOutInput/AgingInOrOutInputService.cs   |   37 +
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/RequestInTaskAsync.cs                        |   74 -
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs                                    |    5 
 Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_NewCW/CommonConveyorLine_NewCWJob.cs                 |  620 ++++++++++++++++
 Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_NewCW/NewCWTask/RequestInbound.cs                    |  407 +++++++++++
 Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob_NewCW/CommonStackerCrane_NewCWJob.cs                 |  604 ++++++++++++++++
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Const/ConfigConst.cs                                                     |    5 
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/Dt_TaskService.cs                            |   42 
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MOM/ResponeAgingInputDto.cs                                               |   26 
 Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_GW/CommonConveyorLine_GWJob.cs                       |    6 
 Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/MOM/AgingInOrOutInput/IAgingInOrOutInputService.cs |    7 
 Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine_NewCW.cs                         |  342 +++++++++
 12 files changed, 2,117 insertions(+), 58 deletions(-)

diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine_NewCW.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine_NewCW.cs
new file mode 100644
index 0000000..042444b
--- /dev/null
+++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/ConveyorLine/CommonConveyorLine_NewCW.cs
@@ -0,0 +1,342 @@
+锘�#region << 鐗� 鏈� 娉� 閲� >>
+
+/*----------------------------------------------------------------
+ * 鍛藉悕绌洪棿锛歐IDESEAWCS_QuartzJob
+ * 鍒涘缓鑰咃細鑳$搴�
+ * 鍒涘缓鏃堕棿锛�2024/8/2 16:13:36
+ * 鐗堟湰锛歏1.0.0
+ * 鎻忚堪锛氫竴鑸緭閫佺嚎瀹炵幇绫�
+ *
+ * ----------------------------------------------------------------
+ * 淇敼浜猴細
+ * 淇敼鏃堕棿锛�
+ * 鐗堟湰锛歏1.0.1
+ * 淇敼璇存槑锛�
+ *
+ *----------------------------------------------------------------*/
+
+#endregion << 鐗� 鏈� 娉� 閲� >>
+
+using HslCommunication;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WIDESEAWCS_Communicator;
+using WIDESEAWCS_QuartzJob.ConveyorLine.Enum;
+using WIDESEAWCS_QuartzJob.DeviceBase;
+using WIDESEAWCS_QuartzJob.DTO;
+using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
+
+namespace WIDESEAWCS_QuartzJob
+{
+    [Description("甯告俯鏂板姞杈撻�佺嚎")]
+    public class CommonConveyorLine_NewCW : IConveyorLine
+    {
+        #region Private Member
+
+        /// <summary>
+        /// 鍫嗗灈鏈洪�氳瀵硅薄
+        /// </summary>
+        private readonly 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;
+
+        private bool _heartStatr = true;
+
+        private bool _isConnected = true;
+
+        #endregion
+
+        #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 string DeviceCode => _deviceCode;
+
+        /// <summary>
+        /// 璁惧鍚嶇О
+        /// </summary>
+        public string DeviceName => _deviceName;
+
+        /// <summary>
+        /// 鏄惁鏈夋晠闅�
+        /// </summary>
+        public bool IsFault => false;
+
+        /// <summary>
+        /// 閫氳鏄惁宸茶繛鎺�
+        /// </summary>
+        public bool IsConnected => Communicator.IsConnected && _isConnected;
+
+        /// <summary>
+        /// 璁惧鐘舵��
+        /// </summary>
+        public DeviceStatus Status => DeviceStatus.Offline;
+
+        #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 CommonConveyorLine_NewCW(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
+
+        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>
+        /// 璇诲彇PLC鍗忚鍦板潃鐨勬暟鎹�
+        /// </summary>
+        /// <typeparam name="TEnum">鍗忚淇℃伅鐨勬灇涓惧璞′俊鎭��</typeparam>
+        /// <typeparam name="TRsult">璇诲彇鏁版嵁鐨勭被鍨嬪璞′俊鎭��</typeparam>
+        /// <param name="value">鏋氫妇鍊�</param>
+        /// <param name="deviceChildCode">璁惧瀛愮紪鍙�</param>
+        /// <returns>璇诲彇鍒扮殑鏁版嵁</returns>
+        public TRsult GetValue<TEnum, TRsult>(TEnum value, string deviceChildCode) where TEnum : Enum
+        {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
+            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == value.ToString() && x.DeviceChildCode == deviceChildCode);
+            return devicePro == null ? throw new Exception() : (TRsult)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
+        }
+
+        /// <summary>
+        /// 涓庤澶囩殑蹇冭烦
+        /// </summary>
+        public void Heartbeat()
+        {
+            throw new NotImplementedException();
+        }
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="command"></param>
+        /// <param name="deviceChildCode"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public bool SendCommand<T>(T command, string deviceChildCode) where T : IDataTransfer, new()
+        {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
+            DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand) && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
+            if (devicePro == null)
+            {
+                return false;
+            }
+            if (Communicator.WriteCustomer(devicePro.DeviceProAddress, command))
+            {
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 璇诲彇PLC鏁版嵁锛岃繑鍥炶嚜瀹氫箟瀵硅薄
+        /// </summary>
+        /// <typeparam name="T">娉涘瀷</typeparam>
+        /// <param name="deviceChildCode">瀛愯澶囩紪鍙�</param>
+        /// <returns>杩斿洖鑷畾涔夊璞℃垨鎶涘嚭寮傚父</returns>
+        /// <exception cref="Exception"></exception>
+        public T ReadCustomer<T>(string deviceChildCode) where T : IDataTransfer, new()
+        {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
+            DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == "DeviceCommand" && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
+
+            if (devicePro == null)
+            {
+                throw new Exception($"銆恵_deviceCode}銆�--鏈壘鍒般�恵deviceChildCode}銆戝崗璁俊鎭�");
+            }
+            else
+            {
+                return Communicator.ReadCustomer<T>(devicePro.DeviceProAddress);
+            }
+        }
+
+        /// <summary>
+        /// 璇诲彇PLC鏁版嵁锛岃繑鍥炶嚜瀹氫箟瀵硅薄
+        /// </summary>
+        /// <typeparam name="T">娉涘瀷</typeparam>
+        /// <param name="deviceChildCode">瀛愯澶囩紪鍙�</param>
+        /// <param name="deviceProParamType">鍙傛暟绫诲瀷</param>
+        /// <returns>杩斿洖鑷畾涔夊璞℃垨鎶涘嚭寮傚父</returns>
+        /// <exception cref="Exception"></exception>
+        public T ReadCustomer<T>(string deviceChildCode, string deviceProParamType) where T : IDataTransfer, new()
+        {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
+            DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == deviceProParamType && x.DeviceChildCode == deviceChildCode).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
+
+            if (devicePro == null)
+            {
+                throw new Exception($"鏈壘鍒般�恵deviceChildCode}銆戝崗璁俊鎭�");
+            }
+            else
+            {
+                return Communicator.ReadCustomer<T>(devicePro.DeviceProAddress);
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍙傛暟鍚嶇О銆佽澶囧瓙缂栧彿鍐欏叆瀵瑰簲鐨勬暟鎹��
+        /// </summary>
+        /// <typeparam name="TEnum">鍙傛暟鍚嶇О鏋氫妇绫诲瀷銆�</typeparam>
+        /// <typeparam name="TValue">瑕佸啓鍏ョ殑鏁版嵁绫诲瀷銆�</typeparam>
+        /// <param name="enum">鍙傛暟鍚嶇О銆�</param>
+        /// <param name="value">瑕佸啓鍏ョ殑鏁版嵁銆�</param>
+        /// <param name="deviceChildCode">璁惧瀛愮紪鍙峰啓</param>
+        /// <returns>杩斿洖鍐欏叆鎴愬姛鎴栧け璐�</returns>
+        public bool SetValue<TEnum, TValue>(TEnum @enum, TValue value, string deviceChildCode)
+            where TEnum : Enum
+            where TValue : notnull
+        {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
+            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == @enum.ToString() && x.DeviceChildCode == deviceChildCode);
+            return devicePro == null ? throw new Exception() : Communicator.WriteObj(devicePro.DeviceProAddress, devicePro.DeviceDataType, value);
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍙傛暟鍚嶇О銆佽澶囧瓙缂栧彿璇诲彇瀵瑰簲鐨勬暟鎹��
+        /// </summary>
+        /// <typeparam name="TEnum">鍙傛暟鍚嶇О鏋氫妇绫诲瀷銆�</typeparam>
+        /// <param name="enum">鍙傛暟鍚嶇О銆�</param>
+        /// <param name="deviceChildCode">璁惧瀛愮紪鍙峰啓</param>
+        /// <returns>杩斿洖鍐欏叆鎴愬姛鎴栧け璐�</returns>
+        public object ReadValue<TEnum>(TEnum @enum, string deviceChildCode)
+            where TEnum : Enum
+        {
+            if (!IsConnected) throw new Exception($"閫氳杩炴帴閿欒锛岃妫�鏌ョ綉缁�");
+            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == @enum.ToString() && x.DeviceChildCode == deviceChildCode);
+            return devicePro == null ? throw new Exception() : Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
+        }
+
+        //public bool IsOccupied(string deviceChildCode)
+        //{
+        //    if (Communicator.IsConnected)
+        //    {
+                
+        //    }
+        //}
+
+        /// <summary>
+        ///
+        /// </summary>
+        /// <param name="deviceChildCode"></param>
+        /// <returns></returns>
+        /// <exception cref="Exception"></exception>
+        public bool IsOccupied(string deviceChildCode)
+        {
+            if (Communicator.IsConnected)
+            {
+                List<DeviceProDTO> devicePros = _deviceProDTOs.Where(x => x.DeviceChildCode == deviceChildCode && x.DeviceProParamName == "InteractiveSignal").ToList();
+                if (devicePros.Count == 0)
+                {
+                    //todo 鍗忚淇℃伅鏈幏鍙栧埌鏃舵姏鍑哄紓甯�
+                    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 == "InteractiveSignal" && x.ProtocalDetailValue.Equals(readStatus.ToString()));
+                    if (deviceProtocolDetail != null)
+                    {
+                        return true;
+                    }
+                    return false;
+                }
+            }
+            //todo 閫氳鏈繛鎺ユ椂鎶涘嚭寮傚父
+            return false;
+        }
+
+        public void Dispose()
+        {
+            _heartStatr = false;
+            _communicator.Dispose();
+            GC.SuppressFinalize(this);
+        }
+
+        #endregion
+    }
+}
\ No newline at end of file
diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_GW/CommonConveyorLine_GWJob.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_GW/CommonConveyorLine_GWJob.cs
index bf43183..ad0243d 100644
--- a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_GW/CommonConveyorLine_GWJob.cs
+++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_GW/CommonConveyorLine_GWJob.cs
@@ -231,10 +231,10 @@
                 {
                     if (childDeviceCode == "1039")
                     {
-                        var GWTask = _taskRepository.QueryData(x => x.Roadway.Contains("GWSC2") && x.SourceAddress == "1039" && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskInStatusEnum.Line_InFinish)).ToList();
-                        if (GWTask.Count >= 2 && childDeviceCode == "1039" && task.Roadway.Contains("GWSC2"))
+                        var GWTask = _taskRepository.QueryData(x => (x.Roadway.Contains("GWSC2")|| x.Roadway.Contains("GWSC3")) && x.SourceAddress == "1039" && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskInStatusEnum.Line_InFinish)).ToList();
+                        if ((GWTask.Where(x => x.Roadway.Contains("GWSC2")).ToList().Count >= 2 && task.Roadway.Contains("GWSC2")) || (GWTask.Where(x => x.Roadway.Contains("GWSC3")).ToList().Count >= 2 && task.Roadway.Contains("GWSC3")))
                         {
-                            ConsoleHelper.WriteErrorLine($"鏃堕棿锛氥�恵DateTime.Now}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戦珮娓╀簩宸插瓨鍦ㄣ�恵GWTask.Count}銆戜釜浠诲姟澶т簬2涓换鍔′笉鍙笅鍙�");
+                            ConsoleHelper.WriteErrorLine($"鏃堕棿锛氥�恵DateTime.Now}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戦珮娓﹞(task.Roadway.Contains("GWSC3")?"涓�":"浜�")}宸插瓨鍦ㄣ�恵GWTask.Count}銆戜釜浠诲姟澶т簬2涓换鍔′笉鍙笅鍙�");
                             return;
                         }
                     }
diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_NewCW/CommonConveyorLine_NewCWJob.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_NewCW/CommonConveyorLine_NewCWJob.cs
new file mode 100644
index 0000000..ba36c83
--- /dev/null
+++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_NewCW/CommonConveyorLine_NewCWJob.cs
@@ -0,0 +1,620 @@
+锘�#region MyRegion
+
+#region << 鐗� 鏈� 娉� 閲� >>
+
+/*----------------------------------------------------------------
+ * 鍛藉悕绌洪棿锛歐IDESEAWCS_Tasks.ConveyorLineJob
+ * 鍒涘缓鑰咃細鑳$搴�
+ * 鍒涘缓鏃堕棿锛�2024/8/2 16:13:36
+ * 鐗堟湰锛歏1.0.0
+ * 鎻忚堪锛�
+ *
+ * ----------------------------------------------------------------
+ * 淇敼浜猴細
+ * 淇敼鏃堕棿锛�
+ * 鐗堟湰锛歏1.0.1
+ * 淇敼璇存槑锛�
+ *
+ *----------------------------------------------------------------*/
+
+#endregion << 鐗� 鏈� 娉� 閲� >>
+
+using AutoMapper;
+using HslCommunication;
+using Masuit.Tools;
+using Microsoft.CodeAnalysis;
+using Newtonsoft.Json;
+using Quartz;
+using SqlSugar;
+using System.ComponentModel.Design;
+using System.Reflection;
+using WIDESEAWCS_BasicInfoRepository;
+using WIDESEAWCS_Common;
+using WIDESEAWCS_Common.TaskEnum;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_Core.HttpContextUser;
+using WIDESEAWCS_DTO.MOM;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_IProcessRepository;
+using WIDESEAWCS_ISystemServices;
+using WIDESEAWCS_ITaskInfoRepository;
+using WIDESEAWCS_ITaskInfoService;
+using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_QuartzJob;
+using WIDESEAWCS_QuartzJob.DTO;
+using WIDESEAWCS_QuartzJob.Repository;
+using WIDESEAWCS_QuartzJob.Service;
+using WIDESEAWCS_SignalR;
+using WIDESEAWCS_Tasks.ConveyorLineJob;
+using ICacheService = WIDESEAWCS_Core.Caches.ICacheService;
+using Platform = WIDESEAWCS_Model.Models.Platform;
+
+namespace WIDESEAWCS_Tasks
+{
+    [DisallowConcurrentExecution]
+    public partial class CommonConveyorLine_NewCWJob : JobBase, IJob
+    {
+        public readonly ITaskService _taskService;
+        private readonly ITaskRepository _taskRepository;
+        private readonly ITaskExecuteDetailService _taskExecuteDetailService;
+        private readonly IRouterService _routerService;
+        private readonly IPlatFormRepository _platFormRepository;
+        private readonly ISys_ConfigService _sys_ConfigService;
+        private readonly IMapper _mapper;
+        private readonly IDt_StationManagerRepository _stationManagerRepository;
+        private readonly ICacheService _cacheService;
+        private readonly INoticeService _noticeService;
+        private readonly IDt_needBarcodeRepository _needBarcodeRepository;
+        private readonly IDeviceInfoRepository _deviceInfoRepository;
+        private static List<string>? userTokenIds;
+        private static List<int>? userIds;
+        private static List<string> childCodeList = new List<string>();
+
+        public CommonConveyorLine_NewCWJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IMapper mapper, ITaskRepository taskRepository, IPlatFormRepository platFormRepository, ISys_ConfigService sys_ConfigService, IDt_StationManagerRepository stationManagerRepository, ICacheService cacheService, INoticeService noticeService, IDt_needBarcodeRepository needBarcodeRepository, IDeviceInfoRepository deviceInfoRepository)
+        {
+            _taskService = taskService;
+            _taskExecuteDetailService = taskExecuteDetailService;
+            _routerService = routerService;
+            _mapper = mapper;
+            _taskRepository = taskRepository;
+            _platFormRepository = platFormRepository;
+            _sys_ConfigService = sys_ConfigService;
+            _stationManagerRepository = stationManagerRepository;
+            _cacheService = cacheService;
+            _noticeService = noticeService;
+            _needBarcodeRepository = needBarcodeRepository;
+            _deviceInfoRepository = deviceInfoRepository;
+        }
+
+        public Task Execute(IJobExecutionContext context)
+        {
+            try
+            {
+                CommonConveyorLine_NewCW conveyorLine = (CommonConveyorLine_NewCW)context.JobDetail.JobDataMap.Get("JobParams");
+                if (conveyorLine != null)
+                {
+                    #region 绔欏彴鏂瑰紡
+
+                    //List<Dt_StationManager> stationManagers = _stationManagerService.GetAllStationByDeviceCode(conveyorLine.DeviceCode);
+
+                    //foreach (var station in stationManagers)
+                    //{
+                    //    ConveyorLineTaskCommand_After command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand_After>(station.stationChildCode);
+
+                    //    DeviceProtocolDetailDTO? deviceProtocolDetails = conveyorLine.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(ConveyorLineTaskCommand_After.InteractiveSignal) && x.ProtocalDetailValue == command.InteractiveSignal.ToString());
+                    //    if (deviceProtocolDetails != null)
+                    //    {
+                    //        MethodInfo? method = GetType().GetMethod(deviceProtocolDetails.ProtocolDetailType);
+                    //        if (method != null)
+                    //        {
+                    //            method.Invoke(this, new object[] { conveyorLine, command, station });
+                    //        }
+                    //    }
+                    //}
+
+                    #endregion 绔欏彴鏂瑰紡
+
+                    #region 璺敱鏂瑰紡
+                    List<string> childDeviceCodes = _routerService.QueryAllPositions(conveyorLine.DeviceCode);
+                    
+                    foreach (string childDeviceCode in childDeviceCodes)
+                    {
+                        
+                        ConveyorLineTaskCommand_After command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand_After>(childDeviceCode);
+
+                        if (command == null) continue;
+                        //if (command.InteractiveSignal == 0 && command.HasPallet != 1) continue;
+                        if (command.ConveyorLineBarcode.Trim().Contains("\0")) command.ConveyorLineBarcode = "";
+                        
+                        DeviceProtocolDetailDTO? deviceProtocolDetails = conveyorLine.DeviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(ConveyorLineTaskCommand_After.InteractiveSignal) && x.ProtocalDetailValue == command.InteractiveSignal.ToString());
+                        if (deviceProtocolDetails != null)
+                        {
+                            MethodInfo? method = GetType().GetMethod(deviceProtocolDetails.ProtocolDetailType);
+                            if (method != null)
+                            {
+                                method.Invoke(this, new object[] { conveyorLine, command, childDeviceCode });
+                            }
+                        }
+
+                        if (childDeviceCode == "1670" || childDeviceCode == "1666" || childDeviceCode == "1548" || childDeviceCode == "1448")
+                        {
+                            Platform platform = _platFormRepository.QueryFirst(x => x.DeviceCode == conveyorLine.DeviceCode && x.PlatCode == childDeviceCode && x.Status == "Active");
+                            if (platform != null)
+                            {
+                                if (command.HasPallet != 1)
+                                {
+                                    MethodInfo? method = GetType().GetMethod(platform.ExecutionMethod);
+                                    if (method != null)
+                                    {
+                                        //var strings = platform.Location.Split(',').ToList();
+                                        int count = 1;
+                                        method.Invoke(this, new object[] { conveyorLine, command, childDeviceCode, count, platform });
+                                    }
+                                }
+                            }
+                        }
+
+
+                        #region 璋冪敤浜嬩欢鎬荤嚎閫氱煡鍓嶇
+
+                        var tokenInfos = _cacheService.Get<List<UserInfo>>("Cache_UserToken");
+                        if (tokenInfos == null || !tokenInfos.Any())
+                        {
+                            //throw new Exception(conveyorLine.DeviceName + "缂撳瓨涓湭鎵惧埌Token缂撳瓨");
+                            continue;
+                        }
+                        var userTokenIds = tokenInfos?.Select(x => x.Token_ID).ToList();
+                        var userIds = tokenInfos?.Select(x => x.UserId).ToList();
+
+                        object obj = new
+                        {
+                            childDeviceCode,
+                            commandAfter = command,
+                        };
+                        _noticeService.LineData(userIds?.FirstOrDefault(), userTokenIds, new { conveyorLine.DeviceName, data = obj });
+
+                        #endregion 璋冪敤浜嬩欢鎬荤嚎閫氱煡鍓嶇
+
+                    }
+
+                    #endregion 璺敱鏂瑰紡
+                }
+            }
+            catch (Exception ex)
+            {
+                Console.Out.WriteLine(nameof(CommonConveyorLine_NewCW) + ":" + DateTime.Now + ":" + ex.ToString(),ex.StackTrace);
+            }
+            finally
+            {
+            }
+            return Task.CompletedTask;
+        }
+
+        /// <summary>
+        /// 杈撻�佺嚎璇锋眰鍏ュ簱
+        /// </summary>
+        /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param>
+        /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param>
+        /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param>
+        /// <param name="ProtocalDetailValue">绾夸綋褰撳墠bool璇诲彇鍋忕Щ鍦板潃</param>
+        public void RequestInbound(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
+        {
+            try
+            {
+                var task = _taskService.QueryBarCodeConveyorLineTask(command.ConveyorLineBarcode, childDeviceCode);
+                var log = $"鏃堕棿锛氥�恵DateTime.Now}銆戙�恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戜换鍔″彿锛氥�恵command.ConveyorLineTaskNum}銆戣澶囩紪鐮侊細銆恵childDeviceCode}銆�";
+                ConsoleHelper.WriteSuccessLine(log);
+
+                //_noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" });
+                WriteInfo(conveyorLine.DeviceName, log);
+
+                if (task == null)
+                {
+                    HandleNewTask(conveyorLine, command, childDeviceCode);
+                }
+                else
+                {
+                    if (childDeviceCode == "1039")
+                    {
+                        var GWTask = _taskRepository.QueryData(x => x.Roadway.Contains("GWSC2") && x.SourceAddress == "1039" && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskInStatusEnum.Line_InFinish)).ToList();
+                        if (GWTask.Count >= 2 && childDeviceCode == "1039" && task.Roadway.Contains("GWSC2"))
+                        {
+                            ConsoleHelper.WriteErrorLine($"鏃堕棿锛氥�恵DateTime.Now}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戦珮娓╀簩宸插瓨鍦ㄣ�恵GWTask.Count}銆戜釜浠诲姟澶т簬2涓换鍔′笉鍙笅鍙�");
+                            return;
+                        }
+                    }
+
+                    ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
+
+                    bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode);
+                    if (sendFlag)
+                    {
+                        conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+                        _taskService.UpdateTaskStatusToNext(task);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Console.Out.WriteLine(ex.ToString());
+            }
+        }
+
+        /// <summary>
+        /// 杈撻�佺嚎璇锋眰鍏ュ簱涓嬩竴鍦板潃
+        /// </summary>
+        /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param>
+        /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param>
+        /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param>
+        public void RequestInNextAddress(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
+        {
+            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode, command.ConveyorLineBarcode);
+            if (task != null)
+            {
+                if (command.ConveyorLineBarcode != task.PalletCode)
+                {
+                    conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+                    return;
+                }
+
+                Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
+                if (newTask != null)
+                {
+                    ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(newTask);
+                    //conveyorLine.SendCommand(taskCommand, childDeviceCode);
+
+                    bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode);
+                    if (sendFlag)
+                    {
+                        conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+                        _taskService.UpdateData(newTask);
+                    }
+                }
+            }
+            //else
+            //{
+            //    //褰撳墠鍦板潃璇锋眰 瀵绘壘褰撳墠鍦板潃鐨勬墭鐩樺彿 浠诲姟鍙风殑浠诲姟锛屽瀛樺湪浠诲姟鍒欓噸鏂板啀娆″啓鍏ユ柊鐩爣鍦板潃
+            //    Dt_Task currentTask = _taskService.QueryExecutingCurrentConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode, command.ConveyorLineBarcode);
+            //    if (currentTask != null)
+            //    {
+            //        conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, Convert.ToInt16(currentTask.TargetAddress), childDeviceCode);
+            //    }
+            //}
+        }
+
+        /// <summary>
+        /// 杈撻�佺嚎鍏ュ簱瀹屾垚
+        /// </summary>
+        /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param>
+        /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param>
+        /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param>
+        /// <param name="ProtocalDetailValue">绾夸綋褰撳墠bool璇诲彇鍋忕Щ鍦板潃</param>
+        public void ConveyorLineInFinish(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
+        {
+            var task = _taskService.QueryExecutingTaskByBarcode(command.ConveyorLineBarcode, childDeviceCode);
+            if (task != null && task.TaskState != (int)TaskInStatusEnum.Line_InFinish)
+            {
+                WebResponseContent content = _taskService.UpdateTaskStatusToNext(task);
+
+                if (content.Status)
+                {
+                    conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+                }
+
+                Console.Out.WriteLine(content.Serialize());
+            }
+        }
+
+        /// <summary>
+        /// 杈撻�佺嚎璇锋眰鍑轰俊鎭�
+        /// </summary>
+        /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param>
+        /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param>
+        /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param>
+        /// <param name="ProtocalDetailValue">绾夸綋褰撳墠bool璇诲彇鍋忕Щ鍦板潃</param>
+        public void RequestOutbound(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
+        {
+            var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
+            if (task != null)
+            {
+                ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
+                //conveyorLine.SendCommand(taskCommand, childDeviceCode);
+
+                bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode);
+                if (sendFlag)
+                {
+                    conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+
+                    _taskService.UpdateTaskStatusToNext(task);
+                    if (task.TaskType == (int)TaskOutboundTypeEnum.OutTray)
+                    {
+                        _taskService.UpdateTaskStatusToNext(task);
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 杈撻�佺嚎璇锋眰鍑哄簱涓嬩竴鍦板潃
+        /// </summary>
+        /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param>
+        /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param>
+        /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param>
+        public void RequestOutNextAddress(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
+        {
+            Dt_Task task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode, command.ConveyorLineBarcode);
+            if (task != null)
+            {
+                var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
+                var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.MOMIP_BASE)?.ConfigValue;
+                var ipAddress = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.TrayCellsStatus)?.ConfigValue;
+                if (wmsBase == null || ipAddress == null)
+                {
+                    throw new InvalidOperationException("MOM IP 鏈厤缃�");
+                }
+                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode);
+                TrayCellsStatusDto trayCells = new TrayCellsStatusDto()
+                {
+                    Software = "WMS",
+                    TrayBarcode = command.ConveyorLineBarcode,
+                    EquipmentCode = stationManager.stationEquipMOM,
+                    SessionId = Guid.NewGuid().ToString(),
+                    EmployeeNo = "MITest",
+                    SceneType = "1",
+                    RequestTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now).ToString("yyyy-MM-ddTHH:mm:ss.fffZ")
+                };
+
+                var MOMIpAddress = wmsBase + ipAddress;
+
+                var result = HttpHelper.PostAsync(MOMIpAddress, trayCells.Serialize()).Result;
+                WriteInfo("鍏ョ珯鏍¢獙", $"銆恵childDeviceCode}銆戝叆绔欐牎楠岃姹傚弬鏁般�恵trayCells.Serialize()}銆�");
+                WriteInfo("鍏ョ珯鏍¢獙", "");
+                WriteInfo("鍏ョ珯鏍¢獙", $"銆恵childDeviceCode}銆戝叆绔欐牎楠岃繑鍥炲弬鏁般�恵result}銆�");
+                ResultTrayCellsStatus result1 = JsonConvert.DeserializeObject<ResultTrayCellsStatus>(result);
+                if (result1.Success || task.Remark != "NG")
+                {
+                    Dt_Task? newTask = _taskService.UpdatePosition(task.TaskNum, task.CurrentAddress);
+                    if (newTask != null)
+                    {
+                        ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(newTask);
+                        //conveyorLine.SendCommand(taskCommand, childDeviceCode);
+
+                        bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode);
+                        if (sendFlag)
+                        {
+                            conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+                            _taskService.UpdateData(newTask);
+                        }
+                    }
+                }
+                else
+                {
+                    ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
+                    taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(stationManager.stationNGChildCode);
+                    //conveyorLine.SendCommand(taskCommand, childDeviceCode);
+
+                    bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode);
+                    if (sendFlag)
+                    {
+                        conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+                        _taskService.UpdateTaskStatusToNext(task);
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 杈撻�佺嚎鍑哄簱瀹屾垚
+        /// </summary>
+        /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param>
+        /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param>
+        /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param>
+        public void ConveyorLineOutFinish(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
+        {
+            var log = $"鏃堕棿锛氥�恵DateTime.Now}銆戙�恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戜换鍔″彿锛氥�恵command.ConveyorLineTaskNum}銆戣澶囩紪鐮侊細銆恵childDeviceCode}銆�";
+            ConsoleHelper.WriteSuccessLine(log);
+
+            //_noticeService.Logs(userTokenIds, new { conveyorLine.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" });
+            WriteInfo(conveyorLine.DeviceName, log);
+
+
+            var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode, command.ConveyorLineBarcode);
+            if (task != null)
+            {
+                WebResponseContent content = new WebResponseContent();
+                ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
+                taskCommand.InteractiveSignal = command.InteractiveSignal;
+                Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode);
+                if (task.PalletCode != command.ConveyorLineBarcode)
+                {
+                    taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(stationManager.stationNGChildCode);
+                }
+                else
+                {
+                    taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(stationManager.stationLocation);
+                }
+
+                if (stationManager.stationPLC == "1018" && stationManager.stationArea == "Cache")  //鏇存柊鍦ㄩ�旀暟鎹�
+                {
+                    dt_needBarcode needBarcode = _needBarcodeRepository.QueryFirst(x => x.productLine == stationManager.productLine && x.toArea == stationManager.stationChildCode);
+
+                    if (needBarcode != null)
+                    {
+                        needBarcode.inLineNum--;
+                        _needBarcodeRepository.UpdateData(needBarcode);
+                    }
+                }
+
+                //conveyorLine.SendCommand(taskCommand, childDeviceCode);
+                bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode);
+                if (sendFlag)
+                {
+                    conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+                    content = _taskService.UpdateTaskStatusToNext(task);
+                }
+            }
+            else
+            {
+                var taskNext = _taskService.QueryExecutingConveyorLineTask(childDeviceCode, command.ConveyorLineBarcode);
+                if (taskNext != null)
+                {
+                    WebResponseContent content = new WebResponseContent();
+                    ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(taskNext);
+                    taskCommand.InteractiveSignal = command.InteractiveSignal;
+                    Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode);
+                    if (taskNext.PalletCode != command.ConveyorLineBarcode)
+                    {
+                        taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(stationManager.stationNGChildCode);
+                    }
+                    else
+                    {
+                        taskCommand.ConveyorLineTargetAddress = Convert.ToInt16(stationManager.stationLocation);
+                    }
+
+                    if (stationManager.stationPLC == "1018" && stationManager.stationArea == "Cache")  //鏇存柊鍦ㄩ�旀暟鎹�
+                    {
+                        dt_needBarcode needBarcode = _needBarcodeRepository.QueryFirst(x => x.productLine == stationManager.productLine && x.toArea == stationManager.stationChildCode);
+
+                        if (needBarcode != null)
+                        {
+                            needBarcode.inLineNum--;
+                            _needBarcodeRepository.UpdateData(needBarcode);
+                        }
+                    }
+
+                    //conveyorLine.SendCommand(taskCommand, childDeviceCode); 
+
+                    bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode);
+                    if (sendFlag)
+                    {
+                        conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+
+                        taskNext.ExceptionMessage = log;
+                        content = _taskService.UpdateTaskStatusToNext(taskNext);
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鐩戞祴绌烘墭鐩樺疄鐩樺嚭搴�
+        /// </summary>
+        /// <param name="conveyorLine">杈撻�佺嚎瀹炰緥瀵硅薄</param>
+        /// <param name="command">璇诲彇鐨勮姹備俊鎭�</param>
+        /// <param name="childDeviceCode">瀛愯澶囩紪鍙�</param>
+        /// <param name="index">绾夸綋褰撳墠bool璇诲彇鍋忕Щ鍦板潃</param>
+        public async void EmptyTrayReturn(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, int index, WIDESEAWCS_Model.Models.Platform platform)
+        {
+            try
+            {
+                TaskOutboundTypeEnum taskOutboundTypeEnum;
+                if (platform.PlatformType.Contains("OutTray"))
+                    taskOutboundTypeEnum = TaskOutboundTypeEnum.OutTray;
+                else
+                    taskOutboundTypeEnum = TaskOutboundTypeEnum.Outbound;
+                await CheckAndCreateTask(taskOutboundTypeEnum, childDeviceCode, index, platform);
+            }
+            catch (Exception)
+            {
+            }
+        }
+
+        /// <summary>
+        /// 妫�鏌ヤ换鍔″苟鍒涘缓鏂颁换鍔�
+        /// </summary>
+        private async Task CheckAndCreateTask(TaskOutboundTypeEnum taskType, string childDeviceCode, int index, Platform platform)
+        {
+            var tasks = _taskRepository.QueryData(x => x.TaskType == (int)taskType && x.TargetAddress == childDeviceCode);
+            if (tasks.Count < platform.Capacity)
+            {
+                #region 璋冪敤WMS鑾峰彇鍑哄簱浠诲姟
+
+                WMSTaskDTO taskDTO = new WMSTaskDTO();
+
+                // 鑾峰彇WMSip鍦板潃
+                var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
+                var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue;
+                var requestTrayOutTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.RequestTrayOutTask)?.ConfigValue;
+                if (wmsBase == null || requestTrayOutTask == null)
+                {
+                    throw new InvalidOperationException("WMS IP 鏈厤缃�");
+                }
+                var wmsIpAddress = wmsBase + requestTrayOutTask;
+
+                
+                List<string> strings = platform.Location.Split(',').ToList();
+
+                WriteInfo("璋冨害鎵ц鏃堕棿璁板綍", "銆愯皟鍙朩MS鍑哄簱鎺ュ彛寮�濮嬫椂闂达細銆�" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
+
+                var result = await HttpHelper.PostAsync(wmsIpAddress, new { Position = childDeviceCode, Tag = (int)taskType, AreaCdoe = platform.Stacker, AreaCdoes = strings, platform.ProductionLine }.Serialize());
+
+                WriteInfo("璋冨害鎵ц鏃堕棿璁板綍", "銆愯皟鍙朩MS鍑哄簱鎺ュ彛缁撴潫鏃堕棿锛氥��" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
+
+                WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
+
+                // 妫�鏌ョ姸鎬佸苟杩斿洖
+                if (!content.Status)
+                    return;
+
+                taskDTO = JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString());
+
+                #endregion 璋冪敤WMS鑾峰彇鍑哄簱浠诲姟
+
+                CreateAndSendTask(taskDTO);
+            }
+        }
+
+        /// <summary>
+        /// 鍒涘缓浠诲姟
+        /// </summary>
+        public WebResponseContent CreateAndSendTask(WMSTaskDTO taskDTO)
+        {
+            var content = _taskService.ReceiveWMSTask(new List<WMSTaskDTO> { taskDTO });
+            if (content.Status)
+            {
+                Console.WriteLine($"{taskDTO.TaskType}鍛煎彨鎴愬姛");
+            }
+            return content;
+        }
+
+        public bool SendCommand(ConveyorLineTaskCommand_After taskCommand, CommonConveyorLine_NewCW conveyorLine, string childDeviceCode)
+        {
+            conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, Convert.ToInt16(taskCommand.ConveyorLineTargetAddress), childDeviceCode);
+            Thread.Sleep(100);
+            conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, taskCommand.ConveyorLineBarcode, childDeviceCode);
+            Thread.Sleep(100);
+            conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTaskNum, taskCommand.ConveyorLineTaskNum, childDeviceCode);
+            for (int i = 0; i < 6; i++)
+            {
+                ConveyorLineTaskCommand_After command = conveyorLine.ReadCustomer<ConveyorLineTaskCommand_After>(childDeviceCode);
+                if (command != null)
+                {
+                    if (command.ConveyorLineBarcode == taskCommand.ConveyorLineBarcode && command.ConveyorLineTaskNum == taskCommand.ConveyorLineTaskNum && command.ConveyorLineTargetAddress == taskCommand.ConveyorLineTargetAddress)
+                    {
+                        WriteInfo(conveyorLine.DeviceName, $"鏃堕棿锛氥�恵DateTime.Now}銆戝啓鍏ヤ换鍔℃垚鍔熷啓鍏ユ鏁皗i}鍐欏叆浠诲姟銆恵JsonConvert.SerializeObject(taskCommand)}銆�");
+                        return true;
+                    }
+                    if (command.ConveyorLineTargetAddress != taskCommand.ConveyorLineTargetAddress)
+                    {
+                        conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, Convert.ToInt16(taskCommand.ConveyorLineTargetAddress), childDeviceCode);
+                        Thread.Sleep(100);
+                    }
+                    if (command.ConveyorLineBarcode != taskCommand.ConveyorLineBarcode)
+                    {
+                        conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, taskCommand.ConveyorLineBarcode, childDeviceCode);
+                        Thread.Sleep(100);
+                    }
+                    if (command.ConveyorLineTaskNum != taskCommand.ConveyorLineTaskNum)
+                    {
+                        conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTaskNum, taskCommand.ConveyorLineTaskNum, childDeviceCode); Thread.Sleep(100);
+                    }
+
+                }
+            }
+            WriteInfo(conveyorLine.DeviceName, $"鏃堕棿锛氥�恵DateTime.Now}銆戝啓鍏ヤ换鍔″け璐ヤ换鍔″彿銆恵taskCommand.ConveyorLineTaskNum}銆戞墭鐩樺彿銆恵taskCommand.ConveyorLineBarcode}銆戠洰鏍囧湴鍧�銆恵taskCommand.ConveyorLineTargetAddress}銆戝綋鍓嶈妭鐐广�恵childDeviceCode}銆�");
+            return false;
+        }
+    }
+}
+#endregion
\ No newline at end of file
diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_NewCW/NewCWTask/RequestInbound.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_NewCW/NewCWTask/RequestInbound.cs
new file mode 100644
index 0000000..4557eb4
--- /dev/null
+++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob_NewCW/NewCWTask/RequestInbound.cs
@@ -0,0 +1,407 @@
+锘縰sing Mapster;
+using Masuit.Tools;
+using Newtonsoft.Json;
+using System.Threading.Tasks;
+using WIDESEAWCS_Common;
+using WIDESEAWCS_Common.TaskEnum;
+using WIDESEAWCS_Core;
+using WIDESEAWCS_Core.Helper;
+using WIDESEAWCS_DTO.TaskInfo;
+using WIDESEAWCS_DTO.WMS;
+using WIDESEAWCS_Model.Models;
+using WIDESEAWCS_QuartzJob;
+using WIDESEAWCS_Tasks.ConveyorLineJob;
+using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database;
+
+namespace WIDESEAWCS_Tasks
+{
+    public partial class CommonConveyorLine_NewCWJob
+    {
+        /// <summary>
+        /// 澶勭悊鍑哄簱浠诲姟
+        /// </summary>
+        private void HandleTaskOut(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, int ProtocalDetailValue, Dt_Task taskOut)
+        {
+            if (taskOut == null) return;
+
+            var taskCommand = MapTaskCommand(taskOut, command);
+
+            bool isOutTray = taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray;
+            bool isOutboundAndOutFinish = taskOut.TaskType == (int)TaskOutboundTypeEnum.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.SC_OutFinish;
+            bool isOutboundAndLineOutExecuting = taskOut.TaskType == (int)TaskOutboundTypeEnum.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting;
+
+            if (isOutTray || isOutboundAndOutFinish || !isOutboundAndLineOutExecuting)
+            {
+                conveyorLine.SendCommand(taskCommand, childDeviceCode);
+                //ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
+                _taskService.UpdateTaskStatusToNext(taskOut);
+            }
+            else if (taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting)
+            {
+                CompleteWmsTask(taskOut, command, conveyorLine, childDeviceCode, ProtocalDetailValue);
+            }
+        }
+
+        /// <summary>
+        /// 澶勭悊鏂颁换鍔�
+        /// </summary>
+        private void HandleNewTask(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
+        {
+            Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode);
+
+            if (stationManager == null)
+            {
+                // Handle the case where stationManager is not found, if necessary
+                Console.WriteLine($"鏈壘鍒皗childDeviceCode}绔欏彴");
+                return;
+            }
+
+            // 鏍规嵁绔欑被鍨嬫墽琛岀浉搴旂殑鏂规硶
+            switch (stationManager.stationType)
+            {
+                case 8:
+                case 9:
+                case 11:
+                case 12:
+                    var task = _taskService.QueryExecutingTaskByBarcode(command.ConveyorLineBarcode, childDeviceCode);
+                    if (task != null)
+                    {
+                        ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode);
+                    }
+                    break;
+                case 1:
+                case 6:
+                case 10:
+                    ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode);
+                    break;
+                    //case 16:
+                    //    ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode);
+                    //    break;
+            }
+
+            #region
+            //Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode);
+
+            //if (stationManager.stationType == 8)
+            //{
+            //    var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
+            //    if (task != null)
+            //    {
+            //        RequestInNextAddress(conveyorLine, command, childDeviceCode);
+            //    }
+            //}
+            //else if (stationManager.stationType == 9)
+            //{
+            //    var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
+            //    if (task != null)
+            //    {
+            //        ConveyorLineInFinish(conveyorLine, command, childDeviceCode);
+            //    }
+            //}
+            //else if (stationManager.stationType == 1)
+            //{
+            //    if (stationManager.stationArea.Contains("GW"))
+            //    {
+            //        var taskGW = _taskRepository.QueryFirst(x => x.TargetAddress == childDeviceCode && x.TaskState == (int)TaskOutStatusEnum.OutFinish);
+            //        if (taskGW != null)
+            //        {
+            //            command.ConveyorLineBarcode = taskGW.PalletCode;
+            //        }
+            //    }
+            //    RequestWmsTask(conveyorLine, command, childDeviceCode);
+            //}
+            //else if (stationManager.stationType == 10)
+            //{
+            //    var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode);
+            //    if (task != null)
+            //    {
+            //        RequestOutbound(conveyorLine, command, childDeviceCode);
+            //    }
+            //}
+            //else if (stationManager.stationType == 11)
+            //{
+            //    var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
+            //    if (task != null)
+            //    {
+            //        RequestOutNextAddress(conveyorLine, command, childDeviceCode);
+            //    }
+            //}
+            //else if (stationManager.stationType == 12)
+            //{
+            //    var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode);
+            //    if (task != null)
+            //    {
+            //        ConveyorLineOutFinish(conveyorLine, command, childDeviceCode);
+            //    }
+            //}
+            #endregion
+        }
+
+        private void ExecuteStationAction(Dt_StationManager stationManager, CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
+        {
+            switch (stationManager.stationType)
+            {
+                case 8:
+                    RequestInNextAddress(conveyorLine, command, childDeviceCode);
+                    break;
+
+                case 9:
+                    ConveyorLineInFinish(conveyorLine, command, childDeviceCode);
+                    break;
+
+                case 10:
+                    RequestOutbound(conveyorLine, command, childDeviceCode);
+                    break;
+
+                case 11:
+                    RequestOutNextAddress(conveyorLine, command, childDeviceCode);
+                    break;
+
+                case 12:
+                    ConveyorLineOutFinish(conveyorLine, command, childDeviceCode);
+                    break;
+
+                case 6:
+                    CreateAndSendEmptyTrayTask(conveyorLine, command, childDeviceCode);
+                    break;
+                case 16:
+                    AbNormalStationBZTask(conveyorLine, command, childDeviceCode);
+                    break;
+                case 1:
+
+                    RequestWmsTask(conveyorLine, command, childDeviceCode, stationManager);
+                    break;
+            }
+        }
+
+        /// <summary>
+        /// 鏄犲皠浠诲姟鍛戒护
+        /// </summary>
+        private ConveyorLineTaskCommand_After MapTaskCommand(Dt_Task task, ConveyorLineTaskCommand_After command)
+        {
+            var comm = _mapper.Map<ConveyorLineTaskCommand_After>(task);
+            comm.InteractiveSignal = command.InteractiveSignal;
+            return comm;
+        }
+
+        /// <summary>
+        /// 瀹屾垚WMS浠诲姟
+        /// </summary>
+        private void CompleteWmsTask(Dt_Task taskOut, ConveyorLineTaskCommand_After command, CommonConveyorLine_NewCW conveyorLine, string childDeviceCode, int ProtocalDetailValue)
+        {
+            if (command.ConveyorLineBarcode == "NoRead")
+            {
+                var NGAddress = _platFormRepository.QueryFirst(x => x.PlatCode == taskOut.TargetAddress).Capacity;
+                taskOut.TargetAddress = NGAddress.ToString();
+            }
+
+            var keys = new Dictionary<string, object>()
+            {
+                {"taskNum", taskOut.TaskNum}
+            };
+            var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
+            var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue;
+            var completeTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.CompleteTask)?.ConfigValue;
+            if (wmsBase == null || completeTask == null)
+            {
+                throw new InvalidOperationException("WMS IP 鏈厤缃�");
+            }
+            var wmsIpAddress = wmsBase + completeTask;
+
+            var result = HttpHelper.GetAsync(wmsIpAddress, keys).Result;
+            WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
+            if (content.Status)
+            {
+                //ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true);
+                _taskService.UpdateTaskStatusToNext(taskOut);
+            }
+        }
+
+        /// <summary>
+        /// 鍒涘缓骞跺彂閫佺┖鎵樼洏浠诲姟
+        /// </summary>
+        public void CreateAndSendEmptyTrayTask(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
+        {
+            if (command.ConveyorLineBarcode != "NoRead")
+            {
+                var taskDTO = CreateEmptyTrayTaskDto(command.ConveyorLineBarcode, childDeviceCode);
+
+                if (_taskRepository.QueryFirst(x => x.PalletCode == command.ConveyorLineBarcode) != null)
+                {
+                    List<string> strings = new List<string>() { "1743", "1739", "1837", "1841" };
+
+                    var taskExecuting = _taskRepository.QueryFirst(x => x.PalletCode == command.ConveyorLineBarcode && x.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting && strings.Contains(x.TargetAddress));
+
+                    if (taskExecuting != null)
+                    {
+                        taskExecuting.ExceptionMessage = "鏈帴鏀跺埌绾夸綋瀹屾垚淇″彿绯荤粺鍐呴儴鑷姩瀹屾垚";
+                        _taskService.Delete(taskExecuting);
+                    }
+
+                    ConsoleHelper.WriteErrorLine($"褰撳墠鎵樼洏瀛樺湪浠诲姟锛氥�恵command.ConveyorLineBarcode}銆�");
+
+                    WriteInfo(conveyorLine.DeviceName, $"褰撳墠鎵樼洏瀛樺湪浠诲姟{command.ConveyorLineBarcode}");
+                }
+
+                var content = CreateAndSendTask(taskDTO);
+                if (content.Status)
+                {
+                    var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode, command.ConveyorLineBarcode);
+                    if (task != null)
+                    {
+                        var taskCommand = MapTaskCommand(task, command);
+
+                        bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode);
+                        if (sendFlag)
+                        {
+                            _taskService.UpdateTaskStatusToNext(task);
+                        }
+                    }
+                }
+            }
+        }
+
+        /// <summary>
+        /// 鍒涘缓绌烘墭鐩樹换鍔TO
+        /// </summary>
+        private WMSTaskDTO CreateEmptyTrayTaskDto(string barcode, string childDeviceCode)
+        {
+            var request = new RequestTaskDto()
+            {
+                Position = childDeviceCode,
+                PalletCode = barcode,
+            };
+
+            var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress);
+            var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue;
+            var requestTrayInTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.RequestTrayInTask)?.ConfigValue;
+            if (wmsBase == null || requestTrayInTask == null)
+            {
+                throw new InvalidOperationException("WMS IP 鏈厤缃�");
+            }
+            var wmsIpAddrss = wmsBase + requestTrayInTask;
+
+            var result = HttpHelper.PostAsync(wmsIpAddrss, request.ToJsonString()).Result;
+
+            if (result == null)
+                return new WMSTaskDTO();
+
+            WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result);
+            if (!content.Status)
+                return new WMSTaskDTO();
+
+            return JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString());
+        }
+
+        /// <summary>
+        /// 璇锋眰WMS浠诲姟
+        /// </summary>
+        private async void RequestWmsTask(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, Dt_StationManager stationManager)
+        {
+            try
+            {
+                if (command.ConveyorLineBarcode.IsNullOrEmpty()) return;
+
+                var content = await _taskService.RequestWMSTask(command.ConveyorLineBarcode, childDeviceCode);
+
+                if (content.Status)
+                {
+                    var task = _taskService.QueryBarCodeConveyorLineTask(command.ConveyorLineBarcode, childDeviceCode);
+                    if (task != null)
+                    {
+                        if (childDeviceCode == "1039")
+                        {
+                            var GWTask = _taskRepository.QueryData(x => x.Roadway.Contains("GWSC2") && x.SourceAddress == "1039" && (x.TaskState == (int)TaskInStatusEnum.Line_InExecuting || x.TaskState == (int)TaskInStatusEnum.Line_InFinish)).ToList();
+                            if (GWTask.Count >= 2 && childDeviceCode == "1039" && task.Roadway.Contains("GWSC2"))
+                            {
+                                ConsoleHelper.WriteErrorLine($"鎵樼洏鍙凤細銆恵command.ConveyorLineBarcode}銆戦珮娓╀簩宸插瓨鍦ㄣ�恵GWTask.Count}銆戜釜浠诲姟澶т簬2涓换鍔′笉鍙笅鍙�");
+                                return;
+                            }
+                        }
+
+                        ConveyorLineTaskCommand_After taskCommand = _mapper.Map<ConveyorLineTaskCommand_After>(task);
+
+                        bool sendFlag = SendCommand(taskCommand, conveyorLine, childDeviceCode);
+                        if (sendFlag)
+                        {
+                            conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+
+                            _taskService.UpdateTaskStatusToNext(task);
+                        }
+                    }
+                }
+                else
+                {
+                    if (content.Message != "璇锋眰杩囦簬棰戠箒锛岃绋嶅悗鍐嶈瘯" && content.Message != "鏃犳硶鑾峰彇鐩爣鍦板潃")
+                    {
+                        WriteInfo(conveyorLine.DeviceName, content.Message);
+                        conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, stationManager.stationNGChildCode, childDeviceCode);
+                        conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+                        ConsoleHelper.WriteErrorLine($"銆恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戣姹傜偣浣嶏細銆恵childDeviceCode}銆戝紓甯镐俊鎭�恵content.Message}銆�");
+                        WriteInfo(conveyorLine.DeviceName, $"銆恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戣姹傜偣浣嶏細銆恵childDeviceCode}銆戝紓甯镐俊鎭�恵content.Message}銆�");
+                    }
+                    ConsoleHelper.WriteErrorLine($"銆恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戣姹傜偣浣嶏細銆恵childDeviceCode}銆戝紓甯镐俊鎭�恵content.Message}銆�");
+                }
+            }
+            catch (Exception ex)
+            {
+                WriteInfo(conveyorLine.DeviceName, $"銆恵conveyorLine.DeviceName}銆戞墭鐩樺彿锛氥�恵command.ConveyorLineBarcode}銆戣姹傜偣浣嶏細銆恵childDeviceCode}銆戝紓甯镐俊鎭�恵ex.Message}銆戝紓甯歌銆恵ex.StackTrace}銆�");
+            }
+
+        }
+
+        /// <summary>
+        /// 楂樻俯鍑哄簱鍚庝换鍔″畬鎴� 濡傛灉浠诲姟鏍囪瘑NG鍒欏皢浠诲姟鏀逛负寮傚父鎺掑嚭浠诲姟
+        /// </summary>
+        /// <param name="conveyorLine"></param>
+        /// <param name="command"></param>
+        /// <param name="childDeviceCode"></param>
+        /// <param name="task"></param>
+        /// <exception cref="Exception"></exception>
+        private void CreateAbNormalOutbound(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, Dt_Task task)
+        {
+            Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode);
+
+            if (stationManager == null || string.IsNullOrWhiteSpace(stationManager.stationNGChildCode) || string.IsNullOrWhiteSpace(stationManager.stationNGLocation))
+            {
+                throw new Exception("鏈厤缃珯鍙扮殑瀵瑰簲NG鍙d俊鎭�");
+            }
+
+            task.SourceAddress = task.TargetAddress;
+            task.TargetAddress = stationManager.stationNGLocation;
+            task.TaskState = (int)TaskOutStatusEnum.OutNew;
+            task.TaskType = (int)TaskOutboundTypeEnum.InToOut;
+            task.Grade = 10;    //姝ゅ 鍑哄簱鑷冲紓甯告帓鍑哄彛鐨勪换鍔″簲闄ょ伀璀﹀鏈�浼樺厛鎵ц
+
+            _taskRepository.UpdateData(task);
+            //Dt_Task task= _taskRepository.QueryFirst(x=>)
+            //_taskRepository.QueryFirst()
+        }
+
+        /// <summary>
+        /// 鍖呰寮傚父鎺掑嚭鍙i�昏緫
+        /// </summary>
+        /// <param name="conveyorLine"></param>
+        /// <param name="command"></param>
+        /// <param name="childDeviceCode"></param>
+        private void AbNormalStationBZTask(CommonConveyorLine_NewCW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode)
+        {
+            Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode && x.stationPLC == conveyorLine.DeviceCode);
+
+            if (command.ConveyorLineBarcode.IsNullOrEmpty())
+            {
+                conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, Convert.ToInt16(1), childDeviceCode);
+                return;
+            }
+
+
+            if (conveyorLine.ReadValue(ConveyorLineDBName_After.InteractiveSignal, childDeviceCode).ObjToInt() == 0) //鎵樼洏姝e弽淇″彿
+            {
+
+            }
+            ;
+            conveyorLine.ReadValue(ConveyorLineDBName_After.InteractiveSignal, childDeviceCode);  //鎵樼洏鏈夋棤鐢佃姱淇″彿
+        }
+
+    }
+}
\ No newline at end of file
diff --git a/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob_NewCW/CommonStackerCrane_NewCWJob.cs b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob_NewCW/CommonStackerCrane_NewCWJob.cs
new file mode 100644
index 0000000..03cb8b8
--- /dev/null
+++ b/Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/StackerCraneJob_NewCW/CommonStackerCrane_NewCWJob.cs
@@ -0,0 +1,604 @@
+锘縰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;
+
+namespace WIDESEAWCS_Tasks
+{
+    [DisallowConcurrentExecution]
+    public class CommonStackerCrane_NewCWJob : 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 CommonStackerCrane_NewCWJob(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
+            {
+
+                CommonStackerCrane_NewCW commonStackerCrane = (CommonStackerCrane_NewCW)context.JobDetail.JobDataMap.Get("JobParams");
+                if (commonStackerCrane != null)
+                {
+                    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 = GetTask(commonStackerCrane);
+                            if (task != null)
+                            {
+                                StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task);
+                                if (stackerCraneTaskCommand != null)
+                                {
+                                    var taskNum = commonStackerCrane.GetValue<StackerCraneDBName, int>(StackerCraneDBName.TaskNum);
+                                    //var taskBarCode = commonStackerCrane.GetValue<StackerCraneDBName, string>(StackerCraneDBName.Barcode);
+                                    ConsoleHelper.WriteColorLine($"銆恵commonStackerCrane.DeviceName}銆戝爢鍨涙満浠诲姟鍙凤細銆恵taskNum}銆戜换鍔′换鍔″彿锛氥�恵task.TaskNum}銆�", ConsoleColor.DarkBlue);
+                                    if (taskNum == 0)
+                                    {
+                                        ConsoleHelper.WriteColorLine($"銆恵commonStackerCrane.DeviceName}銆戜换鍔″彿涓恒�恵0}銆�,浠诲姟鍙蜂笉涓�鑷村彲浠ヤ笅鍙戜换鍔�", ConsoleColor.DarkBlue);
+
+                                        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);
+                                        }
+                                    }
+                                    else
+                                    {
+                                        ConsoleHelper.WriteColorLine($"銆恵commonStackerCrane.DeviceName}銆戜换鍔″彿涓嶄负銆恵0}銆�,涓嶅彲浠ヤ笅鍙戜换鍔�", ConsoleColor.DarkBlue);
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    #region 璋冪敤浜嬩欢鎬荤嚎閫氱煡鍓嶇
+
+                    var tokenInfos = _cacheService.Get<List<UserInfo>>("Cache_UserToken");
+                    if (tokenInfos != null && tokenInfos.Any())
+                    {
+                        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("CommonConveyorLineJob", "test", ex);
+                ConsoleHelper.WriteErrorLine($"{ex.Message}");
+                //Console.WriteLine(nameof(CommonStackerCraneJob) + ":" + ex.ToString());
+            }
+            //WriteDebug("CommonConveyorLineJob", "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)
+        {
+            CommonStackerCrane? commonStackerCrane = sender as CommonStackerCrane;
+            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("CW") && task.TaskType==(int)TaskOutboundTypeEnum.InToOut)
+                    {
+                        var stationinfo = _stationManagerRepository.QueryFirst(x => x.stationPLC == "1017" && x.stationType == 10 && x.Roadway == commonStackerCrane.DeviceCode);
+
+                        IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == stationinfo.stationPLC);
+                        if (device != null)
+                        {
+                            CommonConveyorLine_NewCW conveyorLine = (CommonConveyorLine_NewCW)device;
+                            conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, Convert.ToInt16(1815), stationinfo.stationChildCode);
+                            Thread.Sleep(100);
+                            conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTaskNum, 1000, stationinfo.stationChildCode);
+                        }
+                        WriteInfo(commonStackerCrane.DeviceName, $"銆愭墜鍔ㄥ嚭搴撹褰曘�戜换鍔″彿銆恵e.TaskNum}銆戞墭鐩樺彿銆恵task.PalletCode}銆�");
+                    }
+
+
+
+
+                    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);
+                        _taskService.UpdateData(newTask);
+                    }
+                    if ((task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup && (task.TargetAddress == "002-021-001" || task.TargetAddress == "001-021-001"))|| task.TaskType == (int)TaskOutboundTypeEnum.OutFireAlarm)
+                    {
+                        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(CommonStackerCrane_NewCW commonStackerCrane)
+        {
+            Dt_Task task;
+            task = _taskService.QueryOutFireAlarmTask(commonStackerCrane.DeviceCode);
+            if (task != null)
+            {
+                return task;
+            }
+
+            if (commonStackerCrane.LastTaskType == null)
+            {
+                task = _taskService.QueryStackerCraneTask(commonStackerCrane.DeviceCode);
+            }
+            else
+            {
+                var lastTaskTypeGroup = commonStackerCrane.LastTaskType.GetValueOrDefault().GetTaskTypeGroup();
+                if (lastTaskTypeGroup == TaskTypeGroup.OutbondGroup)
+                {
+                    task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
+                    if (task == null)
+                    {
+                        task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
+                    }
+                }
+                else
+                {
+                    task = _taskService.QueryStackerCraneOutTask(commonStackerCrane.DeviceCode);
+                }
+            }
+
+            if (task != null && task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup)
+            {
+                // 妫�鏌ュ綋鍓嶅嚭搴撲换鍔$珯鍙版槸鍚﹀厑璁告斁璐�
+                var occupiedStation = OutTaskStationIsOccupied(task);
+                if (occupiedStation == null)
+                {
+                    // 濡傛灉褰撳墠鍑哄簱浠诲姟绔欏彴涓嶅厑璁告斁璐э紝鎺掗櫎褰撳墠浠诲姟锛屾煡鎵惧叾浠栧嚭搴撲换鍔�
+
+                    var log = $"浠诲姟鍙凤細銆恵task.TaskNum}銆戝嚭搴撳湴鍧�锛氥�恵task.NextAddress}銆戜笉鍏佽鏀捐揣";
+                    ConsoleHelper.WriteErrorLine(log);
+
+                    _noticeService.Logs(userTokenIds, new { commonStackerCrane.DeviceName, log = log, time = DateTime.Now.ToString("G"), color = "red" });
+                    WriteInfo(commonStackerCrane.DeviceName, log);
+
+                    task = FindAnotherOutboundTask(commonStackerCrane.DeviceCode, task.TaskId);
+
+                    if (task == null)
+                    {
+                        task = _taskService.QueryStackerCraneInTask(commonStackerCrane.DeviceCode);
+                    }
+                }
+                else
+                {
+                    return task;
+                }
+
+            }
+            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)
+        {
+            Dt_Router? router = _routerService.QueryNextRoutes(task.Roadway, task.NextAddress).FirstOrDefault();
+            if (task.Roadway.Contains("GW") || task.Roadway.Contains("CW"))
+            {
+                if (router != null)
+                {
+                    IDevice? device = null;
+                    if (task.Roadway.Contains("CW"))
+                    {
+                        device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == router.ChildPosiDeviceCode);
+                        if (device != null)
+                        {
+                            CommonConveyorLine_NewCW conveyorLine = (CommonConveyorLine_NewCW)device;
+                            if (conveyorLine.IsOccupied(task.NextAddress))//鍑哄簱绔欏彴鏈鍗犵敤
+                            {
+                                return task;
+                            }
+                        }
+                        else
+                        {
+                            _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒板嚭搴撶珯鍙般�恵task.NextAddress}銆戝搴旂殑閫氳瀵硅薄锛屾棤娉曞垽鏂嚭搴撶珯鍙版槸鍚﹁鍗犵敤");
+                        }
+                    }
+                }
+                else
+                {
+                    IDevice? device = null;
+                    if (task.Roadway.Contains("GW"))
+                    {
+                        device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "1015");
+                        if (device != null)
+                        {
+                            CommonConveyorLine_GW conveyorLine = (CommonConveyorLine_GW)device;
+                            if (conveyorLine.IsOccupied(task.TargetAddress))//鍑哄簱绔欏彴鏈鍗犵敤
+                            {
+                                return task;
+                            }
+                        }
+                        else
+                        {
+                            _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒板嚭搴撶珯鍙般�恵task.TargetAddress}銆戝搴旂殑閫氳瀵硅薄锛屾棤娉曞垽鏂嚭搴撶珯鍙版槸鍚﹁鍗犵敤");
+                        }
+                    }
+                    //_taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.TargetAddress}銆戜俊鎭紝鏃犳硶鏍¢獙绔欏彴");
+                }
+            }
+            else
+            {
+                if ((task.NextAddress == ("002-021-001") || task.NextAddress == ("001-021-001")) && task.Roadway.Contains("JZ"))
+                {
+                    return task;
+                }
+                else
+                {
+                    //Dt_Router? router = _routerService.QueryNextRoutes(task.Roadway, task.NextAddress).FirstOrDefault();
+                    if (router != null)
+                    {
+                        IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == router.ChildPosiDeviceCode);
+                        if (device != null)
+                        {
+                            CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
+                            if (conveyorLine.IsOccupiedx(router.ChildPosi))//鍑哄簱绔欏彴鏈鍗犵敤
+                            {
+                                return task;
+                            }
+                        }
+                        else
+                        {
+                            _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒板嚭搴撶珯鍙般�恵router.ChildPosiDeviceCode}銆戝搴旂殑閫氳瀵硅薄锛屾棤娉曞垽鏂嚭搴撶珯鍙版槸鍚﹁鍗犵敤");
+                        }
+                    }
+                    else
+                    {
+                        _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"鏈壘鍒扮珯鍙般�恵task.NextAddress}銆戜俊鎭紝鏃犳硶鏍¢獙绔欏彴");
+                    }
+                }
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 鏌ユ壘鍏朵粬鍑哄簱浠诲姟鐨勮緟鍔╂柟娉曪紙鎺掗櫎鎸囧畾浠诲姟ID鐨勪换鍔★級
+        /// </summary>
+        /// <param name="deviceCode">璁惧浠g爜</param>
+        /// <param name="excludedTaskId">瑕佹帓闄ょ殑浠诲姟ID</param>
+        /// <returns></returns>
+        private Dt_Task? FindAnotherOutboundTask(string deviceCode, int excludedTaskId)
+        {
+            // 鍏堣幏鍙栨墍鏈夌鍚堟潯浠讹紙鎺掗櫎鎸囧畾浠诲姟ID锛夌殑鍑哄簱浠诲姟鍒楄〃
+            var allOutboundTasks = _taskService.QueryAllOutboundTasks(deviceCode);
+            var availableTasks = allOutboundTasks?.Where(t => excludedTaskId != t.TaskId && t.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup).ToList();
+
+            if (availableTasks == null || availableTasks.Count == 0)
+            {
+                return null;
+            }
+
+            // 閬嶅巻鍙敤浠诲姟鍒楄〃锛屾鏌ヤ换鍔$珯鍙版槸鍚﹀厑璁告斁璐э紝鎵惧埌绗竴涓厑璁告斁璐х殑浠诲姟灏辫繑鍥�
+            foreach (var candidateTask in availableTasks)
+            {
+                var occupiedStation = OutTaskStationIsOccupied(candidateTask);
+                if (occupiedStation != null)
+                {
+                    return candidateTask;
+                }
+                var log = $"浠诲姟鍙凤細銆恵candidateTask.TaskNum}銆戝嚭搴撳湴鍧�锛氥�恵candidateTask.NextAddress}銆戜笉鍏佽鏀捐揣";
+                ConsoleHelper.WriteErrorLine(log);
+
+                _noticeService.Logs(userTokenIds, new { deviceCode, log = log, time = DateTime.Now.ToString("G"), color = "red" });
+                WriteInfo(deviceCode, log);
+            }
+
+            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;
+            stackerCraneTaskCommand.FireCommand = Convert.ToInt16(task.TaskType == (int)TaskOutboundTypeEnum.OutFireAlarm ? 2 : 0);
+            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("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")|| task.TaskType == (int)TaskOutboundTypeEnum.OutFireAlarm)
+                {
+                    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.TaskType == (int)TaskOutboundTypeEnum.InToOut)
+                    {
+                        string[] endCodes = task.TargetAddress.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")) || task.TaskType == (int)TaskOutboundTypeEnum.OutFireAlarm)
+                    {
+                        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/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Const/ConfigConst.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Const/ConfigConst.cs
index c851d83..7b95dee 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Const/ConfigConst.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_Core/Const/ConfigConst.cs
@@ -113,6 +113,11 @@
         public const string AgingOutput = "AgingOutput";
 
         /// <summary>
+        /// 鎹㈠瀷
+        /// </summary>
+        public const string EqptRun = "EqptRun";
+
+        /// <summary>
         /// 宸ヨ壓璺嚎鐢宠
         /// </summary>
         public const string ProcessApply = "ProcessApply";
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MOM/ResponeAgingInputDto.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MOM/ResponeAgingInputDto.cs
index f2f7358..50c278c 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MOM/ResponeAgingInputDto.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_DTO/MOM/ResponeAgingInputDto.cs
@@ -91,4 +91,30 @@
         /// </summary>
         public string ParameterCode { get; set; }
     }
+
+
+    public class EqptRunDTO: BasicResult
+    {
+        public string WipOrderNo { get; set; }
+
+        public string ProductDesc { get; set; }
+
+        public string FirstArticleNum { get; set; }
+
+        public string DebugNum { get; set; }
+
+        public string ParamVersion { get; set; }
+
+        public string ParamRefreshFlag { get; set; }
+
+        public string ProductType { get; set; }
+ 
+        public bool ProductModel { get; set; }
+
+        public string ParameterInfo { get; set; }
+
+        public string IsProcessed { get; set; }
+
+        public string PreProductNo { get; set; }
+    }
 }
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/MOM/AgingInOrOutInput/IAgingInOrOutInputService.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/MOM/AgingInOrOutInput/IAgingInOrOutInputService.cs
index 1e87d41..339f2fd 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/MOM/AgingInOrOutInput/IAgingInOrOutInputService.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_IStoragIntegrationServices/MOM/AgingInOrOutInput/IAgingInOrOutInputService.cs
@@ -18,4 +18,11 @@
     /// <param name="input">鍑哄簱鏁版嵁</param>
     /// <returns></returns>
     Task<WebResponseContent> GetOCVOutputAsync(AgingOutputDto input);
+
+    /// <summary>
+    /// 淇敼璁惧鍨嬪彿
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    Task<WebResponseContent> Change(EqptRunDto input);
 }
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MOM/AgingInOrOutInput/AgingInOrOutInputService.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MOM/AgingInOrOutInput/AgingInOrOutInputService.cs
index a1786ad..95298d9 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MOM/AgingInOrOutInput/AgingInOrOutInputService.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StoragIntegrationServices/MOM/AgingInOrOutInput/AgingInOrOutInputService.cs
@@ -122,4 +122,41 @@
         }
         return content;
     }
+
+
+    public async Task<WebResponseContent> Change(EqptRunDto input)
+    {
+        WebResponseContent content = new WebResponseContent();
+        try
+        {
+            input.SessionId = Guid.NewGuid().ToString();
+            input.EmployeeNo = "MITest";
+            input.RequestTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now).ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
+            var inputJson = Masuit.Tools.ObjectExtensions.ToDictionary(input); // Specify the namespace explicitly
+            var configs = _configService.GetConfigsByCategory(CateGoryConst.SYS_MOMIPAddress);
+            var MOMBase = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.MOMBaseIP)?.ConfigValue;
+            var ipAddress = configs.FirstOrDefault(x => x.ConfigKey == SysConfigConst.EqptRun)?.ConfigValue;
+            if (MOMBase == null || ipAddress == null)
+            {
+                throw new InvalidOperationException("WMS IP 鏈厤缃�");
+            }
+            var MOMIpAddress = MOMBase + ipAddress;
+
+            var result = HttpsClient.PostAsync(MOMIpAddress, inputJson).Result;
+
+            //var respone = JsonConvert.DeserializeObject<EqptRunDTO>(result.ToString());
+            
+            content.OK(data: result);
+            LogFactory.GetLog("鎹㈠瀷").Info(true, $"\r\r--------------------------------------");
+            LogFactory.GetLog("鎹㈠瀷").Info(true, input.EquipmentCode);
+            LogFactory.GetLog("鎹㈠瀷").Info(true, result);
+        }
+        catch (Exception err)
+        {
+            LogFactory.GetLog("鎹㈠瀷").Error(true, $"\r\r--------------------------------------");
+            LogFactory.GetLog("鎹㈠瀷").Error(true, err.StackTrace);
+            content.Error(err.Message);
+        }
+        return content;
+    }
 }
\ No newline at end of file
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
index 7948f6c..7662b61 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -769,6 +769,7 @@
                 //    return await HandleErrorCells(input, area, serialNosError);
                 //}
                 #endregion
+
                 var boxing = CreateBoxingInfo(result, input.PalletCode);
                 if (boxing == null) return content.Error("缁勭洏澶辫触");
 
@@ -932,7 +933,9 @@
         }
         else
         {
-            _boxingInfoRepository.DeleteData(boxing);
+            _boxingInfoRepository.Db.DeleteNav<DtBoxingInfo>(x => x.Id == boxing.Id)
+                                            .Include(x => x.BoxingInfoDetails)
+                                            .ExecuteCommandAsync();
             return new DtBoxingInfo
             {
                 PalletCode = palletCode,
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/Dt_TaskService.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/Dt_TaskService.cs
index 6bd38fe..7323b07 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/Dt_TaskService.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/Dt_TaskService.cs
@@ -4,6 +4,7 @@
 using SqlSugar;
 using WIDESEA_Common.CustomModels;
 using WIDESEA_Core.Const;
+using WIDESEA_DTO;
 using WIDESEA_DTO.MOM;
 using WIDESEA_DTO.WMS;
 using WIDESEA_Model.Models;
@@ -1078,24 +1079,39 @@
         WebResponseContent content = new WebResponseContent();
         try
         {
-            LogFactory.GetLog($"鍖呰璇锋眰鍑哄簱浠诲姟").Info(true, $"銆愯姹傚弬鏁般�戯細銆恵JsonConvert.SerializeObject(json)}銆憑Environment.NewLine}{Environment.NewLine}");
             Dt_StationManager station = _stationManagerRepository.QueryFirst(x => x.stationChildCode == json.Position && x.stationType == 12 && x.stationArea == "Call");
             if (station == null) { throw new Exception($"鏈壘鍒板寘瑁呯珯鍙颁俊鎭紝璇锋鏌ヤ紶鍏ュ弬鏁皗json.Position}"); }
+
+            EqptRunDto basic = new EqptRunDto()
+            {
+                EquipmentModel = "0",
+                Password ="",
+                EmployeeNo = "82412152",
+                SessionId = Guid.NewGuid().ToString(),
+                RequestTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now).ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
+                Software = "鍖呰涓婃枡",
+                EquipmentCode = station.stationEquipMOM,
+            };
+            var result = _agingInOrOutInputService.Change(basic).Result;
+            var respone = JsonConvert.DeserializeObject<EqptRunDTO>(result.Data.ToString());
+            if(!result.Status || !respone.Success)
+            {
+                throw new Exception($"{station.productLine}鑾峰彇MOM鎹㈠瀷鏁版嵁寮傚父,寮傚父淇℃伅{respone.MOMMessage}");
+            }
 
             var deviceCode = SqlSugarHelper.DbWCS.Queryable<Dt_DeviceInfo>()
                 .Where(x => x.DeviceStatus == "1")
                 .Where(x => x.DeviceCode.Contains("CWSC")) // 杩囨护鏉′欢
                 .ToList().Select(x => x.DeviceCode).ToList();
 
-            //var outBoundMateriel = AppSettings.app<OutBoundMateriel>("OutBoundMateriel");
-            var outBoundMateriel = _dt_ChangeoversRepository.QueryData(x => x.Status == "1").ToList();
-            List<string>? materielCodes = outBoundMateriel.Count != 0
-                ? outBoundMateriel.Where(x => x.ProductionLine == station.productLine && x.ProcessCode == "CWSC3")
-                                  .Select(x => x.MaterielCode)
-                                  .ToList()
-                : null;
+            //var outBoundMateriel = _dt_ChangeoversRepository.QueryData(x => x.Status == "1").ToList();
+            //List<string>? materielCodes = outBoundMateriel.Count != 0
+            //    ? outBoundMateriel.Where(x => x.ProductionLine == station.productLine && x.ProcessCode == "CWSC3")
+            //                      .Select(x => x.MaterielCode)
+            //                      .ToList()
+            //    : null;
 
-            #region
+            #region Redis缂撳瓨鏌ヨ浠g爜
             //// 浠庣紦瀛樹腑鑾峰彇搴撳瓨淇℃伅
             //IDictionary<string, DtStockInfo>? stockInfos = _simpleCacheService.HashGetAll<DtStockInfo>(WIDESEA_Cache.CacheConst.Cache_DtStockInfo);
             //List<DtStockInfo> stockInfoList = stockInfos.Values.ToList();
@@ -1115,7 +1131,7 @@
             //    .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails != null && x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
             //    .FirstOrDefault();
             // 淇敼鍚庣殑鏌ヨ浠g爜
-            #endregion
+
             //var stockInfo = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
             //                    .Includes(x => x.LocationInfo)
             //                    .Includes(x => x.StockInfoDetails)
@@ -1128,6 +1144,7 @@
             //                    .WhereIF(!materielCodes.IsNullOrEmpty(), x => x.StockInfoDetails.Any(y => materielCodes.Contains(y.MaterielCode)))
             //                    .OrderBy(x => x.OutboundTime)
             //                    .FirstAsync();
+            #endregion 
 
             DtStockInfo stockInfo = null;
             var stockInfoList = await _stockInfoRepository.Db.Queryable<DtStockInfo>()
@@ -1143,7 +1160,7 @@
             foreach (var stock in stockInfoList)
             {
                 var hasMatchingDetail = await _stockInfoRepository.Db.Queryable<DtStockInfoDetail>()
-                    .Where(d => d.StockId == stock.Id && materielCodes.Contains(d.MaterielCode))
+                    .Where(d => d.StockId == stock.Id && respone.PreProductNo.Contains(d.MaterielCode))
                     .AnyAsync();
 
                 if (hasMatchingDetail)
@@ -1152,7 +1169,7 @@
                     break;
                 }
             }
-            if (stockInfo == null) throw new Exception($"搴撳唴{station.productLine}鏃犳弧瓒虫潯浠剁殑搴撳瓨鍙嚭搴�");
+            if (stockInfo == null) throw new Exception($"CWSC3搴撳唴銆恵station.productLine}銆�,銆愮墿鏂欑紪鐮亄respone.PreProductNo}銆戞棤婊¤冻鏉′欢鐨勫簱瀛樺彲鍑哄簱");
 
             DtLocationInfo locationInfo = _locationRepository.QueryFirst(x => x.AreaId == 5 && x.LocationCode == stockInfo.LocationCode);
 
@@ -1189,7 +1206,6 @@
 
             _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(stockInfo.LocationInfo, lastStatus, (int)StatusChangeTypeEnum.AutomaticDelivery, task.TaskNum);
 
-            LogFactory.GetLog($"鍖呰璇锋眰鍑哄簱浠诲姟").Info(true, $"銆愯繑鍥炲弬鏁般�戯細銆恵JsonConvert.SerializeObject(taskDTO)}銆憑Environment.NewLine}{Environment.NewLine}");
             return content.OK(data: taskDTO);
         }
         catch (Exception ex)
diff --git a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/RequestInTaskAsync.cs b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/RequestInTaskAsync.cs
index 2e8dd63..240cfe1 100644
--- a/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/RequestInTaskAsync.cs
+++ b/Code Management/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Partial/RequestInTaskAsync.cs
@@ -45,26 +45,16 @@
         try
         {
             // 鍒ゆ柇闇�涓嶉渶瑕佸幓鍖呰锛屼笉闇�瑕佸氨鍘诲父娓╀笁
-            var stationManagers = _stationManagerRepository.QueryData(x => x.stationPLC == "1018" && x.stationArea == "Cache" && x.productLine == input.ProductionLine);
+            //var stationManagers = _stationManagerRepository.QueryData(x => x.stationPLC == "1018" && x.stationArea == "Cache" && x.productLine == input.ProductionLine);
 
-            var STATION = _stationManagerRepository.QueryFirst(x => x.stationChildCode == input.Position);
+            //var STATION = _stationManagerRepository.QueryFirst(x => x.stationChildCode == input.Position);
 
-            //var station = stationManagers.Select(x => x.stationChildCode).ToList();
-
-            //// 鑾峰彇WCSip鍦板潃鐩稿叧閰嶇疆
+            // 鑾峰彇WCSip鍦板潃鐩稿叧閰嶇疆
             var wcsIpAddrss = GetWCSIpAddress();
-            //if (wcsIpAddrss == null)
-            //{
-            //    throw new InvalidOperationException("WCS IP 鏈厤缃�");
-            //}
-
-            //var abc = HttpHelper.PostAsync(wcsIpAddrss, station.ToJsonString()).Result;
-            //content = JsonConvert.DeserializeObject<WebResponseContent>(abc);
-            //var num = content.Data.ObjToInt();
 
             //濡傛灉褰撳墠搴撳唴瀛樺湪姣斿綋鍓嶆椂闂寸殑瀵瑰簲浜х嚎鐨勬枡 鍒欏叆搴撹嚦甯告俯3
-            DtStockInfo stockInfo = _stockInfoRepository.QueryFirst(x => x.AreaCode == "CWSC3" && x.IsFull == true && x.ProductionLine == STATION.productLine && x.OutboundTime < DateTime.Now);
-            if (stockInfo != null)
+            //DtStockInfo stockInfo = _stockInfoRepository.QueryFirst(x => x.AreaCode == "CWSC3" && x.IsFull == true && x.ProductionLine == STATION.productLine && x.OutboundTime < DateTime.Now);
+            //if (stockInfo != null)
             {
                 var config = _configService.GetByConfigKey("SYS_InStacker", "CW3InStacker");
                 var strings = config.ConfigValue.Split(',').ToList();
@@ -79,32 +69,34 @@
 
             // TODO 鍒ゆ柇鍦ㄩ�旀暟閲�
 
-            var needBarcode = await SqlSugarHelper.DbWCS.Queryable<dt_needBarcode>().FirstAsync(x => x.productLine == STATION.productLine && x.fromArea == "CW");
-            var needCount =  BaseDal.QueryData(x => x.TargetAddress == needBarcode.toArea).Count();
-            //var count = BaseDal.QueryData(x => x.TargetAddress == stationManagers[0].Roadway).Count;
-            if (needCount < needBarcode.cacheNum)
-            {
-                // 閫佽嚦鍖呰
-                List<string> strings = stationManagers.Where(x => x.stationType == 0 && x.productLine == input.ProductionLine).Select(x => x.Roadway).ToList();
-                var x = await SqlSugarHelper.DbWCS.Updateable<dt_needBarcode>()
-                    .SetColumns(x => x.inLineNum == x.inLineNum + 1)
-                    .Where(x => x.id == needBarcode.id).ExecuteCommandHasChangeAsync();
-                ConsoleHelper.WriteSuccessLine($"鍦ㄩ�旀暟閲忔坊鍔爗(x ? "鎴愬姛" : "澶辫触")}鏁伴噺+1,褰撳墠宸ュ簭{boxing.ProcessCode},浜х嚎{input.ProductionLine}");
-                LogFactory.GetLog("OCVB").InfoFormat(true, $"鍦ㄩ�旀暟閲忔坊鍔爗(x ? "鎴愬姛" : "澶辫触")}鏁伴噺+1,褰撳墠宸ュ簭{boxing.ProcessCode},浜х嚎{input.ProductionLine}", "鏃犲弬鏁�");
-                return await CreateNewTask(input, input.ProductionLine, boxing.ProcessCode, strings, 3);
-            }
-            else
-            {
-                var config = _configService.GetByConfigKey("SYS_InStacker", "CW3InStacker");
-                var strings = config.ConfigValue.Split(',').ToList();
-                // 鍏ュ簱閫佽嚦甯告俯3
-                var resultContent = await CreateNewTask(input, input.ProductionLine, boxing.ProcessCode, strings);
-                if (resultContent.Status)
-                {
-                    await _boxingInfoRepository.AddDataNavAsync(boxing);
-                }
-                return resultContent;
-            }
+            #region OCV甯告俯3鐩存帴鍘诲寘瑁呰矾寰勪笉閫氭閫昏緫涓嶉渶瑕�
+            //var needBarcode = await SqlSugarHelper.DbWCS.Queryable<dt_needBarcode>().FirstAsync(x => x.productLine == STATION.productLine && x.fromArea == "CW");
+            //var needCount =  BaseDal.QueryData(x => x.TargetAddress == needBarcode.toArea).Count();
+            //if (needCount < needBarcode.cacheNum)
+            //{
+            //    // 閫佽嚦鍖呰
+            //    List<string> strings = stationManagers.Where(x => x.stationType == 0 && x.productLine == input.ProductionLine).Select(x => x.Roadway).ToList();
+            //    var x = await SqlSugarHelper.DbWCS.Updateable<dt_needBarcode>()
+            //        .SetColumns(x => x.inLineNum == x.inLineNum + 1)
+            //        .Where(x => x.id == needBarcode.id).ExecuteCommandHasChangeAsync();
+            //    ConsoleHelper.WriteSuccessLine($"鍦ㄩ�旀暟閲忔坊鍔爗(x ? "鎴愬姛" : "澶辫触")}鏁伴噺+1,褰撳墠宸ュ簭{boxing.ProcessCode},浜х嚎{input.ProductionLine}");
+            //    LogFactory.GetLog("OCVB").InfoFormat(true, $"鍦ㄩ�旀暟閲忔坊鍔爗(x ? "鎴愬姛" : "澶辫触")}鏁伴噺+1,褰撳墠宸ュ簭{boxing.ProcessCode},浜х嚎{input.ProductionLine}", "鏃犲弬鏁�");
+            //    return await CreateNewTask(input, input.ProductionLine, boxing.ProcessCode, strings, 3);
+            //}
+            //else
+            //{
+            //    var config = _configService.GetByConfigKey("SYS_InStacker", "CW3InStacker");
+            //    var strings = config.ConfigValue.Split(',').ToList();
+            //    // 鍏ュ簱閫佽嚦甯告俯3
+            //    var resultContent = await CreateNewTask(input, input.ProductionLine, boxing.ProcessCode, strings);
+            //    if (resultContent.Status)
+            //    {
+            //        await _boxingInfoRepository.AddDataNavAsync(boxing);
+            //    }
+            //    return resultContent;
+            //}
+
+            #endregion
         }
         catch (Exception ex)
         {

--
Gitblit v1.9.3