ToStoreJob.cs 6.0 KB
using Common;
using DeviceLib.Model.AGV;

namespace DeviceLib.BLL
{
    public class ToStoreJob : ImpJob
    {
        /// <summary>
        /// 运送任务
        /// </summary>
        public ToStoreJob(JobParam jobParam) : base(jobParam)
        {
            JobName = "去料仓取箱任务";
        }

        public override Job Run(Robot robot)
        {
            Job job = this;
            switch (JobRunStep.CurStep)
            {
                case RunStep.None:
                    ToNextStep(RunStep.ToStore_01_ToStore, $"开始运输任务,AGV无料箱面对接出料口");
                    SetRobotState(robot, RobotState.忙碌中);
                    MoveToStore(robot, JobParam.CurDstNode, GetNoneSide(robot));
                    SetOrderState(JobParam.OrderId, 1);
                    break;
                case RunStep.ToStore_01_ToStore:
                    if (MissionIsOk())
                    {
                        ToNextStep(RunStep.ToStore_02_RequestLeave, $"到达{JobParam.CurDstNode.Name},与出料口通讯");
                        GenJobCallBack(this.GetType(), RunStep.ToStore_03_EnterAGVOK, JobParam);
                        job = new CommLineJob(JobParam);
                    }
                    break;
                case RunStep.ToStore_02_RequestLeave:
                    break;
                case RunStep.ToStore_03_EnterAGVOK:
                    SetOrderState(JobParam.OrderId, 2);
                    ToNextStep(RunStep.ToStore_04_ReToStore, $"AGV空料箱面对接出料口");
                    MoveToStore(robot, JobParam.CurDstNode, GetEmptySide(robot));
                    JobParam.JobGoal = JobGoal.Send;
                    SetOrderState(JobParam.OrderId, 3);
                    break;
                case RunStep.ToStore_04_ReToStore:
                    if (MissionIsOk())
                    {
                        ToNextStep(RunStep.ToStore_05_RequestEnter, $"到达{JobParam.CurDstNode.Name},与出料口通讯");
                        GenJobCallBack(this.GetType(), RunStep.ToStore_06_LeaveAGVOK, JobParam);
                        job = new CommLineJob(JobParam);
                    }
                    break;
                case RunStep.ToStore_05_RequestEnter:
                    break;
                case RunStep.ToStore_06_LeaveAGVOK:
                    ToNextStep(RunStep.ToStore_07_CheckIsNeedToShelfPlace, $"检查是否需要去料架处");
                    SetOrderState(JobParam.OrderId, 4);
                    break;
                case RunStep.ToStore_07_CheckIsNeedToShelfPlace:
                    if (NeedToShelfPlace(robot,JobParam.FullBoxId, out string targetLines))
                    {
                        JobParam.LineNode = NodeManager.GetLineNodeByName(targetLines);
                        if (JobParam.LineNode != null)
                        {
                            ToNextStep(RunStep.ToStore_08_ToShelfPlace, $"有料架任务,去料架处。目的产线:{targetLines}");
                            JobParam.JobGoal = JobGoal.Send;
                            JobParam.TargetNodes.Clear();
                            JobParam.TargetNodes.AddRange(NodeManager.GetNodesState(AppConfigSetting.GetStrVal(Setting_Str.ShelfPlace, "B-1-1")));
                            JobParam.TargetNodes.AddRange(NodeManager.GetLineNodesState(targetLines));
                        }
                        else
                        {
                            ToNextStep(RunStep.ToStore_10_End, $"获取不到目标点位数据,结束任务:{targetLines}");
                            OrderManager.DeleteOrderById(JobParam.OrderId, out string res, true);

                        }
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(targetLines))
                        {
                            ToNextStep(RunStep.ToStore_10_End, $"目的产线为空,结束任务:{targetLines}");
                            OrderManager.DeleteOrderById(JobParam.OrderId, out string res, true);
                        }
                        else
                        {
                            JobParam.LineNode = NodeManager.GetLineNodeByName(targetLines);
                            if (JobParam.LineNode != null)
                            {
                                ToNextStep(RunStep.ToStore_09_ToLine, $"无料架任务,直接去产线。目标产线:{targetLines}");
                                JobParam.JobGoal = JobGoal.Send;
                                JobParam.TargetNodes.Clear();
                                JobParam.TargetNodes.AddRange(NodeManager.GetLineNodesState(targetLines));
                            }
                            else
                            {
                                ToNextStep(RunStep.ToStore_10_End, $"获取不到目标点位数据,结束任务:{targetLines}");
                                OrderManager.DeleteOrderById(JobParam.OrderId, out string res, true);
                            }
                        }

                    }
                    break;
                case RunStep.ToStore_08_ToShelfPlace:
                    Context.SetNodeOccupied(robot.id, "");
                    RobotManager.SetLoadInfo(robot.id, GetFullSide(robot, out string shelfId), ShelfType.Empty, shelfId);
                    job = new ToLinesJob(JobParam);
                    break;
                case RunStep.ToStore_09_ToLine:
                    Context.SetNodeOccupied(robot.id, "");
                    RobotManager.SetLoadInfo(robot.id, GetFullSide(robot, out shelfId), ShelfType.Empty, shelfId);
                    job = new ToLinesJob(JobParam);
                    break;
                case RunStep.ToStore_10_End:
                    Context.SetNodeOccupied(robot.id, "");
                    RobotManager.SetLoadInfo(robot.id, GetFullSide(robot, out shelfId), ShelfType.Empty, shelfId);
                    job = null;
                    break;
            }
            return job;
        }
    }
}