huangxiaoqiang
6 天以前 c3877b2ebec19f473f45e8c2245926f65d2a3948
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_StorageSocketServices/SocketClientService.cs
@@ -22,6 +22,16 @@
using WIDESEA_Core.BaseRepository;
using AutoMapper;
using Mapster;
using AngleSharp.Dom;
using Masuit.Tools.Security;
using WIDESEA_IStorageTaskServices;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using WIDESEA_IBusinessesRepository;
using WIDESEA_Repository;
using static MailKit.Telemetry;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using System.Runtime.InteropServices;
namespace WIDESEA_StorageSocketServices
{
@@ -32,25 +42,32 @@
        const byte ETX = 3;
        private readonly ILogger<SocketClientService> _logger;
        private readonly LogFactory LogFactory = new LogFactory();
        //private readonly IDt_TaskService _taskService;
        private readonly IDt_StationManagerRepository _stationManagerRepository;
        private readonly IDt_TaskRepository BaseDal;
        Connection connection = AppSettings.Configuration.GetSection("Connection").Get<Connection>();
        string url = AppSettings.Configuration["AGVIP"];
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly IStockInfoRepository _stockInfoRepository;
        private readonly IDt_Task_HtyRepository _task_HtyRepository;
        private readonly IMapper _mapper;
        private readonly ILocationInfoRepository _locationRepository;
        private readonly IDt_TaskService _taskService;
        private readonly IDt_HostLogRepository _hostLogRepository;
        private bool _IsOnline = false;
        public DateTime Time { get; set; } = DateTime.Now;
        private static int _currentNumber = 0;
        private static readonly object _lock = new object();
        public SocketClientService(IDt_TaskRepository TaskRepository, IDt_StationManagerRepository stationManagerRepository, ILogger<SocketClientService> logger)
        public SocketClientService(IDt_TaskService TaskService, IDt_TaskRepository TaskRepository, IDt_StationManagerRepository stationManagerRepository, ILogger<SocketClientService> logger, IDt_HostLogRepository hostLogRepository)
        {
            BaseDal = TaskRepository;
            _stationManagerRepository = stationManagerRepository;
            _logger = logger;
            _taskService = TaskService;
            _hostLogRepository = hostLogRepository;
        }
        /// <summary>
        /// Socket连接
        /// </summary>
        /// <param name="IP"></param>
        /// <param name="Port"></param>
        public void ConnectServer(string IP, int Port)
        {
            try
@@ -58,12 +75,12 @@
                // æ£€æŸ¥æ˜¯å¦å·²è¿žæŽ¥ï¼Œé¿å…é‡å¤åˆ›å»º
                if (socket != null && socket.Connected)
                {
                    //Console.WriteLine("Socket已连接,无需重复创建");
                    ConsoleHelper.WriteErrorLine($"Socket已处于连接状态");
                    //ConsoleHelper.WriteErrorLine($"Socket已处于连接状态");
                    return;
                }
                //创建负责通信的socket
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socket = new System.Net.Sockets.Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(IP);
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(Port));
@@ -73,24 +90,41 @@
                _logger.LogInformation("Socket连接成功");
                ConsoleHelper.WriteSuccessLine("Socket连接成功");
                DeleteHostLog(910);
                _IsOnline = true;
                RequestCommunication();
                DeviceStateReport("I");
                AGVStatusRespone status = GetAGVStatus();
                DeviceStateReport(GetAGVStatus(status.RuntimeStatus));
                //开启一个新的线程不停的接收服务端发来的信息
                Thread th = new Thread(Receive);
                th.IsBackground = true;
                th.Start();
                ConsoleHelper.WriteErrorLine($"Socket启动");
                return;
            }
            catch (Exception ex)
            {
                _IsOnline = false;
                ConsoleHelper.WriteErrorLine($"Socket连接失败{ex.Message}");
                LogFactory.GetLog("Socket连接异常").Error(true, $"Socket连接失败{ex.Message}{ex.StackTrace}");
                HandleDisconnection();
            }
        }
        public bool Socketonline()
        {
            return _IsOnline;
        }
        /// <summary>
        /// çº¿ç¨‹è¯»å–数据
        /// </summary>
        void Receive()
        {
            Time = DateTime.Now;
            while (true)
            {
                try
@@ -121,6 +155,7 @@
                        var str = Encoding.UTF8.GetString(newArray);
                        string receivedChecksum = str.Substring(str.Length - 2);
                        LogFactory.GetLog("接收Socket数据").Info(true, $"{JsonConvert.SerializeObject(GetParse(str))}{Environment.NewLine}");
                        if (calculatedChecksum == receivedChecksum)
                        {
                            var x = Encoding.UTF8.GetString(newArray);
@@ -136,22 +171,29 @@
                        }
                        else
                        {
                            LogFactory.GetLog("Socket接收数据").Error(true, "校验失败");
                            CheckSum("3");
                            LogFactory.GetLog("Socket接收数据").Error(true, $"CheckSum校验失败,解析{calculatedChecksum}、读取{receivedChecksum}数据{JsonConvert.SerializeObject(GetParse(str))}");
                        }
                    }
                    else
                    {
                        LogFactory.GetLog("Socket接收数据").Error(true, $"无效报文格式:{JsonConvert.SerializeObject(Y)}");
                        LogFactory.GetLog("Socket接收数据").Error(true, $"无效报文格式:{JsonConvert.SerializeObject(Y)}{Environment.NewLine}");
                    }
                }
                catch
                {
                    _IsOnline = false;
                    HandleDisconnection();
                }
            }
        }
        /// <summary>
        /// ä½œä¸šJobType
        /// </summary>
        /// <param name="cmdId"></param>
        /// <param name="x"></param>
        private void ProcessCommand(string cmdId, string x)
        {
            switch (cmdId)
@@ -160,10 +202,10 @@
                    ReceiveCommandResponse(x);
                    break;
                case "906":
                    AGVJobStartOrEndResponse(x.Substring(21, 1), x.Substring(22, 1));
                    AGVJobStartOrEndResponse(x.Substring(20, 1), x.Substring(21, 1));
                    break;
                case "902":
                    DataReportResponse(x.Substring(21, 1));
                    DataReportResponse(x.Substring(20, 1));
                    break;
                case "935":
                    DeviceStationStatusInvite(x.Substring(15, 5));
@@ -175,22 +217,63 @@
                    RecreateGetLocation(x);
                    break;
                case "108":
                    RecreateGetLocation(x.Substring(21, 1));
                    EmptyOutBoundResponse(x.Substring(20, 1));
                    break;
                case "909":
                    DeviceStatusReportRequest();
                    break;
                case "987":
                    FireAlarm(x.Substring(21, 6), x.Substring(15, 5));
                    break;
                case "301":
                    UpdateLocalTime(x.Substring(30), x.Substring(15, 5));
                    break;
                case "918":
                    break;
                default:
                    CheckSum("1");
                    break;
            }
        }
        private void HandleDisconnection()
        #region
        //private void HandleDisconnection()
        //{
        //    int attempts = 100;
        //    do
        //    {
        //        string message = "连接已断开..." + '\n';
        //        message += "等待5秒后重新连接" + '\n';
        //        Console.WriteLine(message);
        //        // å…³é—­å½“前连接
        //        try
        //        {
        //            socket?.Close();
        //        }
        //        catch { }
        //        // ç­‰å¾…5秒
        //        Thread.Sleep(5000);
        //        // å°è¯•重新连接
        //        ConnectServer(connection.IP, connection.Port);
        //        attempts--;
        //    } while (!socket.Connected && attempts > 0);
        //}
        #endregion
        /// <summary>
        /// é‡è¿ž
        /// </summary>
        public void HandleDisconnection()
        {
            int attempts = 5;
            do
            int maxAttempts = 10; // æœ€å¤§å°è¯•次数
            int currentAttempts = 0;
            while (currentAttempts < maxAttempts)
            {
                string message = "连接已断开..." + '\n';
                string message = "与Host系统连接已断开..." + '\n';
                message += "等待5秒后重新连接" + '\n';
                Console.WriteLine(message);
@@ -206,32 +289,51 @@
                // å°è¯•重新连接
                ConnectServer(connection.IP, connection.Port);
                attempts--;
            } while (!socket.Connected && attempts > 0);
                currentAttempts++;
                // æ£€æŸ¥æ˜¯å¦å·²è¿žæŽ¥
                if (socket?.Connected ?? false)
                {
                    break; // è¿žæŽ¥æˆåŠŸï¼Œé€€å‡ºå¾ªçŽ¯
                }
            }
            if (currentAttempts >= maxAttempts)
            {
                Console.WriteLine("已达到最大重连次数,停止重连。");
                // å¯ä»¥åœ¨è¿™é‡Œè¿›è¡Œå…¶ä»–处理,例如通知用户或记录日志
            }
        }
        //private void CheckTimeout(object state)
        //{
        //    TimeSpan elapsed = DateTime.Now - _lastActivityTime;
        //    if (elapsed.TotalSeconds > 180) // 3分钟超时
        //    {
        //        Console.WriteLine("超时未收到数据,触发909命令并尝试重新连接...");
        //        // è§¦å‘909命令
        //        _workTaskService.DeviceStatusReportRequest();
        //        // å°è¯•重新连接
        //        HandleDisconnection();
        //    }
        //}
        /// <summary>
        /// ä¸‹å‘
        /// </summary>
        /// <param name="buffer"></param>
        public void clientSend(byte[] buffer)
        {
            var Y = Encoding.UTF8.GetString(buffer);
            LogFactory.GetLog("Socket发送数据").Info(true, Y);
            socket.Send(buffer);
            int newLength = buffer.Length - 2;
            byte[] newArray = new byte[newLength];
            Array.Copy(buffer, 1, newArray, 0, newLength);
            string calculatedChecksum = GetCheckSumone(newArray);
            var str = Encoding.UTF8.GetString(newArray);
            string receivedChecksum = str.Substring(str.Length - 2);
            var x = Encoding.UTF8.GetString(newArray);
            LogFactory.GetLog("Socket发送数据").Info(true, $"{JsonConvert.SerializeObject(GetParse(x))}{Environment.NewLine}");
        }
        /// <summary>
        /// CheckSum解析
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        /// <exception cref="Exception"></exception>
        public string GetCheckSumone(byte[] x)
        {
            int sum = 0;
@@ -260,10 +362,22 @@
        /// </summary>
        public const string JobOrderID = "0000000000000000";
        public const string JobOrderIDPDA = "PDA0000000000000";
        public const string JobOrderIDF = "FIRE000000000000";
        /// <summary>
        /// ä¼˜å…ˆçº§  é¢„ç•™
        /// </summary>
        public const string priority = "1";
        /// <summary>
        /// é‡å…¥åº“
        /// </summary>
        public const string Restocking = "2100";
        public const string EmptyOutBoundconst = "2101";
        /// <summary>
        /// æ‰˜ç›˜ä¸ªæ•°  é¢„ç•™
@@ -326,6 +440,23 @@
        #endregion
        #region WMS下发HOST方法
        public static string Sequence()
        {
            // ä½¿ç”¨é”ç¡®ä¿çº¿ç¨‹å®‰å…¨
            lock (_lock)
            {
                _currentNumber++;
                // å¦‚果超过99999,可以重置或抛出异常,这里选择重置
                if (_currentNumber > 99999)
                {
                    _currentNumber = 1;
                }
                return _currentNumber.ToString("D5");
            }
        }
        /// <summary>
        /// è®¾å¤‡è¯·æ±‚入库  å·¥åº101
@@ -336,12 +467,12 @@
        {
            try
            {
                string str = SendandReply + "101" + BaseDal.GetSeqNo().Result.ToString("D5") + GetFieldsAsString(Agvstatus) + GetListStringOutStation(outStations) + "1" + GetFieldsAsString(inStation);
                string str = SendandReply + "101" + Sequence() + GetFieldsAsString(Agvstatus) + GetListStringOutStation(outStations) + OutStationSpare2 + "1" + GetFieldsAsString(inStation);
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("DeviceRequestInbound").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
@@ -354,12 +485,12 @@
        {
            try
            {
                string str = SendandReply + "925" + BaseDal.GetSeqNo().Result.ToString("D5");
                string str = SendandReply + "925" + Sequence();
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("RequestCommunication").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
@@ -372,14 +503,13 @@
        {
            try
            {
                string str = SendNotReply + "915" + BaseDal.GetSeqNo().Result.ToString("D5") + Command;
                string str = SendNotReply + "915" + Sequence() + Command;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("JobReady").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
@@ -391,14 +521,13 @@
        {
            try
            {
                string str = SendNotReply + "913" + BaseDal.GetSeqNo().Result.ToString("D5") + Status;
                string str = SendNotReply + "913" + Sequence() + Status;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("DeviceStateReport").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
@@ -410,14 +539,13 @@
        {
            try
            {
                string str = SendNotReply + "917" + BaseDal.GetSeqNo().Result.ToString("D5") + Status;
                string str = SendandReply + "917" + Sequence() + Status;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("DeviceAutoStatusReport").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// /// <summary>
@@ -432,14 +560,13 @@
        {
            try
            {
                string str = SendandReply + "905" + BaseDal.GetSeqNo().Result.ToString("D5") + Status + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                string str = SendandReply + "905" + Sequence() + Status + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("JobStartOrEnd").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
@@ -455,14 +582,13 @@
        {
            try
            {
                string str = SendNotReply + "907" + BaseDal.GetSeqNo().Result.ToString("D5") + Status + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                string str = SendNotReply + "907" + Sequence() + Status + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("PalletActionReport工序907").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
@@ -477,14 +603,46 @@
        {
            try
            {
                string str = SendandReply + "901" + BaseDal.GetSeqNo().Result.ToString("D5") + "0" + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                string str = SendandReply + "901" + Sequence() + "0" + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                Dt_HostLog hostLog = new Dt_HostLog()
                {
                    CommandID = 901,
                    Count = 0,
                    Messgae = str,
                };
                _hostLogRepository.AddData(hostLog);
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("PalletActionReport工序901").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        public void PalletActionReportPDA(string FormLocation, string ToLocation, string TaskType, string PallteCode)
        {
            try
            {
                string str = SendandReply + "901" + Sequence() + "0" + JobOrderIDPDA + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                LogFactory.GetLog("PalletActionReportPDA工序901").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        public void PalletActionReportFrie(string FormLocation, string ToLocation, string TaskType, string PallteCode)
        {
            try
            {
                string str = SendandReply + "901" + Sequence() + "0" + JobOrderIDF + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                LogFactory.GetLog("PalletActionReportPDA工序901").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
@@ -507,9 +665,8 @@
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("DeviceStationStatusReport").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// /// <summary>
@@ -523,14 +680,38 @@
        {
            try
            {
                string str = SendandReply + "105" + BaseDal.GetSeqNo().Result.ToString("D5") + "R" + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                ErrorReport(Restocking, "A", "00");
                string str = SendandReply + "105" + Sequence() + "R" + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                Dt_HostLog hostLog = new Dt_HostLog()
                {
                    CommandID = 105,
                    Count = 0,
                    Messgae = str,
                };
                _hostLogRepository.AddData(hostLog);
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("RecreateGetLocation").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
        /// CheckSum校验 å·¥åº981
        /// </summary>
        /// <param name="message"></param>
        public void CheckSum(string message)
        {
            try
            {
                string str = SendNotReply + "981" + Sequence() + message;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                LogFactory.GetLog("CheckSum").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// /// <summary>
@@ -543,14 +724,14 @@
        {
            try
            {
                string str = SendNotReply + "985" + BaseDal.GetSeqNo().Result.ToString("D5") + Trouble + Level + Location;
                string str = SendNotReply + "985" + Sequence() + Trouble + Level + Location;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("ErrorReport").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
@@ -562,14 +743,13 @@
        {
            try
            {
                string str = SendNotReply + "104" + BaseDal.GetSeqNo().Result.ToString("D5") + Statues;
                string str = SendNotReply + "104" + Sequence() + Statues;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("DeviceReceiveJobResponse").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// /// <summary>
@@ -583,14 +763,21 @@
        {
            try
            {
                string str = SendandReply + "107" + BaseDal.GetSeqNo().Result.ToString("D5") + "1" + JobOrderID + priority + FormLocation + ToLocation + "O" + TrayCnt + PallteCode;
                ErrorReport(EmptyOutBoundconst, "A", "00");
                string str = SendandReply + "107" + Sequence() + "1" + JobOrderID + priority + FormLocation + ToLocation + "O" + TrayCnt + PallteCode;
                Dt_HostLog hostLog = new Dt_HostLog()
                {
                    CommandID = 107,
                    Count = 0,
                    Messgae = str,
                };
                _hostLogRepository.AddData(hostLog);
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
                LogFactory.GetLog("EmptyOutBound").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
@@ -599,8 +786,72 @@
        /// <param name="AgvStatus"></param>
        public void DeviceStatusReportResponse(HOSTAGVStatus AgvStatus, string X, string Y)
        {
            string str = SendNotReply + "910" + BaseDal.GetSeqNo().Result.ToString("D5") + GetFieldsAsString(AgvStatus) + X + Y;
            clientSend(MakeStringToByteMsg(str));
            try
            {
                string str = SendNotReply + "910" + Sequence() + GetFieldsAsString(AgvStatus) + X + Y;
                clientSend(MakeStringToByteMsg(str));
                var hostlog = SqlSugarHelper.DbWMS.Queryable<Dt_HostLog>().Where(x => x.CommandID == 910).First();
                if (hostlog != null)
                {
                    hostlog.ModifyDate=DateTime.Now;
                    SqlSugarHelper.DbWMS.Updateable(hostlog).ExecuteCommand();
                }
                else
                {
                    Dt_HostLog hostLog = new Dt_HostLog()
                    {
                        CommandID = 910,
                        Count = 0,
                        Messgae = str,
                    };
                    _hostLogRepository.AddData(hostLog);
                }
            }
            catch (Exception ex)
            {
                LogFactory.GetLog("DeviceStatusReportResponse").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
        /// å›žå¤HOST987工序  å·¥åº988
        /// </summary>
        /// <param name="AgvStatus"></param>
        /// <param name="X"></param>
        /// <param name="Y"></param>
        public void FireAlarmReportResponse(string SeqNo, string IsOK, string Location)
        {
            try
            {
                string str = SendNotReply + "988" + SeqNo + IsOK + Location;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                LogFactory.GetLog("FireAlarmReportResponse").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
        /// å›žå¤HOST301工序  å·¥åº302
        /// </summary>
        /// <param name="AgvStatus"></param>
        /// <param name="X"></param>
        /// <param name="Y"></param>
        public void UpdateLocalTimeResponse(string message, string SeqNo)
        {
            try
            {
                string str = SendNotReply + "302" + SeqNo + message;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
            {
                LogFactory.GetLog("UpdateLocalTimeResponse").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        #endregion
@@ -613,46 +864,43 @@
        /// <param name="message"></param>
        public void ReceiveCommandResponse(string message)
        {
            var parseMessage = GetParse(message);
            switch (parseMessage.body.ret)
            try
            {
                //OK
                case "0":
                    var location = _locationRepository.QueryFirst(x => x.LocationCode == parseMessage.body.ToLocation);
                    if (location == null)
                    {
                        return;
                    }
                    if (location.LocationStatus == (int)LocationEnum.Free)
                    {
                        InsertWMSTask(parseMessage);
                        Thread.Sleep(500);
                        //915
                        JobReady("0");
                        return;
                    }
                    else
                    {
                        //todo货位有货重复入库
                        return;
                    }
                //NG
                case "1":
                    break;
                //无库位分配
                case "2":
                    break;
                //站台到站台,出库站台未准备好
                case "3":
                    break;
                //非常温工程
                case "4":
                    break;
                case "9":
                    break;
                default:
                    break;
                ParseMessage parseMessage = GetParse(message);
                var lcationEnd = parseMessage.body.ToLocation;
                switch (parseMessage.body.ret)
                {
                    //OK
                    case "0":
                        GetLocation(parseMessage);
                        break;
                    //NG
                    case "1":
                        AddErrorMessage("2013", "Host", StationParse(parseMessage.body.FromLocation));
                        break;
                    //无库位分配
                    case "2":
                        AddErrorMessage("2014", "Host", StationParse(parseMessage.body.FromLocation));
                        break;
                    //站台到站台,出库站台未准备好
                    case "3":
                        AddErrorMessage("2015", "Host", StationParse(parseMessage.body.FromLocation));
                        break;
                    //非常温工程
                    case "4":
                        AddErrorMessage("2016", "Host", StationParse(parseMessage.body.FromLocation));
                        break;
                    case "9":
                        AddErrorMessage("2017", "Host", StationParse(parseMessage.body.FromLocation));
                        break;
                    default:
                        break;
                }
            }
            catch (Exception ex)
            {
                ErrorReport("2199", "A", "00");
                LogFactory.GetLog("Host102回复WMS101ReceiveCommandResponse").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
@@ -661,26 +909,41 @@
        /// </summary>
        public void AGVJobStartOrEndResponse(string status, string message)
        {
            switch (message)
            try
            {
                //OK
                case "0":
                    if (status == "E")
                    {
                        DeviceStateReport("I");
                        Thread.Sleep(3000);
                        JobReady("1");
                    }
                    break;
                //NG
                case "1":
                    //调用AGV暂停接口
                    break;
                case "9":
                    break;
                default:
                    break;
                switch (message)
                {
                    //OK
                    case "0":
                        if (status == "E")
                        {
                            AGVStatusRespone Agvstatus = GetAGVStatus();
                            DeviceStateReport(GetAGVStatus(Agvstatus.RuntimeStatus));
                            Thread.Sleep(3000);
                            JobReady("1");
                        }
                        break;
                    //NG
                    case "1":
                        //调用AGV暂停接口
                        AddErrorMessage("2004", "Host", "");
                        break;
                    case "9":
                        AddErrorMessage("2005", "Host", "");
                        break;
                    default:
                        break;
                }
            }
            catch (Exception ex)
            {
                ErrorReport("2199", "A", "00");
                LogFactory.GetLog("Host906回复WMS905AGVJobStartOrEndResponse").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
@@ -688,50 +951,32 @@
        /// </summary>
        public void DataReportResponse(string message)
        {
            Dt_Task task = BaseDal.QueryFirst(x => x.TaskState == (int)TaskOutStatusEnum.AGV_OutFinish || x.TaskState == (int)TaskRelocationStatusEnum.AGV_RelocationFinish || x.TaskState == (int)TaskInStatusEnum.AGV_InFinish);
            if (task != null)
            try
            {
                switch (task.TaskType)
                DeleteHostLog(901);
                #region
                switch (message)
                {
                    case (int)TaskInboundTypeEnum.Inbound:
                        //入库
                        task.TaskState = (int)TaskInStatusEnum.AGV_InFinish;
                        if (message == "0")
                        {
                            JobStartOrEnd("E", task.SourceAddress, task.TargetAddress, "O", task.PalletCode);
                        }
                        CompleteInboundTask(task);
                    case "0":
                        break;
                    case (int)TaskOutboundTypeEnum.Outbound:
                        //出库
                        if (message == "0")
                        {
                            JobStartOrEnd("E", task.SourceAddress, task.TargetAddress, "O", task.PalletCode);
                        }
                        task.TaskState = (int)TaskOutStatusEnum.AGV_OutFinish;
                        CompleteOutboundTask(task);
                    case "1":
                        AddErrorMessage("2001", "Host", "");
                        break;
                    case (int)TaskRelocationTypeEnum.Relocation:
                        if (message == "0")
                        {
                            JobStartOrEnd("E", task.SourceAddress, task.TargetAddress, "O", task.PalletCode);
                        }
                        task.TaskState = (int)TaskRelocationStatusEnum.AGV_RelocationFinish;
                        CompleteRelocationboundTask(task);
                        break;
                    case (int)TaskStationTypeEnum.StationToStation:
                        if (message == "0")
                        {
                            JobStartOrEnd("E", task.SourceAddress, task.TargetAddress, "O", task.PalletCode);
                        }
                        task.TaskState = (int)TaskOutStatusEnum.AGV_OutFinish;
                        TaskMoveHty(task);
                    case "9":
                        AddErrorMessage("2002", "Host", "");
                        break;
                    default:
                        break;
                }
            }
            catch (Exception ex)
            {
                ErrorReport("2199", "A", "00");
                LogFactory.GetLog("Host902回复WMS901DataReportResponse").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
            #endregion
        }
        /// <summary>
        /// HOST下发出库任务  å·¥åº103
@@ -746,41 +991,19 @@
                {
                    //OK
                    case "0":
                        var location = _locationRepository.QueryFirst(x => x.LocationCode == parseMessage.body.ToLocation);
                        if (location == null)
                        {
                            return;
                        }
                        if (location.LocationStatus == (int)LocationEnum.InStock)
                        {
                            var task = InsertWMSTask(parseMessage);
                            BaseDal.AddData(task);
                            InsertAGVTask(task);
                            Thread.Sleep(500);
                            //915
                            JobReady("0");
                            Thread.Sleep(500);
                            //104
                            DeviceReceiveJobResponse("0");
                        }
                        else
                        {
                            //todo货位无货空出库
                            return;
                        }
                        GetLocation(parseMessage);
                        break;
                    default:
                        break;
                }
            }
            catch (Exception)
            catch (Exception ex)
            {
                DeviceReceiveJobResponse("1");
                ErrorReport("2199", "A", "00");
                LogFactory.GetLog("Host103HOSTOutBoundTask").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
        /// HOST设备状态获取  å·¥åº935
        /// </summary>
@@ -790,54 +1013,71 @@
            try
            {
                //回复936
                List<OutStationStatus> outStationStatus = new List<OutStationStatus>();
                List<InStationStatus> inStationStatus = new List<InStationStatus>();
                StationStatus stationIn = GetStationStatus("B002");
                inStationStatus.Add(new InStationStatus()
                {
                    StationName = "02",
                    StationEnable = stationIn.WorkstationO == "1" ? "0" : "1",
                    IsDistributionTask = "0",
                    PallteCode = "0000000000",
                });
                inStationStatus.Add(new InStationStatus()
                {
                    StationName = "01",
                    StationEnable = stationIn.WorkstationT == "1" ? "0" : "1",
                    IsDistributionTask = "0",
                    PallteCode = "0000000000",
                });
                StationStatus stationOut = GetStationStatus("B001");
                var taskOutStationO = BaseDal.QueryFirst(x => x.SourceAddress == "B001::1" || x.TargetAddress == "B001::1");
                var taskOutStationT = BaseDal.QueryFirst(x => x.SourceAddress == "B001::2" || x.TargetAddress == "B001::2");
                outStationStatus.Add(new OutStationStatus()
                if (stationIn == null || stationOut == null)
                {
                    StationName = "04",
                    StationEnable = stationOut.WorkstationO == "1" ? "0" : "1",
                    IsDistributionTask = taskOutStationO == null ? "0" : "1",
                    Spare1 = "00"
                });
                outStationStatus.Add(new OutStationStatus()
                {
                    StationName = "03",
                    StationEnable = stationOut.WorkstationT == "1" ? "0" : "1",
                    IsDistributionTask = taskOutStationT == null ? "0" : "1",
                    Spare1 = "00"
                });
                    ErrorReport("2103", "A", "00");
                }
                List<OutStationStatus> outStationStatus = GetOutStationStatus(stationOut);
                List<InStationStatus> inStationStatus = GetInStationStatus(stationIn);
                #region
                //inStationStatus.Add(new InStationStatus()
                //{
                //    StationName = "02",
                //    StationEnable = stationIn.WorkstationO == "1" ? "0" : "1",
                //    IsDistributionTask = "0",
                //    PallteCode = "0000000000",
                //});
                //inStationStatus.Add(new InStationStatus()
                //{
                //    StationName = "01",
                //    StationEnable = stationIn.WorkstationT == "1" ? "0" : "1",
                //    IsDistributionTask = "0",
                //    PallteCode = "0000000000",
                //});
                //var taskOutStationO = BaseDal.QueryFirst(x => x.SourceAddress == "B001::1" || x.TargetAddress == "B001::1");
                //var taskOutStationT = BaseDal.QueryFirst(x => x.SourceAddress == "B001::2" || x.TargetAddress == "B001::2");
                //outStationStatus.Add(new OutStationStatus()
                //{
                //    StationName = "04",
                //    StationEnable = stationOut.WorkstationO == "1" ? "0" : "1",
                //    IsDistributionTask = taskOutStationO == null ? "0" : "1",
                //    Spare1 = "00"
                //});
                //outStationStatus.Add(new OutStationStatus()
                //{
                //    StationName = "03",
                //    StationEnable = stationOut.WorkstationT == "1" ? "0" : "1",
                //    IsDistributionTask = taskOutStationT == null ? "0" : "1",
                //    Spare1 = "00"
                //});
                #endregion
                AGVStatusRespone status = GetAGVStatus();
                HOSTAGVStatus AgvStatus = new HOSTAGVStatus()
                {
                    RuntimeStatus = CapitalizeFirstLetter(status.RuntimeStatus),
                    AutoStatus = status.AutoStatus == "MaintenanceMode" ? "1" : "0",
                    Ready = status.AutoStatus == "MaintenanceMode" ? "0" : "1",
                };
                if (status.RuntimeStatus == "Idle" && status.AutoStatus == "ControlMode")
                {
                    AgvStatus.Ready = "1";
                }
                else
                {
                    AgvStatus.Ready = "0";
                }
                DeviceStationStatusReport(AgvStatus, outStationStatus, inStationStatus, sSeqNo);
            }
            catch (Exception)
            catch (Exception ex)
            {
                DeviceReceiveJobResponse("1");
                ErrorReport("2199", "A", "00");
                LogFactory.GetLog("Host935DeviceStationStatusInvite").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
                JobReady("1");
            }
        }
@@ -850,30 +1090,36 @@
        {
            try
            {
                DeleteHostLog(105);
                var parseMessage = GetParse(message);
                var lcationEnd = parseMessage.body.ToLocation;
                switch (parseMessage.body.ret)
                {
                    //OK
                    case "0":
                        UpdateTaskLocation(parseMessage);
                        GetLocation(parseMessage, true);
                        break;
                    //NG
                    case "1":
                        AddErrorMessage("2019", "Host", StationParse(parseMessage.body.FromLocation));
                        break;
                    //无库位分配
                    case "2":
                        AddErrorMessage("2020", "Host", StationParse(parseMessage.body.FromLocation));
                        break;
                    case "9":
                        AddErrorMessage("2021", "Host", StationParse(parseMessage.body.FromLocation));
                        break;
                    default:
                        break;
                }
            }
            catch (Exception)
            catch (Exception ex)
            {
                DeviceReceiveJobResponse("1");
                ErrorReport("2199", "A", "00");
                LogFactory.GetLog("Host106重新分配库位RecreateGetLocation").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
                JobReady("1");
            }
        }
        /// <summary>
@@ -882,13 +1128,123 @@
        /// <param name="message"></param>
        public void EmptyOutBoundResponse(string message)
        {
            if (message != null && message == "0")
            try
            {
                DeviceStateReport("I");
                Thread.Sleep(500);
                JobReady("1");
                DeleteHostLog(107);
                if (message != null)
                {
                    switch (message)
                    {
                        case "0":
                            AGVStatusRespone Agvstatus = GetAGVStatus();
                            DeviceStateReport(GetAGVStatus(Agvstatus.RuntimeStatus));
                            Thread.Sleep(2000);
                            JobReady("1");
                            break;
                        case "1":
                            AddErrorMessage("2023", "Host", "");
                            break;
                        case "9":
                            AddErrorMessage("2024", "Host", "");
                            break;
                        default:
                            break;
                    }
                }
            }
            catch (Exception ex)
            {
                ErrorReport("2199", "A", "00");
                LogFactory.GetLog("Host108空出库响应EmptyOutBoundResponse").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
        /// Host下发火警任务  987
        /// </summary>
        public void FireAlarm(string Location, string SeqNo)
        {
            try
            {
                Dt_Task taskNew = new Dt_Task();
                var stock = SqlSugarHelper.DbWMS.Queryable<DtStockInfo>().Where(x => x.LocationCode == Location).First();
                var location = SqlSugarHelper.DbWMS.Queryable<Dt_Task>().Where(x => x.SourceAddress == Location).First();
                if (location != null)
                {
                    FireAlarmReportResponse(SeqNo, "0", Location);
                    return;
                }
                var stationOne = SqlSugarHelper.DbWMS.Queryable<Dt_Task>().Where(x => x.TargetAddress == "B001::1").ToList();
                var stationTwo = SqlSugarHelper.DbWMS.Queryable<Dt_Task>().Where(x => x.TargetAddress == "B001::2").ToList();
                if (stationOne.Count > 0 && stationTwo.Count > 0)
                {
                    if (stationOne.Count > stationTwo.Count)
                    {
                        taskNew = GetFireAlarm(Location, "B001::2", stock == null ? "F" + DateTime.Now.ToString("HHmmss") + new Random().Next(100, 1000) : stock.PalletCode, SeqNo);
                    }
                    else
                    {
                        taskNew = GetFireAlarm(Location, "B001::1", stock == null ? "F" + DateTime.Now.ToString("HHmmss") + new Random().Next(100, 1000) : stock.PalletCode, SeqNo);
                    }
                    FireAlarmReportResponse(SeqNo, "0", Location);
                }
                else
                {
                    StationStatus stationOut = GetStationStatus("B001");
                    if (stationOut != null && stationOut.WorkstationO == "0" && stationOne.Count == 0)
                    {
                        taskNew = GetFireAlarm(Location, "B001::1", stock == null ? "F" + DateTime.Now.ToString("HHmmss") + new Random().Next(100, 1000) : stock.PalletCode, SeqNo);
                    }
                    else if (stationOut != null && stationOut.WorkstationT == "0" && stationTwo.Count == 0)
                    {
                        taskNew = GetFireAlarm(Location, "B001::2", stock == null ? "F" + DateTime.Now.ToString("HHmmss") + new Random().Next(100, 1000) : stock.PalletCode, SeqNo);
                    }
                    else
                    {
                        taskNew = GetFireAlarm(Location, "B001::2", stock == null ? "F" + DateTime.Now.ToString("HHmmss") + new Random().Next(100, 1000) : stock.PalletCode, SeqNo);
                    }
                    FireAlarmReportResponse(SeqNo, "0", Location);
                }
                BaseDal.AddData(taskNew);
                InsertAGVTask(taskNew);
            }
            catch (Exception ex)
            {
                ErrorReport("2199", "A", "00");
                LogFactory.GetLog("火警987FireAlarm").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
        /// èŽ·å–æ¶ˆé˜²ä»»åŠ¡
        /// </summary>
        /// <param name="SourceAddress">起始地址</param>
        /// <param name="TargetAddress">终点地址</param>
        /// <param name="PalletCode">托盘号</param>
        /// <param name="SeqNo">Host序列号</param>
        /// <returns></returns>
        public Dt_Task GetFireAlarm(string SourceAddress, string TargetAddress, string PalletCode, string SeqNo)
        {
            return new Dt_Task()
            {
                SourceAddress = SourceAddress,
                TargetAddress = TargetAddress,
                CurrentAddress = SourceAddress,
                NextAddress = TargetAddress,
                TaskType = (int)TaskFireAlarmTypeEnum.FireAlarmOut,
                TaskState = (int)TaskFireAlarmStatusEnum.FireAlarmNew,
                Remark = TargetAddress,
                TaskNum = BaseDal.GetTaskNo().Result,
                PalletCode = PalletCode == null ? "" : PalletCode,
                Dispatchertime = DateTime.Now,
                Grade = 1,
                SeqNo = Convert.ToInt32(SeqNo),
                CommandID = Convert.ToInt32(987),
            };
        }
        /// <summary>
@@ -896,17 +1252,72 @@
        /// </summary>
        public void DeviceStatusReportRequest()
        {
            AGVStatusRespone status = GetAGVStatus();
            HOSTAGVStatus AgvStatus = new HOSTAGVStatus()
            try
            {
                RuntimeStatus = CapitalizeFirstLetter(status.RuntimeStatus),
                AutoStatus = status.AutoStatus == "MaintenanceMode" ? "1" : "0",
                Ready = status.AutoStatus == "MaintenanceMode" ? "0" : "1",
            };
            string axis = "000000";
                DeleteHostLog(910);
                AGVStatusRespone status = GetAGVStatus();
            DeviceStatusReportResponse(AgvStatus, axis, axis);
                HOSTAGVStatus AgvStatus = new HOSTAGVStatus()
                {
                    RuntimeStatus = CapitalizeFirstLetter(status.RuntimeStatus),
                    AutoStatus = status.AutoStatus == "MaintenanceMode" ? "1" : "0",
                };
                if (status.RuntimeStatus == "Idle" && status.AutoStatus == "ControlMode")
                {
                    AgvStatus.Ready = "1";
                }
                else
                {
                    AgvStatus.Ready = "0";
                }
                string axis = "000000";
                DeviceStatusReportResponse(AgvStatus, axis, axis);
            }
            catch (Exception ex)
            {
                ErrorReport("2199", "A", "00");
                LogFactory.GetLog("Host心跳").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        /// <summary>
        /// WMS同步Host时间  å·¥åº301
        /// </summary>
        public void UpdateLocalTime(string Time, string SeqNo)
        {
            try
            {
                SYSTEMTIME newTime = new SYSTEMTIME
                {
                    Year = Convert.ToUInt16(Time.Substring(0, 4)),
                    Month = Convert.ToUInt16(Time.Substring(4, 2)),
                    Day = Convert.ToUInt16(Time.Substring(6, 2)),
                    Hour = Convert.ToUInt16(Time.Substring(8, 2)),
                    Minute = Convert.ToUInt16(Time.Substring(10, 2)),
                    Second = Convert.ToUInt16(Time.Substring(12, 2)),
                    Milliseconds = 0
                };
                if (SetLocalTime(ref newTime))
                {
                    UpdateLocalTimeResponse("0", SeqNo);
                    Console.WriteLine("系统时间已成功修改。");
                }
                else
                {
                    UpdateLocalTimeResponse("1", SeqNo);
                    Console.WriteLine("修改系统时间失败。请确保以管理员权限运行此程序。");
                }
            }
            catch (Exception ex)
            {
                ErrorReport("2199", "A", "00");
                LogFactory.GetLog("UpdateLocalTime时间同步").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}{ex.StackTrace}", "");
            }
        }
        #endregion
@@ -944,8 +1355,6 @@
                // å¤åˆ¶åŽŸå§‹æ•°ç»„çš„æ‰€æœ‰æ•°æ®åˆ°æ–°æ•°ç»„çš„ä¸­é—´éƒ¨åˆ†
                Array.Copy(buffer, 0, newArray, 1, buffer.Length);
                //var parseMessage = GetParse(str);
                LogFactory.GetLog("Socket发送报文").Info(true, str);
                return newArray;
            }
            catch (Exception ex)
@@ -1013,121 +1422,240 @@
            }
        }
        public ParseMessage SubString(string Y)
        public List<OutStationStatus> GetOutStationStatus(StationStatus stationOut)
        {
            const string STX = "0x02";
            const string ETX = "0x03";
            // æ£€æŸ¥æ˜¯å¦ä»¥ STX å¼€å¤´ã€ETX ç»“å°¾
            if (Y.Substring(0, 4) == STX && Y.Substring(Y.Length - 4) == ETX)
            List<OutStationStatus> outStationStatus = new List<OutStationStatus>();
            var taskOutStationO = BaseDal.QueryFirst(x => x.SourceAddress == "B001::1" || x.TargetAddress == "B001::1");
            var taskOutStationT = BaseDal.QueryFirst(x => x.SourceAddress == "B001::2" || x.TargetAddress == "B001::2");
            outStationStatus.Add(new OutStationStatus()
            {
                string str = Y.Substring(4, Y.Length - 8);
                byte[] message = Encoding.UTF8.GetBytes(str);
                int newLength = message.Length - 2;
                if (newLength < 0)
                {
                    throw new ArgumentException("数组长度不足,无法去掉最后两位。");
                }
                byte[] newArray = new byte[newLength];
                Array.Copy(message, 0, newArray, 0, newLength);
                string calculatedChecksum = GetCheckSum(newArray);
                string receivedChecksum = str.Substring(str.Length - 2);
                if (calculatedChecksum == receivedChecksum)
                {
                    var x = Encoding.UTF8.GetString(newArray);
                    ParseMessage parseMessage = new ParseMessage()
                    {
                        bDir = x.Substring(0, 1),
                        bObjID = x.Substring(2, 10),
                        bReply = x.Substring(11, 1),
                        bCmdID = x.Substring(12, 3),
                        nSeqNo = x.Substring(15, 5),
                        //Body = x.Substring(21),
                    };
                    return parseMessage;
                }
                else
                {
                    Console.WriteLine("校验失败!");
                    return null;
                }
            }
            else
                StationName = "04",
                StationEnable = stationOut.WorkstationO == "1" ? "0" : "1",
                IsDistributionTask = taskOutStationO == null ? "0" : "1",
                Spare1 = "00"
            });
            outStationStatus.Add(new OutStationStatus()
            {
                Console.WriteLine("无效报文格式!");
                return null;
            }
                StationName = "03",
                StationEnable = stationOut.WorkstationT == "1" ? "0" : "1",
                IsDistributionTask = taskOutStationT == null ? "0" : "1",
                Spare1 = "00"
            });
            return outStationStatus;
        }
        #endregion
        #region å®šä¹‰å¯¹è±¡
        public List<InStationStatus> GetInStationStatus(StationStatus stationIn)
        {
            List<InStationStatus> inStationStatus = new List<InStationStatus>();
            var taskOutStationO = BaseDal.QueryFirst(x => x.SourceAddress == "B002::1" || x.TargetAddress == "B002::1");
            var taskOutStationT = BaseDal.QueryFirst(x => x.SourceAddress == "B002::2" || x.TargetAddress == "B002::2");
            inStationStatus.Add(new InStationStatus()
            {
                StationName = "02",
                StationEnable = stationIn.WorkstationO == "1" ? "0" : "1",
                IsDistributionTask = taskOutStationO == null ? "0" : "1",
                PallteCode = "0000000000",
            });
            inStationStatus.Add(new InStationStatus()
            {
                StationName = "01",
                StationEnable = stationIn.WorkstationT == "1" ? "0" : "1",
                IsDistributionTask = taskOutStationT == null ? "0" : "1",
                PallteCode = "0000000000",
            });
            return inStationStatus;
        }
        #endregion
        #region ç§æœ‰æ–¹æ³•
        private void UpdateTaskLocation(ParseMessage parseMessage)
        /// <summary>
        /// æ·»åŠ WMS任务
        /// </summary>
        /// <param name="parseMessage"></param>
        /// <exception cref="Exception"></exception>
        private void InsertWMSTask(ParseMessage parseMessage)
        {
            var task = BaseDal.QueryFirst(x => x.SeqNo == Convert.ToInt32(parseMessage.nSeqNo) && x.PalletCode.Contains(parseMessage.body.TrayIdList));
            if (task != null)
            {
                task.TargetAddress = parseMessage.body.ToLocation;
                task_call agvtask = SqlSugarHelper.DbAGV.Queryable<task_call>().Where(it => it.d_involed5 == task.TaskNum).First();
                BaseDal.Update(task);
                SqlSugarHelper.DbAGV.Updateable(agvtask).ExecuteCommand();
            }
        }
        private Dt_Task InsertWMSTask(ParseMessage parseMessage)
        {
            //var task = BaseDal.QueryFirst(x => x.PalletCode.Contains(parseMessage.body.TrayIdList));
            int taskType = 0;
            int taskState = 0;
            Dt_Task task = new Dt_Task();
            if (parseMessage.body.JobType == "I")
            {
                Dt_StationManager Instation = _stationManagerRepository.QueryFirst(x => x.HostName == parseMessage.body.FromLocation.Substring(4, 2));
                task.SourceAddress = StationParse(parseMessage.body.FromLocation);
                task.TargetAddress = parseMessage.body.ToLocation;
                task.CurrentAddress = StationParse(parseMessage.body.FromLocation);
                task.NextAddress = parseMessage.body.ToLocation;
                taskType = (int)TaskInboundTypeEnum.Inbound;
                taskState = (int)TaskInStatusEnum.InNew;
                task.Remark = parseMessage.body.FromLocation;
            }
            else if (parseMessage.body.JobType == "O")
            {
                task.SourceAddress = parseMessage.body.FromLocation;
                task.TargetAddress = StationParse(parseMessage.body.ToLocation);
                task.CurrentAddress = parseMessage.body.FromLocation;
                task.NextAddress = StationParse(parseMessage.body.ToLocation);
                taskType = (int)TaskOutboundTypeEnum.Outbound;
                taskState = (int)TaskOutStatusEnum.OutNew;
                task.Remark = parseMessage.body.ToLocation;
            }
            else if (parseMessage.body.JobType == "C")
            {
                task.SourceAddress = parseMessage.body.FromLocation;
                task.TargetAddress = StationParse(parseMessage.body.ToLocation);
                task.CurrentAddress = parseMessage.body.FromLocation;
                task.NextAddress = StationParse(parseMessage.body.ToLocation);
                taskType = (int)TaskOutboundTypeEnum.OutQuality;
                taskState = (int)TaskOutStatusEnum.OutNew;
                task.Remark = parseMessage.body.ToLocation;
            }
            else if (parseMessage.body.JobType == "S")
            {
                taskType = (int)TaskStationTypeEnum.StationToStation;
                taskState = (int)TaskOutStatusEnum.OutNew;
                task.SourceAddress = StationParse(parseMessage.body.FromLocation);
                task.TargetAddress = StationParse(parseMessage.body.ToLocation);
                task.CurrentAddress = StationParse(parseMessage.body.FromLocation);
                task.NextAddress = StationParse(parseMessage.body.ToLocation);
                task.Remark = parseMessage.body.FromLocation;
                task.HostName = parseMessage.body.ToLocation;
            }
            else if (parseMessage.body.JobType == "R")
            {
                taskType = (int)TaskRelocationTypeEnum.Relocation;
                taskState = (int)TaskRelocationStatusEnum.RelocationNew;
                task.SourceAddress = parseMessage.body.FromLocation;
                task.TargetAddress = parseMessage.body.ToLocation;
                task.CurrentAddress = parseMessage.body.FromLocation;
                task.NextAddress = parseMessage.body.ToLocation;
            }
            else
            {
                throw new Exception("未知库位");
            }
            return new Dt_Task()
            {
                TaskNum = BaseDal.GetTaskNo().Result,
                SourceAddress = parseMessage.body.FromLocation,
                TargetAddress = parseMessage.body.ToLocation,
                PalletCode = parseMessage.body.TrayIdList.Substring(0, 10),
                TaskType = taskType,
                TaskState = taskState,
                Dispatchertime = DateTime.Now,
                SeqNo = Convert.ToInt32(parseMessage.nSeqNo),
                CommandID = Convert.ToInt32(parseMessage.bCmdID)
            };
            task.TaskNum = BaseDal.GetTaskNo().Result;
            task.PalletCode = parseMessage.body.TrayIdList.Substring(0, 10);
            task.TaskType = taskType;
            task.TaskState = taskState;
            task.Dispatchertime = DateTime.Now;
            task.Grade = 1;
            task.SeqNo = Convert.ToInt32(parseMessage.nSeqNo);
            task.CommandID = Convert.ToInt32(parseMessage.bCmdID);
            BaseDal.AddData(task);
            InsertAGVTask(task);
        }
        public void GetLocation(ParseMessage parseMessage, bool repeat = false)
        {
            switch (parseMessage.body.JobType)
            {
                case "I":
                    var locationIn = SqlSugarHelper.DbWMS.Queryable<DtLocationInfo>().Where(x => x.LocationCode == parseMessage.body.ToLocation).First();
                    if (locationIn == null)
                    {
                        ErrorReport("2102", "A", "00");
                        return;
                    }
                    if (locationIn.LocationStatus == (int)LocationEnum.Free)
                    {
                        var taskIn = SqlSugarHelper.DbWMS.Queryable<Dt_Task>().Where(x => x.PalletCode == parseMessage.body.TrayIdList.Substring(0, 10)).First();
                        if (taskIn != null)
                        {
                            _taskService.UpdateTask(StationParse(parseMessage.body.FromLocation), parseMessage.body.ToLocation, parseMessage.body.TrayIdList.Substring(0, 10));
                        }
                        else
                        {
                            InsertWMSTask(parseMessage);
                        }
                        Thread.Sleep(500);
                        JobReady("0");
                    }
                    else
                    {
                        RecreateGetLocation(parseMessage.body.FromLocation, parseMessage.body.ToLocation, parseMessage.body.JobType, parseMessage.body.TrayIdList.Substring(0, 10));
                    }
                    break;
                case "O":
                case "C":
                    var locationOut = SqlSugarHelper.DbWMS.Queryable<DtLocationInfo>().Where(x => x.LocationCode == parseMessage.body.FromLocation).First();
                    if (locationOut == null)
                    {
                        ErrorReport("2102", "A", "00");
                        return;
                    }
                    if (locationOut.LocationStatus == (int)LocationEnum.InStock)
                    {
                        var taskOut = SqlSugarHelper.DbWMS.Queryable<Dt_Task>().Where(x => x.PalletCode == parseMessage.body.TrayIdList.Substring(0, 10)).First();
                        if (taskOut != null)
                        {
                            _taskService.UpdateTask(locationOut.LocationCode, StationParse(parseMessage.body.ToLocation), parseMessage.body.TrayIdList.Substring(0, 10));
                        }
                        else
                        {
                            InsertWMSTask(parseMessage);
                        }
                        Thread.Sleep(500);
                        JobReady("0");
                        Thread.Sleep(500);
                        //104
                        DeviceReceiveJobResponse("0");
                    }
                    else
                    {
                        EmptyOutBound(parseMessage.body.FromLocation, parseMessage.body.ToLocation, parseMessage.body.TrayIdList.Substring(0, 10));
                        _taskService.AddStcokHty(parseMessage.body.TrayIdList.Substring(0, 10), parseMessage.body.FromLocation);
                    }
                    break;
                case "S":
                    var taskS = SqlSugarHelper.DbWMS.Queryable<Dt_Task>().Where(x => x.PalletCode == parseMessage.body.TrayIdList.Substring(0, 10)).First();
                    if (taskS != null)
                    {
                        _taskService.UpdateTask(StationParse(parseMessage.body.FromLocation), StationParse(parseMessage.body.ToLocation), parseMessage.body.TrayIdList.Substring(0, 10));
                    }
                    else
                    {
                        InsertWMSTask(parseMessage);
                    }
                    Thread.Sleep(500);
                    JobReady("0");
                    break;
                case "R":
                    var locationA = SqlSugarHelper.DbWMS.Queryable<DtLocationInfo>().Where(x => x.LocationCode == parseMessage.body.FromLocation).First();
                    var locationB = SqlSugarHelper.DbWMS.Queryable<DtLocationInfo>().Where(x => x.LocationCode == parseMessage.body.ToLocation).First();
                    if (locationA == null || locationB == null)
                    {
                        ErrorReport("2102", "A", "00");
                        return;
                    }
                    if (locationA.LocationStatus == (int)LocationEnum.InStock && locationB.LocationStatus == (int)LocationEnum.Free)
                    {
                        var taskR = SqlSugarHelper.DbWMS.Queryable<Dt_Task>().Where(x => x.PalletCode == parseMessage.body.TrayIdList.Substring(0, 10)).First();
                        if (taskR != null)
                        {
                            _taskService.UpdateTask(parseMessage.body.FromLocation, parseMessage.body.ToLocation, parseMessage.body.TrayIdList.Substring(0, 10));
                        }
                        else
                        {
                            InsertWMSTask(parseMessage);
                        }
                        Thread.Sleep(500);
                        JobReady("0");
                    }
                    else
                    {
                        RecreateGetLocation(parseMessage.body.FromLocation, parseMessage.body.ToLocation, parseMessage.body.JobType, parseMessage.body.TrayIdList.Substring(0, 10));
                    }
                    break;
                default:
                    break;
            }
        }
        /// <summary>
        /// æ·»åŠ AGV任务
@@ -1138,57 +1666,137 @@
        {
            string SourceAddress = string.Empty;
            string TargetAddress = string.Empty;
            string AGVType = string.Empty;
            if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)
            {
                SourceAddress = task.SourceAddress;
                AGVType = "2";
                TargetAddress = InsertHyphenEveryTwoChars(task.TargetAddress);
            }
            else if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
            {
                SourceAddress = InsertHyphenEveryTwoChars(task.SourceAddress);
                TargetAddress = task.TargetAddress;
                AGVType = "4";
            }
            else if (task.TaskType == (int)TaskOutboundTypeEnum.OutQuality)
            {
                SourceAddress = InsertHyphenEveryTwoChars(task.SourceAddress);
                TargetAddress = task.TargetAddress;
                AGVType = "128";
            }
            else if (task.TaskType == (int)TaskRelocationTypeEnum.Relocation)
            {
                TargetAddress = InsertHyphenEveryTwoChars(task.TargetAddress);
                SourceAddress = InsertHyphenEveryTwoChars(task.SourceAddress);
                AGVType = "16";
            }
            else if (task.TaskType == (int)TaskStationTypeEnum.StationToStation)
            {
                TargetAddress = task.TargetAddress;
                SourceAddress = task.SourceAddress;
                SourceAddress = InsertHyphenEveryTwoChars(task.SourceAddress);
                AGVType = "8";
            }
            else if (task.TaskType == (int)TaskFireAlarmTypeEnum.FireAlarmOut)
            {
                TargetAddress = task.TargetAddress;
                SourceAddress = InsertHyphenEveryTwoChars(task.SourceAddress);
                AGVType = "1";
            }
            task_call task_Call = new task_call()
            {
                d_task_type = task.TaskType == (int)TaskTypeEnum.Inbound ? 1 : 2,
                d_floor = 1,
                d_task_type = AGVType,
                d_floor = "1",
                d_involed1 = SourceAddress,
                d_involed2 = TargetAddress,
                d_involed5 = task.TaskNum,
                d_involed5 = task.TaskNum.ToString(),
            };
            return SqlSugarHelper.DbAGV.Insertable(task_Call).ExecuteCommand();
            var x = SqlSugarHelper.DbAGV.Insertable(task_Call).ExecuteCommand();
            LogFactory.GetLog("插入数据到AGV").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(x)}", "");
            return x;
        }
        public ParseMessage GetParse(string x)
        {
            return new ParseMessage()
            if (string.IsNullOrEmpty(x))
            {
                bDir = x.Substring(0, 1),
                bObjID = x.Substring(2, 10),
                bReply = x.Substring(11, 1),
                bCmdID = x.Substring(12, 3),
                nSeqNo = x.Substring(15, 5),
                body = new ReceiveBody
                {
                    ret = x.Substring(21, 1),
                    JobOrderID = x.Substring(22, 16),
                    priority = x.Substring(39, 1),
                    FromLocation = x.Substring(40, 6),
                    ToLocation = x.Substring(47, 6),
                    JobType = x.Substring(54, 1),
                    TrayCnt = x.Substring(55, 1),
                    TrayIdList = x.Substring(56)
                },
                throw new ArgumentNullException(nameof(x), "Input string cannot be null or empty");
            }
            // å®šä¹‰æ‰€æœ‰éœ€è¦çš„字段长度和位置
            var fieldDefinitions = new (int Start, int Length, string Name)[]
            {
                (0, 1, "bDir"),
                (1, 10, "bObjID"),
                (11, 1, "bReply"),
                (12, 3, "bCmdID"),
                (15, 5, "nSeqNo"),
                (20, 1, "ret"),
                (21, 16, "JobOrderID"),
                (37, 1, "priority"),
                (38, 6, "FromLocation"),
                (44, 6, "ToLocation"),
                (50, 1, "JobType"),
                (51, 1, "TrayCnt"),
                (52, x.Length - 52, "TrayIdList") // å¯å˜é•¿åº¦å­—段
            };
            // è®¡ç®—所需最小长度
            int minLength = fieldDefinitions.Max(f => f.Start + f.Length);
            if (x.Length < minLength)
            {
                // å¦‚果字符串长度不足,可以选择记录警告或日志
                // è¿™é‡Œæˆ‘们继续处理,尽可能多地解析字段
            }
            // è¾…助方法:安全的子字符串截取,长度不足时返回空字符串
            string SafeSubstringOrDefault(string source, int start, int length, string fieldName)
            {
                if (start < 0 || start >= source.Length)
                {
                    return ""; // è¿”回空字符串
                }
                if (length < 0)
                {
                    return ""; // è¿”回空字符串
                }
                if (start + length > source.Length)
                {
                    length = source.Length - start; // è°ƒæ•´é•¿åº¦ä»¥é¿å…è¶Šç•Œ
                }
                return source.Substring(start, length);
            }
            // æž„建结果对象
            var result = new ParseMessage();
            // è®¾ç½®åŸºæœ¬å­—段
            result.bDir = SafeSubstringOrDefault(x, fieldDefinitions[0].Start, fieldDefinitions[0].Length, fieldDefinitions[0].Name);
            result.bObjID = SafeSubstringOrDefault(x, fieldDefinitions[1].Start, fieldDefinitions[1].Length, fieldDefinitions[1].Name);
            result.bReply = SafeSubstringOrDefault(x, fieldDefinitions[2].Start, fieldDefinitions[2].Length, fieldDefinitions[2].Name);
            result.bCmdID = SafeSubstringOrDefault(x, fieldDefinitions[3].Start, fieldDefinitions[3].Length, fieldDefinitions[3].Name);
            result.nSeqNo = SafeSubstringOrDefault(x, fieldDefinitions[4].Start, fieldDefinitions[4].Length, fieldDefinitions[4].Name);
            // è®¾ç½®body字段
            result.body = new ReceiveBody
            {
                ret = SafeSubstringOrDefault(x, fieldDefinitions[5].Start, fieldDefinitions[5].Length, fieldDefinitions[5].Name),
                JobOrderID = SafeSubstringOrDefault(x, fieldDefinitions[6].Start, fieldDefinitions[6].Length, fieldDefinitions[6].Name),
                priority = SafeSubstringOrDefault(x, fieldDefinitions[7].Start, fieldDefinitions[7].Length, fieldDefinitions[7].Name),
                FromLocation = SafeSubstringOrDefault(x, fieldDefinitions[8].Start, fieldDefinitions[8].Length, fieldDefinitions[8].Name),
                ToLocation = SafeSubstringOrDefault(x, fieldDefinitions[9].Start, fieldDefinitions[9].Length, fieldDefinitions[9].Name),
                JobType = SafeSubstringOrDefault(x, fieldDefinitions[10].Start, fieldDefinitions[10].Length, fieldDefinitions[10].Name),
                TrayCnt = SafeSubstringOrDefault(x, fieldDefinitions[11].Start, fieldDefinitions[11].Length, fieldDefinitions[11].Name),
                TrayIdList = SafeSubstringOrDefault(x, fieldDefinitions[12].Start, fieldDefinitions[12].Length, fieldDefinitions[12].Name)
            };
            return result;
        }
        public AGVStatusRespone GetAGVStatus()
        {
            string urlnew = url + "/ilns/AGV/getState";
@@ -1200,19 +1808,115 @@
        public StationStatus GetStationStatus(string stationName)
        {
            string urlnew = url + "/ilns/ctrl/getState";
            var result = HttpsClient.PostAsync(urlnew, JsonConvert.DeserializeObject<Dictionary<string, object>>(new { ctrlName = "B001" }.ToJson())).Result;
            var result = HttpsClient.PostAsync(urlnew, JsonConvert.DeserializeObject<Dictionary<string, object>>(new { ctrlName = stationName }.ToJson())).Result;
            return JsonConvert.DeserializeObject<StationStatus>(result.ToString());
        }
        public void ReportStationErrorMeaage(string StationName)
        {
            string urlnew = url + "/ilns/setctrlerr";
            var result = HttpsClient.PostAsync(urlnew, JsonConvert.DeserializeObject<Dictionary<string, object>>(new { ctrlName = StationName }.ToJson())).Result;
        }
        public void ReportAgvErrorMeaage(string ErrorCode)
        {
            string urlnew = url + "/ilns/rpterr";
            var result = HttpsClient.PostAsync(urlnew, JsonConvert.DeserializeObject<Dictionary<string, object>>(new { code = ErrorCode }.ToJson())).Result;
        }
        public void AddErrorMessage(string Code, string ReportName, string Location = "")
        {
            var errorDescription = SqlSugarHelper.DbWMS.Queryable<Dt_ErrorDescription>().Where(x => x.ErrorCode == Code).First();
            if (errorDescription != null)
            {
                Dt_HostErrorMessage hostErrorMessage = new Dt_HostErrorMessage()
                {
                    ErrorCode = Code,
                    ErrorMessage = errorDescription.ErrorMessgae,
                    AlarmSource = errorDescription.AlarmSource,
                    Grade = errorDescription.Grade,
                    ReportName = ReportName,
                    Creater = "System",
                    Location = Location == "" ? "" : Location,
                    CreateDate = DateTime.Now,
                };
                SqlSugarHelper.DbWMS.Insertable(hostErrorMessage).ExecuteCommand();
                if (Location == "")
                {
                    ReportAgvErrorMeaage(Code);
                }
                else
                {
                    ReportStationErrorMeaage(Location);
                }
            }
            else
            {
                //tode不存在异常Code
            }
        }
        public void DeleteHostLog(int CommandID)
        {
            var hostLog = SqlSugarHelper.DbWMS.Queryable<Dt_HostLog>().Where(x => x.CommandID == CommandID).First();
            if (hostLog != null)
            {
                SqlSugarHelper.DbWMS.Deleteable(hostLog).ExecuteCommand();
            }
        }
        public string StationParse(string station)
        {
            var Station = SqlSugarHelper.DbWMS.Queryable<Dt_StationManager>().Where(x => x.HostName == station.Substring(4, 2)).First();
            if (Station != null)
            {
                return Station.stationName;
            }
            else
            {
                return "";
            }
        }
        public string CapitalizeFirstLetter(string s)
        {
            if (s == "Pause")
            {
                return "S";
            }
            else if (s == "PowerOFF")
            {
                return "O";
            }
            if (string.IsNullOrEmpty(s))
            {
                return "";
            }
            char firstChar = s[0];
            return char.ToUpper(firstChar).ToString();
        }
        public string GetAGVStatus(string Status)
        {
            switch (Status)
            {
                case "Run":
                    return "R";
                case "Idle":
                    return "I";
                case "Trouble":
                    //故障
                    return "T";
                case "Pause":
                    return "S";
                case "Charge":
                    return "C";
                case "PowerOn":
                    return "P";
                case "PowerOFF":
                    return "O";
                default: break;
            }
            return "T";
        }
        public string InsertHyphenEveryTwoChars(string input)
        {
            if (string.IsNullOrEmpty(input))
@@ -1236,165 +1940,27 @@
            return result.ToString();
        }
        #region å¤–部接口方法
        public WebResponseContent CompleteInboundTask(Dt_Task task)
        #endregion
        #region ä¿®æ”¹æœ¬åœ°è®¡ç®—机时间
        // å®šä¹‰ System ç»“构体
        [StructLayout(LayoutKind.Sequential)]
        public struct SYSTEMTIME
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                _unitOfWorkManage.BeginTran();
                var locationInf = _locationRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                locationInf.LocationStatus = (int)LocationEnum.InStock;
                var stock = new DtStockInfo()
                {
                    PalletCode = task.PalletCode,
                    LocationCode = task.TargetAddress,
                    CreateDate = DateTime.Now,
                    Creater = "system",
                    LocationId = locationInf.Id,
                };
                _stockInfoRepository.AddData(stock);
                _locationRepository.UpdateData(locationInf);
                TaskMoveHty(task);
                _unitOfWorkManage.CommitTran();
                return content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return content.Error(ex.Message);
            }
            public ushort Year;
            public ushort Month;
            public ushort DayOfWeek;
            public ushort Day;
            public ushort Hour;
            public ushort Minute;
            public ushort Second;
            public ushort Milliseconds;
        }
        public WebResponseContent CompleteOutboundTask(Dt_Task task)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                _unitOfWorkManage.BeginTran();
                var locationInf = _locationRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                locationInf.LocationStatus = (int)LocationEnum.Free;
                var stock = _stockInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
                DtStockInfo_Hty stockInfo_Hty = stock.Adapt<DtStockInfo_Hty>();
                stockInfo_Hty.ModifyDate = DateTime.Now;
                AddStockInfoHty(stockInfo_Hty);
                _stockInfoRepository.DeleteData(stock);
                _locationRepository.UpdateData(locationInf);
                TaskMoveHty(task);
                _unitOfWorkManage.CommitTran();
                return content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent CompleteRelocationboundTask(Dt_Task task)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                _unitOfWorkManage.BeginTran();
                var locationInf = _locationRepository.QueryFirst(x => x.LocationCode == task.TargetAddress);
                var location = _locationRepository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                locationInf.LocationStatus = (int)LocationEnum.InStock;
                location.LocationStatus = (int)LocationEnum.Free;
                var stock = _stockInfoRepository.QueryFirst(x => x.PalletCode == task.PalletCode);
                stock.LocationCode = locationInf.LocationCode;
                stock.LocationId = locationInf.Id;
                _stockInfoRepository.UpdateData(stock);
                _locationRepository.UpdateData(locationInf);
                _locationRepository.UpdateData(location);
                TaskMoveHty(task);
                _unitOfWorkManage.CommitTran();
                return content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return content.Error(ex.Message);
            }
        }
        public WebResponseContent TaskMoveHty(Dt_Task task)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                _unitOfWorkManage.BeginTran();
                var taskHtyNG = CreateHistoricalTask(task);
                var isTaskHtyAdd = _task_HtyRepository.AddData(taskHtyNG) > 0;
                var isTaskDelete = Delete(task.TaskId);
                var AgvTask = SqlSugarHelper.DbAGV.Queryable<task_call>().Where(x => x.d_involed5 == task.TaskNum).First();
                if (AgvTask != null)
                {
                    SqlSugarHelper.DbAGV.Deleteable(AgvTask).ExecuteCommand();
                }
                _unitOfWorkManage.CommitTran();
                return content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                return content.Error(ex.Message);
            }
        }
        #endregion å¤–部接口方法
        #region private å†…部方法
        /// <summary>
        /// åˆ›å»ºåŽ†å²ä»»åŠ¡è®°å½•
        /// </summary>
        /// <param name="task"></param>
        /// <returns></returns>
        public Dt_Task_Hty CreateHistoricalTask(Dt_Task task, bool isHand = false)
        {
            task.CurrentAddress = task.NextAddress;
            // åˆ›å»ºåŽ†å²ä»»åŠ¡
            var taskHty = _mapper.Map<Dt_Task_Hty>(task);
            taskHty.FinishTime = DateTime.Now;
            taskHty.TaskId = 0;
            taskHty.OperateType = isHand ? (int)OperateTypeEnum.人工删除 : App.User.UserName != null ? (int)OperateTypeEnum.人工完成 : (int)OperateTypeEnum.自动完成;
            taskHty.SourceId = task.TaskId;
            if (isHand)
            {
                taskHty.Creater = App.User.UserName != null ? App.User.UserName : "System";
            }
            return taskHty;
        }
        /// <summary>
        /// åˆ é™¤ä¸€ä¸ªä»»åŠ¡
        /// </summary>
        /// <param name="id">任务ID</param>
        /// <returns>是否删除成功</returns>
        public bool Delete(int id)
        {
            return BaseDal.Delete(id);
        }
        private void AddStockInfoHty(DtStockInfo_Hty dtStock)
        {
            var isStockAdd = SqlSugarHelper.DbWMS.InsertNav(dtStock).IncludesAllFirstLayer().ExecuteCommand();
            if (!isStockAdd)
            {
                throw new Exception("库存历史信息添加失败");
            }
        }
        #endregion private å†…部方法
        // å¯¼å…¥ SetLocalTime å‡½æ•°
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool SetLocalTime(ref SYSTEMTIME st);
        #endregion
    }
}