AGVManager.cs 10.8 KB
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AGVControl;

namespace BLL
{
    public class AGVManager
    {
        /// <summary>
        /// 小车从B区域离开前检查出库任务是否完成
        /// </summary>
        /// <param name="rfid"></param>
        /// <returns>true:可以离开</returns>
        public static bool LeaveCheck(Agv_Info agv, out int taskCount)
        {
            taskCount = 0;
            try
            {
                //Common.log.OutInfo("URL:"  +  Common.webService["URL"]);
                string url = ConfigAppSettings.GetValue(Setting_Init.http_server) + "rest/api/qisda/device/shelfTaskCount?rfid=" + agv.RFID;
                var client = new RestSharp.RestClient(url) { Timeout = -1 };
                var request = new RestSharp.RestRequest(RestSharp.Method.GET);
                RestSharp.IRestResponse response = client.Execute(request);
                string json = response.Content;
                Common.log.OutInfo(agv.Name + " [URL:  " + url+"] [Return:  " + json+"]");
                if (string.IsNullOrWhiteSpace(json)) return true;    //可以离开
                //{"code":0,"msg":"ok","data":{"taskCount":1,"rfid":"A14"}}不能搬运锁定的料架,到待机位等待
                ShelfTaskCount serverResult = JsonHelper.DeserializeJsonToObject<ShelfTaskCount>(json);
                if (serverResult == null)
                {
                    Common.log.OutInfo(" 没有收到服务器反馈");
                    return true;
                }
                if (serverResult.code != 0) return true;

                if (serverResult.data.taskCount == 0) //该料架出库完成
                {
                    //清除mark
                    List<string> markLst = new List<string>();
                    foreach (var mark in Common.control.Marks)
                    {
                        int count = 0;
                        foreach (var node in Common.nodeInfo)
                        {
                            if (mark.Equals(node.Mark))
                                count++;
                        }
                        if (count == 0)//mark存在标记,但节点任务没有,删除该mark
                        {
                            markLst.Add(mark);
                        }
                    }
                    if (markLst.Count != 0)
                    {
                        for (int i = 0; i < markLst.Count; i++)
                        {
                            Common.control.Marks.Remove(markLst[i]);
                        }
                    }
                    Common.log.OutInfo(agv.Name+" 料架【" + agv.RFID + "】 无剩余出库任务,serverResult.shelfTaskData.taskCount=" + serverResult.data.taskCount.ToString());
                    return true;
                }
                else //该料架的出库任务未完成
                {
                    //  foreach (ShelfLockData item in serverResult.data)
                    //  {
                    taskCount = serverResult.data.taskCount;
                    Common.log.OutInfo(agv.Name + " [RFID=" + serverResult.data.rfid + "] [taskCount=" + serverResult.data.taskCount + "]");
                    // }
                    return false;
                }
            }
            catch (Exception ex)
            {
                Common.log.OutError(ex);
                return true;
            }


        }

        private static string Addr_getShelfLockInfo = "/rest/api/qisda/device/getShelfLockInfo"; //包装仓获取料架锁定状态地址
        public static bool GetShelfLockInfo(string name,string rfid, List<string> shelfLockNodeNames)
        {
            string msg = "";
            try
            {
                Dictionary<string, string> paramMap = new Dictionary<string, string>();
                paramMap.Add("rfid", rfid);

                string server = GetAddr(Addr_getShelfLockInfo, paramMap);
                DateTime startTime = DateTime.Now;

                string resultStr = HttpHelper.Post(server, "");

                Common.log.OutInfo("节点【"+name+ "】 料架锁定状态 " + " 【" + server + "】【" + resultStr + "】");

                ShelfLockInfo serverResult = JsonHelper.DeserializeJsonToObject<ShelfLockInfo>(resultStr);
                if (serverResult == null)
                {
                    msg = "节点【" + name + "】没有收到服务器反馈";
                    Common.log.OutInfo(msg);
                    return false;
                }

                if (serverResult.data.Count == 0) //该料架未锁定
                {
                    msg = "节点【" + name + "】 料架【" + rfid + "】 没有锁定库位的料";
                    Common.log.OutInfo(msg);
                    return false;
                }
                else //该料架存在锁定库位的料
                {
                    foreach (ShelfLockData item in serverResult.data)
                    {
                        if (!shelfLockNodeNames.Contains(Common.webService[item.cid]))
                        {
                            shelfLockNodeNames.Add(Common.webService[item.cid]);
                            Common.log.OutInfo("锁定的CID=" + item.cid + ";节点名称=" + Common.webService[item.cid]);
                        }
                    }
                    Common.log.OutInfo("节点【" + name + "】"+rfid+"获取料架上的锁定料仓信息完成");
                    return true;
                }
            }
            catch (Exception ex)
            {
                Common.log.OutInfo(ex.Message);
            }
            return false;
        }
        private static string Addr_updateDeviceAlarmMsg = "/rest/api/qisda/device/updateDeviceAlarmMsg";
        /// <summary>
        /// 异常看板
        /// </summary>
        /// <param name="msgList"></param>
        /// <returns></returns>
        public static string updateDeviceAlarmMsg(List<AlarmMsg> msgList)
        {
            string msg = "";
            try
            {
                Dictionary<string, string> paramMap = new Dictionary<string, string>();
                string msgListStr = JsonHelper.SerializeObject(msgList);
                paramMap.Add("deviceAlarmList", msgListStr);
                string server = GetAddr(Addr_updateDeviceAlarmMsg, paramMap);
                DateTime startTime = DateTime.Now;
                string resultStr = HttpHelper.Post(server, "");
                Common.log.OutInfo("updateDeviceAlarmMsg    " + "  【" + server + "】【" + resultStr + "】");

                RfidData data = JsonHelper.DeserializeJsonToObject<RfidData>(resultStr);

                if (data == null)
                {
                    return msg = " updateDeviceAlarmMsg 没有收到服务器反馈";
                }
                else if (data.code.Equals(0).Equals(false))
                {
                    return msg = " updateDeviceAlarmMsg   【" + server + "】【" + resultStr + "】" + data.msg;
                }
                return "";
            }
            catch (Exception ex)
            {
                Common.log.OutError(ex);
            }
            return msg;
        }
        private static string GetAddr(string addr, Dictionary<string, string> paramsMap)
        {
            string server = ConfigAppSettings.GetValue(Setting_Init.http_server);
            if (server.EndsWith("/"))
            {
                server = server.Substring(0, server.Length - 1);
            }
            string path = server + addr.Trim() + "?";
            foreach (string paramName in paramsMap.Keys)
            {
                string par = System.Web.HttpUtility.UrlEncode(paramsMap[paramName], System.Text.Encoding.UTF8);
                path += paramName + "=" + par + "&";
            }
            path = path.Substring(0, path.Length - 1);
            return path;
        }
    }
    public class ShelfLockInfo
    {
        //返回: {"code":0,"msg":"ok","data":
        //[{"barcode":"S20052301213","cid":"packing-20","rfid":"A12","rfidLoc":"3","lockPos":"4D2001AA0006","lockPosId":"1231"}]}
        /// <summary>
        /// 返回码,0为正常,其他为异常
        /// </summary>
        public int code { get; set; }
        /// <summary>
        /// 消息
        /// </summary>
        public string msg { get; set; }

        public List<ShelfLockData> data { get; set; }
    }

    public class ShelfLockData
    {
        /// <summary>
        /// 库位中料盘的条码
        /// </summary>
        public string barcode { get; set; }
        /// <summary>
        /// 库位中料盘的锁定库位对应的料仓编
        /// </summary>
        public string cid { get; set; }
        /// <summary>
        /// 料架RFID
        /// </summary>
        public string rfid { get; set; }
        /// <summary>
        /// 料架的库位
        /// </summary>
        public int rfidLoc { get; set; }
        /// <summary>
        /// 库位中料盘的锁定库位
        /// </summary>
        public string lockPos { get; set; }
        /// <summary>
        /// 料架出库的剩余数量
        /// </summary>
        public int taskCount { get; set; }

    }

    /// <summary>
    /// 获取料架中的任务数
    /// </summary>
    public class ShelfTaskCount
    {
        // {"code":0,"msg":"ok","data":{"taskCount":0,"rfid":"A2"}}
        /// <summary>
        /// 0为正常,其他为异常
        /// </summary>
        public int code { get; set; }
        /// <summary>
        /// 消息
        /// </summary>
        public string msg { get; set; }

        public ShelfTaskData data { get; set; }
    }

    public struct ShelfTaskData
    {
        /// <summary>
        /// 当前料架剩余任务数(即还有几盘料没放上去)
        /// </summary>
        public int taskCount { get; set; }
        /// <summary>
        /// 料架RFID
        /// </summary>
        public string rfid { get; set; }
    }

    public class AlarmMsg
    {

        //>>>name :  异常位置名称
        public string name = "";
        //>>>msgKey :  异常信息唯一标识
        public string msgKey = "";
        //>>>msgValue :  异常信息
        public string msgValue = "";

        /// <summary>
        /// 异常信息
        /// </summary>
        /// <param name="name">异常位置名称</param>
        /// <param name="key">异常信息唯一标识</param>
        /// <param name="value">异常信息</param>
        public AlarmMsg(string name, string key, string value)
        {
            this.name = name;
            this.msgKey = key;
            this.msgValue = value;
        }
    }
    public class RfidData
    {
        //{"code":0,"msg":"ok","data":"7"} 
        public int code { get; set; }

        public string msg { get; set; }

        public Dictionary<string, string> data { get; set; }
    }
}