StandbyJob.cs 4.2 KB
using AGVControl_Steel;

namespace Model
{
    public class StandbyJob : Job
    {
        private string id;
        private JobStep<StandbyStep> standbyStep;

        public StandbyJob()
        {
            standbyStep = new JobStep<StandbyStep>(StandbyStep.None);
        }

        public override Job Execute(AgvInfo info)
        {
            if (standbyStep.IsEqual(StandbyStep.None))
            {
                if (info.IsSelfWorkshop())
                    MoveStandby(info);
                else
                    MoveDoor(info);
            }
            else if (standbyStep.IsEqual(StandbyStep.WaitWorkshopDoor))
            {
                rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
                if (rtn)
                {
                    if (state == MissionState.Done.ToString())
                        MoveStandby(info);
                    else if (state == MissionState.Aborted.ToString())
                        standbyStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
                }
                else
                {
                    standbyStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
                }
            }
            else if (standbyStep.IsEqual(StandbyStep.WaitStandby))
            {
                rtn = Common.mir.Get_MissionState_Fleet(info.Authorization, id, out string state);
                if (rtn)
                {
                    if (state == MissionState.Done.ToString())
                    {
                        standbyStep.Msg = info.FullName + "已在待机位";
                        standbyStep.NextStep(StandbyStep.End);
                    }
                    else if (state == MissionState.Aborted.ToString())
                    {
                        standbyStep.Msg = info.FullName + "任务状态" + MissionState.Aborted.ToString();
                    }
                }
                else
                {
                    standbyStep.Msg = info.FullName + "获取任务状态id[" + id + "]失败";
                }
            }
            else if (standbyStep.IsEqual(StandbyStep.End))
            {
                if (info.Battery <= info.BatteryMin)
                {
                    Common.log.Info(info.FullName + "电量小于" + info.BatteryMin + ",执行充电任务");
                    return new ChargeJob();
                }
                else
                {
                    Job job = Common.steelManage.GetSteelJob(info);
                    if (job != null) return job;
                }
            }
            return this;
        }

        private void MoveDoor(AgvInfo info)
        {
            if (info.Workshop == Common.WORKSHOP_4D)
                mission = Common.MISSION_MOVE_4C_4D;
            else if (info.Workshop == Common.WORKSHOP_4C)
                mission = Common.MISSION_MOVE_4D_4C;

            rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
            if (rtn)
            {
                standbyStep.Msg = info.FullName + "在" + info.Workshop + "车间,先过车间门";
                standbyStep.NextStep(StandbyStep.WaitWorkshopDoor);
            }
            else
            {
                standbyStep.Msg = info.FullName + "发送" + mission + "任务失败";
            }
        }

        private void MoveStandby(AgvInfo info)
        {
            if (info.Workshop == Common.WORKSHOP_4D)
                mission = Common.MISSION_STANDBY_4D;
            else if (info.Workshop == Common.WORKSHOP_4C)
                mission = Common.MISSION_STANDBY_4C;

            rtn = Common.mir.Add_Mission_Fleet(info.FleetID, info.Authorization, mission, out id);
            if (rtn)
            {
                info.Place = "待机位";
                standbyStep.Msg = info.FullName + "回待机位" + mission;
                standbyStep.NextStep(StandbyStep.WaitStandby);
            }
            else
            {
                standbyStep.Msg = info.FullName + "发送" + mission + "任务失败";
            }
        }

        private enum StandbyStep
        {
            None,
            WaitWorkshopDoor,
            WaitStandby,
            End
        }
    }
}