AgvTaskManager.cs 9.1 KB
using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DeviceLibrary
{
    /// <summary>
    /// AGV任务管理
    /// </summary>
    public class AgvTaskManager
    {
        /// <summary>
        /// 任务列表
        /// </summary>
        public static List<AgvTask> AgvTasks;

        /// <summary>
        /// 加载任务
        /// </summary>
        public static void InitAgvTask()
        {
            try
            {
                AgvTasks = new List<AgvTask>();
                manager.XmlConfigOperation.LoadTaskInfos(AgvTasks);
            }
            catch (Exception ex)
            {
                LogUtil.error("加载AGV任务失败", ex);
            }

        }
        public static void ReloadAgvTask()
        {
            try
            {
                List<AgvTask> tasks = new List<AgvTask>();
                manager.XmlConfigOperation.LoadTaskInfos(tasks);
                AgvTasks = tasks;
            }
            catch (Exception ex)
            {
                MessageBox.Show("重载任务配置失败" + ex.StackTrace, "提示");
            }

        }
        public static void InitView(ComboBox comboBox, AgvInfo agv)
        {
            comboBox.DisplayMember = "AliceName";
            comboBox.ValueMember = "Name";
            List<AgvTask> tasks = AgvTaskManager.AgvTasks.FindAll(s => s.TypeId.Equals(agv.FleetIP));
            foreach (AgvTask mission in tasks)
            {
                comboBox.Items.Add(mission);
            }
            comboBox.SelectedItem = GetTaskByName($"{SettingString.Init}", agv);
        }
        /// <summary>
        /// 根据id获取任务
        /// </summary>
        /// <param name="taskName"></param>
        /// <returns></returns>
        //public static AgvTask GetTaskById(int id)
        //{
        //    AgvTask task = AgvTasks.Find(s => s.Id.Equals(id));
        //    if (task != null)
        //        return task;
        //    else
        //        LogUtil.error(string.Format("任务Id={0}不存在,请检查配置文件!", id));
        //    return new AgvTask();
        //}
        /// <summary>
        /// 根据任务名获取任务
        /// </summary>
        /// <returns></returns>
        public static AgvTask GetTaskByName(string name, AgvInfo agv)
        {
            AgvTask task = AgvTasks.Find(s => s.Name.Equals(name) && agv.FleetIP.Equals(s.TypeId));
            if (task != null)
                return task.ToCopy();
            else
                LogUtil.error($"{agv.Name}任务名{name}不存在,请检查配置文件!");
            return new AgvTask();
        }
        public static bool IsExistTask(string name,AgvInfo agv)
        {
            AgvTask task = AgvTasks.Find(s => s.Name.Equals(name) && agv.FleetIP.Equals(s.TypeId));
            if (task != null)
                return true;
            return false;
        }
        public static AgvTask GetTaskByAliceName(string aliceName)
        {
            AgvTask mission = AgvTasks.Find(s => s.AliceName.Equals(aliceName));
            if (mission != null)
                return mission;
            else
                LogUtil.error(string.Format("任务[{0}]不存在,请检查!", aliceName));
            return new AgvTask();
        }
        /// <summary>
        /// 向小车发送任务
        /// </summary>
        /// <returns></returns>
        public static bool AssignMission(AgvInfo agv, string taskname)
        {
            bool rtn = false;
            AgvTask task = GetTaskByName(taskname, agv);
            Node node = null;
            if (taskname.Contains($"{SettingString.Standby}"))
            {
                node = new Node() { Name = $"{agv.Name}{SettingString.Standby}", AliceName = $"{agv.Name}待机位", Type = NodeType.Standby };
            }
            else
            {
                node = manager.NodeManager.GetNodeByName(taskname);
                if (node == null)
                {
                    string[] names = taskname.Split('_');
                    foreach (string item in names)
                    {
                        node = manager.NodeManager.GetNodeByName(item);
                        if (node != null)
                            break;
                    }
                }                
            }

            if (task != null&& !string.IsNullOrEmpty(task.Guid))
            {
                agv.TaskRunState.Task = task;
                if (node != null)
                    agv.Place = node;
                //else
                //{
                //    agv.Place = new Node() { Name= taskname,AliceName= taskname };
                //}
                if (!agv.IsCon)
                {
                    agv.TaskRunState.ResetInfo();
                    if (!agv.TaskRunState.CheckTaskExist(task))
                    {
                        agv.TaskRunState.EnWaitTaskQueue(task);
                        LogUtil.info(string.Format("{0} 离线,[{1}]加入任务等待队列 ", agv.Name, task.AliceName));
                    }
                    return false;
                }
                if (agv.UseFleet)
                {
                    rtn = MiR_API.Add_Mission_Fleet(agv);
                    MiR_API.State_Ready(agv);
                    if (rtn)
                    {
                        LogUtil.info(string.Format("{0} Add Mission Fleet[{1}]Success", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                    else
                    {
                        LogUtil.info(string.Format("{0} Add Mission Fleet[{1}]Fail", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                }
                else
                {
                    rtn = MiR_API.Add_Mission(agv);
                    MiR_API.State_Ready(agv);
                    if (rtn)
                    {
                        LogUtil.info(string.Format("{0} Add Mission[{1}]Success", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    } 
                    else
                    {
                        LogUtil.info(string.Format("{0} AddMission[{1}]Fail", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                }
                agv.StateKanban.SetCurTask(agv.TaskRunState.ToTaskShowInfo());
                if (!rtn)
                {
                    if (!agv.TaskRunState.CheckTaskExist(task))
                    {
                        agv.TaskRunState.EnWaitTaskQueue(task);
                        LogUtil.info(string.Format("{0} 发送失败,[{1}]加入任务等待队列 ", agv.Name, task.AliceName));
                    }
                }
            }
            return rtn;
        }
        public static bool AssignMission(AgvInfo agv, DeviceLibrary.bean.ChargePile chargePile, AgvTask task)
        {
            bool rtn = false;
            Node node = new Node() { Name = chargePile.Name, AliceName = chargePile.AliceName, Type = NodeType.AutoCharge };
            if (task != null)
            {
                agv.TaskRunState.Task = task;
                if (node != null)
                    agv.Place = node;
                if (!agv.IsCon)
                {
                    agv.TaskRunState.ResetInfo();
                    if (!agv.TaskRunState.CheckTaskExist(task))
                    {
                        agv.TaskRunState.EnWaitTaskQueue(task);
                        LogUtil.info(string.Format("{0} 离线,[{1}]加入任务等待队列 ", agv.Name, task.AliceName));
                    }
                    return false;
                }
                if (agv.UseFleet)
                {
                    rtn = MiR_API.Add_Mission_Fleet(agv);
                    MiR_API.State_Ready(agv);
                    if (rtn)
                    {
                        LogUtil.info(string.Format("{0} Add Mission Fleet[{1}]Success", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                    else
                    {
                        LogUtil.info(string.Format("{0} Add Mission Fleet[{1}]Fail", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                }
                else
                {
                    rtn = MiR_API.Add_Mission(agv);
                    MiR_API.State_Ready(agv);
                    if (rtn)
                    {
                        LogUtil.info(string.Format("{0} Add Mission[{1}]Success", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                    else
                    {
                        LogUtil.info(string.Format("{0} Add Mission[{1}]Fail", agv.Name, agv.TaskRunState.ToTaskInfo()));
                    }
                }
                agv.StateKanban.SetCurTask(agv.TaskRunState.ToTaskShowInfo());
                if (!rtn)
                {
                    if (!agv.TaskRunState.CheckTaskExist(task))
                    {
                        agv.TaskRunState.EnWaitTaskQueue(task);
                        LogUtil.info(string.Format("{0} 发送失败,[{1}]加入任务等待队列 ", agv.Name, task.AliceName));
                    }
                }
            }
            return rtn;
        }
    }
}