using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Serilog; using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Data.SqlClient; using System.Linq; using WPFWCSDemo.Common; using WPFWCSDemo.Data; using WPFWCSDemo.Models.Devices.CircleRGV; using WPFWCSDemo.Models.Devices.CircleRGVStation; using WPFWCSDemo.Models.Tables; using WPFWCSDemo.StateCode; using WPFWCSDemo.Utilities; using WPFWCSDemo.Utilities.Table; using WPFWCSDemo.ViewModels; namespace WPFWCSDemo.Schedules { [Obsolete("该类下的方法已经移至其他类中使用",true)] public class TaskFinishSchedule { /// /// A线单次请求标志 /// public static bool LineAIsAvailable = true; /// /// B线单次请求标志 /// public static bool LineBIsAvailable = true; /// /// C线单次请求标志 /// public static bool LineCIsAvailable = true; /// /// D线单次请求标志 /// public static bool LineDIsAvailable = true; /// /// AB线单次请求标志 /// public static bool LineABIsAvailable = true; /// /// CD线单次请求标志 /// public static bool LineCDIsAvailable = true; /// /// 自动完成处于一定时间内【放货中】状态的环穿【实垛】遗留任务 /// public static void DeleteTaskForPuttingTimeout() { //查询【放货中】的任务 using DataTable? dt = SqlHelper.ExecuteTable("SELECT TOP 1 * FROM TASK WHERE SCHEDULESTATE=@ScheduleState", new SqlParameter("@ScheduleState", ScheduleStateCode.Trans_CircleRGV_Putting) ); if (dt is null || dt.Rows.Count == 0) { return; } for (int i = 0; i < dt.Rows.Count; i++) { //获取第i条记录 using TaskRT taskRT = TaskManager.ToModels(dt.Rows[i]); TimeSpan diff = DateTime.Now - taskRT.ScheduleTime; //处于【放货中】的实垛任务---如果旧任务放货时未正常自动完成,则出现新的同设备任务后,旧任务2分钟后自动完成 if (taskRT.TaskType == 10) { //if (diff.TotalMinutes >= 2) //{ //查询是否有编号重复的任务 int count = SqlHelper.GetRowCount("SELECT * FROM TASK WHERE JOBID=@JobId", new SqlParameter("@JobId", taskRT.JobId) ); //如果存在编号重复的任务,表示小车已经分配了新任务---将【放货中】的任务设置为超时完成 if (count > 1) { //表示小车已接到新任务 SqlHelper.ExecuteNonQuery("UPDATE TASK SET TASKSTATE=@TaskState WHERE TASKID=@TaskId", new SqlParameter("@TaskState", TaskStateCode.Task_Finish_Timeout), new SqlParameter("@TaskId", taskRT.TaskId) ); Log.Warning($"【WCS更新<放货中>状态】任务号:{taskRT.TaskId}已作为遗留任务处理"); } //} } } } /// /// 自动完成处于一定时间内【放货完成】状态的环穿遗留任务 /// 该原因可能是由于某些因素使程序意外关闭导致的 /// public static void DeleteTaskForFinishTimeout() { //查询【放货完成】的任务 using DataTable? dt = SqlHelper.ExecuteTable("SELECT TOP 1 * FROM TASK WHERE SCHEDULESTATE=@ScheduleState AND CREATETIME<@CurrentTime", new SqlParameter("@ScheduleState", ScheduleStateCode.Trans_CircleRGV_Finish), new SqlParameter("@CurrentTime", DateTime.Now.AddMinutes(-8).ToString(TimeFormat.stringFormat)) ); if (dt is null || dt.Rows.Count == 0) { return; } //获取第i条记录 using TaskRT taskRT = TaskManager.ToModels(dt.Rows[0]); if (taskRT is null) return; //表示小车已接到新任务 SqlHelper.ExecuteNonQuery("UPDATE TASK SET TASKSTATE=@TaskState WHERE TASKID=@TaskId", new SqlParameter("@TaskState", TaskStateCode.Task_Finish_Timeout), new SqlParameter("@TaskId", taskRT.TaskId) ); Log.Warning($"【WCS更新<放货完成>状态】任务号:{taskRT.TaskId}已作为遗留任务处理"); } /// /// 防错机制(处理长时间可能未正常完成遗留任务记录)---获取下发时间距离当前时间较长的任务 /// 将其任务号与执行中的小车匹配 /// 判断该任务是否已经执行完成---完成则视为遗留任务处理 /// public static void DeleteTaskForDeviceTaskNumberIsNotExist() { //查找【放货途中】和【放货中】的任务 using DataTable? dt = SqlHelper.ExecuteTable("SELECT * FROM TASK WHERE (SCHEDULESTATE=@ScheduleState OR SCHEDULESTATE=@ScheduleState1) AND SCHEDULETIME<@CurrentTime", new SqlParameter("@ScheduleState", ScheduleStateCode.Trans_CircleRGV_PutOnTheWay), new SqlParameter("@ScheduleState1", ScheduleStateCode.Trans_CircleRGV_Putting), new SqlParameter("@CurrentTime", DateTime.Now.AddMinutes(-30).ToString(TimeFormat.stringFormat)) ); if (dt is null || dt.Rows.Count == 0) { return; } for (int i = 0; i < dt.Rows.Count; i++) { using TaskRT? taskRT = TaskManager.ToModels(dt.Rows[i]); //获取对应小车编号---此处需要保证小车编号正确性,在更新【放货】阶段的逻辑中再次更新了小车编号 if (string.IsNullOrEmpty(taskRT.JobId)) continue; //数据类型正确 if (int.Parse(taskRT.JobId) > 0 && int.Parse(taskRT.JobId) < 10) { //获取任务表中编号对应的小车 CircleRGVState? circleRGVState = CircleRGVsViewModel.GetCircleRGVState(int.Parse(taskRT.JobId)); if (circleRGVState == null) { continue; } //判断设备任务号是否与任务表中的任务号匹配 //匹配---不执行操作 //不匹配---视为遗留任务处理 if (circleRGVState.Read_TaskNumber.ToString() != taskRT.TaskId) { //表示小车已接到新任务 SqlHelper.ExecuteNonQuery("UPDATE TASK SET TASKSTATE=@TaskState WHERE TASKID=@TaskId", new SqlParameter("@TaskState", TaskStateCode.Task_Finish_Timeout), new SqlParameter("@TaskId", taskRT.TaskId) ); Log.Warning($"【WCS更新任务状态】任务号:{taskRT.TaskId}无法匹配与执行中设备任务号,已作为遗留任务超时处理"); } } } } } }