F1StoreToLiftJob.cs 18.7 KB
using Common;
using DeviceLibrary.bean;
using DeviceLibrary.manager;
using System;

namespace DeviceLibrary
{
    /// <summary>
    /// 1F,库房到电梯(满料运送)
    /// </summary>
    public class F1StoreToLiftJob : Job
    {
        /// <summary>
        /// 1F满架运送任务
        /// </summary>
        public F1StoreToLiftJob(JobParam jobParam) : base(jobParam)
        {
        }
        lift.LiftStatus liftStatus;
        public override Job Run(AgvInfo agv)
        {

            if (JobRunStep.IsStep(RunStep.NONE))
            {
                JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_01_ToStore);
                runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}取料点";
                JobRunStep.Msg = runInfo;
                //任务状态变更
                MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.接料, out string msg);
                AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}");

            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_01_ToStore))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_02_PutShelfOn);
                    runInfo = $"到达{JobParam.SrcNode.AliceName}取料点,拾取料车";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, SettingString.PutShelfOn);
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_02_PutShelfOn))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_03_ToLift);
                    runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,去{JobParam.CurTargetNode.AliceName}";
                    JobRunStep.Msg = runInfo;
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg);
                    //开始请求电梯
                    lift.LiftContext.Request(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo());
                    AllocateTask(agv, JobParam.CurTargetNode.Name);
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_03_ToLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_04_CheckLiftStatus);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName},等待开门";
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_04_CheckLiftStatus))
            {
                if (lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name,JobParam.GetMissionInfo().sourceFloor))
                {
                    if (lift.LiftContext.HasShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out lift.LiftStatus liftStatus))
                    {
                        JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_01_ToTemp1);
                        runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有料车,去临时点1的卸料点,准备卸下车上料车";
                        JobRunStep.Msg = runInfo;
                        AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
                        service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
                        if(missionInfo!=null)
                        {
                            //任务状态变更
                            MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回电梯到达, out string msg);
                        }
                    }
                    else
                    {
                        JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_06_01_EnterLift);
                        runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点";
                        JobRunStep.Msg = runInfo;
                        AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}");
                    }
                }
                else if (!lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo()))
                {
                    //请求电梯
                    lift.LiftContext.Request(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo());
                    System.Threading.Thread.Sleep(2000);
                }
            }
            #region 电梯内有料车
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_01_ToTemp1))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_02_TakeShelfOffAtTemp1);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}的临时点1,将车上料车卸下";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.TakeShelfOff}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_02_TakeShelfOffAtTemp1))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_03_ToLift);
                    runInfo = $"在{JobParam.CurTargetNode.AliceName}将车上料车卸在临时点1完成,去电梯口";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_03_ToLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_04_EnterLift);
                    runInfo = $"到{JobParam.CurTargetNode.AliceName}的取料点";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.PutShelfOn}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_04_EnterLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_05_PutShelfOn);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}的取料点,准备拾取料车";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.PutShelfOn}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_05_PutShelfOn))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_06_LeaveLift);
                    runInfo = $"拾取{JobParam.CurTargetNode.AliceName}的料车完成,准备离开";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_06_LeaveLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_07_ToTemp2);
                    runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,前往临时点2的放料点";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp2}_{SettingString.TakeShelfOff}");
                    //电梯空,切换电梯控制权
                    lift.LiftContext.SwitchControl(JobParam.CurTargetNode.Name,JobParam.GetMissionInfo());
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_07_ToTemp2))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_08_TakeShelfOffAtTemp2);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}临时点2,准备放下料车";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.TakeShelfOff}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_08_TakeShelfOffAtTemp2))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_09_ToTemp1);
                    runInfo = $"将料车放到{JobParam.CurTargetNode.AliceName}的临时点2完成,去临时点1的取料点";
                    JobRunStep.Msg = runInfo;
                    service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
                    if (missionInfo != null)
                    {
                        //任务状态变更
                        MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回离开电梯, out string msg);
                    }
                    AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp1}_{SettingString.PutShelfOn}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_09_ToTemp1))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_10_PutTemp1ShelfOn);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}的临时点1的取料点,准备取料";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.PutShelfOn}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_10_PutTemp1ShelfOn))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_11_ToLift);
                    runInfo = $"取临时点1的料车完成,去{JobParam.CurTargetNode.AliceName}";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{JobParam.CurTargetNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_11_ToLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_12_EnterLift);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName},准备到放料点";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.TakeShelfOff}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_12_EnterLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_13_TakeShelfOffAtLift);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}的放料点,准备卸下";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.TakeShelfOff}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_13_TakeShelfOffAtLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_14_LeaveLift);
                    runInfo = $"料车在{JobParam.CurTargetNode.AliceName}卸下完成,离开电梯";
                    JobRunStep.Msg = runInfo;
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.到达电梯, out string msg);
                    AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_14_LeaveLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_15_ToTemp2);
                    runInfo = $"离开{JobParam.CurTargetNode.AliceName}完成,去临时点2的取料点";
                    JobRunStep.Msg = runInfo;
                    //关电梯门
                    //lift.LiftContext.CloseDoor(JobParam.CurTargetNode.Name);
                    //去指定层
                    lift.LiftContext.RunTo(JobParam.CurTargetNode.Name, int.Parse(JobParam.GetMissionInfo().destinationWorkshop.Substring(0, 1)));
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.电梯运行, out string msg);
                    AllocateTask(agv, $"{JobParam.CurTargetNode.Name}_{SettingString.Temp2}_{SettingString.PutShelfOn}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_15_ToTemp2))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_16_PutTemp2ShelfOn);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}的临时点2,准备拾取料车";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.PutShelfOn}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_16_PutTemp2ShelfOn))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    Node node = NodeManager.GetNode(liftStatus.destinationPoint);
                    if (node != null)
                    {
                        JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_17_ToStore);
                        JobParam.SrcNode = node;
                        runInfo = $"拾取{JobParam.CurTargetNode.AliceName}临时点2的料车完成,将该料车送回{JobParam.SrcNode.AliceName}的放料点";
                        JobRunStep.Msg = runInfo;
                        service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
                        if (missionInfo != null)
                        {
                            //任务状态变更
                            MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.返回起始地, out string msg);
                        }
                        AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.TakeShelfOff}");
                    }

                    else
                    {
                        runInfo = $"拾取{JobParam.CurTargetNode.AliceName}临时点2的料车完成,获取料车目的地不存在:{liftStatus.destinationPoint}";
                        JobRunStep.Msg = runInfo;
                    }
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_17_ToStore))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_05_18_TakeShelfOff);
                    runInfo = $"到达{JobParam.SrcNode.AliceName}的放料点,准备卸下料车";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.TakeShelfOff}");

                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_05_18_TakeShelfOff))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.END);
                    runInfo = $"任务结束:在{JobParam.SrcNode.AliceName}卸下料车完成";
                    service.model.MissionInfo missionInfo = manager.MissionManager.GetMission(liftStatus.missionId);
                    if (missionInfo != null)
                    {
                        //任务状态变更
                        MissionManager.SetMissionState(missionInfo.missionId, service.model.MissionState.完成, out string msg);
                    }
                    JobRunStep.Msg = runInfo;
                }
            }
            #endregion

            #region 电梯内无料车
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_06_01_EnterLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_06_02_TakeShelfOffAtLift);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}放料点,准备卸下料车";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.TakeShelfOff}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_06_02_TakeShelfOffAtLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.S1F_StoreToLift_06_03_LeaveLift);
                    runInfo = $"料车在{JobParam.CurTargetNode.AliceName}卸下完成,准备离开";
                    JobRunStep.Msg = runInfo;
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.到达电梯, out string msg);
                    AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.S1F_StoreToLift_06_03_LeaveLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.END);
                    runInfo = $"任务结束:离开{JobParam.CurTargetNode.AliceName}完成";
                    JobRunStep.Msg = runInfo;
                    lift.LiftContext.RunTo(JobParam.CurTargetNode.Name,JobParam.GetMissionInfo().destinationFloor);
                }
            }
            #endregion
            else if (JobRunStep.IsStep(RunStep.END))
            {
                JobRunStep.EndJob();
                return null;
            }
            return this;
        }

    }
}