JobType.cs 5.2 KB
using Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    public class JobType
    {
        public JobType()
        {
        }
        public virtual Job GetNewJob(Agv_Info agv)
        {
            return null;
        }

        /// <summary>
        /// 需要离开料架
        /// </summary>
        /// <param name="agv"></param>
        /// <param name="nodeName"></param>
        /// <param name="rfid"></param>
        /// <param name="empty">料架类型</param>
        /// <returns></returns>
       public static bool FindNeedLeave(Agv_Info agv, string nodeName, out string rfid, bool empty)
        {
            rfid = "";
            int nodeIdx = Context.FindNode(nodeName);
            if (nodeIdx > -1)
            {
                if (!empty)
                    nodeIdx = Context.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.Action.Equals(Agv.ClientAction.NeedLeave) && s.Shelf.Equals(Agv.ClientShelf.Full));
                else
                    nodeIdx = Context.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.Action.Equals(Agv.ClientAction.NeedLeave));
                if (nodeIdx > -1)
                {
                    if (Context.nodeInfo[nodeIdx].RFID.StartsWith(SettingString.ReelString_RFID_Prefix))
                    {
                        rfid = Context.nodeInfo[nodeIdx].RFID;
                        return true;
                    }
                    else
                    {
                        agv.AddDisplayBoard(nodeName, "Using." + nodeName, "出口为出料任务,但是RFID状态异常:rfid="+ Context.nodeInfo[nodeIdx].RFID);
                    }
                }
            }
            else
            {
                agv.AddDisplayBoard(nodeName, "Using." + nodeName, "调用关闭");
            }
            return false;
        }
        /// <summary>
        /// 需要进入料架
        /// </summary>
        /// <param name="agv"></param>
        /// <param name="nodeName"></param>
        /// <param name="empty">料架类型</param>
        /// <returns></returns>
        static bool FindNeedEnter(Agv_Info agv, string nodeName, bool empty)
        {
            int nodeIdx = Context.FindNode(nodeName);
            if (nodeIdx > -1)
            {
                if (empty)
                    nodeIdx = Context.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.Action.Equals(Agv.ClientAction.NeedEnter) &&
                    (s.Shelf.Equals(Agv.ClientShelf.Empty) || s.Shelf.Equals(Agv.ClientShelf.None)));
                else
                    nodeIdx = Context.nodeInfo.FindIndex(s => s.Name.Equals(nodeName) && s.Action.Equals(Agv.ClientAction.NeedEnter) &&
                    s.Shelf.Equals(Agv.ClientShelf.Full));
                if (nodeIdx > -1)
                    return true;
            }
            else
            {
                agv.AddDisplayBoard(nodeName, "Using." + nodeName, "调用关闭");
            }
            return false;
        }

        /// <summary>
        /// 寻找需要进料架[满/空]的节点
        /// </summary>
        /// <param name="agv"></param>
        /// <param name="nodeName"></param>
        /// <param name="empty">需要的料架类型,默认是空料架</param>
        /// <returns></returns>
        public static bool FindNeedEnterMission(Agv_Info agv, string nodeName, bool empty)
        {

            if (FindNeedEnter(agv, nodeName, empty))
            {
                int idx = Context.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null &&
                (
                s.CurJob is SendShelfJob && (((SendShelfJob)s.CurJob).TargetPlace.Equals(nodeName)) ||
                s.CurJob is RecycleEmptyShelf && (((RecycleEmptyShelf)s.CurJob).TargetPlace.Equals(nodeName))
                    ));
                if (idx == -1)
                {
                    LogUtil.debug(string.Format("{0} FindNeedEnterMission ", agv.Name));
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// 查询节点出料架[满/空]任务
        /// </summary>
        /// <param name="agv"></param>
        /// <param name="nodeName"></param>
        /// <param name="RFID"></param>
        /// <param name="empty">料架类型</param>
        /// <returns></returns>
        public static bool FindNeedLeaveMission(Agv_Info agv, string nodeName, out string RFID,bool empty)
        {
            RFID = "";
            if (FindNeedLeave(agv, nodeName, out string rfid,empty))
            {

                int idx = Context.agvInfo.FindIndex(s => !s.IP.Equals(agv.IP) && s.CurJob != null &&
                (
                (s.CurJob is GetShelfJob && (((GetShelfJob)s.CurJob).TargetPlace.Equals(nodeName)))||
                 (s.CurJob is GetFullShelfJob && (((GetFullShelfJob)s.CurJob).TargetPlace.Equals(nodeName)))
                )
                );
                if (idx == -1)
                {
                    RFID = rfid;
                    LogUtil.debug(string.Format("{0} FindNeedLeaveMission", agv.Name));
                    return true;
                }
            }
            return false;
        }
    }
}