SwitchShelfJob.cs 18.7 KB
using Common;
using DeviceLibrary.bean;
using DeviceLibrary.bean.job;
using DeviceLibrary.lift;
using DeviceLibrary.manager;
using DeviceLibrary.service.model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static System.Windows.Forms.AxHost;

namespace DeviceLibrary
{
    public class SwitchShelfJob : Job
    {
        /// <summary>
        /// 电梯交换料车任务
        /// </summary>
        /// <param name="agvPlae">小车当前位置</param>
        public SwitchShelfJob(JobParam jobParam) : base(jobParam)
        {
            JobName = "电梯交换料车任务";
            MissionInfo info= manager.MissionManager.GetMission(JobParam?.LiftStatus?.missionId ?? "");
            liftMission = new MissionInfo() { 
            missionId=info.missionId,
             state= info.state,
                liftName = info.liftName,
                sourcePoint=info.sourcePoint,
                destinationPoint=info.destinationPoint,
                needBack=info.needBack
            };

        }
        public SwitchShelfJob() : base() { JobName = "电梯交换料车任务"; }
        /// <summary>
        /// 电梯内料车的任务信息
        /// </summary>
        service.model.MissionInfo liftMission;

        private string missionInfo()
        {
            try
            {
                return $"【当前任务:{JobParam?.GetMissionInfo()?.missionId ?? ""}," +
                        $"{MissionManager.GetMission(JobParam?.GetMissionInfo()?.missionId ?? "")?.state.ToString() ?? ""}】" +
                        $"【电梯内任务:{liftMission?.missionId ?? ""}," +
                        $"{MissionManager.GetMission(liftMission?.missionId ?? "")?.state.ToString() ?? ""}】";
            }
            catch
            {
                return "";
            }

        }

        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.Switch_01_ToTmp1);
                runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点1,{missionInfo()}";
                ToTmp1TakeOff(agv, JobParam.CurTargetNode.Name);
                JobRunStep.Msg = runInfo;
            }
            else if (JobRunStep.IsStep(RunStep.Switch_01_ToTmp1))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_02_TakeShelfOffAtTmp1);
                    runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点1将待送料车卸下,,{missionInfo()}";
                    TakeShelfOff(agv);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_02_TakeShelfOffAtTmp1))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_03_ToLift);
                    runInfo = $"去{JobParam.CurTargetNode.AliceName},{missionInfo()}";
                    //MoveToNode(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_03_ToLift))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_04_EnterLift);
                    if (setMissionState(liftMission))
                    {
                        runInfo = $"到{JobParam.CurTargetNode.AliceName}的取料点,并设置任务状态,,{missionInfo()}";
                    }
                    else
                        runInfo = $"到{JobParam.CurTargetNode.AliceName}的取料点,未找到电梯内料架任务";
                    MoveToNodePutShelf(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_04_EnterLift))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_05_PutLiftShelfOn);
                    runInfo = $"在{JobParam.CurTargetNode.AliceName}的取料点拾取电梯内的料车,,{missionInfo()}";
                    PutLiftShelfOn(agv, JobParam.CurTargetNode.Name, liftMission);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_05_PutLiftShelfOn))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_06_LeaveLift);
                    runInfo = $"拾取完成,离开{JobParam.CurTargetNode.AliceName},{missionInfo()}";
                    LeaveLift(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_06_LeaveLift))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_07_ToTmp2);
                    if (setMissionState(liftMission))
                    {
                        runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2放料点,并设置任务状态,{missionInfo()}";
                    }
                    else
                        runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2放料点,未找到电梯内的料架任务";
                    ToTmp2TakeOff(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_07_ToTmp2))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_08_TakeShelfOffAtTpm2);
                    runInfo = $"将{JobParam.CurTargetNode.AliceName}内的料车卸在临时点2,{missionInfo()}";
                    TakeShelfOff(agv);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_08_TakeShelfOffAtTpm2))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_09_ReToTmp1);
                    runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点1取料点,{missionInfo()}";
                    ToTmp1PutOn(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_09_ReToTmp1))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_10_PutShelfOnAtTmp1);
                    runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点1拾取待送料车,{missionInfo()}";
                    PutShelfOn(agv);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_10_PutShelfOnAtTmp1))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_11_ToLift);
                    runInfo = $"去{JobParam.CurTargetNode.AliceName},{missionInfo()}";
                    //MoveToNode(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_11_ToLift))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_12_EnterLift);
                    runInfo = $"去{JobParam.CurTargetNode.AliceName}的放料点,{missionInfo()}";
                    MoveToNodeTakeOff(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_12_EnterLift))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_13_TakeLiftShelfOff);
                    runInfo = $"在{JobParam.CurTargetNode.AliceName}卸下料车,{missionInfo()}";
                    TakeShelfOffAtLift(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_13_TakeLiftShelfOff))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_14_LeaveLift);
                    MissionInfo mission = MissionManager.GetMission(JobParam.GetMissionInfo().missionId);
                    MissionState state = getNextState(mission.state);
                    if (mission.projectType.Equals(ProjectType.移远成品入库) && SettingString.LIFT_D2.Equals(JobParam.CurTargetNode.Name))
                    {
                        state = MissionState.等待成品回收;
                    }
                    setMissionState(state);
                    runInfo = $"离开{JobParam.CurTargetNode.AliceName},设置任务状态,并清空任务占用,{missionInfo()}";
                    ResetMissionOccupiedAgv(JobParam.GetMissionInfo());
                    LeaveLift(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_14_LeaveLift))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_15_CloseDoor);
                    MissionInfo mission = MissionManager.GetMission(JobParam.GetMissionInfo().missionId);
                    if (mission.projectType.Equals(ProjectType.移远成品入库) && SettingString.LIFT_D2.Equals(JobParam.CurTargetNode.Name))
                    {
                        runInfo = $"关闭{JobParam.CurTargetNode.AliceName}";
                    }
                    else
                    {
                        runInfo = $"关闭{JobParam.CurTargetNode.AliceName},并更新电梯运行信息";
                        LiftContext.UpdateRequestInfo(mission, agv, MissionIsBackState(mission));
                    }

                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_15_CloseDoor))
            {
                JobRunStep.ToNextStep(RunStep.Switch_15_WaitDoorClose);
                MissionInfo mission = MissionManager.GetMission(JobParam.GetMissionInfo().missionId);
                if (mission.projectType.Equals(ProjectType.移远成品入库) && SettingString.LIFT_D2.Equals(JobParam.CurTargetNode.Name))
                {
                    LiftContext.FinishedProduct(JobParam.CurTargetNode.Name, agv);
                    Thread.Sleep(5000);
                }
                else
                {
                    MissionState state = getNextState(mission.state);
                    setMissionState(state);
                }
                bool continueUse = false;
                if ((mission.state >= MissionState.到达电梯 && mission.state <= MissionState.电梯运行)||
                    (mission.state >= MissionState.返回到达电梯内 && mission.state <= MissionState.返回电梯运行))
                    continueUse = true;
                //关门
                bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv, continueUse);
                if (mission.projectType.Equals(ProjectType.移远成品入库) && SettingString.LIFT_D2.Equals(JobParam.CurTargetNode.Name))
                {
                    LiftContext.CloseFinishedProduct(JobParam.CurTargetNode.Name, agv);
                }
                ClearLiftNodeOccupied(agv);
                runInfo = $"离开{JobParam.CurTargetNode.AliceName},关闭门:{rtn},continueUse={continueUse}";
                JobRunStep.Msg = runInfo;
            }
            else if (JobRunStep.IsStep(RunStep.Switch_15_WaitDoorClose))
            {
                //if (!lift.LiftContext.IsDoorOpen(JobParam.CurTargetNode.Name))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_16_ReToTmp2);
                    runInfo = $"去{JobParam.CurTargetNode.AliceName}临时点2取料点,{missionInfo()}";
                    ToTmp2PutOn(agv, JobParam.CurTargetNode.Name);
                    JobRunStep.Msg = runInfo;
                }
                //else if (JobRunStep.IsTimeOut(5))
                //{
                //    JobRunStep.ToNextStep(RunStep.Switch_15_WaitDoorClose);
                //    bool rtn = lift.LiftContext.AGVLeave(JobParam.CurTargetNode.Name, agv);
                //    runInfo = $"重新发送关闭门{JobParam.CurTargetNode.AliceName},{rtn}";
                //}
            }
            else if (JobRunStep.IsStep(RunStep.Switch_16_ReToTmp2))
            {
                if (AGVTaskIsFinished(agv))
                {
                    JobRunStep.ToNextStep(RunStep.Switch_17_PutShelfOnAtTmp2);
                    runInfo = $"在{JobParam.CurTargetNode.AliceName}临时点2拾取电梯内的料车,{missionInfo()}";
                    PutShelfOn(agv, liftMission);
                    JobRunStep.Msg = runInfo;
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_17_PutShelfOnAtTmp2))
            {
                if (AGVTaskIsFinished(agv))
                {
                    if (CheckMIssionInlift(MissionManager.GetMission(liftMission.missionId)))
                    {
                        JobRunStep.ToNextStep(RunStep.Switch_19_ReturnShelf);
                    }
                    else
                    {
                        JobRunStep.ToNextStep(RunStep.Switch_18_SendShelf);
                    }
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_18_SendShelf))
            {
                JobRunStep.ToNextStep(RunStep.END);
                MissionInfo missionInfo = MissionManager.GetMission(liftMission.missionId);
                //if(missionInfo ==null)
                //{
                //    job = null;
                //    runInfo = $"未查询到任务信息,结束任务:{liftMission.missionId}";
                //    JobRunStep.Msg = runInfo;
                //}
                //else 
                if (service.model.MissionInfo.IsFinishedProdcut(missionInfo))
                {
                    if (JobParam.CurTargetNode.Name.Equals(SettingString.LIFT_D2))//电梯内的料架为移远成品空料车
                    {
                        Node src = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift);
                        Node dest = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift);
                        JobParam jobParam = new JobParam(src, dest, null, missionInfo);
                        MissionManager.SetMissionOccupied(missionInfo, agv);
                        job = new F1LiftD2ToLiftC1Job(jobParam);
                        job.JobRunStep.ToNextStep(RunStep.S1F_LiftD2ToLiftC1_06_CloseLiftDoor);
                        job.JobRunStep.Msg = $"从{JobParam.CurTargetNode.AliceName}取料完成,继续执行任务:{JsonHelper.SerializeObject(missionInfo)}";
                    }
                    else//电梯内的料架为移远成品满料车
                    {
                        Node src = manager.NodeManager.GetNode(SettingString.LIFT_C1, NodeType.Lift);
                        Node dest = manager.NodeManager.GetNode(SettingString.LIFT_D2, NodeType.Lift);
                        JobParam jobParam = new JobParam(src, dest, null, missionInfo);
                        MissionManager.SetMissionOccupied(missionInfo, agv);
                        job = new F1LiftC1ToLiftD2Job(jobParam);
                        job.JobRunStep.ToNextStep(RunStep.S1F_LiftC1ToLiftD2_06_CloseLiftDoor);
                        job.JobRunStep.Msg = $"从{JobParam.CurTargetNode.AliceName}取料完成,继续执行任务:{JsonHelper.SerializeObject(missionInfo)}";
                    }
                }
                else
                {
                    Node src = manager.NodeManager.GetNode(missionInfo.liftName, NodeType.Lift);
                    string[] destTmp = missionInfo.destinationPoint.Split(',');
                    string[] dests = destTmp.Distinct().ToArray();
                    Node dest = manager.NodeManager.GetNode(dests.Length > 1 ? dests[0] : missionInfo.destinationPoint, NodeType.Node);
                    JobParam jobParam = new JobParam(src, dest, null, missionInfo);
                    if (dests.Length > 1)
                    {
                        for (int i = 1; i < dests.Length; i++)
                        {
                            Node node = manager.NodeManager.GetNode(dests[i], NodeType.Node);
                            if (node != null)
                                jobParam.TargetNodes.Add(node);
                            else
                            {
                                LogUtil.error($"无法生成任务,因不存在的节点:{dests[i]}");
                                job = null;
                            }

                        }
                    }
                    job = new LiftToLinesJob(jobParam);
                    job.JobRunStep.ToNextStep(RunStep.SD_LiftToLine_06_CloseLiftDoor);
                    job.JobRunStep.Msg = $"从{JobParam.CurTargetNode.AliceName}取料完成,继续执行任务:{JsonHelper.SerializeObject(missionInfo)}";
                }
            }
            else if (JobRunStep.IsStep(RunStep.Switch_19_ReturnShelf))
            {
                JobRunStep.ToNextStep(RunStep.END);
                MissionInfo missionInfo = MissionManager.GetMission(liftMission.missionId);
                Node src = manager.NodeManager.GetNode(missionInfo.liftName, NodeType.Lift);
                Node dest = manager.NodeManager.GetNode(missionInfo.sourcePoint, NodeType.Node);
                JobParam jobParam = new JobParam(src, dest, null, missionInfo);
                MissionManager.SetMissionOccupied(missionInfo, agv);
                job = new ShelfBackLiftToStoreJob(jobParam);
                job.JobRunStep.ToNextStep(RunStep.ShelfBack_LiftToStore_05_CloseLiftDoor);
                job.JobRunStep.Msg = $"从{JobParam.CurTargetNode.AliceName}取料完成,继续执行任务:{JsonHelper.SerializeObject(missionInfo)}";
            }
            else if (JobRunStep.IsStep(RunStep.END))
            {
            }
            return job;
        }
    }
}