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 { /// /// 处理出库任务 /// 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); } } /// /// 处理新任务 /// private async void HandleNewTask(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; } //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); //} } /// /// 映射任务命令 /// 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(task); comm.InteractiveSignal = command.InteractiveSignal; return comm; } /// /// 完成WMS任务 /// 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() { {"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(result); if (content.Status) { ConveyorLineSendFinish(conveyorLine, childDeviceCode, ProtocalDetailValue, true); _taskService.UpdateTaskStatusToNext(taskOut); } } /// /// 创建并发送空托盘任务 /// 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; } /// /// 创建空托盘任务DTO /// 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(result); if (!content.Status) return new WMSTaskDTO(); return JsonConvert.DeserializeObject(content.Data.ToString()); } /// /// 请求WMS任务 /// 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.NextAddress.Contains("JZ")) { int nextStatus = task.TaskState.GetNextNotCompletedStatus(); 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); } } }