添加项目文件。

This commit is contained in:
Administrator
2026-06-29 14:46:32 +08:00
parent 9a9c508618
commit d9e0324b1d
175 changed files with 17983 additions and 0 deletions

View File

@@ -0,0 +1,132 @@
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.CircleRGVStation;
using WPFWCSDemo.StateCode;
using WPFWCSDemo.Utilities.Table;
using WPFWCSDemo.ViewModels;
namespace WPFWCSDemo.Schedules.TaskFinish
{
/// <summary>
/// 任务移除
/// </summary>
public class Delete
{
/// <summary>
/// 完成的调度任务从实时表删除记入历史记录
/// </summary>
/// <param name="taskRT">当前已完成的任务</param>
public static void TaskDelete()
{
using var context = new AppDbContext();
//查找符合【任务状态】和【调度状态】的记录
var taskRT = context.Tasks
.Where(t => t.TaskState == TaskStateCode.Task_Finish ||
t.TaskState == TaskStateCode.Task_Finish_Manual ||
t.TaskState == TaskStateCode.Task_Finish_Cancel ||
t.TaskState == TaskStateCode.Task_Cancel ||
t.TaskState == TaskStateCode.Task_Finish_Timeout)
.OrderBy(t => t.CreateTime)
.ToList();
if (taskRT is null || taskRT.Count == 0) return;
for (int i = 0; i < taskRT.Count; i++)
{
//任务完成状态文本
string strTaskState;
switch (taskRT[i].TaskState)
{
case TaskStateCode.Task_Finish:
strTaskState = "任务自动完成";
break;
case TaskStateCode.Task_Finish_Manual:
strTaskState = "任务手动完成";
break;
case TaskStateCode.Task_Finish_Cancel:
strTaskState = "任务手动取消";
break;
case TaskStateCode.Task_Cancel:
strTaskState = "任务自动作废";
break;
case TaskStateCode.Task_Finish_Timeout:
strTaskState = "任务超时自动完成";
break;
default:
strTaskState = "发生未知异常,请检查后手动处理";//其他状态:异常-手动处理
break;
}
Log.Information($"【WCS任务结束】【{strTaskState}】,任务号:{taskRT[i].TaskId}");
//---------------------------------------------反馈任务结束成功后:删除表任务添加至历史记录---------------------------------------------
int result = TaskManager.Delete(taskRT[i]);
if (result == 1)
{
if (taskRT[i].TaskType == TaskType.Goods)
Log.Information($"【常规任务-实垛】【{strTaskState}】,任务号:{taskRT[i].TaskId},历史任务记录已保存");
if (taskRT[i].TaskType == TaskType.Pallet)
Log.Information($"【常规任务-空托】【{strTaskState}】,任务号:{taskRT[i].TaskId},历史任务记录已保存");
if (taskRT[i].TaskType == TaskType.GoToRest)
Log.Information($"【进休息区】【{strTaskState}】,作业号:{taskRT[i].JobId} 任务号:{taskRT[i].TaskId},历史任务记录已保存");
if (taskRT[i].TaskType == TaskType.BackToRail)
Log.Information($"【返回轨道】【{strTaskState}】,作业号:{taskRT[i].JobId} 任务号:{taskRT[i].TaskId},历史任务记录已保存");
}
}
//LineFlagAutoReset();
}
///// <summary>
///// 防错机制【可下发任务标志】---如果当前某条线无输送任务,则重置该输送线请求标志为true
///// </summary>
//public static void LineFlagAutoReset()
//{
// using var context = new AppDbContext();
// int lineA = context.Tasks.Where(t => t.SourceLocation == RGVStation.LineA_In.ToString()).Count();
// if (lineA == 0) LineAIsAvailable = true;
// int lineB = context.Tasks.Where(t => t.SourceLocation == RGVStation.LineB_In.ToString()).Count();
// if (lineB == 0) LineBIsAvailable = true;
// int lineC = context.Tasks.Where(t => t.SourceLocation == RGVStation.LineC_In.ToString()).Count();
// if (lineC == 0) LineCIsAvailable = true;
// int lineD = context.Tasks.Where(t => t.SourceLocation == RGVStation.LineD_In.ToString()).Count();
// if (lineD == 0) LineDIsAvailable = true;
// using CircleRGVStationState? circleRGVStationState = CircleRGVsViewModel.GetCircleRGVStaionState();
// //地面站【允许下发】
// if (circleRGVStationState is null || circleRGVStationState.Read_Permission == 0) return;
// int lineAB = context.Tasks.Where(t => t.SourceLocation == RGVStation.LineAB_In.ToString()).Count();
// if (lineAB == 0 && circleRGVStationState.Read_PutRequest_LineB) LineABIsAvailable = true;
// int lineCD = context.Tasks.Where(t => t.SourceLocation == RGVStation.LineCD_In.ToString()).Count();
// if (lineCD == 0 && circleRGVStationState.Read_PutRequest_LineC) LineCDIsAvailable = true;
//}
}
}

View File

@@ -0,0 +1,59 @@
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WPFWCSDemo.Data;
using WPFWCSDemo.StateCode;
namespace WPFWCSDemo.Schedules.TaskFinish
{
/// <summary>
/// 任务完成
/// </summary>
public class Finish
{
/// <summary>
/// 更新【任务自动完成】状态
/// </summary>
public static void TaskFinish()
{
using var context = new AppDbContext();
//---------------------------------------------查询【调度状态】为已完成的任务---------------------------------------------
//var query = context.Set<TaskRT>()
// .Where(t => t.ScheduleState == ScheduleStateCode.Trans_CircleRGV_Finish && t.TaskState == TaskStateCode.Task_Running)
// .OrderBy(t => t.CreateTime);
//string s = query.ToQueryString();
//查询
//调度状态【环穿-执行完成】
//任务状态【执行中】
//的符合条件的任务
var taskRT = context.Tasks?
.Where(t => t.ScheduleState == ScheduleStateCode.Trans_CircleRGV_Finish && t.TaskState == TaskStateCode.Task_Running)
.OrderBy(t => t.CreateTime)
.ToList();
if (taskRT is null || taskRT.Count == 0) return;
//所有符合上述条件的任务
for (int i = 0; i < taskRT.Count; i++)
{
if (taskRT[i] is null) continue;
//任务状态更新为【自动完成】
taskRT[i].TaskState = TaskStateCode.Task_Finish;
Log.Information($"【WCS更新调度状态】任务号:{taskRT[i].TaskId},环穿输送完成");
}
context.SaveChanges();
}
}
}

View File

@@ -0,0 +1,159 @@
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
}
}
}
}

View File

@@ -0,0 +1,29 @@
using Quartz;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace WPFWCSDemo.Schedules.TaskFinish
{
public class TaskFinishSchedule : IJob
{
public Task Execute(IJobExecutionContext context)
{
Application.Current.Dispatcher.InvokeAsync(() =>
{
Finish.TaskFinish();
Handler.TaskForSendFailedHandler();
Handler.TaskExceptionHandler();
Delete.TaskDelete();
//Log.Information($"-----------------任务处理调度-----------------");
});
return Task.CompletedTask;
}
}
}