MoveJob.cs 3.5 KB
using System;
using Model;

namespace BLL
{
    public class MoveJob : IJob
    {
        private string _id;
        private string _mission;
        private AgvInfo _info;
        private DateTime _getTime;
        private JobStep<MoveStep> moveStep;
        
        public MoveJob(string mission)
        {
            IsEnd = false;
            _mission = mission;
            moveStep = new JobStep<MoveStep>(MoveStep.Send);
        }

        public bool IsEnd { get; private set; }

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

        public IJob Execute(AgvInfo info)
        {
            _info = info;
            if (moveStep.Equals(MoveStep.Send))
                Send();
            else if (moveStep.Equals(MoveStep.Working))
                Working();
            else if (moveStep.Equals(MoveStep.Error))
                Error();
            else if (moveStep.Equals(MoveStep.End))
                IsEnd = true;

            return this;
        }





        private void Send()
        {
            bool rtn;
            if (Common.FLEET_SEND)
                rtn = Common.mir.Add_Mission_Fleet(_info.FleetID, _info.Authorization, _mission, out _id);
            else
                rtn = Common.mir.Add_Mission(_info.IP, _info.Authorization, _mission, out _id);
            if (rtn)
            {
                Common.log.Debug("MoveJob To:" + _info.Name + ", " + _mission + " 发送成功");
                moveStep.NextStep(MoveStep.Working);
                _getTime = DateTime.Now;
            }
            else
            {
                Common.log.Warn("MoveJob To:" + _info.Name + ", " + _mission + " 发送失败");
            }
        }

        private void Working()
        {
            TimeSpan span = DateTime.Now - _getTime;
            if (span.TotalMilliseconds > 5000)
            {
                bool rtn;
                string state;
                if (Common.FLEET_SEND)
                    rtn = Common.mir.Get_MissionState_Fleet(_info.Authorization, _id, out state);
                else
                    rtn = Common.mir.Get_MissionState(_info.IP, _info.Authorization, _id, out state);
                if (rtn)
                {
                    Common.log.Debug("MoveJob To:" + _info.Name + ", " + _mission + ", " + state.ToString());
                    if (state == MissionState.Done.ToString())
                        moveStep.NextStep(MoveStep.End);
                    else if (state == MissionState.Aborted.ToString())
                        moveStep.NextStep(MoveStep.Error);
                    else if (state == MissionState.Executing.ToString())
                        _getTime = DateTime.Now;
                }
                else
                {
                    Common.log.Warn("MoveJob To:" + _info.Name + ", " + _mission + " 获取状态失败");
                }
            }
        }

        private void Error()
        {
            Common.log.Debug("MoveJob To:" + _info.Name + ", " + _mission + " 重新发送");
            Common.mir.Clear_Error(_info.IP, _info.Authorization);
            Common.mir.Del_Mission(_info.IP, _info.Authorization);
            moveStep.NextStep(MoveStep.Send);
        }

        private enum MoveStep
        {
            Send,
            Working,
            Error,
            End
        }

        private enum MissionState
        {
            Aborted,
            Executing,
            Done,
            Pending
        }
    }
}