AgvTaskManager.cs 8.6 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 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(string.Format("任务名{0}不存在,请检查配置文件!", name));
            return new AgvTask();
        }
        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
            {
                string[] names = taskname.Split('_');
                foreach (string item in names)
                {
                    node = manager.NodeManager.GetNodeByName(item);
                    if (node != null)
                        break;
                }

            }

            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;
        }
        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;
        }
        /// <summary>
        /// 删除任务
        /// </summary>
        /// <returns></returns>
        public static void DelMission(AgvInfo agv)
        {
            if (agv.UseFleet)
            {
                MiR_API.Del_Mission_Fleet(agv);
            }
            else
            {
                MiR_API.Del_Mission(agv);
            }
            LogUtil.info(string.Format("{0} DelMission[{1}]OK", agv.Name, agv.TaskRunState.ToTaskInfo()));

        }
    }
}