ShelfBackLiftToStoreJob.cs 10.9 KB
using Common;
using DeviceLibrary.manager;
using System.Data.Entity.Infrastructure;

namespace DeviceLibrary.bean.job
{
    /// <summary>
    /// 1F,电梯到库房,中间一个电梯(空架返回)
    /// </summary>
    public class ShelfBackLiftToStoreJob : Job
    {
        /// <summary>
        /// 1F空架返回任务
        /// </summary>
        public ShelfBackLiftToStoreJob(JobParam jobParam) : base(jobParam)
        {
        }
        public ShelfBackLiftToStoreJob() : base()
        {

        }
        public override Job Run(AgvInfo agv)
        {
            Job job = this;
            agv.SetJobContext(new bean.agv.JobContext()
            {
                MissionId = JobParam.GetMissionInfo().missionId,
                AgvTask = agv.TaskRunState.Task,
                JobFullName = this.ToString(),
                JobStep = JobRunStep.PreStep(),
                Name = agv.Name,
                JobParam = JobParam
            });
            if (JobRunStep.IsStep(RunStep.NONE))
            {
                if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
                {
                    JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_01_ToStandby);
                    runInfo = $"{JobParam.SrcNode.AliceName}有小车,去待机点";
                    JobRunStep.Msg = runInfo;
                    ToStandby(agv);
                }
                else
                {
                    JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_01_ToLift);
                    runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
                    JobRunStep.Msg = runInfo;
                    ToLift(agv, $"{JobParam.SrcNode.Name}");
                }
            }

            else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_01_ToStandby))
            {
                if (TargetIsOccupied(agv, JobParam.SrcNode.Name))
                {

                }
                else
                {
                    JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_01_ToLift);
                    runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
                    JobRunStep.Msg = runInfo;
                    ToLift(agv, $"{JobParam.SrcNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_01_ToLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_02_01_WaitLiftDoorOpen);
                    //上报状态
                    manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                        service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
                        $"到达{JobParam.SrcNode.Name}"));
                    runInfo = $"到达{JobParam.SrcNode.AliceName},等待门开启";
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_02_01_WaitLiftDoorOpen))
            {
                if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().sourceFloor))
                {
                    JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_02_02_EnterLift);
                    runInfo = $"{JobParam.SrcNode.AliceName}门已开启,去取料点";
                    //任务状态变更
                    lift.LiftContext.SetLiftOccupiedAgv(JobParam.SrcNode.Name, agv.IP);
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯到达, out string msg);
                    ToPutShelfOn(agv, $"{JobParam.SrcNode.Name}");
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_02_02_EnterLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_03_PutShelfOn);
                    runInfo = $"到达{JobParam.SrcNode.AliceName}取料点,开始取料车";
                    JobRunStep.Msg = runInfo;
                    PutLiftShelfOn(agv, JobParam.SrcNode.Name);
                    //AllocateTask(agv, $"{SettingString.PutShelfOn}_{JobParam.SrcNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_03_PutShelfOn))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_04_LeaveLift);
                    //上报状态
                    manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                        service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
                        $"电梯取车"));
                    runInfo = $"在{JobParam.SrcNode.AliceName}取料车完成,准备离开";
                    JobRunStep.Msg = runInfo;
                    //AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}");
                    LeaveLift(agv, JobParam.SrcNode.Name);
                }
            }
            else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_04_LeaveLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_05_CloseLiftDoor);
                    //关门
                    bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv, false);
                    runInfo = $"离开{JobParam.SrcNode.AliceName},关闭电梯门:{rtn}";
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回离开电梯, out string msg);
                    JobRunStep.Msg = runInfo;
                    ClearLiftNodeOccupied(agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_05_CloseLiftDoor))
            {
                if (NodeManager.NeedCrossDoor(agv, JobParam.SrcNode, JobParam.CurTargetNode, out bool isin, out bool isair))
                {
                    JobParam.CrossDoor.CurNode = JobParam.SrcNode;
                    JobParam.CrossDoor.NextNode = JobParam.CurTargetNode;
                    JobParam.CrossDoor.IsIn = isin;
                    JobParam.CrossDoor.IsAir = isair;
                    GenJobCallBack(this.GetType(), RunStep.ShelfBack_LiftToStore_06_CrossDoor, JobParam);
                    job = new CrossDoorJob(JobParam);
                }
                else
                {
                    JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_06_CrossDoor);
                }

            }
            else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_06_CrossDoor))
            {
                JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_06_ToStore);
                runInfo = $"去{JobParam.CurTargetNode.AliceName}放料点";
                //任务状态变更
                MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回起始地, out string msg);
                ToTakeShelfOff(agv, $"{JobParam.CurTargetNode.Name}");
                JobRunStep.Msg = runInfo;
            }
            else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_06_ToStore))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_07_TakeShelfOff);
                    //上报状态
                    manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                        service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
                        $"到达{JobParam.CurTargetNode.Name}"));
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}放料点,卸下料车";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, SettingString.TakeShelfOff);
                }
            }
            else if (JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_07_TakeShelfOff))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    runInfo = $"在{JobParam.CurTargetNode.AliceName}卸下料车完成";
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.完成, out string msg);
                    JobRunStep.Msg = runInfo;
                    if (IsProjectType(service.model.ProjectType.移远成品入库))
                    {
                        manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                            service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
                            $"卸货{JobParam.CurTargetNode.Name}"));
                    }
                    else
                        //上报状态
                        manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                            service.model.TransportStatus.TypeStr.status, agv.Name, agv.Place.Name, service.model.TransportStatus.ModeStr.auto,
                            $"还车"));
                    if (NodeManager.NeedCrossDoor(agv, JobParam.CurTargetNode, JobParam.SrcNode, out bool isin, out bool isair))
                    {
                        JobParam.CrossDoor.CurNode = JobParam.CurTargetNode;
                        JobParam.CrossDoor.NextNode = JobParam.SrcNode;
                        JobParam.CrossDoor.IsIn = isin;
                        JobParam.CrossDoor.IsAir = isair;
                        GenJobCallBack(this.GetType(), RunStep.ShelfBack_LiftToStore_07_CrossDoor, JobParam);
                        job = new CrossDoorJob(JobParam);
                    }
                    else
                    {
                        JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_07_CrossDoor);
                    }
                }
            }
            else if(JobRunStep.IsStep(RunStep.ShelfBack_LiftToStore_07_CrossDoor))
            {
                JobRunStep.ToNextStep(RunStep.END);
            }
            else if (JobRunStep.IsStep(RunStep.END))
            {
                job = null;
            }
            return job;
        }
    }
}