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
}
}
}
}