ToLinesJob.cs 3.3 KB
using DeviceLib.Model.AGV;

namespace DeviceLib.BLL
{
    public class ToLinesJob : ImpJob
    {
        /// <summary>
        /// 运送任务
        /// </summary>
        public ToLinesJob(JobParam jobParam) : base(jobParam)
        {
            JobName = "运输料箱任务";
        }
        public override Job Run(Robot robot)
        {
            Job job = this;
            switch (JobRunStep.CurStep)
            {
                case RunStep.None:
                    if(NodeManager.CheckNodeIsOccupied(JobParam.LineNode))
                    {
                        ToNextStep(RunStep.ToLine_05_ToTmpPlace, $"{JobParam.LineNode.name}有小车,去临时点");
                        GenJobCallBack(this.GetType(), RunStep.ToLine_01_CheckTarget, JobParam);
                        job = new TmpPlaceJob(JobParam);
                    }
                    else
                    {
                        ToNextStep(RunStep.ToLine_01_CheckTarget, $"{JobParam.LineNode.name}无小车");
                    }
                    break;
                case RunStep.ToLine_01_CheckTarget:
                    ToNextStep(RunStep.ToLine_01_ToPlace, $"开始运输任务,去目标点");
                    SetRobotState(robot, RobotState.忙碌中);
                    SetOrderState(JobParam.OrderId, 5);
                    Context.SetNodeOccupied(robot.id, JobParam?.LineNode?.name ?? "");
                    MoveToNode(robot, JobParam.CurDstNode);
                    break;
                case RunStep.ToLine_01_ToPlace:
                    if (MissionIsOk())
                    {
                        ToNextStep(RunStep.ToLine_02_ConfirmProcess, $"到达目标点");
                        GenJobCallBack(this.GetType(), RunStep.ToLine_02_ConfirmProcess, JobParam);
                        job = new ManualConfirmJob(JobParam);
                    }
                    break;
                case RunStep.ToLine_02_ConfirmProcess:
                    JobParam.SetCurNodeFinished();
                    if (JobParam.HasNextDst())
                        ToNextStep(RunStep.ToLine_03_CheckNextLine, $"有下一个目的地");
                    else
                    {
                        ToNextStep(RunStep.ToLine_04_LeaveLine, $"无下一个目的地,离开线体");
                        MoveToNode(robot, Common.Setting_Str.outplace);
                        if (JobParam.OrderId.StartsWith("A"))
                            RobotManager.SetLoadInfo(robot.id, GetFullSide(robot, out string shelfId), ShelfType.Empty, shelfId);
                    }

                    break;
                case RunStep.ToLine_03_CheckNextLine:
                    ToNextStep(RunStep.ToLine_01_ToPlace, $"去下一任务点");
                    MoveToNode(robot, JobParam.CurDstNode);
                    break;

                case RunStep.ToLine_04_LeaveLine:
                    if(MissionIsOk())
                    {
                        ToNextStep(RunStep.ToLine_04_Finish, $"任务结束");
                        Context.SetNodeOccupied(robot.id,"");
                    }
                    break;
                case RunStep.ToLine_04_Finish:
                    SetOrderState(JobParam.OrderId, 100);
                    SetRobotState(robot, RobotState.空闲);
                    job = null;
                    break;
            }
            return job;
        }
    }
}