StandbyJob.cs 3.1 KB
using System;
using Model;

namespace BLL
{
    public class StandbyJob : IJob
    {
        private AgvInfo _info;
        private MoveJob move;
        private string mission;
        private DateTime _getTime;
        private JobStep<StandbyStep> standbyStep;

        public StandbyJob()
        {
            standbyStep = new JobStep<StandbyStep>(StandbyStep.None);
            Common.log.Debug("加载StandbyJob");
        }

        public bool IsEnd { get; private set; }

        public IJob Execute(AgvInfo info)
        {
            _info = info;
            if (standbyStep.Equals(StandbyStep.None))
            {
                if (_info.IsWorkspace())
                    MoveStandby();
                else
                    PassDoor();
            }
            else if (standbyStep.Equals(StandbyStep.PassDoor))
            {
                move.Execute(_info);
                if (move.IsEnd)
                    MoveStandby();
            }
            else if (standbyStep.Equals(StandbyStep.MoveStandby))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    standbyStep.NextStep(StandbyStep.End);
                    standbyStep.Msg = _info.Name + "到达待机位";
                    _getTime = DateTime.Now;
                }
            }
            else if (standbyStep.Equals(StandbyStep.End))
            {
                if (_info.Battery <= _info.BatteryMin)
                {
                    standbyStep.Msg = _info.Name + "电量小于" + _info.BatteryMin + ",执行充电任务";
                    return new ChargeJob();
                }
                else
                {
                    TimeSpan span = DateTime.Now - _getTime;
                    if (span.TotalMinutes >= 2)
                    {
                        standbyStep.Msg = _info.Name + "在待机位停留超过2分钟,执行充电任务";
                        return new ChargeJob();
                    }
                    else
                    {
                        IJob job = SteelManage.GetSteelJob(info);
                        if (job != null) return job;
                    }
                }
            }

            return this;
        }

        private void MoveStandby()
        {
            mission = Common.MISSION_STANDBY + _info.Workshop;
            _info.Place = mission;
            move = new MoveJob(mission);
            move.Execute(_info);
            standbyStep.NextStep(StandbyStep.MoveStandby);
            standbyStep.Msg = _info.Name + "发送任务" + mission;
        }

        private void PassDoor()
        {
            mission = Common.MISSION_PASS_DOOR_INTO + _info.Workshop;
            _info.Place = mission;
            move = new MoveJob(mission);
            move.Execute(_info);
            standbyStep.NextStep(StandbyStep.PassDoor);
            standbyStep.Msg = _info.Name + "发送任务" + mission;
        }

        private enum StandbyStep
        {
            None,
            End,
            PassDoor,
            MoveStandby
        }


    }





}