StandbyJob.cs 3.7 KB
using System;
using Model;

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

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

        public bool IsEnd { get; private set; }

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

        public IJob Execute(AgvInfo info)
        {
            _info = info;
            if (standbyStep.Equals(StandbyStep.None))
            {
                _info.Place = "去待机位";
                _info.LogJson.SetMissionStart("回待机点任务", "待机位");

                SendStandby();
                _info.LogJson.SetMissionStep("开始执行任务", StandbyStep.None.ToString());

            }
            else if (standbyStep.Equals(StandbyStep.MoveStandby))
            {
                move.Execute(_info);
                if (move.IsEnd)
                {
                    _info.Place = "待机位";
                    _info.MissionName = "";
                    standbyStep.NextStep(StandbyStep.End);
                    standbyStep.Msg = _info.Name + " 到达待机位";
                    _info.LogJson.SetMissionStep("已到达待机位", StandbyStep.MoveStandby.ToString());

                }
            }
            else if (standbyStep.Equals(StandbyStep.End))
            {
                IsEnd = true;

                if (_info.Battery <= Common.BatteryMin)
                {
                    if (Common.AutoCharge)
                    {
                        _info.Place = "";
                        standbyStep.Msg = string.Format("{0} 电量小于{1}%,执行充电任务", _info.Name, Common.BatteryMin);
                        return new ChargeJob();
                    }
                    else
                    {
                        standbyStep.Msg = string.Format("{0} 电量小于{1}%,不在执行任务,并且没有打开自动充电。", _info.Name, Common.BatteryMin);
                    }
                }
                else
                {
                    IJob job = ManageWork.GetJob();
                    if (job == null)
                    {
                        if (_info.Battery <= Common.BatteryIdle)
                        {
                            if (Common.AutoCharge)
                            {
                                _info.Place = "";
                                standbyStep.Msg = string.Format("{0} 空闲并且电量小于{1}%,执行充电任务", _info.Name, Common.BatteryIdle);
                                return new ChargeJob();
                            }
                        }
                        standbyStep.Msg = string.Format("{0} 空闲,当前电量{1}%", _info.Name, _info.Battery);
                    }
                    else
                    {
                        _info.Place = "";
                        return job;
                    }
                }
            }

            return this;
        }



        private void SendStandby()
        {
            mission = Common.MISSION_STANDBY;
            _info.ExistShelf = -1;
            move = new MissionJob(mission);
            move.Execute(_info);
            standbyStep.NextStep(StandbyStep.MoveStandby);
            standbyStep.Msg = string.Format("{0} 去待机位,[{1}]", _info.Name, mission);
        }

        private enum StandbyStep
        {
            None,
            End,
            MoveStandby
        }


    }





}