SendNewJob.cs 9.0 KB
using System;
using Model;

namespace BLL
{
    public class SendNewJob : IJob
    {
        private AgvInfo _info;
        private MoveJob move;
        private string mission;
        private string airPlace;
        private JobStep<SendNewStep> sendNewStep;
        
        public SendNewJob()
        {
            sendNewStep = new JobStep<SendNewStep>(SendNewStep.None);
            Common.log.Debug("加载SendNewStep");
        }

        public bool IsEnd { get; private set; }

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

        public IJob Execute(AgvInfo info)
        {
            _info = info;
            if (sendNewStep.Equals(SendNewStep.None))
            {
                _info.Place = "";
                _info.LogJson.SetMissionStart("查找送新钢板任务", "产线");
                _info.LogJson.SetMissionStep("开始执行任务", SendNewStep.None.ToString());

                if (_info.IsWorkspace())
                    sendNewStep.NextStep(SendNewStep.FindLine);
                else
                    PassDoor();
            }
            else if (sendNewStep.Equals(SendNewStep.PassDoor))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    _info.LogJson.SetMissionStep("已过门", SendNewStep.PassDoor.ToString());
                    sendNewStep.NextStep(SendNewStep.FindLine);
                }
            }
            else if (sendNewStep.Equals(SendNewStep.FindLine))
            {
                //_info.LogJson.SetMissionStep("查找任务", SendNewStep.FindLine.ToString());
                bool rtn = SteelManage.FindNewSteelWork(_info, out string place);
                if (rtn)
                {
                    airPlace = place;
                    if (SteelManage.IsAirLines(place))
                    {
                        if (_info.In4CAirRoom())
                        {
                            MoveLine(place);
                        }
                        else
                        {
                            sendNewStep.Msg = _info.Name + " 先暂停" + place;
                            EnterAirAccess();
                        }
                    }
                    else
                    {
                        if (_info.In4CAirRoom())
                        {
                            sendNewStep.Msg = _info.Name + " 先暂停" + place;
                            LeaveAirAccess();
                        }
                        else
                        {
                            if (place == "STORAGE")
                            {
                                SteelManage.NewSteelWorkDel(_info.From, place);
                                return new StorageJob();
                            }
                            else
                            {
                                MoveLine(place);
                            }
                        }
                    }
                }
                else
                {
                    //sendNewStep.Msg = info.Name + " 没有后续新钢板任务";
                    //sendNewStep.NextStep(SendNewStep.GoWashPoint);



                    sendNewStep.Msg = info.Name + " 没有后续新钢板任务";
                    if (_info.In4CAirRoom())
                    {
                        airPlace = "$WASH";
                        sendNewStep.Msg = _info.Name + " 先暂停去清洗点";
                        LeaveAirAccess();
                    }
                    else
                    {
                        sendNewStep.NextStep(SendNewStep.GoWashPoint);
                    }
                }
            }
            else if (sendNewStep.Equals(SendNewStep.EnterAirRoom))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    sendNewStep.Msg = _info.Name + " 已进入4C无尘室";
                    MoveLine(airPlace);
                    _info.LogJson.SetMissionStep("已进入无尘室", SendNewStep.EnterAirRoom.ToString());
                }
            }
            else if (sendNewStep.Equals(SendNewStep.LeaveAirRoom))
            {
               
                move.Execute(_info);
                if (move.IsEnd)
                {
                    _info.LogJson.SetMissionStep("已离开无尘室", SendNewStep.LeaveAirRoom.ToString());
                    sendNewStep.Msg = _info.Name + " 已离开4C无尘室";
                    if (airPlace == "$WASH")
                    {
                        MoveWash();
                    }
                    else if (airPlace == "STORAGE")
                    {
                        SteelManage.NewSteelWorkDel(_info.From, airPlace);
                        return new StorageJob();
                    }
                    else
                    {
                        MoveLine(airPlace);
                    }
                }
            }
            else if (sendNewStep.Equals(SendNewStep.MoveLine))
            {
                
                move.Execute(_info);
                if (move.IsEnd)
                {
                    SteelManage.NewSteelWorkDel(_info.From, _info.Place);
                    sendNewStep.Msg = _info.Name + " 到达" + _info.Place;
                    sendNewStep.NextStep(SendNewStep.FindLine);
                    _info.LogJson.SetMissionStep("到达" + _info.Place, SendNewStep.MoveLine.ToString());
                }
            }
            else if (sendNewStep.Equals(SendNewStep.GoWashPoint))
            {
                //_info.LogJson.SetMissionStep("去清洗房", SendNewStep.GoWashPoint.ToString());
                MoveWash();
            }
            else if (sendNewStep.Equals(SendNewStep.WaitWashPoint))
            {
               
                move.Execute(_info);
                if (move.IsEnd)
                {
                    _info.Place = "";
                    sendNewStep.NextStep(SendNewStep.End);
                    sendNewStep.Msg = _info.Name + " 到达" + _info.Workshop + "清洗房";
                    _info.LogJson.SetMissionStep("到达清洗房", SendNewStep.WaitWashPoint.ToString());
                }
            }
            else if (sendNewStep.Equals(SendNewStep.End))
            {
                //_info.LogJson.SetMissionStep("送新钢板任务结束", SendNewStep.End.ToString());
                IJob job = SteelManage.GetSteelJob(info);
                if (job == null)
                    return new StandbyJob();
                else
                    return job;
            }
            return this;
        }

        private void MoveLine(string place)
        {
            //if (place == "STORAGE")
            //{
            //    SteelManage.NewSteelWorkDel(_info.From, place);
            //    return new StorageJob();
            //}
            //else
            //{
           
            //}
            _info.Place = place;
            mission = Common.MISSION_MOVE_STEEL + place;
            move = new MoveJob(mission);
            move.Execute(_info);
            sendNewStep.NextStep(SendNewStep.MoveLine);
            sendNewStep.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);
            sendNewStep.NextStep(SendNewStep.WaitWashPoint);
            sendNewStep.Msg = _info.Name + " 发送回清洗点任务 " + mission;
        }

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

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

        private void PassDoor()
        {
            mission = Common.MISSION_PASS_DOOR_INTO + _info.Workshop;
            _info.Place = string.Format("去{0}车间", _info.Workshop);
            move = new MoveJob(mission);
            move.Execute(_info);
            sendNewStep.NextStep(SendNewStep.PassDoor);
            sendNewStep.Msg = _info.Name + " 发送过车间门任务 " + mission;
        }

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