ImpJob.cs 8.9 KB
using AGVLib;
using Common;
using DeviceLib.Model.AGV;
using System;

namespace DeviceLib.BLL
{
    public class ImpJob : Job
    {
        public ImpJob(JobParam jobParam) : base(jobParam)
        {
            JobParam = jobParam;
        }
        public override Job Run(Robot agv)
        {
            throw new NotImplementedException();
        }
        /// <summary>
        /// 获取小车上无料箱的一边
        /// </summary>
        /// <param name="robot"></param>
        /// <returns></returns>
        protected int GetNoneSide(Robot robot)
        {
            if (robot.load_infos != null)
            {
                LoadInfo loadInfo = robot.load_infos.Find(s => s.shelf_type.Equals(ShelfType.None));
                if (loadInfo != null)
                    return loadInfo.pos;
            }
            return 1;
        }
        /// <summary>
        /// 获取小车上有空料箱的一边
        /// </summary>
        /// <param name="robot"></param>
        /// <returns></returns>
        protected int GetEmptySide(Robot robot)
        {
            if (robot.load_infos != null)
            {
                LoadInfo loadInfo = robot.load_infos.Find(s => s.shelf_type.Equals(ShelfType.Empty));
                if (loadInfo != null)
                    return loadInfo.pos;
            }
            return GetNoneSide(robot) == 1 ? 2 : 1;
        }
        protected int GetFullSide(Robot robot, out string shelfId)
        {
            shelfId = "";
            if (robot.load_infos != null)
            {
                LoadInfo loadInfo = robot.load_infos.Find(s => s.shelf_type.Equals(ShelfType.Full));
                if (loadInfo != null)
                {
                    shelfId = loadInfo.shelf_id;
                    return loadInfo.pos;
                }

            }
            return GetEmptySide(robot) == 1 ? 2 : 1;
        }
        protected override ClientNode GetClientNode(NodeJobState nodeState)
        {
            throw new NotImplementedException();
        }

        protected override Robot getRobot(string robotIp)
        {
            return RobotManager.GetRobot(robotIp);
        }
        protected void MoveToNode(Robot robot, NodeJobState nodeState)
        {
            JobParam.MissionState.state = "";
            Mission mission = MissionManager.GetMission(nodeState.Name);
            if (mission != null)
            {
                SendMission(robot, mission);
            }
        }
        protected void MoveToNode(Robot robot,string missionName)
        {
            JobParam.MissionState.state = "";
            Mission mission = MissionManager.GetMission(missionName);
            if (mission != null)
            {
                SendMission(robot, mission);
            }
        }
        /// <summary>
        /// 去料仓出料口
        /// </summary>
        /// <param name="robot"></param>
        /// <param name="nodeState"></param>
        ///   /// <param name="side">1:小车左侧对接,2:小车右侧</param>
        protected void MoveToStore(Robot robot, NodeJobState nodeState, int side = 1)
        {
            JobParam.MissionState.state = "";
            Mission mission = MissionManager.GetMission($"{nodeState.Name}-{side}");
            if (mission != null)
            {
                SendMission(robot, mission);
            }
        }
        /// <summary>
        /// AGV执行任务运行完成
        /// </summary>
        /// <returns></returns>
        protected bool MissionIsOk()
        {
            try
            {
                Robot robot = RobotManager.GetRobot(JobParam?.RobotIp ?? "");
                if (robot != null)
                {
                    return robot.mission_state.mission.guid.Equals(JobParam.MissionState.mission.guid)
                             && robot.mission_state.run_id.Equals(JobParam.MissionState.run_id)
                            && robot.mission_state.state.ToLower().Contains("done");
                }
            }
            catch
            {
            }
            return false;
        }
        /// <summary>
        /// 转向
        /// </summary>
        /// <param name="robot"></param>
        protected void Turn(Robot robot)
        {
            Mission mission = MissionManager.GetMission(Setting_Str.Turn);
            if (mission != null)
            {
                SendMission(robot, mission);
            }
        }
        protected void PlaySound(Robot robot)
        {
            Mission mission = MissionManager.GetMission(Setting_Str.PlaySound);
            if (mission != null)
            {
                SendMission(robot, mission);
            }
        }
        protected void StopSound(Robot robot)
        {
            Mission mission = MissionManager.GetMission(Setting_Str.StopSound);
            if (mission != null)
            {
                SendMission(robot, mission);
            }
        }
        /// <summary>
        /// 是否已确认
        /// </summary>
        /// <returns></returns>
        protected bool IsConfirmed(Robot robot = null)
        {

            bool apiConfirm = JobParam?.CurDstNode?.Confirmed ?? false;

            bool actionConfirm = false;
            if (JobParam?.CurDstNode != null)
                actionConfirm = NodeManager.GetNodeStatus(JobParam.CurDstNode.Id).Equals(NodeStatus.Confirmed);
            bool btnOnAgv = false;
            if (robot.io_modules.Count > 0)
            {
                btnOnAgv = robot.io_modules[0].status?.input_state?[3] ?? false;
            }

            return apiConfirm || actionConfirm || btnOnAgv;
        }
        /// <summary>
        /// AGV拾取/进料架
        /// </summary>
        /// <param name="robot"></param>
        protected void PickUp(Robot robot, int side = 1)
        {
            Mission mission = MissionManager.GetMission($"{Setting_Str.PickUp}-{side}");
            if (mission != null)
            {
                SendMission(robot, mission);
            }
        }
        /// <summary>
        /// AGV放下/出料架
        /// </summary>
        /// <param name="robot"></param>
        protected void PutDown(Robot robot, int side = 1)
        {
            Mission mission = MissionManager.GetMission($"{Setting_Str.PutDown}-{side}");
            if (mission != null)
            {
                SendMission(robot, mission);
            }
        }
        protected void StartCharge(Robot robot)
        {
            Mission mission = MissionManager.GetMission(Setting_Str.Charge);
            if (mission != null)
            {
                SendMission(robot, mission);
            }
        }
        protected Job GetCallBackJob()
        {
            //Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集
            //return (Model.Job)assembly.CreateInstance(JobParam.CallbackJob.Type.FullName);
            object[] parameters = new object[1];
            parameters[0] = JobParam;
            Job job = (Job)Activator.CreateInstance(JobParam.CallbackJob.Type, parameters);
            return job;
        }
        protected RunStep GetCallBackStep()
        {
            return JobParam.CallbackJob.RunStep;
        }
        /// <summary>
        /// 生成Job回调
        /// </summary>
        /// <param name="type"></param>
        /// <param name="callbackStep"></param>
        /// <returns></returns>
        protected void GenJobCallBack(Type type, RunStep callbackStep, JobParam jobParam = null)
        {
            JobParam.CallbackJob = new JobCallBack(type, callbackStep);
        }
        /// <summary>
        /// 是否开始充电
        /// </summary>
        /// <returns></returns>
        protected bool ChargeOk(Robot robot)
        {
            return true;
            string txt = robot?.status?.mission_text?.ToLower() ?? "";
            return txt.Contains("充电中") || txt.Contains("charging");
        }
        protected void SetRobotState(Robot robot, RobotState state)
        {
            robot.state = state;
            Log.Info($"【{robot.name}】设置状态为{state.ToString()}");
        }
        public void SetOrderState(string orderId, int state)
        {
            Robot robot = RobotManager.GetRobot(JobParam?.RobotIp);
            OrderManager.SetOrderState(orderId, state);
            Log.Info($"改变订单状态:【{robot?.name??""}】【{orderId}】【{state}】【{OrderManager.GetOrderState(state)}】");
        }
        protected bool NeedToShelfPlace(Robot robot,string shelfID, out string targetLines)
        {
            targetLines = "";//A05-2FSMT-16S
            bool rtn = HttpManager.GetBoxTarget(shelfID, out BoxTaskInfo boxTaskInfo);
            RobotManager.ClearBoxBind(robot,shelfID);
            if (rtn)
            {
                if (String.IsNullOrEmpty(boxTaskInfo.line))
                {
                    return false;
                }

                targetLines = boxTaskInfo.line;
                return boxTaskInfo.rackTaskCount > 0;
            }
            return false;
        }
    }
}