TaskRunState.cs 3.1 KB
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Common;
namespace DeviceLibrary
{
    /// <summary>
    /// AGV任务运行信息
    /// </summary>
    public class TaskRunState
    {
        /// <summary>
        /// AGV任务ID
        /// </summary>
        public long TaskID { get; set; } = -1;

        /// <summary>
        /// 任务开始时间戳
        /// </summary>
        public string TaskTimeStamp { get; set; }
        /// <summary>
        /// 正在分配任务
        /// </summary>
        public bool IsAllocatingTask = false;
        /// <summary>
        /// AGV任务
        /// </summary>
        public AgvTask Task { get; set; } = new AgvTask();
        /// <summary>
        /// 等待任务执行队列
        /// </summary>
        public ConcurrentQueue<AgvTask> WaitExecuteTask = new ConcurrentQueue<AgvTask>();
        /// <summary>
        /// 任务状态
        /// </summary>
        public string TaskState { get; set; } = SettingString.Wait;
        /// <summary>
        /// 重置
        /// </summary>
        public void ResetInfo()
        {
            TaskID = -1;
            ResetState();
        }
        /// <summary>
        /// 重置状态
        /// </summary>
        public void ResetState()
        {
            TaskState = SettingString.Wait;
        }
        /// <summary>
        /// 检查任务是否分配成功,分配成功时任务id!=-1且能获取到任务状态
        /// </summary>
        /// <returns></returns>
        public bool CheckAllocateOk()
        {
            return !TaskID.Equals(-1) && !TaskState.Equals(SettingString.Wait);
        }
        public bool CheckTaskFinished(string name = "")
        {
            LogUtil.debug(name + " 检查任务是否结束: " + ToTaskState());
            return TaskState.Equals(SettingString.Done);
        }
        public void EnWaitTaskQueue(AgvTask task)
        {
            if (string.IsNullOrEmpty(task.Name) || task.Type.Equals(TaskType.InOut))
                return;
            WaitExecuteTask.Enqueue(task);
        }
        public bool DeWaitTaskQueue(out AgvTask task)
        {
            task = null;
            if (WaitExecuteTask.Count > 0)
            {
                if (WaitExecuteTask.TryDequeue(out task))
                {
                    return true;
                }
            }
            return false;
        }
        public void ClearWaitTaskQueue()
        {
            System.Threading.Tasks.Task.Factory.StartNew(new Action(() =>
            {
                while (WaitExecuteTask.Count > 0)
                {
                    WaitExecuteTask.TryDequeue(out AgvTask task);
                }
            }));
        }
        public string ToTaskInfo()
        {
            return $" [{Task.AliceName}] [{TaskID}] ";
        }
        public string ToTaskShowInfo()
        {
            return $" [{Task.AliceName}]\r\n[{TaskID}] ";
        }
        public string ToTaskState()
        {
            return $"[{Task.AliceName}] [{TaskID}] [{TaskState}]";
        }
    }
}