HttpServer.cs 13.5 KB
using OnlineStore.Common; 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;

namespace DeviceLibrary
{
    public class HttpServer
    {

        public HttpServer()
        {
        }
        private static string Addr_updateDeviceAlarmMsg = "/rest/api/qisda/device/updateDeviceAlarmMsg"; 
        private static string Addr_ShelfFinish = "/rest/api/qisda/device/putShelfFinished";
        private static string Addr_getLocation = "/rest/api/qisda/device/getLocation";
        private static string Addr_getShelfEmptySlot = "/rest/api/dcs/device/getShelfEmptySlot";
        /// <summary>
        ///   rest/api/dcs/device/getShelfEmptySlot
        ///   获取当前任务数及料架的剩余空位
        ///   参数:rfids 料架rfid列表,逗号分割,未发送rfids只返回当前剩余任务数量 
        /// </summary>
        /// <param name="rfids"></param>
        /// <returns></returns>
        public static Dictionary<string, int> getShelfEmptySlot(string rfids)
        {

            Dictionary<string, int> map = new Dictionary<string, int>();
            DateTime startTime = DateTime.Now;
            try
            {
                string api = Addr_getShelfEmptySlot;
                Dictionary<string, string> paramMap = new Dictionary<string, string>();
                paramMap.Add("rfids", rfids);
                string url = GetAddr(api, paramMap);
                LogUtil.debug("http :URL:" + url);

                string json = HttpHelper.Post(url, "", 2000);
                if (rfids != "")
                {
                    LogUtil.debug("http :URL:" + url + " :Response:" + json + " 耗时[" + FormUtil.GetSpanStr(DateTime.Now - startTime) + "]");
                }
                else
                {
                    LogUtil.debug("http :URL:" + url + " :Response:" + json);
                }
                if (string.IsNullOrWhiteSpace(json))
                {
                    return map;
                }

                ResultData result = JsonHelper.DeserializeJsonToObject<ResultData>(json);
                if (result.code > 0||result.data==null)
                {
                    LogUtil.error("getShelfEmptySlot,rfids[" + rfids + "]结果:code=" + result.code + ",msg=" + result.msg);
                }
                else
                {
                    foreach(string key in result.data.Keys)
                    {
                        int v =Convert.ToInt32( result.data[key].ToString());
                        map.Add(key, v);
                    } 
                    return map;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("http getShelfEmptySlot error  : " + ex.ToString());
            }
            return map;
        }


        //private static string Addr_putShelfFinished = "/rest/api/qisda/device/putShelfFinished";
        //        取消出库任务地址:   /cancelOutTask      //参数: barcode
        //private static string Addr_cancelPutInTask = "/rest/api/qisda/device/cancelOutTask";
        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, "", 2000);
                LogUtil.debug("updateDeviceAlarmMsg    " + FormUtil.GetSpanStr(DateTime.Now - startTime) + "  【" + server + "】【" + resultStr + "】");

                ResultData data = JsonHelper.DeserializeJsonToObject<ResultData>(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)
            {
                LogUtil.error("  updateDeviceAlarmMsg Error:  " + ex.ToString());
            }
            return msg;
        } 
        public static string GetAddr(string addr, Dictionary<string, string> paramsMap)
        {
            string server = ConfigAppSettings.GetValue(Setting_Init.Device_Server_Address);
            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;
        }
        private static string getData(Dictionary<string, Object> data, string key)
        {
            if (data.ContainsKey(key))
            {
                return data[key].ToString();
            }
            return "";
        }
        private static  int getIntData(Dictionary<string, Object> data, string key)
        {
            try
            {
                return Int32.Parse(getData(data, key));
            }
            catch (Exception ex)
            {

            }
            return -1;
        }
        /// <summary>
        /// 放料到料架完成通知
        /// </summary>
        /// <param name="rfid"></param>
        /// <param name="barcode"></param>
        /// <param name="rfidLoc"></param>
        /// <param name="robotIndex"></param>
        /// <returns></returns>
        public static ShelfTaskInfo ShelfFinish(string rfid, string barcode = "", string rfidLoc = "", string robotIndex = "1")
        {
            ShelfTaskInfo task = new ShelfTaskInfo();
            task.rfid = rfid;

            DateTime startTime = DateTime.Now;
            try
            {
                string api = Addr_ShelfFinish;
                Dictionary<string, string> paramMap = new Dictionary<string, string>();
                paramMap.Add("barcode", barcode);
                paramMap.Add("rfid", rfid);
                paramMap.Add("rfidLoc", rfidLoc);
                paramMap.Add("robotIndex", robotIndex);
                //string url = httpAddr + api + "?barcode=" + barcode + "&rfid=" + rfid + "&rfidLoc=" + rfidLoc + "&robotIndex=" + robotIndex;
                string url = GetAddr(api, paramMap);
                LogUtil.debug("http :URL:" + url);
                 
                string resultStr = HttpHelper.Post(url, "", 10000);
                if (barcode != "")
                {
                    LogUtil.info("http :URL:" + url + " :Response:" + resultStr + " 耗时[" + FormUtil.GetSpanStr(DateTime.Now - startTime) + "]");
                }
                else
                {
                    LogUtil.debug("http :URL:" + url + " :Response:" + resultStr);
                }
                ResultData data = JsonHelper.DeserializeJsonToObject<ResultData>(resultStr);

                if (data == null || data.code != 0)
                { 
                    return null;
                }
                else
                {
                    task.bigEmpty = getIntData(data.data, "bigEmpty");
                    task.smallEmpty = getIntData(data.data, "smallEmpty");
                    task.usedRfidList = getData(data.data, "usedRfidList"); 
                }
               
            }
            catch (Exception ex)
            {
                LogUtil.error("http error  : " + ex.ToString());
            }
            return task;
        }

        /// <summary>
        /// 根据条码获取位置
        /// </summary>
        /// <param name="barcode"></param>
        /// <param name="currRFID"></param>
        /// <param name="msg"></param>
        /// <returns></returns>
        public static TrayInfo GetLocation(string barcode, string currRFID, out string msg)
        {
            //getLocation这个接口传入barcode和rfid列表会分配料架
            TrayInfo tray = new TrayInfo();
            msg = "";
            try
            {
                //string api = "getLocation" + "?barcode=" + barcode + "&rfid=" + currRFID;
                //string url = httpAddr + api;
                Dictionary<string, string> paramMap = new Dictionary<string, string>();
                paramMap.Add("barcode", barcode);
                paramMap.Add("rfid", currRFID);

                string url = GetAddr(Addr_getLocation, paramMap);
                string logName = "http :URL:" + url;
                DateTime startTime = DateTime.Now;
                string resultStr = HttpHelper.Post(url, "", 5000);
                LogUtil.info(logName + ": Response:" + resultStr + ",耗时【" + FormUtil.GetSpanStr(DateTime.Now - startTime) + "】");

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

                if (data == null || data.code != 0)
                {
                    tray = TrayInfo.newNgTray(barcode, data.msg);
                    return tray;
                }

                tray = JsonHelper.DeserializeJsonToObject<TrayInfo>(data.data.ToString());
                if (tray == null || tray.rfid == "" || tray.shelfP == 0)
                {
                    tray = TrayInfo.newNgTray(barcode, "获取位置失败");
                    return tray;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("http error  : " + ex.ToString());
            }
            //tray.robotNum = robot;
            return tray;
        }
   
         
    }
    public class TrayInfo
    {
        //Response:{"code":0,"msg":"ok","data":{"w":"7","realRfid":"","h":"8","rfid":"1-2F","usedRfidList":"F102","rfidLoc":"11","barcode":"985022*35030377*0822*3000*08220350"}}
        /// <summary>
        /// 料架位置,1-31
        /// </summary>
        public int shelfP = 0;
        /// <summary>
        /// 虚拟料架号
        /// </summary>
        public string rfid = "";
        /// <summary>
        /// 真实料架号
        /// </summary>
        public string realRFID = "";
        /// <summary>
        /// 条码信息
        /// </summary>
        public string barcode = "";
        /// <summary>
        /// 已使用的真实料架号
        /// </summary>
        public string usedRfidList = "";

        public int plateW = 7;
        public int plageH = 8;

        public bool ngReel = false;

        public string ngMsg = "";

        public string ToStr()
        {
            if (ngReel)
            { 
                return "NGReel: [" + barcode + "] [" + ngMsg + "] [" + updateTime.ToLongTimeString() + "]";
            }
            else
            {
                return " [" + barcode + "] [" + shelfP + "]  [" + rfid + "]  [" + realRFID + "]  [" + usedRfidList + "] [" + updateTime.ToLongTimeString() + "]";
            }
        }
        public DateTime updateTime = DateTime.Now;

        public TrayInfo()
        {

        }
        public static TrayInfo newNgTray(string barcode, string ngMsg)
        {
            TrayInfo tray = new TrayInfo();
            tray.ngMsg = ngMsg;
            tray.ngReel = true;
            tray.barcode = barcode;
            return tray;
        }

    }

    public class ShelfTaskInfo
    {
        public string rfid = "";
        public int bigEmpty = -1;
        public int smallEmpty = -1;
        //public int packageEmpty = -1; 
        public string usedRfidList = "";
        public bool IsValid()
        {
            if (bigEmpty != -1 && smallEmpty != -1)
            {
                return true;
            }
            return false;
        }

        public string ToStr()
        {
            return "  " + rfid + "剩余位置:  小料=" + smallEmpty + ",大料=" + bigEmpty + ",已使用料架=" + usedRfidList + " ";
        }
    }
    public class AllTaskInfo
    {
        public int smallTask = -1;
        public int bigTask = -1;
        //public int packageTask = -1;
        public string ToStr()
        {
            return " 剩余任务: 小料=" + smallTask + ",大料=" + bigTask + " ";
        }
        public bool IsValid()
        {
            if (smallTask != -1 && bigTask != -1)
            {
                return true;
            }
            return false;
        }
    }

    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 ResultData
    //{ 
    //    public int code { get; set; }

    //    public string msg { get; set; }

    //    public object data { get; set; }
    //}
   
}