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

using System;
using Model;

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

        public MissionJob(string mission)
        {
            _times = 0;
            _mission = mission;

            IsEnd = false;
            missionStep = new JobStep<MissionStep>(MissionStep.Send);
            Common.log.Debug(string.Format("加载MissionJob[{0}]", _mission));
        }

        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;
            _info.MissionName = _mission;

            if (Common.FleetSend)
                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)
            {
                _times = 0;
                log = string.Format("MissionJob To:{0},[{1}]发送成功", _info.Name, _mission);
                Common.log.Info(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)
            //{
                bool rtn;
                string state;
                string log;

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

        private void Error()
        {
            Common.mir.Clear_Error(_info.IP, _info.Authorization);
            Common.mir.Del_Mission(_info.IP, _info.Authorization);
            Common.log.Info(string.Format("MissionJob To:{0},[{1}]重新发送", _info.Name, _mission));
            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
        }
    }
}