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

196 lines
7.7 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 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
{
/// <summary>
/// A线单次请求标志
/// </summary>
public static bool LineAIsAvailable = true;
/// <summary>
/// B线单次请求标志
/// </summary>
public static bool LineBIsAvailable = true;
/// <summary>
/// C线单次请求标志
/// </summary>
public static bool LineCIsAvailable = true;
/// <summary>
/// D线单次请求标志
/// </summary>
public static bool LineDIsAvailable = true;
/// <summary>
/// AB线单次请求标志
/// </summary>
public static bool LineABIsAvailable = true;
/// <summary>
/// CD线单次请求标志
/// </summary>
public static bool LineCDIsAvailable = true;
/// <summary>
/// 自动完成处于一定时间内【放货中】状态的环穿【实垛】遗留任务
/// </summary>
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}已作为遗留任务处理");
}
//}
}
}
}
/// <summary>
/// 自动完成处于一定时间内【放货完成】状态的环穿遗留任务
/// 该原因可能是由于某些因素使程序意外关闭导致的
/// </summary>
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}已作为遗留任务处理");
}
/// <summary>
/// 防错机制(处理长时间可能未正常完成遗留任务记录)---获取下发时间距离当前时间较长的任务
/// 将其任务号与执行中的小车匹配
/// 判断该任务是否已经执行完成---完成则视为遗留任务处理
/// </summary>
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}无法匹配与执行中设备任务号,已作为遗留任务超时处理");
}
}
}
}
}
}