StorageJob.cs 8.8 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 = "";
                _info.LogJson.SetMissionStart("去仓库任务", "仓库");
                _info.LogJson.SetMissionStep("开始执行任务", StorageStep.None.ToString());

                dockTime = 0;
                if (_info.Is4DWorkshop())
                    MoveStorage();
                else
                    PassDoor4D();
            }
            else if (storageStep.Equals(StorageStep.PassDoor))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    MoveStorage();
                    _info.LogJson.SetMissionStep("已过门", StorageStep.PassDoor.ToString());
                }
            }
            else if (storageStep.Equals(StorageStep.MoveStorage))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    delayGetSignal = 0;
                    _info.Place = "到达仓库";
                    storageStep.Msg = info.Name + " 已到位,等待对接信号";
                    storageStep.NextStep(StorageStep.GetSingle);
                    _info.LogJson.SetMissionStep("到达仓库", StorageStep.MoveStorage.ToString());
                }
            }
            else if (storageStep.Equals(StorageStep.GetSingle))
            {
                //_info.LogJson.SetMissionStep("等待离开信号", StorageStep.GetSingle.ToString());

                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;
                            _info.LogJson.SetMissionStep("对接仓库连续3次信号没有到位", StorageStep.GetSingle.ToString());
                        }
                        else
                        {
                            dockTime++;
                            storageStep.Msg = info.Name + " 没有收到对接信号,重新发送";
                            MoveStorage();
                        }
                    }
                    delayGetSignal++;
                }
            }
            else if (storageStep.Equals(StorageStep.WaitStorageLeave))
            {

                if (SteelManage.FindStorageWorkLeave())
                {
                    SteelManage.StorageWorkDelLeave();
                    storageStep.Msg = info.Name + " 收到离开信号";
                    _info.LogJson.SetMissionStep("收到离开信号", StorageStep.WaitStorageLeave.ToString());

                    if (_info.IsWorkspace())
                        storageStep.NextStep(StorageStep.FindJob);
                    else
                        PassDoor4C();
                }
                else
                {
                }
            }
            else if (storageStep.Equals(StorageStep.BackDoor))
            {
              
                move.Execute(_info);
                if (move.IsEnd)
                {
                    storageStep.NextStep(StorageStep.FindJob);
                    _info.LogJson.SetMissionStep("已过门", StorageStep.BackDoor.ToString());
                }
            }
            else if (storageStep.Equals(StorageStep.Error))
            {
                //_info.LogJson.SetMissionStep("信号没有到位", StorageStep.Error.ToString());

                if (SteelManage.FindStorageWorkLeave())
                {
                    SteelManage.StorageWorkDelLeave();
                    storageStep.Msg = info.Name + " 收到离开信号";

                    if (_info.IsWorkspace())
                        storageStep.NextStep(StorageStep.FindJob);
                    else
                        PassDoor4C();
                }
            }
            else if (storageStep.Equals(StorageStep.FindJob))
            {
                //_info.LogJson.SetMissionStep("查找任务", StorageStep.FindJob.ToString());
                IJob job = SteelManage.GetNewSteelJob(info);
                if (job == null)
                {
                    storageStep.Msg = info.Name + " 没有找到仓库送新钢板任务,回清洗点";
                    storageStep.NextStep(StorageStep.GoWashPoint);
                }
                else
                {
                    _info.Place = "";
                    IsEnd = true;
                    return job;
                }
            }
            else if(storageStep.Equals(StorageStep.GoWashPoint))
            {
                //_info.LogJson.SetMissionStep("去清洗房", StorageStep.GoWashPoint.ToString());

                mission = Common.MISSION_MOVE_WASH + _info.Workshop;
                _info.Place = string.Format("去{0}清洗点", _info.Workshop);
                move = new MoveJob(mission);
                move.Execute(_info);
                storageStep.NextStep(StorageStep.WaitWashPoint);
                storageStep.Msg = _info.Name + " 发送回清洗点任务 " + mission;
            }
            else if (storageStep.Equals(StorageStep.WaitWashPoint))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    _info.Place = "";
                    storageStep.NextStep(StorageStep.End);
                    storageStep.Msg = _info.Name + " 到达" + _info.Workshop + "清洗房";
                    _info.LogJson.SetMissionStep("到达清洗房", StorageStep.WaitWashPoint.ToString());
                }
            }
            else if (storageStep.Equals(StorageStep.End))
            {
                //_info.LogJson.SetMissionStep("去仓库任务结束", StorageStep.End.ToString());
                return new StandbyJob();
            }

            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,
            FindJob,
            GoWashPoint,
            WaitWashPoint,
            Error
        }
    }
}