using HslCommunication; 
 | 
using Newtonsoft.Json; 
 | 
using System.Text.RegularExpressions; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEAWCS_Common; 
 | 
using WIDESEAWCS_Common.TaskEnum; 
 | 
using WIDESEAWCS_Core; 
 | 
using WIDESEAWCS_Core.Helper; 
 | 
using WIDESEAWCS_DTO.TaskInfo; 
 | 
using WIDESEAWCS_DTO.WMS; 
 | 
using WIDESEAWCS_Model.Models; 
 | 
using WIDESEAWCS_QuartzJob; 
 | 
using WIDESEAWCS_Tasks.ConveyorLineJob; 
 | 
  
 | 
namespace WIDESEAWCS_Tasks 
 | 
{ 
 | 
    public partial class CommonConveyorLineJob 
 | 
    { 
 | 
        /// <summary> 
 | 
        /// 处理出库任务 
 | 
        /// </summary> 
 | 
        private void HandleTaskOut(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue, Dt_Task taskOut) 
 | 
        { 
 | 
            if (taskOut == null) return; 
 | 
            //ConveyorLineTaskCommand? taskCommand = MapTaskCommand(taskOut, command); 
 | 
  
 | 
            var next = taskOut.NextAddress; 
 | 
            var taskCommand = MapTaskCommand(taskOut, command); 
 | 
            taskOut.NextAddress = next; 
 | 
  
 | 
            bool isOutTray = taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray; 
 | 
            bool isOutboundAndOutFinish = taskOut.TaskType == (int)TaskOutboundTypeEnum.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.SC_OutFinish; 
 | 
            bool isOutboundAndLineOutExecuting = taskOut.TaskType == (int)TaskOutboundTypeEnum.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting; 
 | 
  
 | 
            if (isOutTray || isOutboundAndOutFinish || !isOutboundAndLineOutExecuting) 
 | 
            { 
 | 
                conveyorLine.SendCommand(taskCommand, childDeviceCode); 
 | 
  
 | 
                ConsoleHelper.WriteWarningLine($"【{conveyorLine._deviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{childDeviceCode}】请求扫码入库,下一目标地址【{taskCommand.TargetAddress}】"); 
 | 
  
 | 
                ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); 
 | 
                _taskService.UpdateTaskStatusToNext(taskOut); 
 | 
            } 
 | 
            else if (taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting) 
 | 
            { 
 | 
                CompleteWmsTask(taskOut, command, conveyorLine, childDeviceCode, ProtocalDetailValue); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 处理新任务 
 | 
        /// </summary> 
 | 
        private async Task HandleNewTaskAsync(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) 
 | 
        { 
 | 
            var stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode && x.stationPLC == conveyorLine.DeviceCode); 
 | 
  
 | 
            switch (stationManager.stationType) 
 | 
            { 
 | 
                case 5: 
 | 
                case 1: 
 | 
                    await RequestWmsTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue); 
 | 
                    break; 
 | 
  
 | 
                case 2: 
 | 
                case 3: 
 | 
                case 4: 
 | 
                case 6: 
 | 
                    await CreateAndSendEmptyTrayTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue); 
 | 
                    break; 
 | 
  
 | 
                case 7: 
 | 
                    RequestOutNextAddress(conveyorLine, command, childDeviceCode, ProtocalDetailValue); 
 | 
                    break; 
 | 
  
 | 
                case 10: 
 | 
                    ConveyorLineOutFinish(conveyorLine, command, childDeviceCode, ProtocalDetailValue); 
 | 
                    break; 
 | 
  
 | 
                default: 
 | 
                    break; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 映射任务命令 
 | 
        /// </summary> 
 | 
        private ConveyorLineTaskCommand MapTaskCommand(Dt_Task task, ConveyorLineTaskCommand command) 
 | 
        { 
 | 
            // 使用正则表达式匹配类似 -数字 的模式,并替换为空字符串 
 | 
            task.NextAddress = Regex.Replace(task.NextAddress, @"-(\d+)", ""); 
 | 
            if (Convert.ToInt32(task.NextAddress) > 1999) 
 | 
            { 
 | 
                task.NextAddress = (Convert.ToInt32(task.NextAddress) - 1000).ToString(); 
 | 
            } 
 | 
            var comm = _mapper.Map<ConveyorLineTaskCommand>(task); 
 | 
            comm.InteractiveSignal = command.InteractiveSignal; 
 | 
            return comm; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 完成WMS任务 
 | 
        /// </summary> 
 | 
        private void CompleteWmsTask(Dt_Task taskOut, ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, string childDeviceCode, int ProtocalDetailValue) 
 | 
        { 
 | 
            if (command.Barcode == "NoRead") 
 | 
            { 
 | 
                var NGAddress = _platFormRepository.QueryFirst(x => x.PlatCode == taskOut.TargetAddress).Capacity; 
 | 
                taskOut.TargetAddress = NGAddress.ToString(); 
 | 
            } 
 | 
  
 | 
            var keys = new Dictionary<string, object>() 
 | 
            { 
 | 
                {"taskNum", taskOut.TaskNum} 
 | 
            }; 
 | 
            var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); 
 | 
            var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue; 
 | 
            var completeTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.CompleteTask)?.ConfigValue; 
 | 
            if (wmsBase == null || completeTask == null) 
 | 
            { 
 | 
                throw new InvalidOperationException("WMS IP 未配置"); 
 | 
            } 
 | 
            var wmsIpAddress = wmsBase + completeTask; 
 | 
  
 | 
            var result = HttpHelper.GetAsync(wmsIpAddress, keys).Result; 
 | 
            WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result); 
 | 
            if (content.Status) 
 | 
            { 
 | 
                ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); 
 | 
                _taskService.UpdateTaskStatusToNext(taskOut); 
 | 
            } 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 创建并发送空托盘任务 
 | 
        /// </summary> 
 | 
        public Task CreateAndSendEmptyTrayTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) 
 | 
        { 
 | 
            if (command.Barcode != "NoRead") 
 | 
            { 
 | 
                var taskDTO = CreateEmptyTrayTaskDto(command.Barcode, childDeviceCode); 
 | 
  
 | 
                if (_taskRepository.QueryFirst(x => x.PalletCode == taskDTO.PalletCode) != null) 
 | 
                { 
 | 
                    WriteInfo(conveyorLine.DeviceName, "当前托盘存在任务"); 
 | 
                } 
 | 
  
 | 
                var content = CreateAndSendTask(taskDTO); 
 | 
                if (content.Status) 
 | 
                { 
 | 
                    var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); 
 | 
                    if (task != null) 
 | 
                    { 
 | 
                        //var taskCommand = MapTaskCommand(task, command); 
 | 
                        var next = task.NextAddress; 
 | 
                        var taskCommand = MapTaskCommand(task, command); 
 | 
                        task.NextAddress = next; 
 | 
  
 | 
                        ConsoleHelper.WriteWarningLine($"【{conveyorLine._deviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{childDeviceCode}】请求扫码入库(空托盘),下一目标地址【{taskCommand.TargetAddress}】"); 
 | 
  
 | 
                        conveyorLine.SendCommand(taskCommand, childDeviceCode); 
 | 
                        ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); 
 | 
                        _taskService.UpdateTaskStatusToNext(task); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
  
 | 
            return Task.CompletedTask; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 创建空托盘任务DTO 
 | 
        /// </summary> 
 | 
        private WMSTaskDTO CreateEmptyTrayTaskDto(string barcode, string childDeviceCode) 
 | 
        { 
 | 
            var request = new RequestTaskDto() 
 | 
            { 
 | 
                Position = childDeviceCode, 
 | 
                PalletCode = barcode, 
 | 
            }; 
 | 
  
 | 
            var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); 
 | 
            var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue; 
 | 
            var requestTrayInTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.RequestTrayInTask)?.ConfigValue; 
 | 
            if (wmsBase == null || requestTrayInTask == null) 
 | 
            { 
 | 
                throw new InvalidOperationException("WMS IP 未配置"); 
 | 
            } 
 | 
            var wmsIpAddrss = wmsBase + requestTrayInTask; 
 | 
            var result = HttpHelper.PostAsync(wmsIpAddrss, request.ToJsonString()).Result; 
 | 
            if (result == null) 
 | 
                return new WMSTaskDTO(); 
 | 
  
 | 
            WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result); 
 | 
            if (!content.Status) 
 | 
                return new WMSTaskDTO(); 
 | 
  
 | 
            return JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString()); 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 请求WMS任务 
 | 
        /// </summary> 
 | 
        private async Task RequestWmsTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) 
 | 
        { 
 | 
            var content = await _taskService.RequestWMSTask(command.Barcode, childDeviceCode); 
 | 
            if (content.Status) 
 | 
            { 
 | 
                var task = _taskService.QueryBarCodeConveyorLineTask(command.Barcode, childDeviceCode); 
 | 
                if (task != null) 
 | 
                { 
 | 
                    if (task.SourceAddress == "1059-4") 
 | 
                    { 
 | 
                        //conveyorLine.SetValue(ConveyorLineDBName.ConveyorLineTargetAddress, "1000", childDeviceCode); 
 | 
  
 | 
                        ConsoleHelper.WriteWarningLine($"【{conveyorLine._deviceName}】任务号:【{task.TaskNum}】,托盘条码:【{task.PalletCode}】已到达【{childDeviceCode}】请求扫码入库(实盘),下一目标地址【{1000}】"); 
 | 
                        ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); 
 | 
                    } 
 | 
                    else 
 | 
                    { 
 | 
                        var next = task.NextAddress; 
 | 
                        var taskCommand = MapTaskCommand(task, command); 
 | 
                        task.NextAddress = next; 
 | 
  
 | 
                        ConsoleHelper.WriteWarningLine($"【{conveyorLine._deviceName}】任务号:【{command.TaskNum}】,托盘条码:【{command.Barcode}】已到达【{childDeviceCode}】请求扫码入库(实盘),下一目标地址【{taskCommand.TargetAddress}】"); 
 | 
  
 | 
                        conveyorLine.SendCommand(taskCommand, childDeviceCode); 
 | 
                        ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); 
 | 
                        _taskService.UpdateTaskStatusToNext(task); 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
            else 
 | 
                WriteInfo(conveyorLine.DeviceName, content.Message); 
 | 
        } 
 | 
    } 
 | 
} 
 |