StorageJob.cs 6.5 KB
using System;
using Model;

namespace BLL
{
    public class StorageJob : IJob
    {
        private int delayGetSignal;  //延迟获取信号
        private int dockTime;        //停靠次数
        private AgvInfo _info;
        private MoveJob move;
        private string mission;
        private JobStep<StorageStep> storageStep;

        public StorageJob()
        {
            storageStep = new JobStep<StorageStep>(StorageStep.None);
            Common.log.Debug("加载StorageStep");
        }

        public bool IsEnd { get; private set; }

        public string Msg
        {
            get
            {
                return storageStep.Msg;
            }
        }

        public IJob Execute(AgvInfo info)
        {
            _info = info;
            if (storageStep.Equals(StorageStep.None))
            {
                _info.From = "";
                if (_info.Is4DWorkshop())
                    MoveStorage();
                else
                    PassDoor4D();
            }
            else if (storageStep.Equals(StorageStep.PassDoor))
            {
                move.Execute(_info);
                if (move.IsEnd)
                    MoveStorage();
            }
            else if (storageStep.Equals(StorageStep.MoveStorage))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    storageStep.Msg = info.Name + " 已到位,等待对接信号";
                    storageStep.NextStep(StorageStep.GetSingle);

                    delayGetSignal = 0;
                    dockTime = 0;
                }
            }
            else if (storageStep.Equals(StorageStep.GetSingle))
            {
                if (Common.StorageDockAlway || Common.StorageDockFinish)
                {
                    SteelManage.StorageWorkDel(_info.Place);
                    storageStep.Msg = info.Name + " 等待离开信号";
                    storageStep.NextStep(StorageStep.WaitStorageLeave);
                }
                else
                {
                    if (delayGetSignal >= 3)
                    {
                        if (dockTime >= 3)
                        {
                            storageStep.Msg = info.Name + " 对接仓库连续3次信号没有到位";
                            storageStep.NextStep(StorageStep.Error);
                            dockTime = 0;
                            //小车报警任务
                        }
                        else
                        {
                            dockTime++;
                            storageStep.Msg = info.Name + " 没有收到对接信号,重新发送";
                            MoveStorage();
                        }
                    }
                    delayGetSignal++;
                }
            }
            else if (storageStep.Equals(StorageStep.WaitStorageLeave))
            {
                if (SteelManage.FindStorageWorkLeave())
                {
                    SteelManage.StorageWorkDelLeave();
                    storageStep.Msg = info.Name + " 收到离开信号";

                    if (SteelManage.FindStorageWork(info))
                    {
                        if (_info.IsWorkspace())
                        {
                            storageStep.NextStep(StorageStep.FindLine);
                        }
                        else
                        {
                            PassDoor4C();
                        }
                    }
                    else
                        return new StandbyJob();
                }
            }
            else if (storageStep.Equals(StorageStep.BackDoor))
            {
                move.Execute(_info);
                if (move.IsEnd)
                    storageStep.NextStep(StorageStep.FindLine);
            }
            else if (storageStep.Equals(StorageStep.FindLine))
            {
                bool rtn = SteelManage.FindStorageWork(_info, out string place);
                if (rtn)
                {
                    FindLine(place);
                }
                else
                {
                    storageStep.Msg = info.Name + " 没有后续新钢板任务";
                    return new StandbyJob();
                }
            }
            else if (storageStep.Equals(StorageStep.MoveLine))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    SteelManage.StorageWorkDel(_info.Place);
                    storageStep.Msg = _info.Name + " 到达 " + _info.Place;
                    storageStep.NextStep(StorageStep.FindLine);
                }
            }
            else if (storageStep.Equals(StorageStep.Error))
            {
            }
            else if (storageStep.Equals(StorageStep.End))
            {
            }

            return this;
        }

        private void MoveStorage()
        {
            mission = Common.MISSION_MOVE_STORAGE;
            _info.Place = _info.Workshop + "_ENTER";
            move = new MoveJob(mission);
            move.Execute(_info);
            storageStep.NextStep(StorageStep.MoveStorage);
            storageStep.Msg = _info.Name + " 发送任务 " + mission;
        }

        private void PassDoor4C()
        {
            mission = Common.MISSION_PASS_DOOR_4C;
            _info.Place = "Pass Door";
            move = new MoveJob(mission);
            move.Execute(_info);
            storageStep.NextStep(StorageStep.BackDoor);
            storageStep.Msg = _info.Name + " 发送任务 " + mission;
        }

        private void PassDoor4D()
        {
            mission = Common.MISSION_PASS_DOOR_4D;
            _info.Place = "Pass Door";
            move = new MoveJob(mission);
            move.Execute(_info);
            storageStep.NextStep(StorageStep.PassDoor);
            storageStep.Msg = _info.Name + " 发送任务 " + mission;
        }

        private void FindLine(string place)
        {
            mission = Common.MISSION_MOVE_STEEL + place;
            _info.Place = place;
            move = new MoveJob(mission);
            move.Execute(_info);
            storageStep.NextStep(StorageStep.MoveLine);
            storageStep.Msg = _info.Name + " 发送任务 " + mission;
        }

        private enum StorageStep
        {
            None,
            End,
            PassDoor,
            BackDoor,
            BackDoorFinish,
            MoveStorage,
            WaitStorage,
            GetSingle,
            WaitStorageLeave,
            FindLine,
            MoveLine,
            Error
        }
    }
}