LiftToLinesJob.cs 19.9 KB
using Common;
using DeviceLibrary.manager;

namespace DeviceLibrary.bean.job
{
    /// <summary>
    /// 电梯到线体,(空架返回)
    /// </summary>
    public class LiftToLinesJob : Job
    {
        /// <summary>
        /// 满料车任务
        /// </summary>
        public LiftToLinesJob(JobParam jobParam) : base(jobParam)
        {
        }
        public LiftToLinesJob() : base()
        {

        }
        lift.LiftStatus liftStatus;
        public override Job Run(AgvInfo agv)
        {
            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))
            {
                JobRunStep.ToNextStep(RunStep.SD_LiftToLine_01_ToLift);
                runInfo = $"任务开始:去{JobParam.SrcNode.AliceName}";
                JobRunStep.Msg = runInfo;
                AllocateTask(agv, JobParam.SrcNode.Name);
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_01_ToLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_02_WaitLiftDoorOpen);
                    //上报运输状态
                    manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                        service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
                        $"到达{ JobParam.SrcNode.Name }"));

                    runInfo = $"到达{JobParam.SrcNode.AliceName},等待门开启";
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_02_WaitLiftDoorOpen))
            {
                if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_03_EnterLift);
                    lift.LiftContext.SetLiftOccupiedAgv(JobParam.SrcNode.Name, agv.IP);
                    runInfo = $"{JobParam.SrcNode.AliceName}门已开启,进电梯取料点";
                    AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.PutShelfOn}");
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.电梯到达, out string msg);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_03_EnterLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_04_PutShelfOn);
                    runInfo = $"到达{JobParam.SrcNode.AliceName}取料点,准备拾取料车";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.PutShelfOn}_{JobParam.SrcNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_04_PutShelfOn))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_05_LeaveLift);
                    //上报运输状态
                    manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                        service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
                        $"电梯取车"));

                    runInfo = $"在{JobParam.SrcNode.AliceName}拾取料车完成,准备离开";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_05_LeaveLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_06_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;
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_06_CloseLiftDoor))
            {
                JobRunStep.ToNextStep(RunStep.SD_LiftToLine_07_ToLine);
                runInfo = $"关闭{JobParam.SrcNode.AliceName}门完成,去{JobParam.CurTargetNode.AliceName}的放料点";
                //任务状态变更
                MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.送料, out string msg);
                AllocateTask(agv, $"{GetTargetName(JobParam.CurTargetNode)}_{SettingString.TakeShelfOff}");
                JobRunStep.Msg = runInfo;
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_07_ToLine))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    //确认按钮生效
                    JobParam.CurTargetNode.ExtendEquip.AllowConfirm();

                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_08_UpdateLocation);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}";
                    JobRunStep.Msg = runInfo;
                    //上报位置
                    manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                        service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.auto,
                        $"到达{ JobParam.CurTargetNode.Name }"));
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_08_UpdateLocation))
            {
                if (NeedConfirm())
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_09_WaitConfirm);
                    runInfo = $"等待{JobParam.CurTargetNode.AliceName}的人员确认";
                    JobRunStep.Msg = runInfo;
                    PlaySound(agv);
                }
                else
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_10_CheckNextLine);
                    runInfo = $"{JobParam.CurTargetNode.AliceName}无需人员确认";
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_09_WaitConfirm))
            {
                if (OpManager.WaitConfirm.Line(JobParam.CurTargetNode))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_10_CheckNextLine);
                    runInfo = $"{JobParam.CurTargetNode.AliceName}的人员确认完成";
                    JobRunStep.Msg = runInfo;
                    manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                    service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.CurTargetNode.Name, service.model.TransportStatus.ModeStr.agvButton,
                    $"卸货{ JobParam.CurTargetNode.Name }"));
                    //重置确认信息
                    JobParam.CurTargetNode.ExtendEquip.Reset();
                    StopSound(agv);
                }
                else if (JobRunStep.IsTimeOut(WaitTimeOut, out double timeoutval))
                {
                    //报警,$"等待{JobParam.CurTargetNode.AliceName}的人员确认超时{timeoutval}分"
                    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.agvButton,
                    $"等待{ JobParam.CurTargetNode.Name }确认超时{timeoutval}分"));
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_10_CheckNextLine))
            {
                if (JobParam.TargetNodes != null && JobParam.TargetNodes.Count > 0)
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_07_ToLine);
                    JobParam.CurTargetNode = JobParam.TargetNodes[0];
                    JobParam.TargetNodes.RemoveAt(0);
                    System.Threading.Thread.Sleep(1000);
                    runInfo = $"去下一线体{JobParam.CurTargetNode.AliceName}的放料点";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{GetTargetName(JobParam.CurTargetNode)}_{SettingString.TakeShelfOff}");
                }
                else
                {
                    if (JobParam.GetMissionInfo() != null && JobParam.GetMissionInfo().needBack)
                    {
                        JobRunStep.ToNextStep(RunStep.SD_LiftToLine_11_BackToLift);
                        runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,分发结束,料车需返回,去电梯口";
                        //任务状态变更
                        MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯, out string msg);

                        AllocateTask(agv, JobParam.SrcNode.Name);
                        JobRunStep.Msg = runInfo;
                    }
                    else if (JobParam.GetMissionInfo() != null && !JobParam.GetMissionInfo().needBack)
                    {
                        JobRunStep.ToNextStep(RunStep.SD_LiftToLine_15_TakeShelfOff);
                        runInfo = $"{JobParam.CurTargetNode.AliceName}是最后一个线体,分发结束,料车无需返回,准备卸车";
                        //任务状态变更
                        MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.完成, out string msg);

                        AllocateTask(agv, SettingString.TakeShelfOff);
                        JobRunStep.Msg = runInfo;
                    }
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_11_BackToLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_12_WaitDoorOpen);
                    runInfo = $"到达{JobParam.SrcNode.AliceName},请求使用电梯并等待电梯门开";
                    JobRunStep.Msg = runInfo;
                    //上报位置
                    manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                        service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
                        $"到达{ JobParam.SrcNode.Name }"));
                    //请求电梯
                    lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, true);
                    System.Threading.Thread.Sleep(1000);
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_12_WaitDoorOpen))
            {
                if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_13_CheckLiftStatus);
                    runInfo = $"{JobParam.SrcNode.AliceName}门已开,检查电梯内该层是否有料车";
                    JobRunStep.Msg = runInfo;
                    //上报位置
                    System.Threading.Thread.Sleep(1000);
                }
                else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.SrcNode.Name, JobParam.GetMissionInfo()))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_12_WaitDoorOpen);
                    //请求电梯
                    lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, true);
                    //上报运输状态
                    manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                        service.model.TransportStatus.TypeStr.error, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
                        $"等待电梯到达超时"));
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_13_CheckLiftStatus))
            {
                if (lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().destinationFloor))
                {
                    if (lift.LiftContext.HasShelfNeedLeave(JobParam.SrcNode.Name, agv.Client, out liftStatus))
                    {
                        JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_01_ToTemp1);
                        runInfo = $"{JobParam.SrcNode.AliceName}内有料车,去临时点1放料点";
                        AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.Temp1}_{SettingString.TakeShelfOff}");
                        JobRunStep.Msg = runInfo;
                    }
                    else
                    {
                        JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_01_EnterLift);
                        lift.LiftContext.SetLiftOccupiedAgv(JobParam.SrcNode.Name, agv.IP);
                        runInfo = $"{JobParam.SrcNode.AliceName}无料车,去放料点";
                        JobRunStep.Msg = runInfo;
                        AllocateTask(agv, $"{JobParam.SrcNode.Name}_{SettingString.TakeShelfOff}");
                    }
                }
                else if (JobRunStep.IsTimeOut(20) && !lift.LiftContext.CheckIfRequestOk(JobParam.SrcNode.Name, JobParam.GetMissionInfo()))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_12_WaitDoorOpen);
                    //请求电梯
                    lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, true);
                }
            }
            #region 电梯内无料车
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_01_EnterLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_02_TakeShelfOffAtLift);
                    runInfo = $"到达{JobParam.SrcNode.AliceName}放料点,准备卸下料车";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.TakeShelfOff}_{JobParam.SrcNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_02_TakeShelfOffAtLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_03_LeaveLift);
                    runInfo = $"在{JobParam.SrcNode.AliceName}卸下料车完成,准备离开";
                    JobRunStep.Msg = runInfo;
                    ResetOccupiedAgv(JobParam.GetMissionInfo());
                    AllocateTask(agv, $"{SettingString.Leave}_{JobParam.SrcNode.Name}");
                    //上报位置
                    manager.UploadManager.UploadTransportStatus(new service.model.TransportStatus(agv.CurJob.JobParam.GetMissionInfo().missionId,
                        service.model.TransportStatus.TypeStr.status, agv.Name, JobParam.SrcNode.Name, service.model.TransportStatus.ModeStr.auto,
                        $"电梯卸车"));
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回到达电梯内, out string msg);
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_03_LeaveLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_04_CloseLiftDoor);
                    bool rtn = lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv);
                    runInfo = $"离开{JobParam.SrcNode.AliceName},关门: {rtn}";
                    JobRunStep.Msg = runInfo;
                    System.Threading.Thread.Sleep(1000);
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_04_CloseLiftDoor))
            {
                if (!lift.LiftContext.IsDoorOpen(JobParam.SrcNode.Name, JobParam.GetMissionInfo().sourceFloor))
                {
                    JobRunStep.ToNextStep(RunStep.END);
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.返回电梯运行, out string msg);
                    runInfo = $"{JobName}结束:{JobParam.SrcNode.AliceName}已关门";
                    JobRunStep.Msg = runInfo;
                }
                else if (JobRunStep.IsTimeOut(0.5, out double time))
                {
                    lift.LiftContext.AGVLeave(JobParam.SrcNode.Name, agv);
                    System.Threading.Thread.Sleep(1000);
                }
            }
            #endregion

            #region 电梯内有料车
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_01_ToTemp1))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_02_WaitLiftIdle);
                    runInfo = $"到达{JobParam.SrcNode.AliceName}的临时点1的放料点,等待电梯空闲";
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_02_WaitLiftIdle))
            {
                if (!lift.LiftContext.HasShelfNeedLeave(JobParam.SrcNode.Name, agv.Client, out liftStatus))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_03_RequestLift);
                    runInfo = $"请求使用{JobParam.SrcNode.AliceName}";
                    JobRunStep.Msg = runInfo;
                    //请求电梯
                    lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, true);
                }
            }
            else if (JobRunStep.IsStep(RunStep.SD_LiftToLine_14_03_RequestLift))
            {
                if (!lift.LiftContext.CheckIfRequestOk(JobParam.SrcNode.Name, JobParam.GetMissionInfo()))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_11_BackToLift);
                    runInfo = $"请求使用{JobParam.SrcNode.AliceName}成功,去电梯口";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, JobParam.SrcNode.Name);
                }
                else if (JobRunStep.IsTimeOut(20))
                {
                    JobRunStep.ToNextStep(RunStep.SD_LiftToLine_14_03_RequestLift);
                    //请求电梯
                    lift.LiftContext.Request(JobParam.GetMissionInfo(), agv, true);
                }
            }
            #endregion

            else if (JobRunStep.IsStep(RunStep.END))
            {
                JobRunStep.EndJob();
                return null;
            }
            return this;
        }
    }
}