CrossDoorJob.cs 6.9 KB
using Common;
using DeviceLibrary.bean;
using DeviceLibrary.manager;
using System.Text;

namespace DeviceLibrary
{
    /// <summary>
    /// 过门任务
    /// </summary>
    public class CrossDoorJob : Job
    {
        /// <summary>
        /// 待机任务
        /// </summary>
        /// <param name="agvPlae"></param>
        public CrossDoorJob(JobParam jobParam) : base(jobParam)
        {
            JobName = "过门任务";
        }
        public CrossDoorJob() : base()
        {
            JobName = "过门任务";
        }
        /// <summary>
        /// 过门任务
        /// </summary>
        /// <param name="agv"></param>
        public override Job Run(AgvInfo agv)
        {
            Job job = this;
            agv.SetJobContext(new bean.agv.JobContext()
            {
                AgvTask = agv.TaskRunState.Task,
                JobFullName = this.ToString(),
                JobStep = JobRunStep.PreStep(),
                Name = agv.Name,
                JobParam = JobParam
            });
            if (JobRunStep.IsStep(RunStep.NONE))
            {
                JobRunStep.ToNextStep(RunStep.CrossDoor_01_ToCurDoor);
                runInfo = $"去{JobParam.CrossDoor.CurNode.AliceName}侧门前";
                JobRunStep.Msg = runInfo;
                tocurDoor(agv);
            }
            else if (JobRunStep.IsStep(RunStep.CrossDoor_01_ToCurDoor))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.CrossDoor_02_OpenCurDoor);
                    runInfo = $"到达{JobParam.CrossDoor.CurNode.AliceName}侧门前,开门";
                    JobRunStep.Msg = runInfo;
                    openCurDoor(agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.CrossDoor_02_OpenCurDoor))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.CrossDoor_03_Enter);
                    runInfo = $"从{JobParam.CrossDoor.CurNode.AliceName}侧进门";
                    JobRunStep.Msg = runInfo;
                    enterDoor(agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.CrossDoor_03_Enter))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.CrossDoor_04_CloseCurDoor);
                    runInfo = $"关闭{JobParam.CrossDoor.CurNode.AliceName}侧的门";
                    JobRunStep.Msg = runInfo;
                    closeCurDoor(agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.CrossDoor_04_CloseCurDoor))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.CrossDoor_05_OpenAntherDoor);
                    runInfo = $"打开{JobParam.CrossDoor.NextNode.AliceName}侧门";
                    JobRunStep.Msg = runInfo;
                    openNextDoor(agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.CrossDoor_05_OpenAntherDoor))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.CrossDoor_06_LeaveDoor);
                    runInfo = $"离开门,进入{JobParam.CrossDoor.NextNode.AliceName}侧";
                    JobRunStep.Msg = runInfo;
                    leaveDoor(agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.CrossDoor_06_LeaveDoor))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.CrossDoor_07_CloseAntherDoor);
                    runInfo = $"关闭{JobParam.CrossDoor.NextNode.AliceName}侧门";
                    JobRunStep.Msg = runInfo;
                    closeNextDoor(agv);
                }
            }
            else if (JobRunStep.IsStep(RunStep.CrossDoor_07_CloseAntherDoor))
            {
                if (agv.TaskRunState.CheckTaskFinished(agv.Name))
                {
                    JobRunStep.ToNextStep(RunStep.CrossDoor_08_Finish);
                    runInfo = $"到达{JobParam.CrossDoor.NextNode.AliceName}的车间";
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.CrossDoor_08_Finish))
            {
                job = GetCallBackJob();
                job.JobRunStep.ToNextStep(GetCallBackStep());
                JobRunStep.Msg = $"从{JobParam.CrossDoor.CurNode.AliceName}-》{JobParam.CrossDoor.NextNode.AliceName}完成";
            }

            return job;
        }

        //默认 4D->4C
        //4C外-》4C风淋门内
        //3D风淋门外-》3D风淋门内

        /// <summary>
        /// 获取任务名
        /// </summary>
        /// <returns></returns>
        string getTaskName(string name)
        {
            StringBuilder sb = new StringBuilder();
            if (JobParam.CrossDoor?.IsAir??false)
                sb.Append(SettingString.CrossAirDoor);
            else
            {
                sb.Append(SettingString.CrossDoor);
            }
            sb.Append("_");
            if (JobParam.CrossDoor?.IsIn??true)
                sb.Append(SettingString.In);
            else
                sb.Append(SettingString.Out);
            sb.Append("_");
            sb.Append(name);
            return sb.ToString();
        }
        /// <summary>
        /// 去当前车间门前
        /// </summary>
        void tocurDoor(AgvInfo agv)
        {
            AllocateTask(agv, getTaskName(SettingString.ToDoor));
        }
        /// <summary>
        /// 开当前门
        /// </summary>
        void openCurDoor(AgvInfo agv)
        {
            AllocateTask(agv, getTaskName(SettingString.OpenDoor));
        }
        /// <summary>
        /// 进入门里
        /// </summary>
        void enterDoor(AgvInfo agv)
        {
            AllocateTask(agv, getTaskName(SettingString.EnterDoor));
        }
        /// <summary>
        /// 关闭当前门
        /// </summary>
        void closeCurDoor(AgvInfo agv)
        {
            AllocateTask(agv, getTaskName(SettingString.CloseDoor));
        }
        /// <summary>
        /// 开另一个门
        /// </summary>
        void openNextDoor(AgvInfo agv)
        {
            AllocateTask(agv, getTaskName(SettingString.OpenOtherDoor));
        }
        /// <summary>
        /// 离开门
        /// </summary>
        void leaveDoor(AgvInfo agv)
        {
            AllocateTask(agv, getTaskName(SettingString.LeaveDoor));
        }
        /// <summary>
        /// 关闭另一个门
        /// </summary>
        void closeNextDoor(AgvInfo agv)
        {
            AllocateTask(agv, getTaskName(SettingString.CloseOtherDoor));
        }
    }

}