1
huangxiaoqiang
2025-06-02 3590ec552055adb6a20fa2b6424b4326b586eecd
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_StorageSocketServices/SocketClientService.cs
@@ -22,6 +22,13 @@
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;
namespace WIDESEA_StorageSocketServices
{
@@ -42,14 +49,28 @@
        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 SocketClientService(/*IDt_TaskService taskService*/IDt_TaskRepository TaskRepository, IDt_StationManagerRepository stationManagerRepository, ILogger<SocketClientService> logger)
        public SocketClientService(IDt_TaskService TaskService, IDt_TaskRepository TaskRepository, IDt_StationManagerRepository stationManagerRepository, ILogger<SocketClientService> logger, ILocationInfoRepository locationInfoRepository,IDt_HostLogRepository hostLogRepository)
        {
            //_taskService = taskService;
            BaseDal = TaskRepository;
            _stationManagerRepository = stationManagerRepository;
            _logger = logger;
            _taskService = TaskService;
            _locationRepository = locationInfoRepository;
            _hostLogRepository = hostLogRepository;
            #region
            //if (App.RootServices != null)
            //{
            //    IDt_TaskRepository? BaseDal = App.RootServices.CreateScope().ServiceProvider.GetService(typeof(IDt_TaskRepository)) as IDt_TaskRepository;
            //    IDt_TaskService? _taskService = App.RootServices.CreateScope().ServiceProvider.GetService(typeof(IDt_TaskService)) as IDt_TaskService;
            //    ILocationInfoRepository? _locationRepository = App.RootServices.CreateScope().ServiceProvider.GetService(typeof(ILocationInfoRepository)) as ILocationInfoRepository;
            //    IDt_StationManagerRepository? _stationManagerRepository = App.RootServices.CreateScope().ServiceProvider.GetService(typeof(IDt_StationManagerRepository)) as IDt_StationManagerRepository;
            //}
            #endregion
        }
        public void ConnectServer(string IP, int Port)
@@ -59,10 +80,10 @@
                // æ£€æŸ¥æ˜¯å¦å·²è¿žæŽ¥ï¼Œé¿å…é‡å¤åˆ›å»º
                if (socket != null && socket.Connected)
                {
                    //Console.WriteLine("Socket已连接,无需重复创建");
                    ConsoleHelper.WriteErrorLine($"Socket已处于连接状态");
                    return;
                }
                //创建负责通信的socket
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(IP);
@@ -73,7 +94,7 @@
                _logger.LogInformation("Socket连接成功");
                ConsoleHelper.WriteSuccessLine("Socket连接成功");
                _IsOnline = true;
                RequestCommunication();
                DeviceStateReport("I");
@@ -81,14 +102,18 @@
                Thread th = new Thread(Receive);
                th.IsBackground = true;
                th.Start();
                ConsoleHelper.WriteErrorLine($"Socket启动");
                return;
            }
            catch (Exception ex)
            {
                _IsOnline = false;
                ConsoleHelper.WriteErrorLine($"Socket连接失败{ex.Message}");
                HandleDisconnection();
            }
        }
        public bool Socketonline()
        {
            return _IsOnline;
        }
        void Receive()
        {
@@ -142,11 +167,12 @@
                    }
                    else
                    {
                        LogFactory.GetLog("Socket接收数据").Error(true, "无效报文格式");
                        LogFactory.GetLog("Socket接收数据").Error(true, $"无效报文格式:{JsonConvert.SerializeObject(Y)}");
                    }
                }
                catch
                {
                    _IsOnline = false;
                    HandleDisconnection();
                }
@@ -161,13 +187,13 @@
                    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();
                    DeviceStationStatusInvite(x.Substring(15, 5));
                    break;
                case "103":
                    HOSTOutBoundTask(x);
@@ -176,7 +202,7 @@
                    RecreateGetLocation(x);
                    break;
                case "108":
                    RecreateGetLocation(x.Substring(21, 1));
                    EmptyOutBoundResponse(x.Substring(20, 1));
                    break;
                case "909":
                    DeviceStatusReportRequest();
@@ -210,26 +236,10 @@
                attempts--;
            } while (!socket.Connected && attempts > 0);
        }
        //private void CheckTimeout(object state)
        //{
        //    TimeSpan elapsed = DateTime.Now - _lastActivityTime;
        //    if (elapsed.TotalSeconds > 180) // 3分钟超时
        //    {
        //        Console.WriteLine("超时未收到数据,触发909命令并尝试重新连接...");
        //        // è§¦å‘909命令
        //        _workTaskService.DeviceStatusReportRequest();
        //        // å°è¯•重新连接
        //        HandleDisconnection();
        //    }
        //}
        public void clientSend(byte[] buffer)
        {
            var Y = Encoding.UTF8.GetString(buffer);
            LogFactory.GetLog("Socket发送数据").Error(true, Y);
            LogFactory.GetLog("Socket发送数据").Info(true, Y);
            socket.Send(buffer);
        }
@@ -267,6 +277,14 @@
        public const string priority = "1";
        /// <summary>
        /// é‡å…¥åº“
        /// </summary>
        public const string Restocking = "2100";
        public const string EmptyOutBoundconst = "2101";
        /// <summary>
        /// æ‰˜ç›˜ä¸ªæ•°  é¢„ç•™
        /// </summary>
        public const string TrayCnt = "1";
@@ -274,7 +292,7 @@
        /// <summary>
        /// è®¾å¤‡ç¼–号
        /// </summary>
        public const string DeviceID = "0000000001";
        public const string DeviceID = "0013130010";
        /// <summary>
        /// å‘送不需要回复
        /// </summary>
@@ -337,7 +355,7 @@
        {
            try
            {
                string str = SendandReply + "101" + BaseDal.GetSeqNo().Result.ToString() + GetFieldsAsString(Agvstatus) + GetListStringOutStation(outStations) + "1" + GetFieldsAsString(inStation);
                string str = SendandReply + "101" + BaseDal.GetSeqNo().Result.ToString("D5") + GetFieldsAsString(Agvstatus) + GetListStringOutStation(outStations) + OutStationSpare2 + "1" + GetFieldsAsString(inStation);
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
@@ -355,7 +373,7 @@
        {
            try
            {
                string str = SendandReply + "925" + BaseDal.GetSeqNo().Result.ToString();
                string str = SendandReply + "925" + BaseDal.GetSeqNo().Result.ToString("D5");
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
@@ -373,7 +391,7 @@
        {
            try
            {
                string str = SendNotReply + "915" + BaseDal.GetSeqNo().Result.ToString() + Command;
                string str = SendNotReply + "915" + BaseDal.GetSeqNo().Result.ToString("D5") + Command;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
@@ -392,7 +410,7 @@
        {
            try
            {
                string str = SendNotReply + "913" + BaseDal.GetSeqNo().Result.ToString() + Status;
                string str = SendNotReply + "913" + BaseDal.GetSeqNo().Result.ToString("D5") + Status;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
@@ -411,7 +429,7 @@
        {
            try
            {
                string str = SendNotReply + "917" + BaseDal.GetSeqNo().Result.ToString() + Status;
                string str = SendNotReply + "917" + BaseDal.GetSeqNo().Result.ToString("D5") + Status;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
@@ -433,7 +451,7 @@
        {
            try
            {
                string str = SendandReply + "905" + BaseDal.GetSeqNo().Result.ToString() + Status + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                string str = SendandReply + "905" + BaseDal.GetSeqNo().Result.ToString("D5") + Status + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
@@ -456,7 +474,7 @@
        {
            try
            {
                string str = SendNotReply + "907" + BaseDal.GetSeqNo().Result.ToString() + Status + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                string str = SendNotReply + "907" + BaseDal.GetSeqNo().Result.ToString("D5") + Status + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
@@ -478,7 +496,14 @@
        {
            try
            {
                string str = SendandReply + "901" + BaseDal.GetSeqNo().Result.ToString() + "0" + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                string str = SendandReply + "901" + BaseDal.GetSeqNo().Result.ToString("D5") + "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)
@@ -496,11 +521,14 @@
        /// <param name="TaskType">任务类型 I入库、O出库、S站台到站台、R移库</param>
        /// <param name="PallteCode">托盘号</param>
        /// <returns></returns>
        public void DeviceStationStatusReport(HOSTAGVStatus Agvstatus, List<OutStationStatus> outStations, List<InStationStatus> inStation)
        public void DeviceStationStatusReport(HOSTAGVStatus Agvstatus, List<OutStationStatus> outStations, List<InStationStatus> inStation, string sGetSeqNo)
        {
            try
            {
                string str = SendNotReply + "936" + BaseDal.GetSeqNo().Result.ToString() + GetFieldsAsString(Agvstatus) + GetListStringOutStation(outStations) + GetListStringInStation(inStation);
                var agvstatus = GetFieldsAsString(Agvstatus);
                var outstation = GetListStringOutStation(outStations);
                var instation = GetListStringInStation(inStation);
                string str = SendNotReply + "936" + sGetSeqNo + agvstatus + outstation + OutStationSpare2 + "2" + instation;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
@@ -521,7 +549,14 @@
        {
            try
            {
                string str = SendandReply + "105" + BaseDal.GetSeqNo().Result.ToString() + "R" + JobOrderID + priority + FormLocation + ToLocation + TaskType + TrayCnt + PallteCode;
                string str = SendandReply + "105" + BaseDal.GetSeqNo().Result.ToString("D5") + "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)
@@ -541,7 +576,7 @@
        {
            try
            {
                string str = SendNotReply + "985" + BaseDal.GetSeqNo().Result.ToString() + Trouble + Level + Location;
                string str = SendNotReply + "985" + BaseDal.GetSeqNo().Result.ToString("D5") + Trouble + Level + Location;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
@@ -560,7 +595,7 @@
        {
            try
            {
                string str = SendNotReply + "104" + BaseDal.GetSeqNo().Result.ToString() + Statues;
                string str = SendNotReply + "104" + BaseDal.GetSeqNo().Result.ToString("D5") + Statues;
                clientSend(MakeStringToByteMsg(str));
            }
            catch (Exception ex)
@@ -581,7 +616,14 @@
        {
            try
            {
                string str = SendandReply + "107" + BaseDal.GetSeqNo().Result.ToString() + "1" + JobOrderID + priority + FormLocation + ToLocation + "O" + TrayCnt + PallteCode;
                string str = SendandReply + "107" + BaseDal.GetSeqNo().Result.ToString("D5") + "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)
@@ -597,7 +639,8 @@
        /// <param name="AgvStatus"></param>
        public void DeviceStatusReportResponse(HOSTAGVStatus AgvStatus, string X, string Y)
        {
            string str = SendNotReply + "910" + BaseDal.GetSeqNo().Result.ToString() + "1" + GetFieldsAsString(AgvStatus) + X + Y;
            string str = SendNotReply + "910" + BaseDal.GetSeqNo().Result.ToString("D5") + GetFieldsAsString(AgvStatus) + X + Y;
            clientSend(MakeStringToByteMsg(str));
        }
        #endregion
@@ -611,25 +654,35 @@
        public void ReceiveCommandResponse(string message)
        {
            var parseMessage = GetParse(message);
            var lcationEnd = parseMessage.body.ToLocation;
            switch (parseMessage.body.ret)
            {
                //OK
                case "0":
                    var location = _locationRepository.QueryFirst(x => x.LocationCode == parseMessage.body.ToLocation);
                    //var location = _locationRepository.QueryFirst(x => x.LocationCode == lcationEnd);
                    var location = SqlSugarHelper.DbWMS.Queryable<DtLocationInfo>().Where(x => x.LocationCode == parseMessage.body.ToLocation).First();
                    if (location == null)
                    {
                        return;
                    }
                    if (location.LocationStatus == (int)LocationEnum.Free)
                    {
                        InsertWMSTask(parseMessage);
                        var task = InsertWMSTask(parseMessage);
                        Thread.Sleep(500);
                        InsertAGVTask(task);
                        location.LocationStatus = 1;
                        //SqlSugarHelper.DbWMS.Insertable(task).ExecuteCommand();
                        SqlSugarHelper.DbWMS.Updateable(location).ExecuteCommand();
                        BaseDal.AddData(task);
                        //915
                        JobReady("0");
                        return;
                    }
                    else
                    {
                        ErrorReport(Restocking, "A", "00");
                        Thread.Sleep(500);
                        RecreateGetLocation(parseMessage.body.FromLocation, parseMessage.body.ToLocation, parseMessage.body.JobType, parseMessage.body.TrayIdList.Substring(0, 10));
                        //todo货位有货重复入库
                        return;
                    }
@@ -651,6 +704,8 @@
                default:
                    break;
            }
            LogFactory.GetLog("Host102回复WMS101").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(parseMessage)}{Environment.NewLine}", "");
        }
        /// <summary>
@@ -678,6 +733,8 @@
                default:
                    break;
            }
            LogFactory.GetLog("Host906回复WMS905").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(status)}{Environment.NewLine}{JsonConvert.SerializeObject(message)}{Environment.NewLine}", "");
        }
        /// <summary>
@@ -685,50 +742,45 @@
        /// </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)
            {
                switch (task.TaskType)
                {
                    case (int)TaskInboundTypeEnum.Inbound:
                        //入库
                        task.TaskState = (int)TaskInStatusEnum.AGV_InFinish;
                        if (message == "0")
                        {
                            JobStartOrEnd("E", task.SourceAddress, task.TargetAddress, "O", task.PalletCode);
                        }
                        CompleteInboundTask(task);
                        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);
                        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);
                        break;
                    default:
                        break;
                }
            }
            LogFactory.GetLog("Host902回复WMS901").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(message)}{Environment.NewLine}", "");
            #region
            //Dt_Task task = BaseDal.QueryFirst(x => (x.TaskState == (int)TaskOutStatusEnum.AGV_OutFinish || x.TaskState == (int)TaskRelocationStatusEnum.AGV_RelocationFinish || x.TaskState == (int)TaskInStatusEnum.AGV_InFinish) && x.Roadway != "PDA");
            //if (task != null)
            //{
            //    switch (task.TaskType)
            //    {
            //        case 200:
            //            //入库
            //            if (message == "0")
            //            {
            //                JobStartOrEnd("E", task.Remark, task.TargetAddress, "O", task.PalletCode);
            //            }
            //            break;
            //        case 100:
            //            //出库
            //            if (message == "0")
            //            {
            //                JobStartOrEnd("E", task.SourceAddress, task.Remark, "O", task.PalletCode);
            //            }
            //            break;
            //        case 300:
            //            if (message == "0")
            //            {
            //                JobStartOrEnd("E", task.SourceAddress, task.TargetAddress, "O", task.PalletCode);
            //            }
            //            _taskService.CompleteRelocationboundTask(task);
            //            break;
            //        case 400:
            //            if (message == "0")
            //            {
            //                JobStartOrEnd("E", task.Remark, task.HostName, "O", task.PalletCode);
            //            }
            //            break;
            //        default:
            //            break;
            //    }
            //}
            #endregion
        }
        /// <summary>
        /// HOST下发出库任务  å·¥åº103
@@ -743,17 +795,20 @@
                {
                    //OK
                    case "0":
                        var location = _locationRepository.QueryFirst(x => x.LocationCode == parseMessage.body.ToLocation);
                        var location = SqlSugarHelper.DbWMS.Queryable<DtLocationInfo>().Where(x => x.LocationCode == parseMessage.body.FromLocation).First();
                        if (location == null)
                        {
                            return;
                        }
                        if (location.LocationStatus == (int)LocationEnum.InStock)
                        {
                            var task = InsertWMSTask(parseMessage);
                            BaseDal.AddData(task);
                            Dt_Task task = InsertWMSTask(parseMessage);
                            //BaseDal.AddData(task);
                            location.LocationStatus = 1;
                            SqlSugarHelper.DbWMS.Insertable(task).ExecuteCommand();
                            SqlSugarHelper.DbWMS.Updateable(location).ExecuteCommand();
                            InsertAGVTask(task);
                            Thread.Sleep(500);
                            //Thread.Sleep(500);
                            //915
                            JobReady("0");
                            Thread.Sleep(500);
@@ -762,7 +817,9 @@
                        }
                        else
                        {
                            //todo货位无货空出库
                            ErrorReport(EmptyOutBoundconst, "A", "00");
                            Thread.Sleep(500);
                            EmptyOutBound(parseMessage.body.FromLocation, parseMessage.body.ToLocation, parseMessage.body.TrayIdList.Substring(0, 10));
                            return;
                        }
@@ -770,8 +827,10 @@
                    default:
                        break;
                }
                LogFactory.GetLog("Host103").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(parseMessage)}{Environment.NewLine}", "");
            }
            catch (Exception)
            catch (Exception ex)
            {
                DeviceReceiveJobResponse("1");
            }
@@ -782,58 +841,72 @@
        /// HOST设备状态获取  å·¥åº935
        /// </summary>
        /// <param name="message"></param>
        public void DeviceStationStatusInvite()
        public void DeviceStationStatusInvite(string sSeqNo)
        {
            try
            {
                //回复936
                List<Dt_StationManager> Instation = _stationManagerRepository.QueryData(x => x.stationType == 1).ToList();
                List<Dt_StationManager> Outstation = _stationManagerRepository.QueryData(x => x.stationType == 2).ToList();
                List<OutStationStatus> outStationStatus = new List<OutStationStatus>();
                List<InStationStatus> inStationStatus = new List<InStationStatus>();
                foreach (var item in Instation)
                {
                    inStationStatus.Add(new InStationStatus()
                    {
                        StationName = item.stationName,
                        StationEnable = item.stationStatus,
                        IsDistributionTask = item.stationHasTask,
                        PallteCode = "0000000000",
                    });
                }
                foreach (var item in Outstation)
                {
                    StationStatus station = GetStationStatus(item.stationName);
                    var taskStation = BaseDal.QueryFirst(x => x.SourceAddress == item.stationName || x.TargetAddress == item.stationName);
                    outStationStatus.Add(new OutStationStatus()
                    {
                        StationName = item.HostName,
                        StationEnable = station.StationEnable == "1" ? "0" : "1",
                        IsDistributionTask = taskStation == null ? "0" : "1",
                        Spare1 = "00"
                    });
                    //outStationStatus.Add(new OutStationStatus()
                    //{
                    //    StationName = item.stationName,
                    //    StationEnable = item.stationStatus,
                    //    IsDistributionTask = item.stationHasTask,
                    //    Spare1 = "00"
                    //});
                }
                StationStatus stationIn = GetStationStatus("B002");
                StationStatus stationOut = GetStationStatus("B001");
                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",
                    //Ready = status.AutoStatus == "MaintenanceMode" ? "0" : "1",
                };
                DeviceStationStatusReport(AgvStatus, outStationStatus, inStationStatus);
                if (status.RuntimeStatus == "Idle" && status.AutoStatus == "ControlMode")
                {
                    AgvStatus.Ready = "1";
                }
                else
                {
                    AgvStatus.Ready = "0";
                }
                DeviceStationStatusReport(AgvStatus, outStationStatus, inStationStatus, sSeqNo);
            }
            catch (Exception)
            {
                DeviceReceiveJobResponse("1");
            }
            LogFactory.GetLog("Host935").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(sSeqNo)}{Environment.NewLine}", "");
        }
        /// <summary>
@@ -845,12 +918,55 @@
            try
            {
                var parseMessage = GetParse(message);
                var lcationEnd = parseMessage.body.ToLocation;
                switch (parseMessage.body.ret)
                {
                    //OK
                    case "0":
                        UpdateTaskLocation(parseMessage);
                        break;
                        var location = SqlSugarHelper.DbWMS.Queryable<DtLocationInfo>().Where(x => x.LocationCode == parseMessage.body.ToLocation).First();
                        if (location == null)
                        {
                            ErrorReport("2102", "A", "00");
                            Thread.Sleep(500);
                            RecreateGetLocation(parseMessage.body.FromLocation, parseMessage.body.ToLocation, parseMessage.body.JobType, parseMessage.body.TrayIdList.Substring(0, 10));
                            return;
                        }
                        if (location.LocationStatus == (int)LocationEnum.Free)
                        {
                            var task = SqlSugarHelper.DbWMS.Queryable<Dt_Task>().Where(x => x.PalletCode == parseMessage.body.TrayIdList.Substring(0, 10)).First();
                            if (task == null)
                            {
                                location.LocationStatus = (int)LocationEnum.Lock;
                                var tasknew = InsertWMSTask(parseMessage);
                                InsertAGVTask(tasknew);
                                BaseDal.AddData(tasknew);
                                SqlSugarHelper.DbWMS.Updateable(location);
                                Thread.Sleep(500);
                                //915
                                JobReady("0");
                            }
                            else
                            {
                                var Agvtask = SqlSugarHelper.DbAGV.Queryable<task_call>().Where(x => x.d_involed5 == task.TaskNum.ToString()).First();
                                location.LocationStatus = (int)LocationEnum.Lock;
                                task.TargetAddress = lcationEnd;
                                Agvtask.d_involed2 = lcationEnd;
                                SqlSugarHelper.DbWMS.Updateable(task);
                                SqlSugarHelper.DbWMS.Updateable(location);
                                SqlSugarHelper.DbAGV.Updateable(Agvtask);
                                Thread.Sleep(500);
                                //915
                                JobReady("0");
                            }
                            return;
                        }
                        else
                        {
                            ErrorReport(Restocking, "A", "00");
                            Thread.Sleep(500);
                            RecreateGetLocation(parseMessage.body.FromLocation, parseMessage.body.ToLocation, parseMessage.body.JobType, parseMessage.body.TrayIdList.Substring(0, 10));
                            return;
                        }
                    //NG
                    case "1":
                        break;
@@ -862,12 +978,13 @@
                    default:
                        break;
                }
                LogFactory.GetLog("Host106重新分配库位").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(parseMessage)}{Environment.NewLine}", "");
            }
            catch (Exception)
            {
                DeviceReceiveJobResponse("1");
            }
        }
        /// <summary>
@@ -879,10 +996,10 @@
            if (message != null && message == "0")
            {
                DeviceStateReport("I");
                Thread.Sleep(500);
                Thread.Sleep(2000);
                JobReady("1");
            }
            LogFactory.GetLog("Host108空出库响应").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(message)}{Environment.NewLine}", "");
        }
        /// <summary>
@@ -896,10 +1013,21 @@
            {
                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";
            }
            string axis = "000000";
            DeviceStatusReportResponse(AgvStatus, axis, axis);
            LogFactory.GetLog("Host心跳").InfoFormat(true, $"请求参数:{JsonConvert.SerializeObject(AgvStatus)}{Environment.NewLine}{JsonConvert.SerializeObject(status)}{Environment.NewLine}", "");
        }
        #endregion
@@ -916,7 +1044,6 @@
            {
                byte[] byt = Encoding.UTF8.GetBytes(Message);  // ä½¿ç”¨ UTF-8 é¿å…ç¼–码问题
                LogFactory.GetLog("请求托盘任务").Error(true, BitConverter.ToString(byt));
                string checksum = GetCheckSum(byt);
                string str = Message + checksum;
@@ -938,6 +1065,8 @@
                // å¤åˆ¶åŽŸå§‹æ•°ç»„çš„æ‰€æœ‰æ•°æ®åˆ°æ–°æ•°ç»„çš„ä¸­é—´éƒ¨åˆ†
                Array.Copy(buffer, 0, newArray, 1, buffer.Length);
                //var parseMessage = GetParse(str);
                LogFactory.GetLog("Socket发送报文").Info(true, str);
                return newArray;
            }
            catch (Exception ex)
@@ -945,17 +1074,13 @@
                throw new Exception(ex.Message);
            }
        }
        //public bool IsOnline()
        //{
        //}
        public string GetListStringOutStation(List<OutStationStatus> outStationStatus)
        {
            return string.Join("", outStationStatus.Select(status => $"{status.StationName}{status.StationEnable}{status.IsDistributionTask}{status.Spare1}"));
        }
        public string GetListStringInStation(List<InStationStatus> inStationStatus)
        {
            return string.Join("", inStationStatus.Select(status => $"{status.StationName}{status.StationEnable}{status.IsDistributionTask}{status.Spare1}"));
            return string.Join("", inStationStatus.Select(status => $"{status.StationName}{status.StationEnable}{status.IsDistributionTask}{status.IsHasPallte}{status.Spare1}{status.StationPallteCount}{status.PallteCode}{status.Spare2}"));
        }
        /// <summary>
        /// å°†å¯¹è±¡å€¼å‡­æ‹¼æŽ¥
@@ -1009,6 +1134,49 @@
            }
        }
        public List<OutStationStatus> GetOutStationStatus(StationStatus stationOut)
        {
            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()
            {
                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"
            });
            return outStationStatus;
        }
        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;
        }
        public ParseMessage SubString(string Y)
        {
@@ -1067,60 +1235,74 @@
        #endregion
        #region ç§æœ‰æ–¹æ³•
        private void UpdateTaskLocation(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 = Instation.stationName;
                task.TargetAddress = parseMessage.body.ToLocation;
                task.CurrentAddress = Instation.stationName;
                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;
                Dt_StationManager Instation = _stationManagerRepository.QueryFirst(x => x.HostName == parseMessage.body.ToLocation.Substring(4, 2));
                task.TargetAddress = Instation.stationName;
                task.CurrentAddress = parseMessage.body.FromLocation;
                task.NextAddress = Instation.stationName;
                taskType = (int)TaskOutboundTypeEnum.Outbound;
                taskState = (int)TaskOutStatusEnum.OutNew;
                task.Remark = parseMessage.body.ToLocation;
            }
            else if (parseMessage.body.JobType == "S")
            {
                Dt_StationManager stationone = _stationManagerRepository.QueryFirst(x => x.HostName == parseMessage.body.FromLocation.Substring(4, 2));
                Dt_StationManager stationtwo = _stationManagerRepository.QueryFirst(x => x.HostName == parseMessage.body.ToLocation.Substring(4, 2));
                taskType = (int)TaskStationTypeEnum.StationToStation;
                taskState = (int)TaskOutStatusEnum.OutNew;
                task.SourceAddress = stationone.stationName;
                task.TargetAddress = stationtwo.stationName;
                task.CurrentAddress = stationone.stationName;
                task.NextAddress = stationtwo.stationName;
                task.Remark = parseMessage.body.FromLocation;
                task.HostName = parseMessage.body.ToLocation;
                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);
            return task;
        }
        /// <summary>
@@ -1130,13 +1312,35 @@
        /// <returns></returns>
        private int InsertAGVTask(Dt_Task task)
        {
            string SourceAddress = string.Empty;
            string TargetAddress = string.Empty;
            if (task.TaskType == (int)TaskInboundTypeEnum.Inbound)
            {
                SourceAddress = task.SourceAddress;
                TargetAddress = InsertHyphenEveryTwoChars(task.TargetAddress);
            }
            else if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound)
            {
                SourceAddress = InsertHyphenEveryTwoChars(task.SourceAddress);
                TargetAddress = task.TargetAddress;
            }
            else if (task.TaskType == (int)TaskRelocationTypeEnum.Relocation)
            {
                TargetAddress = InsertHyphenEveryTwoChars(task.TargetAddress);
                SourceAddress = InsertHyphenEveryTwoChars(task.SourceAddress);
            }
            else if (task.TaskType == (int)TaskStationTypeEnum.StationToStation)
            {
                TargetAddress = task.TargetAddress;
                SourceAddress = task.SourceAddress;
            }
            task_call task_Call = new task_call()
            {
                d_task_type = task.TaskType == (int)TaskTypeEnum.Inbound ? 1 : 2,
                d_floor = 1,
                d_involed1 = InsertHyphenEveryTwoChars(task.SourceAddress),
                d_involed2 = InsertHyphenEveryTwoChars(task.TargetAddress),
                d_involed5 = task.TaskNum,
                d_task_type = task.TaskType == (int)TaskTypeEnum.Inbound ? "1" : "2",
                d_floor = "1",
                d_involed1 = SourceAddress,
                d_involed2 = TargetAddress,
                d_involed5 = task.TaskNum.ToString(),
            };
            return SqlSugarHelper.DbAGV.Insertable(task_Call).ExecuteCommand();
@@ -1152,20 +1356,20 @@
                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)
                    ret = x.Substring(20, 1),
                    JobOrderID = x.Substring(21, 16),
                    priority = x.Substring(37, 1),
                    FromLocation = x.Substring(38, 6),
                    ToLocation = x.Substring(44, 6),
                    JobType = x.Substring(50, 1),
                    TrayCnt = x.Substring(51, 1),
                    TrayIdList = x.Substring(52)
                },
            };
        }
        public AGVStatusRespone GetAGVStatus()
        {
            string urlnew = url + "/ilns/AGV/getAgvState";
            string urlnew = url + "/ilns/AGV/getState";
            var result = HttpsClient.PostAsync(urlnew, JsonConvert.DeserializeObject<Dictionary<string, object>>(new { getStatus = "1" }.ToJson())).Result;
            return JsonConvert.DeserializeObject<AGVStatusRespone>(result.ToString());
@@ -1173,8 +1377,8 @@
        public StationStatus GetStationStatus(string stationName)
        {
            string urlnew = url + "/ilns/strl/getState";
            var result = HttpsClient.PostAsync(urlnew, JsonConvert.DeserializeObject<Dictionary<string, object>>(new { strlName = stationName }.ToJson())).Result;
            string urlnew = url + "/ilns/ctrl/getState";
            var result = HttpsClient.PostAsync(urlnew, JsonConvert.DeserializeObject<Dictionary<string, object>>(new { ctrlName = "B001" }.ToJson())).Result;
            return JsonConvert.DeserializeObject<StationStatus>(result.ToString());
        }
        public string CapitalizeFirstLetter(string s)
@@ -1183,7 +1387,6 @@
            {
                return "";
            }
            char firstChar = s[0];
            return char.ToUpper(firstChar).ToString();
        }
@@ -1210,165 +1413,7 @@
            return result.ToString();
        }
        #region å¤–部接口方法
        public WebResponseContent CompleteInboundTask(Dt_Task task)
        {
            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 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 å†…部方法
        #endregion
    }
}