Files
FT479/WPFWCSDemo/Schedules/TaskFinish/Handler.cs
2026-06-29 14:46:32 +08:00

160 lines
5.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
}
}
}
}