using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; using NLog; using POSV.Common.Http; using POSV.Common.Transport; using POSV.Common.Util; using POSV.Entity; namespace POSV.Utils { public class MessageCenterUtils { private static Logger logger = NLog.LogManager.GetCurrentClassLogger(); private static object _lock = new object(); private static MessageCenterUtils _instance = null; /// /// 消息中心Http服务访问地址 /// private readonly string _context_path = "/api/v1"; private string _baseUrl = string.Empty; private string _message = string.Empty; private HttpManager _httpManager = null; public static MessageCenterUtils Instance { get { if (_instance == null) { lock (_lock) { _instance = new MessageCenterUtils(); _instance.InitMessageCenter(); } } return _instance; } } private void InitMessageCenter() { try { this._httpManager = new HttpManager(); //获取消息中心配置 var messageCenter = Global.Instance.EnableServiceCenter; if (messageCenter.Item1) { //Web服务地址 string url = messageCenter.Item3; //Web服务端口为基础端口+1 int port = messageCenter.Item4 + 1; this._baseUrl = string.Format("http://{0}:{1}{2}", url, port, this._context_path); this._message = messageCenter.Item2; } else { this._baseUrl = string.Empty; this._message = messageCenter.Item2; } } catch (Exception ex) { logger.Error(ex , "初始化消息中心异常"); } } /// /// 检测消息中心是否正常。1)没有配置消息中心;2)启用了消息中心是否连接; /// /// public Tuple IsAvailable() { bool enabled = false; bool connected = false; try { Stopwatch watch = Stopwatch.StartNew(); //是否启用消息中心 bool enabledMessageCenter = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_SERVICECENTER_ENABLE , false); if (enabledMessageCenter) { enabled = true; } else { enabled = false; } if (enabled) { logger.Info("开始检测服务中心是否通畅耗时"); //获取配置的参数 string host = Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_SERVICECENTER_IP , string.Empty); int port = Global.Instance.GlobalConfigIntValue(ConfigConstant.DEVICE_SERVICECENTER_PORT , 0); //IP和端口配置错误 if (string.IsNullOrEmpty(host) || port == 0) { connected = false; } else { //检测IP和端口是否通畅 var url = string.Format("{0}{1}" , this._baseUrl , "/amok"); HttpResult hr = this._httpManager.Get(url , null, 2000); connected = (hr.Code == 200); } } else { connected = false; } logger.Info("检测服务中心是否通畅耗时<{0}>", watch.ElapsedMilliseconds); } catch (Exception ex) { logger.Error(ex , "连接消息中心失败"); enabled = false; connected = false; } return new Tuple(enabled , connected); } /// /// 是否采用共享沽清 /// public bool IsSaleClear { get { //是否启用共享沽清 var enableSaleClear = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_SALECLEAR_ENABLE , false); //1)启用消息中心;2)消息中心连接正常;3)参数配置中设置了共享沽清 return Global.Instance.MessageCenterOnline.Item1 && Global.Instance.MessageCenterOnline.Item2 && enableSaleClear; } } /// /// 加载服务中心的全局票号 /// /// /// public Tuple GetGlobalTicketNo(int length = 4) { lock (Global.Instance.CacheLock) { try { if (!string.IsNullOrEmpty(this._baseUrl)) { var url = string.Format("{0}{1}{2}" , this._baseUrl , "/trade/" , length); HttpResult hr = this._httpManager.Get(url , null); if (hr.Code == 200) { return new Tuple(true , string.Format("获取到全局票号成功<{0}>" , hr.Text) , hr.Text); } else { return new Tuple(false , string.Format("获取到全局票号失败<{0}>" , hr.Text) , hr.Text); } } else { return new Tuple(false , this._message , string.Empty); } } catch (Exception ex) { logger.Error(ex , "获取全局票号异常"); return new Tuple(false , "获取全局票号失败" , string.Empty); } } } /// /// 加载服务中心全局序号 /// /// /// /// public Tuple GetGlobalOrderNo(int length = 2,int initialValue = 0) { lock(Global.Instance.CacheLock) { try { if (!string.IsNullOrEmpty(this._baseUrl)) { var url = string.Format("{0}{1}{2}/{3}" , this._baseUrl , "/order/" , length , initialValue); HttpResult hr = this._httpManager.Get(url , null); if (hr.Code == 200) { return new Tuple(true , string.Format("获取到全局序号成功<{0}>" , hr.Text) , hr.Text); } else { return new Tuple(false , string.Format("获取到全局序号失败<{0}>" , hr.Text) , hr.Text); } } else { return new Tuple(false , this._message , string.Empty); } } catch (Exception ex) { logger.Error(ex , "获取全局序号异常"); return new Tuple(false , "获取全局序号失败" , string.Empty); } } } /// /// 加载全局沽清数据 /// /// /// public Tuple> GetGlobalAvailableSaleClear() { try { var url = string.Format("{0}{1}" , this._baseUrl , "/sale/clear"); HttpResult hr = this._httpManager.PostJson(url ,"{}", null); if (hr.Code == 200) { logger.Info(hr.Text); var obj = JsonUtils.Deserialize>>(hr.Text); logger.Info(obj.Data); if (obj.Status == 1) { return new Tuple>(true , obj.Message , obj.Data); } else { return new Tuple>(false , obj.Message , new List()); } } else { return new Tuple>(false , "获取沽清数据错误" , new List()); } } catch (Exception ex) { logger.Error(ex , "获取沽清数据异常"); return new Tuple>(false , "获取沽清数据异常" , new List()); } } public Tuple> GetSaleClearList(string dateTimer = null) { try { if (!string.IsNullOrEmpty(this._baseUrl)) { var url = string.Format("{0}{1}" , this._baseUrl , "/sale/clear/list"); //构建POST的JSON参数,date为空标识今日沽清 var body = new Dictionary(); body["date"] = string.Empty; //指定日期的沽清 if (!string.IsNullOrEmpty(dateTimer)) { body["date"] = dateTimer; } HttpResult hr = this._httpManager.PostJson(url , JsonUtils.Serialize(body) , null); if (hr.Code == 200) { var obj = JsonUtils.Deserialize>>(hr.Text); if (obj.Status == 1) { var data = obj.Data as List; return new Tuple>(true , obj.Message , data); } else { return new Tuple>(false , obj.Message , new List()); } } else { return new Tuple>(false , "获取沽清列表数据错误" , new List()); } } else { return new Tuple>(false , this._message , new List()); } } catch (Exception ex) { logger.Error(ex , "获取沽清列表数据异常"); return new Tuple>(false , "获取沽清列表数据异常" , new List()); } } public Tuple ChangeSaleClear(SaleClear saleClear) { lock (Global.Instance.CacheLock) { try { if (!string.IsNullOrEmpty(this._baseUrl)) { var url = string.Format("{0}{1}" , this._baseUrl , "/sale/clear/change"); //将沽清对象序列化,传递到http var body = JsonUtils.Serialize(saleClear); HttpResult hr = this._httpManager.PostJson(url , body , null); if (hr.Code == 200) { logger.Info("变更沽清信息,服务中心的应答"); logger.Info(hr.Text); var obj = JsonUtils.Deserialize>(hr.Text); SaleClearUtils.Instance.SaveOrUpdateNoChanged(obj.Data); return new Tuple(true , "获取沽清列表数据错误"); } else { return new Tuple(false , "获取沽清列表数据错误"); } } else { return new Tuple(false , this._message); } } catch (Exception ex) { logger.Error(ex , "获取沽清列表数据异常"); return new Tuple(false , "获取沽清列表数据异常"); } } } } }