160 lines
5.8 KiB
C#
160 lines
5.8 KiB
C#
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
|
||
{
|
||
/// <summary>
|
||
/// 任务处理
|
||
/// </summary>
|
||
public class Handler
|
||
{
|
||
static int deviceCount = RGVStation.RGVCount;
|
||
|
||
/// <summary>
|
||
/// 防错机制 ---
|
||
/// 任务状态 ->【执行中】
|
||
/// 调度状态 ->【环穿-待执行】
|
||
/// 取货状态 ->【未取货】
|
||
/// 同时满足的任务视为下发失败的任务
|
||
/// 将任务状态更新为【待执行】令其重新下发
|
||
/// </summary>
|
||
public static void TaskForSendFailedHandler()
|
||
{
|
||
using var context = new AppDbContext();
|
||
|
||
var tasks = context.Tasks
|
||
//.Set<TaskRT>()
|
||
.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}更新任务状态,尝试重新下发...");
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
/// <summary>
|
||
/// 防错机制 ---
|
||
/// 处理长时间未正常完成的遗留任务记录---获取下发时间距离当前一定时间的任务
|
||
/// 将其任务号与所有小车状态匹配
|
||
/// 判断该任务是否在执行中---否则视为遗留任务处理
|
||
/// </summary>
|
||
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<CircleRGVState> 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
|
||
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
}
|
||
}
|