StorageJob.cs 7.7 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 = "STORAGE";
                _info.Place = "";
                dockTime = 0;
                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)
                {
                    delayGetSignal = 0;
                    _info.Place = "到达仓库";
                    storageStep.Msg = info.Name + " 已到位,等待对接信号";
                    storageStep.NextStep(StorageStep.GetSingle);
                }
            }
            else if (storageStep.Equals(StorageStep.GetSingle))
            {
                if (Common.StorageDockAlway || Common.StorageDockFinish)
                {
                    SteelManage.StorageWorkDel(_info.Workshop + "_ENTER");
                    SteelManage.StorageWorkDelLeave();
                    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 (_info.IsWorkspace())
                        storageStep.NextStep(StorageStep.End);
                    else
                        PassDoor4C();

                    //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.End);
            }
            //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.NewSteelWorkDel(_info.From, _info.Place);
            //        storageStep.Msg = _info.Name + " 到达 " + _info.Place;
            //        storageStep.NextStep(StorageStep.FindLine);
            //    }
            //}
            else if (storageStep.Equals(StorageStep.Error))
            {
                if (SteelManage.FindStorageWorkLeave())
                {
                    SteelManage.StorageWorkDelLeave();
                    storageStep.Msg = info.Name + " 收到离开信号";

                    if (_info.IsWorkspace())
                        storageStep.NextStep(StorageStep.End);
                    else
                        PassDoor4C();
                }
            }
            else if (storageStep.Equals(StorageStep.End))
            {
                //IsEnd = true;
                //return new SendNewJob();

                _info.Place = "";
                IJob job = SteelManage.GetNewSteelJob(info);
                if (job == null)
                {
                    return new StandbyJob();
                }
                else
                {
                    return job;
                }
            }

            return this;
        }

        private void MoveStorage()
        {
            mission = Common.MISSION_MOVE_STORAGE;
            _info.Place = "去仓库";
            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 = "去4C车间";
            move = new MoveJob(mission);
            move.Execute(_info);
            storageStep.NextStep(StorageStep.BackDoor);
            storageStep.Msg = _info.Name + " 去4C车间任务 " + mission;
        }

        private void PassDoor4D()
        {
            mission = Common.MISSION_PASS_DOOR_4D;
            _info.Place = "去4D车间";
            move = new MoveJob(mission);
            move.Execute(_info);
            storageStep.NextStep(StorageStep.PassDoor);
            storageStep.Msg = _info.Name + " 去4D车间任务 " + 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
        }
    }
}