LineToLiftJob.cs 17.3 KB
using Common;
using DeviceLibrary.bean;
using DeviceLibrary.bean.job;
using DeviceLibrary.lift;
using DeviceLibrary.manager;
using DeviceLibrary.service.model;
using System;
using System.Threading;

namespace DeviceLibrary
{
    /// <summary>
    /// 线体取料车送到电梯任务
    /// </summary>
    public class LineToLiftJob : Job
    {
        /// <summary>
        /// 1F满架运送任务
        /// </summary>
        public LineToLiftJob(JobParam jobParam) : base(jobParam)
        {
        }
        public LineToLiftJob() : 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))
            {
                JobParam.CrossDoor.CurNode = agv.Place;
                JobParam.CrossDoor.NextNode = JobParam.SrcNode;
                if (NodeManager.NeedCrossDoor(agv,JobParam.CrossDoor.CurNode,JobParam.CrossDoor.NextNode, out bool isin, out bool isair))
                {
                    JobParam.CrossDoor.IsIn = isin;
                    JobParam.CrossDoor.IsAir = isair;
                    GenJobCallBack(this.GetType(), RunStep.LineToLift_00_CrossDoor, JobParam);
                    job = new CrossDoorJob(JobParam);
                }
                else
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_00_CrossDoor);
                }


            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_00_CrossDoor))
            {
                JobRunStep.ToNextStep(RunStep.LineToLift_01_ToLine);
                runInfo = $"去{JobParam.SrcNode.AliceName}的取料点";
                ToPutShelfOn(agv, $"{JobParam.SrcNode.Name}");
                JobRunStep.Msg = runInfo;
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_01_ToLine))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_02_PutShelfOn);
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.接料, out string msg);
                    //上报状态
                    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;
                    PutShelfOn(agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_02_PutShelfOn))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv))
                {
                    //上报状态
                    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.CrossDoor.CurNode = JobParam.SrcNode;
                    JobParam.CrossDoor.NextNode = JobParam.CurTargetNode;
                    if (NodeManager.NeedCrossDoor(agv, JobParam.CrossDoor.CurNode,JobParam.CrossDoor.NextNode, out bool isin, out bool isair))
                    {
                        JobParam.CrossDoor.IsIn = isin;
                        JobParam.CrossDoor.IsAir = isair;
                        GenJobCallBack(this.GetType(), RunStep.LineToLift_02_CrossDoor, JobParam);
                        job = new CrossDoorJob(JobParam);
                    }
                    else
                    {
                        JobRunStep.ToNextStep(RunStep.LineToLift_02_CrossDoor);
                    }
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_02_CrossDoor))
            {

                if (TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_ToStandby);
                    if (agv.Scope.Workshop.Equals("1F"))
                    {
                        ToStandby(agv);
                        runInfo = $"{JobParam.CurTargetNode.AliceName}有小车,先去待机点";
                    }
                    else
                        runInfo = $"{JobParam.CurTargetNode.AliceName}有小车,等待空闲";
                    JobRunStep.Msg = runInfo;
                }
                else
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_03_ToLift);
                    runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,去{JobParam.CurTargetNode.AliceName}";
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg);
                    ToLift(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }

            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_ToStandby))
            {
                if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_03_ToLift);
                    runInfo = $"{JobParam.CurTargetNode.AliceName}已空闲,前往目的地";
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.前往电梯, out string msg);
                    //AllocateTask(agv, JobParam.CurTargetNode.Name);
                    ToLift(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }

            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_03_ToLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_04_CheckLiftStatus);
                    //上报状态
                    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}"));
                    //任务状态变更
                    // MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.到达电梯, out string msg);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯并等待开门";
                    JobRunStep.Msg = runInfo;
                    //开始请求电梯
                    lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_04_CheckLiftStatus))
            {
                if (LiftContext.CheckHasEmptyFinished(agv, JobParam.CurTargetNode.Name, out JobParam.LiftStatus))
                {
                    ChargePileManager.StopCharge(agv);
                    MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId ?? "");
                    if (missionInfo != null)
                    {
                        JobRunStep.ToNextStep(RunStep.LineToLift_05_13_ToShelfPlace);
                        runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,内有成品空料车{missionInfo.missionId},去料架缓存点";//
                        ToTakeShelfOff(agv, SettingString.ShelfBuff);
                        JobRunStep.Msg = runInfo;
                    }
                    else
                    {
                        JobRunStep.ToNextStep(RunStep.LineToLift_05_01_ToStandby);
                        //设置电梯占用
                        //SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
                        runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,内有成品空料车但无工单信息,去待机点,需要手动清空电梯缓存并关闭电梯门";//
                        ToStandby(agv);
                        JobRunStep.Msg = runInfo;
                    }
                }
                else if (lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo().sourceFloor, agv))
                {
                    ChargePileManager.StopCharge(agv);
                    if (lift.LiftContext.HasShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out JobParam.LiftStatus))
                    {
                        ChargePileManager.StopCharge(agv);
                        MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId ?? "");
                        if (missionInfo != null)
                        {
                            MissionManager.SetMissionOccupied(missionInfo, agv);
                            job = new SwitchShelfJob(JobParam);
                        }
                        else
                        {
                            JobRunStep.ToNextStep(RunStep.LineToLift_05_01_ToStandby);
                            //设置电梯占用
                            //SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
                            runInfo = $"{JobParam.CurTargetNode.AliceName}已开门。电梯内有送料的料车但无工单信息,去待机点,需要手动清空电梯缓存并关闭电梯门";//
                            ToStandby(agv);
                            JobRunStep.Msg = runInfo;
                        }
                    }
                    else //if(!TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
                    {
                        JobRunStep.ToNextStep(RunStep.LineToLift_06_01_EnterLift);
                        //设置电梯占用
                        SetLiftOccupied(JobParam.CurTargetNode.Name, agv);
                        runInfo = $"{JobParam.CurTargetNode.AliceName}已开门,到放料点";
                        JobRunStep.Msg = runInfo;
                        ToTakeShelfOff(agv, JobParam.CurTargetNode.Name);
                    }
                }
                else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo()))
                {
                    if (agv?.Battery <= 10 && !agv.IsInCharge)
                    {
                        if (ChargePileManager.HasEmpty(agv, out ChargePile charge))
                        {
                            ChargePileManager.StartCharge(agv, charge.Name);
                            AllocateTask(agv, charge);
                            return job;
                        }
                    }
                    else if (agv.Battery > 50 && agv.IsInCharge)
                    {
                        ChargePileManager.StopCharge(agv);
                        ToStandby(agv); return job;
                    }
                    JobRunStep.ToNextStep(RunStep.LineToLift_04_CheckLiftStatus);
                    //请求电梯
                    lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
                    ////上报运输状态
                    //manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                    //    service.model.TransportStatus.TypeStr.error, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.auto,
                    //    $"等待电梯到达超时"));
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_05_01_ToStandby))
            {
                if (!TargetIsOccupied(agv, JobParam.CurTargetNode.Name) && !LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_03_ToLift);
                    runInfo = $"{JobParam.CurTargetNode.AliceName}已空闲";
                    ToLift(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            #region 电梯内有空成品料车
            else if (JobRunStep.IsStep(RunStep.LineToLift_05_13_ToShelfPlace))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_05_14_TakeShelfOff);
                    runInfo = $"到达料架缓存点,准备卸下料车";
                    TakeShelfOff(agv);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_05_14_TakeShelfOff))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv))
                {
                    //设置任务状态为料架换缓存
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.料架缓存, out string msg);
                    ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
                    //执行取空成品任务
                    Node src = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift);
                    Node dest = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift);
                    MissionInfo missionInfo = MissionManager.GetMission(JobParam.LiftStatus?.missionId);
                    if (missionInfo != null)
                    {
                        JobParam jobParam = new JobParam(src, dest, null, missionInfo);
                        MissionManager.SetMissionOccupied(missionInfo, agv);
                        job = new F1LiftD2ToLiftC1Job(jobParam);
                    }
                    else
                    {
                        JobRunStep.ToNextStep(RunStep.END);
                        runInfo = $"未搜索到电梯内的料车任务信息【{JobParam.LiftStatus?.missionId ?? ""}】,结束任务";
                        JobRunStep.Msg = runInfo;
                    }
                }
            }

            #endregion

            #region 电梯内无料车
            else if (JobRunStep.IsStep(RunStep.LineToLift_06_01_EnterLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_06_02_TakeShelfOffAtLift);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}放料点,准备卸下料车";
                    JobRunStep.Msg = runInfo;
                    TakeShelfOffAtLift(agv, JobParam.CurTargetNode.Name);
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_06_02_TakeShelfOffAtLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv))
                {
                    //清除任务占用
                    ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
                    JobRunStep.ToNextStep(RunStep.LineToLift_06_03_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.CurTargetNode.AliceName}卸下完成,准备离开";
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.到达电梯, out string msg);
                    LeaveLift(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_06_03_LeaveLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.END);
                    bool rtn = false;
                    {
                        //AGV离开
                        rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv);
                    }
                    runInfo = $"任务结束:离开{JobParam.CurTargetNode.AliceName}完成并发送离开信号:{rtn}";
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.电梯运行, out string msg);
                    JobRunStep.Msg = runInfo;
                    ClearLiftNodeOccupied(agv);
                }
            }
            #endregion
            else if (JobRunStep.IsStep(RunStep.END))
            {
                JobRunStep.EndJob();
                return null;
            }
            return job;
        }

    }
}