using Serilog; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WPFWCSDemo.Common; using WPFWCSDemo.Data; using WPFWCSDemo.Models.Devices.CircleRGV; using WPFWCSDemo.StateCode; using WPFWCSDemo.Utilities.Table; using WPFWCSDemo.ViewModels; namespace WPFWCSDemo.Schedules.TaskFinish { /// /// 任务处理 /// public class Handler { static int deviceCount = RGVStation.RGVCount; /// /// 防错机制 --- /// 任务状态 ->【执行中】 /// 调度状态 ->【环穿-待执行】 /// 取货状态 ->【未取货】 /// 同时满足的任务视为下发失败的任务 /// 将任务状态更新为【待执行】令其重新下发 /// public static void TaskForSendFailedHandler() { using var context = new AppDbContext(); var tasks = context.Tasks //.Set() .OrderBy(t => t.CreateTime) .Where(t => t.TaskState == TaskStateCode.Task_Running && t.ScheduleState == ScheduleStateCode.Trans_CircleRGV_Ready && t.ScheduleTime <= DateTime.Now.AddSeconds(-30) && string.IsNullOrEmpty(t.JobId)) .ToList(); if (tasks is null || tasks.Count == 0) return; for (int i = 0; i < tasks.Count; i++) { tasks[i].TaskState = TaskStateCode.Task_Ready; if (context.SaveChanges() == 1) Log.Warning($"【向地面站下发任务】任务号:{tasks[i].TaskId}更新任务状态,尝试重新下发..."); } } /// /// 防错机制 --- /// 处理长时间未正常完成的遗留任务记录---获取下发时间距离当前一定时间的任务 /// 将其任务号与所有小车状态匹配 /// 判断该任务是否在执行中---否则视为遗留任务处理 /// public static void TaskExceptionHandler() { //只处理一段时间前的任务 int diff = -5; using var context = new AppDbContext(); //查询符合条件的任务 //任务状态---【执行中】 //生成时间---【执行中】 var tasks = context.Tasks .Where(t => t.TaskState == TaskStateCode.Task_Running && t.CreateTime <= DateTime.Now.AddMinutes(diff)) .OrderBy(t => t.CreateTime) .ToList(); //获取所有符合条件的任务记录 for (int i = 0; i < tasks.Count; i++) { List circleRGVStates = CircleRGVsViewModel.GetAllCircleRGVState(); if (circleRGVStates == null || circleRGVStates.Count < deviceCount) continue; //查找匹配【任务号】和无【允许下发】的设备 var result = circleRGVStates .Where(a => a.Read_TaskNumber.ToString() == tasks[i].TaskId && !a.Read_Permission) .Count(); //有匹配结果---> 查询下一条记录 if (result > 0) continue; //无匹配结果---> 移除遗留任务 int handlerResult = TaskManager.Delete(tasks[i]); if (handlerResult == 1) { Log.Warning($"【WCS更新任务状态】任务号:{tasks[i].TaskId},执行中设备无匹配任务,已作为遗留任务超时处理"); } #region 遍历小车状态参数(已弃用) //每条记录与所有小车状态匹配 //for (int j = 1; j <= deviceCount; j++) //{ // CircleRGVState circleRGVState = CircleRGVsViewModel.GetCircleRGVState(j); // if (circleRGVState == null) continue; // //过滤掉取货完成前的阶段 // if (circleRGVState.Read_Phase < 2) continue; // //匹配到任务号 ---> 任务号不是设备的唯一标识,需要继续判断 // if (circleRGVState.Read_TaskNumber.ToString() == tasks[i].TaskId) // { // //无【允许下发】---表示有执行中任务---跳出并开始下一条任务记录的匹配处理 // if (!circleRGVState.Read_Permission) break; // //1.有【允许下发】---> 必须匹配任务号的所有小车均有【允许下发】才能满足条件 // if (j == deviceCount) // { // int result = TaskManager.Delete(tasks[i]); // if (result == 1) // { // Log.Warning($"【WCS更新任务状态】任务号:{tasks[i].TaskId},执行中设备无匹配任务号,已作为遗留任务超时处理"); // } // } // } // else//无任务号匹配 // { // //---所有车都无任务号匹配,表示该任务为遗留任务 // if (j == deviceCount) // { // int result = TaskManager.Delete(tasks[i]); // if (result == 1) // { // Log.Warning($"【WCS更新任务状态】任务号:{tasks[i].TaskId},执行中设备无匹配任务号,已作为遗留任务超时处理"); // } // } // } //} #endregion } } } }