using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_Core; using WIDESEAWCS_DTO.TaskInfo; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_Tasks.ConveyorLineJob; using HslCommunication; using OfficeOpenXml.ConditionalFormatting; using WIDESEAWCS_DTO.WMS; namespace WIDESEAWCS_Tasks { public partial class CommonConveyorLineJob { /// /// 处理出库任务 /// private void HandleTaskOut(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue, Dt_Task taskOut) { // 如果没有任务,直接返回 if (taskOut == null) return; // 映射任务命令 var taskCommand = MapTaskCommand(taskOut, command); // 根据不同的任务类型和状态执行不同的逻辑 bool isOutTray = taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray; bool isOutboundAndOutFinish = taskOut.TaskType == (int)TaskOutboundTypeEnum.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.SC_OutFinish; bool isOutboundAndLineOutExecuting = taskOut.TaskType == (int)TaskOutboundTypeEnum.Outbound && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting; if (isOutTray || isOutboundAndOutFinish || isOutboundAndLineOutExecuting) { // 发送命令到输送线 conveyorLine.SendCommand(taskCommand, childDeviceCode); // 标记发送完成 ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); // 更新任务状态 _taskService.UpdateTaskStatusToNext(taskOut); } else if (taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting) { // 完成WMS任务 CompleteWmsTask(taskOut, command, conveyorLine, childDeviceCode, ProtocalDetailValue); } } /// /// 处理新任务 /// private void HandleNewTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) { // 特定条件下创建并发送空托盘入库任务 if ((conveyorLine.DeviceCode == "1003" && childDeviceCode == "1016") || (conveyorLine.DeviceCode == "1005" && childDeviceCode == "1048")) { // 请求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口任务 } } /// /// 映射任务命令 /// private ConveyorLineTaskCommand MapTaskCommand(Dt_Task task, ConveyorLineTaskCommand command) { // 使用mapper映射任务命令 var comm = _mapper.Map(task); comm.InteractiveSignal = command.InteractiveSignal; return comm; } /// /// 完成WMS任务 /// 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 result = HttpHelper.GetAsync($"http://127.0.0.1:5000/api/Task/CompleteTaskAsync?taskNum={taskOut.TaskNum}").Result; WebResponseContent content = JsonConvert.DeserializeObject(result); if (content.Status) { // 标记发送完成 ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); // 更新任务状态 _taskService.UpdateTaskStatusToNext(taskOut); } } /// /// 创建并发送空托盘任务 /// public void CreateAndSendEmptyTrayTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) { if (command.Barcode != "NoRead") { // 创建空托盘任务DTO WMSTaskDTO taskDTO = CreateEmptyTrayTaskDto(command.Barcode, childDeviceCode); // 创建并发送任务 WebResponseContent content = CreateAndSendTask(taskDTO); if (content.Status) { // 查询任务 Dt_Task task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); if (task != null) { // 映射任务命令 ConveyorLineTaskCommand taskCommand = MapTaskCommand(task, command); // 发送命令到输送线 conveyorLine.SendCommand(taskCommand, childDeviceCode); // 标记发送完成 ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); // 更新任务状态 _taskService.UpdateTaskStatusToNext(task); } } } } /// /// 创建空托盘任务DTO /// private WMSTaskDTO CreateEmptyTrayTaskDto(string barcode, string childDeviceCode) { #region 向WMS请求空托盘任务 WMSTaskDTO wMSTaskDTO = new WMSTaskDTO(); RequestTaskDto request = new RequestTaskDto() { Position = childDeviceCode, PalletCode = barcode, }; var result = HttpHelper.PostAsync("http://127.0.0.1:5000/api/Task/RequestTrayInTaskAsync", request.ToJsonString()).Result; if (result == null) return wMSTaskDTO; WebResponseContent content = JsonConvert.DeserializeObject(result); // 检查状态并返回 if (!content.Status) return wMSTaskDTO; return JsonConvert.DeserializeObject(content.Data.ToString()); #endregion 向WMS请求空托盘任务 } /// /// 请求WMS任务 /// private void RequestWmsTask(CommonConveyorLine conveyorLine, ConveyorLineTaskCommand command, string childDeviceCode, int ProtocalDetailValue) { // 请求WMS任务 if (_taskService.RequestWMSTask(command.Barcode, childDeviceCode).Status) { // 查询任务 Dt_Task 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); } } } } }