SteelLineToLiftJob.cs 14.5 KB
using Common;
using DeviceLibrary.bean;
using DeviceLibrary.lift;
using DeviceLibrary.manager;
using DeviceLibrary.service.model;
using System;

namespace DeviceLibrary
{
    /// <summary>
    /// 3D钢网任务 线体到电梯
    /// </summary>
    public class SteelLineToLiftJob : Job
    {
        /// <summary>
        /// 3D钢网任务 线体到电梯
        /// </summary>
        public SteelLineToLiftJob(JobParam jobParam) : base(jobParam)
        {
        }
        public SteelLineToLiftJob() : 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))
            {
                JobRunStep.ToNextStep(RunStep.LineToLift_01_ToLine);
                runInfo = $"任务开始:去{JobParam.SteelShelfNode.AliceName}的取料点";
                ToPutShelfOn(agv, JobParam.SteelShelfNode.Name);
                JobRunStep.Msg = runInfo;

            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_01_ToLine))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    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.Name))
                {
                    //if(JobParam.GetMissionInfo().projectType.Equals(ProjectType.钢网入库))
                    //{
                    //    JobRunStep.ToNextStep(RunStep.LineToLift_ToSteelSrc);
                    //    //上报状态
                    //    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.SrcNode.AliceName}拾取料车完成,去{JobParam.SrcNode.AliceName}放料点";
                    //    ToTakeShelfOff(agv, JobParam.SrcNode.Name);
                    //    JobRunStep.Msg = runInfo;
                    //}
                    //else
                    {
                        JobRunStep.ToNextStep(RunStep.LineToLift_WaitConfirm);
                        runInfo = $"钢网领用任务,直接去电梯口";
                        JobRunStep.Msg = runInfo;
                    }
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_ToSteelSrc))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_PlaySound);
                    //确认按钮生效
                    JobParam.SrcNode.ExtendEquip.AllowConfirm();
                    //上报运输状态
                    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.CurTargetNode.AliceName}的放料点";
                    JobRunStep.Msg = runInfo;
                    PlaySound(agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_PlaySound))
            {
                if (OpManager.WaitConfirm.Line(JobParam.SrcNode))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_WaitConfirm);
                    runInfo = $"在{JobParam.SrcNode.AliceName}确认完成";
                    JobRunStep.Msg = runInfo;
                    //重置确认信息
                    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, agv.Place.Name, service.model.TransportStatus.ModeStr.agvButton,
                    $"等待{JobParam.SrcNode.Name}确认超时{timeoutval}分"));
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_WaitConfirm))
            {
                if(TargetIsOccupied(agv, JobParam.CurTargetNode.Name))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_ToStandby);
                    runInfo = $"{JobParam.CurTargetNode.AliceName}有小车,去待机点";
                    ToStandby(agv);
                }
                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))
                {
                }
                else
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_03_ToLift);
                    runInfo = $"{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_03_ToLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    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}"));
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName},请求电梯并等待开门";
                    JobRunStep.Msg = runInfo;
                    //开始请求电梯
                    lift.LiftContext.Request(JobParam.GetMissionInfo(), agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_04_CheckLiftStatus))
            {
                if (lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name, JobParam.GetMissionInfo().sourceFloor))
                {
                    if (lift.LiftContext.HasShelfNeedLeave(JobParam.CurTargetNode.Name, agv.Client, out JobParam.LiftStatus))
                    {
                        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
                    {
                        JobRunStep.ToNextStep(RunStep.LineToLift_06_01_EnterLift);
                        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()))
                {
                    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_06_01_EnterLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.LineToLift_06_02_TakeShelfOffAtLift);
                    runInfo = $"到达{JobParam.CurTargetNode.AliceName}放料点,准备卸下料车";
                    JobRunStep.Msg = runInfo;
                    AllocateTask(agv, $"{SettingString.TakeShelfOff}_{JobParam.CurTargetNode.Name}");
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_06_02_TakeShelfOffAtLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    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,
                        $"电梯卸车"));
                    if (JobParam.GetMissionInfo().projectType.Equals(service.model.ProjectType.成品入库))
                    {
                        //设置该电梯内的产品是成品入库
                        lift.LiftContext.SetFinishedState(JobParam.CurTargetNode.Name, true);
                    }
                    runInfo = $"料车在{JobParam.CurTargetNode.AliceName}卸下完成,准备离开";
                    ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
                    //任务状态变更
                    MissionManager.SetMissionState(JobParam.GetMissionInfo().missionId, service.model.MissionState.到达电梯, out string msg);
                    AllocateTask(agv, $"{SettingString.Leave}_{JobParam.CurTargetNode.Name}");
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.LineToLift_06_03_LeaveLift))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.END);
                    bool rtn = false;
                    if (JobParam.GetMissionInfo().projectType.Equals(service.model.ProjectType.成品入库))
                    {
                        //AGV离开
                        rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, false);
                    }
                    else
                    {
                        //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;
                }
            }
            #endregion
            else if (JobRunStep.IsStep(RunStep.END))
            {
                JobRunStep.EndJob();
                return null;
            }
            return job;
        }

    }
}