MissionJob.cs 4.4 KB
/*
 * 这是一个子job,只运行一个小车任务,需要其他job来调用
 * 
 */

using System;
using Model;

namespace BLL
{
    public class MissionJob : IJob
    {
        private string _id;
        private string _mission;
        private bool _fleetSend;
        private AgvInfo _info;
        private int _times;  //发送次数
        private DateTime _getTime;  //用于调用API的间隔时间
        private JobStep<MissionStep> missionStep;

        public MissionJob(string mission)
        {
            _times = 0;
            IsEnd = false;
            _mission = mission;
            _fleetSend = Common.fleetSend;
            missionStep = new JobStep<MissionStep>(MissionStep.Send);
        }

        public bool IsEnd { get; private set; }

        public IJob Execute(AgvInfo info)
        {
            _info = info;
            if (missionStep.Equals(MissionStep.Send))
                Send();
            else if (missionStep.Equals(MissionStep.Working))
                Working();
            else if (missionStep.Equals(MissionStep.Error))
                Error();
            else if (missionStep.Equals(MissionStep.End))
                IsEnd = true;
            return this;
        }



        private void Send()
        {
            bool rtn;
            string log;

            if (_fleetSend)
                rtn = MiR_API.Add_Mission_Fleet(_info.FleetID, _info.Authorization, _mission, out _id);
            else
                rtn = MiR_API.Add_Mission(_info.IP, _info.Authorization, _mission, out _id);

            if (rtn)
            {
                _times = 0;
                log = string.Format("MissionJob To:{0},[{1}]发送成功", _info.Name, _mission);
                Common.log.Debug(log);
                _getTime = DateTime.Now;
                missionStep.NextStep(MissionStep.Working);
            }
            else
            {
                _times++;
                log = string.Format("MissionJob To:{0},[{1}]发送失败{2}次", _info.Name, _mission, _times);
                Common.log.Warn(log);
            }
        }

        private void Working()
        {
            TimeSpan span = DateTime.Now - _getTime;
            if (span.TotalMilliseconds >= 5000)  //间隔5s取一次任务状态
            {
                bool rtn;
                string state;
                string log;

                if (_fleetSend)
                    rtn = MiR_API.Get_MissionState_Fleet(_info.Authorization, _id, out state);
                else
                    rtn = MiR_API.Get_MissionState(_info.IP, _info.Authorization, _id, out state);

                if (rtn)
                {
                    log = string.Format("MissionJob To:{0},[{1}]任务状态{2}", _info.Name, _mission, state);
                    Common.log.Debug(log);
                    if (state == MissionState.Done.ToString())
                        missionStep.NextStep(MissionStep.End);
                    else if (state == MissionState.Aborted.ToString())
                        missionStep.NextStep(MissionStep.Error);
                    else if (state == MissionState.Executing.ToString())
                        _getTime = DateTime.Now;
                    else if (state == MissionState.Pending.ToString())
                        _getTime = DateTime.Now;
                }
                else
                {
                    log = string.Format("MissionJob To:{0},[{1}]获取状态失败", _info.Name, _mission);
                    Common.log.Warn(log);
                }
            }
        }

        private void Error()
        {
            Common.log.Debug(string.Format("MissionJob To:{0},[{1}]重新发送", _info.Name, _mission));
            MiR_API.Clear_Error(_info.IP, _info.Authorization);
            MiR_API.Del_Mission(_info.IP, _info.Authorization);
            missionStep.NextStep(MissionStep.Send);
        }

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

        private enum MissionState
        {
            /// <summary>
            /// 异常
            /// </summary>
            Aborted,
            /// <summary>
            /// 正在执行
            /// </summary>
            Executing,
            /// <summary>
            /// 未发送(fleet收到任务,还未分配给小车)
            /// </summary>
            Pending,
            /// <summary>
            /// 完成
            /// </summary>
            Done
        }
    }
}