using Masuit.Tools; using Masuit.Tools.Systems; using Newtonsoft.Json; using System.Threading.Tasks; using WIDESEAWCS_Common; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_DTO.MOM; using WIDESEAWCS_DTO.TaskInfo; using WIDESEAWCS_DTO.WMS; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_Tasks.ConveyorLineJob; using static Microsoft.EntityFrameworkCore.DbLoggerCategory.Database; namespace WIDESEAWCS_Tasks { public partial class CommonConveyorLine_GWJob { /// /// 处理出库任务 /// private void HandleTaskOut(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After 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); //conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTaskNum, taskCommand.ConveyorLineTaskNum, childDeviceCode); //conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, taskCommand.ConveyorLineTargetAddress, childDeviceCode); //conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, taskCommand.ConveyorLineBarcode, childDeviceCode); //conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode); _taskService.UpdateTaskStatusToNext(taskOut); } else if (taskOut.TaskType == (int)TaskOutboundTypeEnum.OutTray && taskOut.TaskState == (int)TaskOutStatusEnum.Line_OutExecuting) { CompleteWmsTask(taskOut, command, conveyorLine, childDeviceCode, ProtocalDetailValue); } } /// /// 处理新任务 /// private void HandleNewTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) { Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode); if (stationManager == null) { // Handle the case where stationManager is not found, if necessary Console.WriteLine($"未找到{childDeviceCode}站台"); return; } // 根据站类型执行相应的方法 switch (stationManager.stationType) { case 8: case 9: case 11: case 12: var task = _taskService.QueryExecutingTaskByBarcode(command.ConveyorLineBarcode, childDeviceCode); if (task != null) { ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode); } break; case 1: case 6: case 10: ExecuteStationAction(stationManager, conveyorLine, command, childDeviceCode); break; } #region //Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationPLC == conveyorLine.DeviceCode && x.stationChildCode == childDeviceCode); //if (stationManager.stationType == 8) //{ // var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode); // if (task != null) // { // RequestInNextAddress(conveyorLine, command, childDeviceCode); // } //} //else if (stationManager.stationType == 9) //{ // var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode); // if (task != null) // { // ConveyorLineInFinish(conveyorLine, command, childDeviceCode); // } //} //else if (stationManager.stationType == 1) //{ // if (stationManager.stationArea.Contains("GW")) // { // var taskGW = _taskRepository.QueryFirst(x => x.TargetAddress == childDeviceCode && x.TaskState == (int)TaskOutStatusEnum.OutFinish); // if (taskGW != null) // { // command.ConveyorLineBarcode = taskGW.PalletCode; // } // } // RequestWmsTask(conveyorLine, command, childDeviceCode); //} //else if (stationManager.stationType == 10) //{ // var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); // if (task != null) // { // RequestOutbound(conveyorLine, command, childDeviceCode); // } //} //else if (stationManager.stationType == 11) //{ // var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode); // if (task != null) // { // RequestOutNextAddress(conveyorLine, command, childDeviceCode); // } //} //else if (stationManager.stationType == 12) //{ // var task = _taskService.QueryExecutingConveyorLineTask(command.ConveyorLineTaskNum, childDeviceCode); // if (task != null) // { // ConveyorLineOutFinish(conveyorLine, command, childDeviceCode); // } //} #endregion } private void ExecuteStationAction(Dt_StationManager stationManager, CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) { switch (stationManager.stationType) { case 8: RequestInNextAddress(conveyorLine, command, childDeviceCode); break; case 9: ConveyorLineInFinish(conveyorLine, command, childDeviceCode); break; case 10: RequestOutbound(conveyorLine, command, childDeviceCode); break; case 11: RequestOutNextAddress(conveyorLine, command, childDeviceCode); break; case 12: ConveyorLineOutFinish(conveyorLine, command, childDeviceCode); break; case 6: CreateAndSendEmptyTrayTask(conveyorLine, command, childDeviceCode); break; case 16: AbNormalStationBZTask(conveyorLine, command, childDeviceCode); break; case 1: RequestWmsTask(conveyorLine, command, childDeviceCode, stationManager); break; } } /// /// 映射任务命令 /// private ConveyorLineTaskCommand_After MapTaskCommand(Dt_Task task, ConveyorLineTaskCommand_After command) { var comm = _mapper.Map(task); comm.ResponState = 1; comm.InteractiveSignal = command.InteractiveSignal; return comm; } /// /// 完成WMS任务 /// private void CompleteWmsTask(Dt_Task taskOut, ConveyorLineTaskCommand_After command, CommonConveyorLine_GW conveyorLine, string childDeviceCode, int ProtocalDetailValue) { if (command.ConveyorLineBarcode == "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) { _taskService.UpdateTaskStatusToNext(taskOut); } } /// /// 创建并发送空托盘任务 /// public void CreateAndSendEmptyTrayTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) { if (command.ConveyorLineBarcode != "NoRead") { #region //var config = _sys_ConfigService.GetConfigsByCategory(CateGoryConst.CONFIG_SYS_IPAddress); //var wmsBase = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.MOMIP_BASE)?.ConfigValue; //var ipAddress = config.FirstOrDefault(x => x.ConfigKey == SysConfigKeyConst.TrayCellsStatus)?.ConfigValue; //if (wmsBase == null || ipAddress == null) //{ // throw new InvalidOperationException("MOM IP 未配置"); //} //var stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode); //TrayCellsStatusDto trayCells = new TrayCellsStatusDto() //{ // Software = "WMS", // TrayBarcode = command.ConveyorLineBarcode, // EquipmentCode = stationManager.stationEquipMOM, // SessionId = Guid.NewGuid().ToString(), // EmployeeNo = "MITest", // SceneType = "4", // RequestTime = TimeZoneInfo.ConvertTimeToUtc(DateTime.Now).ToString("yyyy-MM-ddTHH:mm:ss.fffZ") //}; //var MOMIpAddress = wmsBase + ipAddress; //var result = HttpHelper.PostAsync(MOMIpAddress, trayCells.ToJsonString()).Result; //WriteInfo("入站校验", $"【{stationManager.stationChildCode}】入站校验请求参数【{trayCells.ToJsonString()}】"); //WriteInfo("入站校验", ""); //WriteInfo("入站校验", $"【{stationManager.stationChildCode}】入站校验返回参数【{result}】"); //ResultTrayCellsStatus result1 = JsonConvert.DeserializeObject(result); //if (result1.Success) //{ // var serialNosError = result1.SerialNos.Where(x => x.SerialNoStatus != 1 && x.SerialNoStatus != 4).ToList(); // if (serialNosError.Count > 0) // { // if (result1.ProcessCode == "AG01") // { // var strings = new List() { "2234", "2226", "2218" }; // foreach (var item in strings) // { // var station = _stationManagerRepository.QueryFirst(x => x.productLine == result1.ProductionLine && x.stationChildCode == item); // if (station != null) // { // IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == station.stationPLC); // if (device != null) // { // CommonConveyorLine_After CommonConveyorLine_After = (CommonConveyorLine_After)device; // ConveyorLineTaskCommand_After taskCommand = new ConveyorLineTaskCommand_After() // { // ConveyorLineTaskNum = Convert.ToInt32(1), // ConveyorLineTargetAddress = Convert.ToInt16(2234), // ConveyorLineBarcode = command.ConveyorLineBarcode.ToString(), // }; // CommonConveyorLine_After.SendCommand(taskCommand, station.stationChildCode); // CommonConveyorLine_After.SetValue(ConveyorLineDBName_After.ResponState, 1, station.stationChildCode); // } // //发送到分容 // return; // } // } // } // } // else // { // var strings = new List() { "2142", "2094", "2046" }; // foreach (var item in strings) // { // var station = _stationManagerRepository.QueryFirst(x => x.productLine == result1.ProductionLine && x.stationChildCode == item); // if (station != null) // { // IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == station.stationPLC); // if (device != null) // { // CommonConveyorLine_After CommonConveyorLine_After = (CommonConveyorLine_After)device; // ConveyorLineTaskCommand_After conveyorLineAfter = CommonConveyorLine_After.ReadCustomer(Convert.ToInt32(station.stationChildCode).ToString()); // if (conveyorLineAfter.InteractiveSignal == 16) // { // var TaskNum = SnowFlake.LongId; // Dt_Task task = new Dt_Task() // { // TaskNum = _taskRepository.GetTaskNo().Result, // Grade = 1, // PalletCode = command.ConveyorLineBarcode, // Roadway = station.Roadway, // SourceAddress = childDeviceCode, // TargetAddress = station.stationChildCode, // CurrentAddress = childDeviceCode, // NextAddress = station.stationChildCode, // TaskState = (int)TaskInStatusEnum.InNew, // ExceptionMessage = "", // TaskId = 0, // TaskType = (int)TaskInboundTypeEnum.InTray, // ProductionLine = result1.ProductionLine, // }; // _taskRepository.AddData(task); // ConveyorLineTaskCommand_After taskCommand = _mapper.Map(task); // conveyorLine.SendCommand(taskCommand, childDeviceCode); // conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode); // _taskService.UpdateTaskStatusToNext(task); // } // } // //发送到分容 // return; // } // } // var taskDTO = CreateEmptyTrayTaskDto(command.ConveyorLineBarcode, childDeviceCode); // if (_taskRepository.QueryFirst(x => x.PalletCode == taskDTO.PalletCode) != null) // { // WriteInfo(conveyorLine.DeviceName, "当前托盘存在任务"); // return; // } // var content = CreateAndSendTask(taskDTO); // if (content.Status) // { // var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); // if (task != null) // { // var taskCommand = MapTaskCommand(task, command); // conveyorLine.SendCommand(taskCommand, childDeviceCode); // _taskService.UpdateTaskStatusToNext(task); // } // } // } //} //else //{ // ConsoleHelper.WriteErrorLine(result1.MOMMessage); //} #endregion if (_taskRepository.QueryFirst(x => x.PalletCode == command.ConveyorLineBarcode) != null) { WriteInfo(conveyorLine.DeviceName, "当前托盘存在任务"); return; } var taskDTO = CreateEmptyTrayTaskDto(command.ConveyorLineBarcode, childDeviceCode); var content = CreateAndSendTask(taskDTO); if (content.Status) { //var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode); var task = _taskService.QueryConveyorLineTask(conveyorLine.DeviceCode, childDeviceCode, command.ConveyorLineBarcode); if (task != null) { //var taskCommand = MapTaskCommand(task, command); //conveyorLine.SendCommand(taskCommand, childDeviceCode); //conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode); //ConveyorLineTaskCommand_After taskCommand = _mapper.Map(task); conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTaskNum, (long)task.TaskNum, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, task.NextAddress, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, task.PalletCode, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode); _taskService.UpdateTaskStatusToNext(task); } } } } /// /// 创建空托盘任务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 void RequestWmsTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, Dt_StationManager stationManager) { if (command.ConveyorLineBarcode.IsNullOrEmpty()) return; var Hastask = _taskService.QueryBarCodeConveyorLineTask(command.ConveyorLineBarcode, childDeviceCode); if (Hastask != null) { //ConveyorLineTaskCommand_After taskCommand = _mapper.Map(Hastask); //conveyorLine.SendCommand(taskCommand, childDeviceCode); //conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTaskNum, (long)Hastask.TaskNum, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, Hastask.NextAddress, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, Hastask.PalletCode, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode); return; } var content = await _taskService.RequestWMSTask(command.ConveyorLineBarcode, childDeviceCode); if (content.Status) { var task = _taskService.QueryBarCodeConveyorLineTask(command.ConveyorLineBarcode, childDeviceCode); if (task != null) { //ConveyorLineTaskCommand_After taskCommand = _mapper.Map(task); //conveyorLine.SendCommand(taskCommand, childDeviceCode); //conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode); //ConveyorLineTaskCommand_After taskCommand = _mapper.Map(task); conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTaskNum, (long)task.TaskNum, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, task.NextAddress, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineBarcode, task.PalletCode, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode); _taskService.UpdateTaskStatusToNext(task); } } else { WriteInfo(conveyorLine.DeviceName, content.Message); conveyorLine.SetValue(ConveyorLineDBName_After.ConveyorLineTargetAddress, stationManager.stationNGChildCode, childDeviceCode); conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 1, childDeviceCode); ConsoleHelper.WriteErrorLine($"【{conveyorLine.DeviceName}】托盘号:【{command.ConveyorLineBarcode}】请求点位:【{childDeviceCode}】异常信息【{content.Message}】"); } } /// /// 高温出库后任务完成 如果任务标识NG则将任务改为异常排出任务 /// /// /// /// /// /// private void CreateAbNormalOutbound(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode, Dt_Task task) { Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode); if (stationManager == null || string.IsNullOrWhiteSpace(stationManager.stationNGChildCode) || string.IsNullOrWhiteSpace(stationManager.stationNGLocation)) { throw new Exception("未配置站台的对应NG口信息"); } task.SourceAddress = task.TargetAddress; task.TargetAddress = stationManager.stationNGLocation; task.TaskState = (int)TaskOutStatusEnum.OutNew; task.TaskType = (int)TaskOutboundTypeEnum.InToOut; task.Grade = 10; //此处 出库至异常排出口的任务应除火警外最优先执行 _taskRepository.UpdateData(task); //Dt_Task task= _taskRepository.QueryFirst(x=>) //_taskRepository.QueryFirst() } /// /// 包装异常排出口逻辑 /// /// /// /// private void AbNormalStationBZTask(CommonConveyorLine_GW conveyorLine, ConveyorLineTaskCommand_After command, string childDeviceCode) { Dt_StationManager stationManager = _stationManagerRepository.QueryFirst(x => x.stationChildCode == childDeviceCode && x.stationPLC == conveyorLine.DeviceCode); if (command.ConveyorLineBarcode.IsNullOrEmpty()) { conveyorLine.SetValue(ConveyorLineDBName_After.ResponState, 2, childDeviceCode); return; } if (conveyorLine.ReadValue(ConveyorLineDBName_After.InteractiveSignal, childDeviceCode).ObjToInt() == 0) //托盘正反信号 { }; conveyorLine.ReadValue(ConveyorLineDBName_After.InteractiveSignal, childDeviceCode); //托盘有无电芯信号 } } }