SendNewJob.cs 4.5 KB
using System;
using Model;

namespace BLL
{
    public class SendNewJob : IJob
    {
        private AgvInfo _info;
        private MoveJob move;
        private string mission;
        //private DateTime _getTime;
        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 = "";
                if (_info.IsWorkspace())
                    sendNewStep.NextStep(SendNewStep.FindLine);
                else
                    PassDoor();
            }
            else if (sendNewStep.Equals(SendNewStep.PassDoor))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    sendNewStep.NextStep(SendNewStep.FindLine);
                }
            }
            else if (sendNewStep.Equals(SendNewStep.FindLine))
            {
                bool rtn = SteelManage.FindNewSteelWork(_info, out string place);
                if (rtn)
                {
                    if (place == "STORAGE")
                    {
                        SteelManage.NewSteelWorkDel(_info.From, place);
                        return new StorageJob();
                    }
                    else
                    {
                        FindLine(place);
                    }
                }
                else
                {
                    sendNewStep.Msg = info.Name + " 没有后续新钢板任务";
                    sendNewStep.NextStep(SendNewStep.GoWashPoint);
                }
            }
            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);
                }
            }
            else if (sendNewStep.Equals(SendNewStep.GoWashPoint))
            {
                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;
            }
            else if (sendNewStep.Equals(SendNewStep.WaitWashPoint))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    _info.Place = "";
                    sendNewStep.NextStep(SendNewStep.End);
                    sendNewStep.Msg = _info.Name + " 到达" + _info.Workshop + "清洗点";
                }
            }
            else if (sendNewStep.Equals(SendNewStep.End))
            {
                IJob job = SteelManage.GetSteelJob(info);
                if (job == null)
                    return new StandbyJob();
                else
                    return job;
            }
            return this;
        }

        private void FindLine(string place)
        {
            mission = Common.MISSION_MOVE_STEEL + place;
            _info.Place = place;
            move = new MoveJob(mission);
            move.Execute(_info);
            sendNewStep.NextStep(SendNewStep.MoveLine);
            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,
            GoWashPoint,
            WaitWashPoint
        }
    }
}