| | |
| | | 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 void HandleNewTask(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); |
| | | 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; |
| | | } |
| | | 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口任务 |
| | | } |
| | | |
| | | //if ((conveyorLine.DeviceCode == "1003" && childDeviceCode == "1016") || (conveyorLine.DeviceCode == "1005" && childDeviceCode == "1048")) |
| | | //{ |
| | | // await CreateAndSendEmptyTrayTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue); |
| | | //} |
| | | //else if ((conveyorLine.DeviceCode == "1001" && childDeviceCode == "1088") || (conveyorLine.DeviceCode == "1004" && childDeviceCode == "1339")) |
| | | //{ |
| | | // await RequestWmsTask(conveyorLine, command, childDeviceCode, ProtocalDetailValue); |
| | | //} |
| | | //else if ((conveyorLine.DeviceCode == "1001" && childDeviceCode == "1068")) |
| | | //{ |
| | | // ConveyorLineOutFinish(conveyorLine, command, childDeviceCode, ProtocalDetailValue); |
| | | //} |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// </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.NextAddress.Contains("JZ")) |
| | | { |
| | | int nextStatus = task.TaskState.GetNextNotCompletedStatus<TaskInStatusEnum>(); |
| | | task.TaskState = nextStatus; |
| | | |
| | | ConsoleHelper.WriteWarningLine($"【{conveyorLine._deviceName}】任务号:【{task.TaskNum}】,托盘条码:【{task.PalletCode}】已到达【{childDeviceCode}】请求扫码入库(实盘),下一目标地址【{task.TargetAddress}】"); |
| | | _taskService.UpdateTaskStatusToNext(task); |
| | | ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); |
| | | } |
| | | else |
| | | { |
| | | //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); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | WriteInfo(conveyorLine.DeviceName, content.Message); |
| | | } |
| | | } |
| | | } |