|  |  | 
 |  |  | using Newtonsoft.Json; | 
 |  |  | using System; | 
 |  |  | using System.Collections.Generic; | 
 |  |  | using System.Linq; | 
 |  |  | using System.Text; | 
 |  |  | using HslCommunication; | 
 |  |  | using Newtonsoft.Json; | 
 |  |  | using System.Text.RegularExpressions; | 
 |  |  | using System.Threading.Tasks; | 
 |  |  | using WIDESEAWCS_Common; | 
 |  |  | using WIDESEAWCS_Common.TaskEnum; | 
 |  |  | using WIDESEAWCS_Core.Helper; | 
 |  |  | using WIDESEAWCS_Core; | 
 |  |  | using WIDESEAWCS_Core.Helper; | 
 |  |  | using WIDESEAWCS_DTO.TaskInfo; | 
 |  |  | using WIDESEAWCS_DTO.WMS; | 
 |  |  | using WIDESEAWCS_Model.Models; | 
 |  |  | using WIDESEAWCS_QuartzJob; | 
 |  |  | using WIDESEAWCS_Tasks.ConveyorLineJob; | 
 |  |  | using HslCommunication; | 
 |  |  | using OfficeOpenXml.ConditionalFormatting; | 
 |  |  | using WIDESEAWCS_DTO.WMS; | 
 |  |  |  | 
 |  |  | namespace WIDESEAWCS_Tasks | 
 |  |  | { | 
 |  |  | 
 |  |  |         /// </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) | 
 |  |  |             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) | 
 |  |  |             { | 
 |  |  |                 // 完成WMS任务 | 
 |  |  |                 CompleteWmsTask(taskOut, command, conveyorLine, childDeviceCode, ProtocalDetailValue); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |         /// <summary> | 
 |  |  |         /// 处理新任务 | 
 |  |  |         /// </summary> | 
 |  |  |         private void HandleNewTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) | 
 |  |  |         private async Task HandleNewTaskAsync(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) | 
 |  |  |         { | 
 |  |  |             // 特定条件下创建并发送空托盘入库任务 | 
 |  |  |             if ((conveyorLine.DeviceCode == "1003" && childDeviceCode == "1016") || (conveyorLine.DeviceCode == "1005" && childDeviceCode == "1048")) | 
 |  |  |             var stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode && x.stationPLC == conveyorLine.DeviceCode); | 
 |  |  |  | 
 |  |  |             switch (stationManager.stationType) | 
 |  |  |             { | 
 |  |  |                 // 请求WMS空托盘任务 | 
 |  |  |                 CreateAndSendEmptyTrayTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue); | 
 |  |  |             } | 
 |  |  |             else if ((conveyorLine.DeviceCode == "1001" && childDeviceCode == "1088") || (conveyorLine.DeviceCode == "1004" && childDeviceCode == "1339")) | 
 |  |  |             { | 
 |  |  |                 // 请求WMS入库任务 | 
 |  |  |                 RequestWmsTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue); | 
 |  |  |             } | 
 |  |  |             else if ((conveyorLine.DeviceCode == "1001" && childDeviceCode == "1073") || (conveyorLine.DeviceCode == "1003" && childDeviceCode == "1002")) | 
 |  |  |             { | 
 |  |  |                 //TODO 发送直接去NG口任务 | 
 |  |  |                 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> | 
 |  |  |         private ConveyorLineTaskCommand MapTaskCommand(Dt_Task task, ConveyorLineTaskCommand command) | 
 |  |  |         { | 
 |  |  |             // 使用mapper映射任务命令 | 
 |  |  |             // 使用正则表达式匹配类似 -数字 的模式,并替换为空字符串 | 
 |  |  |             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> | 
 |  |  |         private void CompleteWmsTask(Dt_Task taskOut, ConveyorLineTaskCommand command, CommonConveyorLine conveyorLine, string childDeviceCode, int ProtocalDetailValue) | 
 |  |  |         { | 
 |  |  |             // 如果没有条码信息,则设置目标地址为NG地址 | 
 |  |  |             if (command.Barcode == "NoRead") | 
 |  |  |             { | 
 |  |  |                 var NGAddress = _platFormRepository.QueryFirst(x => x.PlatCode == taskOut.TargetAddress).Capacity; | 
 |  |  |                 taskOut.TargetAddress = NGAddress.ToString(); | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             // TODO调用WMS任务完成接口 | 
 |  |  |             var keys = new Dictionary<string, object>() | 
 |  |  |                 { | 
 |  |  |                     {"taskNum", taskOut.TaskNum} | 
 |  |  |                 }; | 
 |  |  |             var result = HttpHelper.GetAsync($"http://127.0.0.1:5000/api/Task/CompleteTaskAsync", keys).Result; | 
 |  |  |             { | 
 |  |  |                 {"taskNum", taskOut.TaskNum} | 
 |  |  |             }; | 
 |  |  |             var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); | 
 |  |  |             var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.WMSIP_BASE)?.ConfigValue; | 
 |  |  |             var completeTask = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.CompleteTask)?.ConfigValue; | 
 |  |  |             if (wmsBase == null || completeTask == null) | 
 |  |  |             { | 
 |  |  |                 throw new InvalidOperationException("WMS IP 未配置"); | 
 |  |  |             } | 
 |  |  |             var wmsIpAddress = wmsBase + completeTask; | 
 |  |  |  | 
 |  |  |             var result = HttpHelper.GetAsync(wmsIpAddress, keys).Result; | 
 |  |  |             WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result); | 
 |  |  |             if (content.Status) | 
 |  |  |             { | 
 |  |  |                 // 标记发送完成 | 
 |  |  |                 ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); | 
 |  |  |                 // 更新任务状态 | 
 |  |  |                 _taskService.UpdateTaskStatusToNext(taskOut); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |         /// <summary> | 
 |  |  |         /// 创建并发送空托盘任务 | 
 |  |  |         /// </summary> | 
 |  |  |         public void CreateAndSendEmptyTrayTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) | 
 |  |  |         public Task CreateAndSendEmptyTrayTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) | 
 |  |  |         { | 
 |  |  |             if (command.Barcode != "NoRead") | 
 |  |  |             { | 
 |  |  |                 // 创建空托盘任务DTO | 
 |  |  |                 WMSTaskDTO taskDTO = CreateEmptyTrayTaskDto(command.Barcode, childDeviceCode); | 
 |  |  |                 // 创建并发送任务 | 
 |  |  |                 WebResponseContent content = CreateAndSendTask(taskDTO); | 
 |  |  |                 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) | 
 |  |  |                 { | 
 |  |  |                     // 查询任务 | 
 |  |  |                     Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); | 
 |  |  |                     var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); | 
 |  |  |                     if (task != null) | 
 |  |  |                     { | 
 |  |  |                         // 映射任务命令 | 
 |  |  |                         ConveyorLineTaskCommand taskCommand = MapTaskCommand(task, command); | 
 |  |  |                         // 发送命令到输送线 | 
 |  |  |                         //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> | 
 |  |  | 
 |  |  |         /// </summary> | 
 |  |  |         private WMSTaskDTO CreateEmptyTrayTaskDto(string barcode, string childDeviceCode) | 
 |  |  |         { | 
 |  |  |             #region 向WMS请求空托盘任务 | 
 |  |  |             WMSTaskDTO wMSTaskDTO = new WMSTaskDTO(); | 
 |  |  |             RequestTaskDto request = new RequestTaskDto() | 
 |  |  |             var request = new RequestTaskDto() | 
 |  |  |             { | 
 |  |  |                 Position = childDeviceCode, | 
 |  |  |                 PalletCode = barcode, | 
 |  |  |             }; | 
 |  |  |             var result = HttpHelper.PostAsync("http://127.0.0.1:5000/api/Task/RequestTrayInTaskAsync", request.ToJsonString()).Result; | 
 |  |  |  | 
 |  |  |             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 wMSTaskDTO; | 
 |  |  |                 return new WMSTaskDTO(); | 
 |  |  |  | 
 |  |  |             WebResponseContent content = JsonConvert.DeserializeObject<WebResponseContent>(result); | 
 |  |  |             // 检查状态并返回 | 
 |  |  |             if (!content.Status) | 
 |  |  |                 return wMSTaskDTO; | 
 |  |  |                 return new WMSTaskDTO(); | 
 |  |  |  | 
 |  |  |             return JsonConvert.DeserializeObject<WMSTaskDTO>(content.Data.ToString()); | 
 |  |  |  | 
 |  |  |             #endregion 向WMS请求空托盘任务 | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /// <summary> | 
 |  |  |         /// 请求WMS任务 | 
 |  |  |         /// </summary> | 
 |  |  |         private void RequestWmsTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) | 
 |  |  |         private async Task RequestWmsTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) | 
 |  |  |         { | 
 |  |  |             // 请求WMS任务 | 
 |  |  |             if (_taskService.RequestWMSTask(command.Barcode, childDeviceCode).Status) | 
 |  |  |             var content = await _taskService.RequestWMSTask(command.Barcode, childDeviceCode); | 
 |  |  |             if (content.Status) | 
 |  |  |             { | 
 |  |  |                 // 查询任务 | 
 |  |  |                 Dt_Task task = _taskService.QueryBarCodeConveyorLineTask(command.Barcode, childDeviceCode); | 
 |  |  |                 var task = _taskService.QueryBarCodeConveyorLineTask(command.Barcode, childDeviceCode); | 
 |  |  |                 if (task != null) | 
 |  |  |                 { | 
 |  |  |                     // 映射任务命令 | 
 |  |  |                     ConveyorLineTaskCommand taskCommand = MapTaskCommand(task, command); | 
 |  |  |                     // 发送命令到输送线 | 
 |  |  |                     conveyorLine.SendCommand(taskCommand, childDeviceCode); | 
 |  |  |                     // 标记发送完成 | 
 |  |  |                     ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); | 
 |  |  |                     // 更新任务状态 | 
 |  |  |                     _taskService.UpdateTaskStatusToNext(task); | 
 |  |  |                     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); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  | } |