AGVManager.cs 12.8 KB
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Sockets;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using DeviceLibrary.bean.jobType;
using Common;
using DeviceLibrary.manager;
using DeviceLibrary.bean.agv;
using static DeviceLibrary.AgvInfo;
using static DeviceLibrary.OpManager;

namespace DeviceLibrary
{
    public static class AGVManager
    {

        static log4net.ILog log = log4net.LogManager.GetLogger("AGVManager");
        /// <summary>
        /// 小车信息
        /// </summary>
        public static List<AgvInfo> agvInfo;

        public static AgvServer server;
        public static Control control;
        public static List<JobType> jobTypes;
        public static readonly string CONFIG_PATH = AppDomain.CurrentDomain.BaseDirectory + "Config\\";
        public static List<string> sysClients = new List<string>();
        #region 任务日志
        static log4net.ILog runLog = log4net.LogManager.GetLogger("RunLog");
        static Dictionary<string, RunInfo> runInfoMap = new Dictionary<string, RunInfo>();

        public static void RunLogInfo(RunInfo info)
        {
            if (runInfoMap == null)
                return;
            if (runInfoMap.Keys.Contains(info.AGVNum))
            {
                if (!runInfoMap[info.AGVNum].Equals(info))
                {
                    runLog.Info(info.ToString());
                }
            }
            else
            {
                runInfoMap.Add(info.AGVNum, info);
                runLog.Info(info.ToString());
            }
        }

        public static void ErrorLogRecord(ErrorInfo errorInfo)
        {
            runLog.Info(errorInfo.ToString());
        }
        #endregion
        /// <summary>
        /// 初始化配置
        /// </summary>
        public static void Init()
        {
            jobTypes = new List<JobType>();
            jobTypes.Add(new F1LiftC1ToLiftD2JobType());
            jobTypes.Add(new F1LiftD2ToLiftC1JobType());
            jobTypes.Add(new LiftToLinesJobType());
            jobTypes.Add(new BackLiftToLineJobType());
            jobTypes.Add(new ShelfBuffToLiftJobType());
            jobTypes.Add(new LineToLiftJobType());
            jobTypes.Add(new LineOneToManyJobType());
            jobTypes.Add(new SteelLineToLiftJobType());
            jobTypes.Add(new SteelLiftToLinesJobType());
            jobTypes.Add(new ChargeJobType());
            InitAgv();

            //任务加载
            AgvTaskManager.InitAgvTask();
        }
        /// <summary>
        /// 获取任务系统标识
        /// </summary>
        /// <param name="floor"></param>
        /// <param name="liftId"></param>
        /// <param name="client"></param>
        /// <returns></returns>
        public static bool GetsysClientBy(int floor, string liftId, out string client)
        {
            client = "";
            AgvInfo agv = agvInfo.Find(s => s.Scope.Floor.Equals(floor) && s.Scope.Remark.Split(',').Contains(liftId));
            if (agv == null)
                return false;
            else
            {
                client = agv.Client;
                return true;
            }
        }
        static void InitAgv()
        {
            agvInfo = new List<AgvInfo>();
            XmlConfigOperation.LoadAgvInfos(agvInfo);
            ReadAgvContextInfo(agvInfo);
            foreach (AgvInfo item in agvInfo)
            {
                if (!sysClients.Contains(item.Client))
                    sysClients.Add(item.Client);
                item.StartTimer();
            }
        }
        /// <summary>
        /// 获取agv运行上下文
        /// </summary>
        /// <param name="agv"></param>
        /// <returns></returns>
        public static JobContext GetJobContext(AgvInfo agv)
        {
            using (AGVDataContext ctx = new AGVDataContext())
            {
                var info = ctx.JobContextInfos.Where(s => s.ip.Equals(agv.IP)).FirstOrDefault();
                if (info != null)
                {
                    try
                    {
                        return JsonHelper.DeserializeJsonToObject<JobContext>(info.jobContext);
                    }
                    catch
                    {
                        return new JobContext();
                    }
                }
            }
            return null;
        }
        /// <summary>
        /// 保存agv运行上下文
        /// </summary>
        /// <param name="agv"></param>
        public static void SaveJobContext(AgvInfo agv)
        {
            try
            {
                if (!DataBufferManager.JobContextInfos.ContainsKey(agv.IP))
                {
                    DataBufferManager.JobContextInfos.Add(agv.IP, JsonHelper.SerializeObject(agv.JobContext));
                    using (AGVDataContext ctx = new AGVDataContext())
                    {
                        var info = ctx.JobContextInfos.Where(s => s.ip.Equals(agv.IP)).FirstOrDefault();
                        if (info != null)
                        {
                            info.jobContext = JsonHelper.SerializeObject(agv.JobContext);
                        }
                        else
                        {
                            info = new JobContextInfo();
                            info.agvName = agv.Name;
                            info.ip = agv.IP;
                            info.jobContext = JsonHelper.SerializeObject(agv.JobContext);
                            ctx.JobContextInfos.Add(info);
                        }

                        ctx.SaveChangesAsync();
                    }
                }
                else
                {
                    string context = JsonHelper.SerializeObject(agv.JobContext);
                    if (!DataBufferManager.JobContextInfos[agv.IP].Equals(context))
                    {
                        using (AGVDataContext ctx = new AGVDataContext())
                        {
                            var info = ctx.JobContextInfos.Where(s => s.ip.Equals(agv.IP)).FirstOrDefault();
                            if (info != null)
                            {
                                info.jobContext = JsonHelper.SerializeObject(agv.JobContext);
                            }
                            else
                            {
                                info = new JobContextInfo();
                                info.agvName = agv.Name;
                                info.ip = agv.IP;
                                info.jobContext = JsonHelper.SerializeObject(agv.JobContext);
                                ctx.JobContextInfos.Add(info);
                            }

                            ctx.SaveChangesAsync();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error($"保存{agv.Name}上下文信息失败:{JsonHelper.SerializeObject(agv.JobContext)}", ex);
            }
        }
        static void ReadAgvContextInfo(List<AgvInfo> agvInfos)
        {
            try
            {
                foreach (AgvInfo agv in agvInfos)
                {
                    if (!agv.Auto)
                        continue;
                    bean.jobType.RecoveryJobType recoveryJobType = new RecoveryJobType();
                    JobContext info = GetJobContext(agv);
                    if (info != null)
                    {
                        if(string.IsNullOrEmpty(info.MissionId)|| string.IsNullOrEmpty(info.JobFullName))
                        {
                            continue;
                        }
                        agv.SetJobContext(info);
                        agv.CurJob = recoveryJobType.GetNewJob(agv);
                        if (agv.CurJob != null && (agv.CurJob is StandyJob || agv.CurJob is ChargeJob))
                        {
                            continue;
                        }
                        LogUtil.info($"读取并使用{agv.Name}上下文信息:{JsonHelper.SerializeObject(info)}");
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("读取Agv上下文信息失败:", ex);
            }
        }
    }

    public class RunInfo
    {
        /// <summary>
        /// AGV编号
        /// </summary>
        public string AGVNum { get; set; } = "";
        public string DeviceName { get; set; } = "";
        /// <summary>
        /// 任务名称
        /// </summary>
        public string TaskName { get; set; } = "";
        /// <summary>
        /// 目的地
        /// </summary>
        public string TargetPlace { get; set; } = "";
        /// <summary>
        /// 任务步骤
        /// </summary>
        public string TaskStep { get; set; } = "";
        /// <summary>
        /// 任务内容
        /// </summary>
        public string MissionInfo { get; set; } = "";
        /// <summary>
        /// 开始时间
        /// </summary>
        public string DateTime { get; set; } = "";
        /// <summary>
        /// 结束时间
        /// </summary>
        public string EndDateTime { get; set; } = "";
        /// <summary>
        /// 任务运行时长
        /// </summary>
        public string TaskRunTime { get; set; } = "";
        /// <summary>
        /// 类型
        /// </summary>
        public string Type { get; set; } = "Task";

        public void SetInfo(string AGVNum, string jobName, string targetPlace, string taskStep, string missionInfo, DateTime startTime, DateTime endTime)
        {
            //开始时间 2006-01-02 15:04:05
            DateTime = startTime.ToString("yyyy-MM-dd HH:mm:ss");
            EndDateTime = endTime.ToString("yyyy-MM-dd HH:mm:ss");
            this.AGVNum = AGVNum;
            MissionInfo = missionInfo;
            TaskName = jobName;
            TaskRunTime = (endTime - startTime).TotalMinutes.ToString("f2");
            TargetPlace = targetPlace;
            TaskStep = taskStep;
        }
        public RunInfo() { }
        public override bool Equals(object obj)
        {
            if (obj is RunInfo)
            {
                RunInfo info = (RunInfo)obj;
                if (this.MissionInfo.Equals(info.MissionInfo))
                    return true;
                this.MissionInfo = info.MissionInfo;
            }
            return false;
        }
        public override string ToString()
        {
            return JsonHelper.SerializeObject(this);
        }
    }

    public class ErrorInfo
    {
        /// <summary>
        /// AGV编号
        /// </summary>
        public string AGVNum
        {
            get { return agvname; }
            set
            {
                agvname = value.PadLeft(4, '0');
            }
        }
        private string agvname = "";
        public string DeviceName { get; set; } = "";
        /// <summary>
        /// 开始时间
        /// </summary>
        public string DateTime { get; set; } = "";
        /// <summary>
        /// 结束时间
        /// </summary>
        public string EndDateTime { get; set; } = "";
        /// <summary>
        /// 异常信息
        /// </summary>
        public string ErrorMsg { get; set; } = "";
        public string ErrorLastTime { get; set; } = "";
        /// <summary>
        /// 任务名称
        /// </summary>
        public string TaskName { get; set; } = "";
        /// <summary>
        /// AGV的当前任务
        /// </summary>
        public string AGVMissionName { get; set; } = "";

        public string MissionInfo { get; set; } = "";
        /// <summary>
        /// 目的地
        /// </summary>
        public string TargetPlace { get; set; } = "";
        /// <summary>
        /// 类型
        /// </summary>
        public string Type { get; set; } = "Error";
        public ErrorInfo(AgvInfo agv)
        {
            DateTime = agv.errStartTime.ToString("yyyy-MM-dd HH:mm:ss");
            AGVNum = agv.Name;
            EndDateTime = System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            ErrorMsg = agv.ErrorMsg;
            ErrorLastTime = (System.DateTime.Now - agv.errStartTime).TotalMinutes.ToString("f2");
            if (agv.CurJob != null)
            {
                TaskName = agv.CurJob.JobName;
                MissionInfo = agv.CurJob.runInfo;
            }
            AGVMissionName = agv.TaskRunState.Task.AliceName;
            TargetPlace = agv.Place.Name;
        }
        public override string ToString()
        {
            return JsonHelper.SerializeObject(this);
        }
    }
    public static class Window_API
    {
        [DllImport("user32.dll", EntryPoint = "ShowWindow", CharSet = CharSet.Auto)]
        public static extern int ShowWindow(IntPtr hwnd, int nCmdShow);
        [DllImport("user32.dll ", SetLastError = true)]
        public static extern void SwitchToThisWindow(IntPtr hWnd, bool fAltTab);
        public const int SW_RESTORE = 9;

    }


}