TakeOldJob.cs 7.9 KB
using System;
using Model;

namespace BLL
{
    public class TakeOldJob : IJob
    {
        private AgvInfo _info;
        private MoveJob move;
        private string mission;
        private string airPlace;
        private JobStep<TakeOldStep> takeOldStep;

        public TakeOldJob()
        {
            takeOldStep = new JobStep<TakeOldStep>(TakeOldStep.None);
            Common.log.Debug("加载TakeOldJob");
            SteelManage.OldSteelWorkDelTimeout();
        }

        public bool IsEnd { get; private set; }

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

        public IJob Execute(AgvInfo info)
        {
            _info = info;
            if (takeOldStep.Equals(TakeOldStep.None))
            {
                _info.From = "";
                _info.Place = "";
                _info.OldSteel = 0;
                _info.LogJson.SetMissionStart("查找回收钢板任务", "产线");
                _info.LogJson.SetMissionStep("开始执行任务", TakeOldStep.None.ToString());

                takeOldStep.Msg = _info.Name + " 查找回收钢板任务";
                takeOldStep.NextStep(TakeOldStep.FindLine);
            }
            else if (takeOldStep.Equals(TakeOldStep.FindLine))
            {
                //_info.LogJson.SetMissionStep("判断钢板数量", TakeOldStep.FindLine.ToString());

                if (_info.OldSteel == 5)
                {
                    takeOldStep.Msg = _info.Name + " 回收钢板已满";
                    if (_info.InAirRoom())
                    {
                        airPlace = "$WASH";
                        LeaveAirAccess();
                    }
                    else
                    {
                        takeOldStep.NextStep(TakeOldStep.GoWashPoint);
                    }
                }
                else
                {
                    FindLine();
                }
            }
            else if (takeOldStep.Equals(TakeOldStep.EnterAirRoom))
            {

                move.Execute(_info);
                if (move.IsEnd)
                {
                    _info.LogJson.SetMissionStep("已进入无尘室", TakeOldStep.EnterAirRoom.ToString());
                    takeOldStep.Msg = _info.Name + " 已进入无尘室";
                    MoveLine(airPlace);
                }
            }
            else if (takeOldStep.Equals(TakeOldStep.LeaveAirRoom))
            {

                move.Execute(_info);
                if (move.IsEnd)
                {
                    _info.LogJson.SetMissionStep("已离开无尘室", TakeOldStep.LeaveAirRoom.ToString());
                    takeOldStep.Msg = _info.Name + " 已离开无尘室";
                    if (airPlace == "$WASH")
                        MoveWash();
                    else
                        MoveLine(airPlace);
                }
            }
            else if (takeOldStep.Equals(TakeOldStep.MoveLine))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    _info.OldSteel++;
                    SteelManage.OldSteelWorkDel(_info.Place);
                    takeOldStep.NextStep(TakeOldStep.FindLine);
                    takeOldStep.Msg = _info.Name + " 到达" + _info.Place;
                    _info.LogJson.SetMissionStep("到达" + _info.Place, TakeOldStep.MoveLine.ToString());
                }
            }
            else if (takeOldStep.Equals(TakeOldStep.GoWashPoint))
            {
                //_info.LogJson.SetMissionStep("判断回收钢板数量", TakeOldStep.GoWashPoint.ToString());
                if (_info.OldSteel == 0)
                {
                    takeOldStep.NextStep(TakeOldStep.End);
                    takeOldStep.Msg = _info.Name + " 回收钢板数量为0,结束任务";
                }
                else
                {
                    MoveWash();
                }
            }
            else if (takeOldStep.Equals(TakeOldStep.WaitWashPoint))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    takeOldStep.NextStep(TakeOldStep.End);
                    takeOldStep.Msg = _info.Name + " 到达" + _info.Workshop + "清洗房";
                    _info.LogJson.SetMissionStep("到达" + _info.Workshop + "清洗房", TakeOldStep.WaitWashPoint.ToString());
                }
            }
            else if (takeOldStep.Equals(TakeOldStep.End))
            {
                //_info.LogJson.SetMissionStep("回收钢板任务结束", TakeOldStep.End.ToString());
                _info.OldSteel = 0;

                IJob job = SteelManage.GetSteelJob(_info);
                if (job == null)
                    return new StandbyJob();
                else
                    return job;
            }

            return this;
        }

        private void FindLine()
        {
            bool rtn = SteelManage.FindOldSteelWork(_info, out string place);
            if (rtn)
            {
                airPlace = place;
               
                if (SteelManage.IsAirLines(place))
                {
                    if (_info.InAirRoom())
                        MoveLine(place);
                    else
                    {
                        takeOldStep.Msg = _info.Name + " 先暂停" + place;
                        EnterAirAccess();
                    }
                }
                else
                {
                    if (_info.InAirRoom())
                    {
                        takeOldStep.Msg = _info.Name + " 先暂停" + place;
                        LeaveAirAccess();
                    }
                    else
                        MoveLine(place);
                }
            }
            else
            {
                takeOldStep.Msg = _info.Name + " 没有后续旧钢板任务";
                if (_info.InAirRoom())
                {
                    airPlace = "$WASH";
                    takeOldStep.Msg = _info.Name + " 先暂停去清洗点";
                    LeaveAirAccess();
                }
                else
                {
                    takeOldStep.NextStep(TakeOldStep.GoWashPoint);
                }
            }
        }

        private void MoveLine(string place)
        {
            _info.Place = place;
            mission = Common.MISSION_MOVE_STEEL + place;
            move = new MoveJob(mission);
            move.Execute(_info);
            takeOldStep.NextStep(TakeOldStep.MoveLine);
            takeOldStep.Msg = _info.Name + " 发送回收钢板任务 " + mission;
        }

        private void MoveWash()
        {
            mission = Common.MISSION_MOVE_WASH + _info.Workshop;
            _info.Place = string.Format("去{0}清洗点", _info.Workshop);
            move = new MoveJob(mission);
            move.Execute(_info);
            takeOldStep.NextStep(TakeOldStep.WaitWashPoint);
            takeOldStep.Msg = _info.Name + " 发送回清洗点任务 " + mission;
        }

        private void EnterAirAccess()
        {
            mission = Common.MISSION_ENTER_AIR;
            _info.Place = "进入风淋门";
            move = new MoveJob(mission);
            move.Execute(_info);
            takeOldStep.NextStep(TakeOldStep.EnterAirRoom);
            takeOldStep.Msg = _info.Name + " 发送进入风淋门任务 " + mission;
        }

        private void LeaveAirAccess()
        {
            mission = Common.MISSION_LEAVE_AIR;
            _info.Place = "离开风淋门";
            move = new MoveJob(mission);
            move.Execute(_info);
            takeOldStep.NextStep(TakeOldStep.LeaveAirRoom);
            takeOldStep.Msg = _info.Name + " 发送离开风淋门任务 " + mission;
        }


        private enum TakeOldStep
        {
            None,
            FindLine,
            MoveLine,
            EnterAirRoom,
            LeaveAirRoom,
            GoWashPoint,
            WaitWashPoint,
            End
        }
    }
}