StorageJob.cs 4.2 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 DateTime _getTime;
        private JobStep<StorageStep> storageStep;

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

        public bool IsEnd { get; private set; }

        public IJob Execute(AgvInfo info)
        {
            _info = info;
            if (storageStep.Equals(StorageStep.None))
            {
                if (_info.Is4DWorkshop())
                    MoveStorage();
                else
                    PassDoor();
            }
            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.NextStep(StorageStep.GetSingle);
                    storageStep.Msg = info.Name + "已到位,等待离开信号";
                    delayGetSignal = 0;
                    dockTime = 0;
                }
            }
            else if (storageStep.Equals(StorageStep.GetSingle))
            {
                if (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++;
                            MoveStorage();
                        }
                    }
                    delayGetSignal++;
                }
            }
            else if (storageStep.Equals(StorageStep.WaitStorageLeave))
            {
                if (SteelManage.FindStorageWorkLeave())
                {
                    SteelManage.StorageWorkDelLeave();
                    storageStep.Msg = info.Name + "收到离开信号";
                    return new StandbyJob();
                }
                else if (SteelManage.FindNewSteelWork(info))
                {
                    return new SendNewJob();
                }
            }
            else if (storageStep.Equals(StorageStep.Error))
            {
            }
            else if (storageStep.Equals(StorageStep.End))
            {
            }

            return this;
        }

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

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

        private enum StorageStep
        {
            None,
            End,
            PassDoor,
            MoveStorage,
            WaitStorage,
            GetSingle,
            WaitStorageLeave,
            Error
        }
    }
}