ToShelfPlaceJob.cs 6.9 KB
using DeviceLib.Model.AGV;

namespace DeviceLib.BLL
{
    public class ToShelfPlaceJob : ImpJob
    {
        /// <summary>
        /// 运送任务
        /// </summary>
        public ToShelfPlaceJob(JobParam jobParam) : base(jobParam)
        {
            JobName = "运输任务";
        }
        public override Job Run(Robot robot)
        {
            Job job = this;
            switch (JobRunStep.CurStep)
            {
                case RunStep.None:
                    ToNextStep(RunStep.DeliverShelf_01_Start, $"开始运输任务");
                    SetRobotState(robot, RobotState.忙碌中);
                    break;
                case RunStep.DeliverShelf_01_Start:
                    ToNextStep(RunStep.DeliverShelf_02_CrossDoor, $"准备去目标车间");
                    GenJobCallBack(this.GetType(), RunStep.DeliverShelf_03_CrossDoorSuccess, JobParam);
                    job = new CrossDoorJob(JobParam);
                    break;

                //case RunStep.DeliverShelf_02_CrossDoor:
                //    break;

                case RunStep.DeliverShelf_03_CrossDoorSuccess:
                    ToNextStep(RunStep.DeliverShelf_04_ToTmpPlace, $"准备去临时点");
                    GenJobCallBack(this.GetType(), RunStep.DeliverShelf_05_ToTmpPlaceSuccess, JobParam);
                    job = new TmpPlaceJob(JobParam);
                    break;
                //case RunStep.DeliverShelf_04_ToTmpPlace:
                //    break;

                case RunStep.DeliverShelf_05_ToTmpPlaceSuccess:
                    ToNextStep(RunStep.DeliverShelf_07_ToDst, $"在临时点停留完成");
                    break;

                case RunStep.DeliverShelf_06_ReadyToDst:
                    ToNextStep(RunStep.DeliverShelf_07_ToDst, $"去目标点");
                    MoveToNode(robot, JobParam.CurDstNode);
                    break;
                case RunStep.DeliverShelf_07_ToDst:
                    ToNextStep(RunStep.DeliverShelf_08_CheckAction, $"到达目标点");
                    GenJobCallBack(this.GetType(), RunStep.DeliveryShelf_15_ActionSuccess, JobParam);
                    break;
                case RunStep.DeliverShelf_08_CheckAction:
                    switch (JobParam.CurAction.ActionType)
                    {
                        case ActionType.PickShelf:
                            ToNextStep(RunStep.DeliverShelf_09_PickAction, $"执行拾取任务");
                            break;
                        case ActionType.PutShelf:
                            ToNextStep(RunStep.DeliverShelf_10_PutAction, $"执行放下任务");
                            break;
                        case ActionType.ManaulConfirm:
                            ToNextStep(RunStep.DeliverShelf_12_ManualConfirmAction, $"执行手动确认任务");
                            break;
                        case ActionType.GetShelfFromLift:
                            ToNextStep(RunStep.DeliverShelf_13_GetShelfFromLiftAction, $"执行从电梯取料任务");
                            break;
                        case ActionType.SendShelfToLift:
                            ToNextStep(RunStep.DeliverShelf_14_SendShelfToLiftAction, $"执行向电梯送料任务");
                            break;
                        case ActionType.CommonToLine:
                            ToNextStep(RunStep.DeliverShelf_11_CommLineAction, $"执行向线体通讯任务");
                            break;
                    }
                    break;

                case RunStep.DeliverShelf_09_PickAction:
                    job = new PickShelfJob(JobParam);
                    break;

                case RunStep.DeliverShelf_10_PutAction:
                    job = new PutShelfJob(JobParam);
                    break;

                case RunStep.DeliverShelf_11_CommLineAction:
                    job = new CommLineJob(JobParam);
                    break;
                case RunStep.DeliverShelf_12_ManualConfirmAction:
                    job = new ManualConfirmJob(JobParam);
                    break;

                case RunStep.DeliverShelf_13_GetShelfFromLiftAction:
                    job = new GetShelfFromLiftJob(JobParam);
                    break;
                case RunStep.DeliverShelf_14_SendShelfToLiftAction:
                    job = new SendShelfToLiftJob(JobParam);
                    break;

                case RunStep.DeliveryShelf_15_ActionSuccess:
                    JobParam.SetCurNodeFinished();
                    if (JobParam.HasNextDst())
                        ToNextStep(RunStep.DeliveryShelf_16_CheckNextDst, $"有下一个目的地");
                    else
                        ToNextStep(RunStep.DeliverShelf_17_CheckNextStep, $"无下一个目的地");
                    break;

                case RunStep.DeliveryShelf_16_CheckNextDst:
                    ToNextStep(RunStep.DeliverShelf_01_Start, $"去下一个目的地");
                    break;

                case RunStep.DeliverShelf_17_CheckNextStep:
                    if (JobParam.JobGoal.Equals(JobGoal.Get))
                    {
                        ToNextStep(RunStep.DeliverShelf_18_SendShelf, $"取料任务完成,准备执行送料任务");
                    }
                    else if (JobParam.JobGoal.Equals(JobGoal.Send))
                    {
                        if (JobParam.ReturnDstNode != null)
                        {
                            ToNextStep(RunStep.DeliverShelf_19_ReturnShelf, $"送料任务完成,准备执行料架返回任务");
                        }
                        else
                        {
                            ToNextStep(RunStep.DeliveryShelf_20_End, $"送料任务完成");
                        }
                    }
                    else if (JobParam.JobGoal.Equals(JobGoal.Return))
                    {
                        ToNextStep(RunStep.DeliveryShelf_20_End, $"料架返回任务完成");
                    }
                    else
                    {
                        ToNextStep(RunStep.DeliveryShelf_20_End, $"不存在的任务类型,直接结束");
                    }
                    break;

                case RunStep.DeliverShelf_18_SendShelf:
                    ToNextStep(RunStep.None, "执行送料任务");
                    SetOrderState(JobParam.OrderId, 3);
                    JobParam.JobGoal = JobGoal.Send;
                    break;

                case RunStep.DeliverShelf_19_ReturnShelf:
                    ToNextStep(RunStep.None, "执行料架返回任务");
                    SetOrderState(JobParam.OrderId, 4);
                    JobParam.JobGoal = JobGoal.Return;
                    break;

                case RunStep.DeliveryShelf_20_End:
                    SetOrderState(JobParam.OrderId, 100);
                    SetRobotState(robot, RobotState.空闲);
                    job = null;
                    break;
            }
            return job;
        }
    }
}