HAIManager.cs 10.7 KB
using OnlineStore.Common;
using OnlineStore.DeviceLibrary.ESS;
using System;
using System.Collections.Generic;

namespace OnlineStore.DeviceLibrary
{
    public class HAIManager
    {
        private static string Addr_containerArrived = "/agv/hai/containerArrived";
        /// <summary>
        /// ESS创建任务接口
        /// </summary>
        private static string Addr_createTask = "/task/create";
        /// <summary>
        /// ESS创建任务接口
        /// </summary>
        private static string Addr_cancelTask = "/task/cancel";
        static string Addr_GetRobotState = "/robot/query";
        static string splitString(string baseAddr)
        {
            if (baseAddr.EndsWith("/"))
            {
                baseAddr = baseAddr.Substring(0, baseAddr.Length - 1);
            }
            return baseAddr;
        }

        /// <summary>
        /// 获取机器人状态
        /// </summary>
        /// <returns></returns>
        public static RobotStates GetRobotState(string baseAddr)
        {
            try
            {
                string path = splitString(baseAddr) + Addr_GetRobotState;
                Dictionary<string, object> tmp = new Dictionary<string, object>();
                string param = JsonHelper.SerializeObject(tmp);
                if (HttpHelper.Post(path, param, out bool isTimueOut, out string outMsg))
                {
                    ResultData resultData = JsonHelper.DeserializeJsonToObject<ResultData>(outMsg);
                    if (resultData != null)
                    {
                        if (resultData.code.Equals(0))
                            return resultData.data;
                    }
                    else
                        return null;
                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error($"GetRobotState ", ex);
            }
            return null;
        }
        /// <summary>
        ///  容器到达,发给ESS
        /// </summary>
        /// <param name="ess_server"></param>
        /// <param name="essModel"></param>
        public static void ContarinerArrived(string ess_server,EssModel essModel)
        {
            try
            {
                string path = splitString(ess_server) + Addr_containerArrived;
                string param = JsonHelper.SerializeObject(essModel);
                string resultStr = HttpHelper.Post(path, param);
                LogUtil.info("容器到达【" + path + "】" + param + "【" + resultStr + "】");
            }
            catch (Exception ex)
            {
                LogUtil.error("容器到达 异常", ex);
            }
        }

        /// <summary>
        /// 创建入库请求
        /// containerCode、slotCode参数必填
        /// </summary>
        /// <param name="ess_server"></param>
        /// <param name="containerInfos"></param>
        /// <param name="debug"></param>
        /// <returns></returns>
        public static bool CreateInStoreOrder(string ess_server, List<ContainerInfo> containerInfos, bool debug = false)
        {
            try
            {
                ESS_CreateTaskBody body = new ESS_CreateTaskBody();
                body.taskType = "tote_inbound";
                body.tasks = new List<ESSTask>();
                foreach (var item in containerInfos)
                {
                    item.TaskCode = $"IN-{item.ContainerValidCode}-{DateTime.Now.ToString("yyyyMMddHHmmssff")}";
                    ESSTask task = new ESSTask();
                    task.taskCode = item.TaskCode;
                    task.taskDescribe = new ESSInstoreTaskDesc()
                    {
                        containerCode = item.ContainerValidCode,
                        locationCode = item.InoutParam?.slotCode
                    };
                    body.tasks.Add(task);
                }
                string param = JsonHelper.SerializeObject(body);
                string path = splitString(ess_server) + Addr_createTask;
                if (HttpHelper.Post(path, param, out bool isTimueOut, out string outMsg))
                {
                    ServerData1 server = JsonHelper.DeserializeJsonToObject<ServerData1>(outMsg);
                    if (server != null)
                    {
                        foreach (var item in containerInfos)
                        {
                            if (server.data.ContainsKey(item.TaskCode))
                            {
                                if (server.data[item.TaskCode].ToString().ToLower().Equals("ok"))
                                {
                                    if (!debug)
                                        ContainerManager.UpdateTaskStatus(item.ContainerValidCode, TaskStatus.EXECUTING);
                                }
                            }
                        }
                        LogUtil.info($"创建入库任务成功【{path}】【{param}】【{outMsg}】");
                        return true;
                    }
                    LogUtil.info($"创建入库任务失败,ESS返回失败【{path}】【{param}】【{outMsg}】");
                    return false;
                }
                else
                {
                    LogUtil.error($"创建入库任务失败【{path}】【{param}】【{outMsg}】【{isTimueOut}】");
                    return false;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error($"创建入库任务异常", ex);
            }
            return false;
        }

        /// <summary>
        /// 创建出库请求
        /// containerCode参数必填
        /// </summary>
        /// <param name="containerInfos"></param>
        /// <returns></returns>
        public static bool CreateOutStoreOrder(string ess_server, List<ContainerInfo> containerInfos, bool debug = false)
        {
            try
            {
                ESS_CreateTaskBody body = new ESS_CreateTaskBody();
                body.taskType = "tote_outbound";
                body.tasks = new List<ESSTask>();
                foreach (var item in containerInfos)
                {
                    item.TaskCode = $"OUT-{item.ContainerValidCode}-{DateTime.Now.ToString("yyyyMMddHHmmssff")}";
                    ESSTask task = new ESSTask();
                    task.taskCode = item.TaskCode;
                    task.taskDescribe = new ESSOutstoreTaskDesc()
                    {
                        containerCode = item.ContainerValidCode,
                        toStationCode = new List<string>() { "1" }
                    };
                    body.tasks.Add(task);
                }
                string param = JsonHelper.SerializeObject(body);
                string path = splitString(ess_server) + Addr_createTask;
                if (HttpHelper.Post(path, param, out bool isTimueOut, out string outMsg))
                {
                    ServerData1 server = JsonHelper.DeserializeJsonToObject<ServerData1>(outMsg);
                    if (server != null)
                    {
                        foreach (var item in containerInfos)
                        {
                            if (server.data.ContainsKey(item.TaskCode))
                            {
                                if (server.data[item.TaskCode].ToString().ToLower().Equals("ok"))
                                {
                                    if (!debug)
                                        ContainerManager.UpdateTaskStatus(item.ContainerValidCode, TaskStatus.EXECUTING);
                                }
                            }
                        }
                        LogUtil.info($"创建出库任务成功【{path}】【{param}】【{outMsg}】");
                        return true;
                    }
                    LogUtil.info($"创建出库任务失败,ESS返回失败【{path}】【{param}】【{outMsg}】");
                    return false;
                }
                else
                {
                    LogUtil.error($"创建出库任务失败【{path}】【{param}】【{outMsg}】【{isTimueOut}】");
                    return false;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error($"创建出库任务异常:{JsonHelper.SerializeObject(containerInfos)}", ex);
            }
            return false;
        }
        /// <summary>
        /// 取消出库任务
        /// </summary>
        /// <param name="containerInfos"></param>
        /// <param name="debug"></param>
        /// <returns></returns>
        public static bool CancelOutStoreOrder(string ess_server, List<ContainerInfo> containerInfos, bool debug = false)
        {
            try
            {
                ESS_CancelBody body = new ESS_CancelBody();
                body.taskCodes = new List<string>();
                foreach (var item in containerInfos)
                {
                    body.taskCodes.Add(item.TaskCode);
                }
                string param = JsonHelper.SerializeObject(body);
                string path = splitString(ess_server) + Addr_cancelTask;
                if (HttpHelper.Post(path, param, out bool isTimueOut, out string outMsg))
                {
                    ServerData1 server = JsonHelper.DeserializeJsonToObject<ServerData1>(outMsg);
                    if (server != null)
                    {
                        foreach (var item in containerInfos)
                        {
                            if (server.data.ContainsKey(item.TaskCode))
                            {
                                if (server.data[item.TaskCode].ToString().ToLower().Equals("ok"))
                                {
                                    if (!debug)
                                        ContainerManager.UpdateTaskStatus(item.ContainerValidCode, TaskStatus.EXECUTING);
                                }
                            }
                        }
                        LogUtil.info($"取消出库任务成功【{path}】【{param}】【{outMsg}】");
                        return true;
                    }
                    LogUtil.info($"取消出库任务失败,ESS返回失败【{path}】【{param}】【{outMsg}】");
                    return false;
                }
                else
                {
                    LogUtil.error($"取消出库任务失败【{path}】【{param}】【{outMsg}】【{isTimueOut}】");
                    return false;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error($"取消出库任务异常:{JsonHelper.SerializeObject(containerInfos)}", ex);
            }
            return false;
        }

    }
}