MessageRouterCommunicator.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. //using System;
  2. //using System.Collections;
  3. //using System.Collections.Generic;
  4. //using System.Collections.Specialized;
  5. //using System.Configuration;
  6. //using System.Data.SqlClient;
  7. //using System.Linq;
  8. //using System.Text;
  9. //using System.Threading;
  10. //using Wayne.Fusion.Framework.Core;
  11. //using Wayne.Lib;
  12. //using Wayne.Lib.Log;
  13. //namespace SinoChemFC2PosProxy
  14. //{
  15. // class MessageRouterCommunicator : IDisposable, ICommunicator
  16. // {
  17. // /// <summary>
  18. // /// 0 for not started, 1 for started already.
  19. // /// </summary>
  20. // private int isStarted = 0;
  21. // private const string DEFAULT_FUSION_USER_NAME = "SSF"; // default fusion user id
  22. // private const string DEFAULT_FUSION_PASSWORD = "MINIMEINFINITERINGTONES"; // default fusion password
  23. // private readonly DebugLogger debugLogger =
  24. // new DebugLogger(new IdentifiableEntity(0, "FC2PosProxyMain", "", null));
  25. // private readonly MessageRouterClient msgRouterClient;
  26. // /// <summary>
  27. // /// Will automatically call the Start() for MessageRouterClient.
  28. // /// </summary>
  29. // /// <param name="msgRouterClient">unstarted MessageRouterClient</param>
  30. // public MessageRouterCommunicator(MessageRouterClient msgRouterClient)
  31. // {
  32. // this.msgRouterClient = msgRouterClient;
  33. // this.msgRouterClient.OnConnect += (conn, reconnect) =>
  34. // {
  35. // debugLogger.Add("Connected with MessageRouterServer", DebugLogLevel.Normal);
  36. // string clientId = DEFAULT_FUSION_USER_NAME;
  37. // string password = DEFAULT_FUSION_PASSWORD;
  38. // string userName = clientId;
  39. // userName = MsgRouterMessageUtility.AppendSpaceOnRight(userName, 20);
  40. // password = MsgRouterMessageUtility.AppendSpaceOnRight(password, 25);
  41. // char[] cryptedPwd = MsgRouterMessageUtility.Crypt(password.ToCharArray(), 25, userName.ToCharArray(), 20);
  42. // password = MsgRouterMessageUtility.BinToHexString(cryptedPwd, 25);
  43. // if (!msgRouterClient.SendMessage(MsgRouterMessageUtility.Login(clientId.ToUpper(), password)))
  44. // debugLogger.Add("Login failed to send to msgRouter server", DebugLogLevel.Normal);
  45. // SendSubscriptions();
  46. // };
  47. // this.msgRouterClient.OnDisconnect += (client, exp) => debugLogger.Add("!!!msgRouterClient disconnected with MessageRouterServer");
  48. // this.msgRouterClient.OnMessageRouterMessageReceived += this.OnMessageRouterMessageReceived;
  49. // }
  50. // private void OnMessageRouterMessageReceived(MessageRouterClient client, string msgType, string evtType, StringDictionary parameters)
  51. // {
  52. // debugLogger.Add("Message received from MessageRouterServer", DebugLogLevel.Detailed);
  53. // debugLogger.Add(" message type: " + msgType, DebugLogLevel.Detailed);
  54. // debugLogger.Add(" event type: " + evtType, DebugLogLevel.Detailed);
  55. // debugLogger.Add(" params(name->value): " + (parameters.Count == 0 ? "" : parameters.Keys.Cast<string>().Select(k => k + "->" + parameters[k]).Aggregate((acc, n) => acc + ", " + n)), DebugLogLevel.Detailed);
  56. // ProcessMessage(msgType, evtType, parameters);
  57. // }
  58. // private void ProcessMessage(string msgType, string evtType, StringDictionary parameters)
  59. // {
  60. // if (msgType != "POST") return;
  61. // string evt = "";
  62. // string pumpId = "";
  63. // if (evtType.IndexOf("_ID_") > 0)
  64. // {
  65. // evt = evtType.Substring(0, evtType.Length - 7);
  66. // pumpId = evtType.Substring(evtType.Length - 3, 3);
  67. // }
  68. // else
  69. // {
  70. // evt = evtType;
  71. // }
  72. // switch (evt)
  73. // {
  74. // #region
  75. // case "RES_GENERIC_ERROR":
  76. // break;
  77. // case "RES_FCRT_PUMPS_CONFIG":
  78. // break;
  79. // case "EVT_PUMP_STATUS_CHANGE":
  80. // ProcessPumpStatusChange(parameters, Convert.ToInt32(pumpId));
  81. // break;
  82. // case "EVT_PUMP_DELIVERY_PROGRESS":
  83. // ProcessPumpDeliveryProgressChange(parameters, Convert.ToInt32(pumpId));
  84. // break;
  85. // case "RES_SECU_LOGIN":
  86. // break;
  87. // case "RES_SECU_ACCESS_DENIED":
  88. // break;
  89. // case "RES_PRICES_REFRESH_PRICE_CHANGE_TBL":
  90. // //LoadNewPrices();
  91. // break;
  92. // case "RES_PRICES_SET_NEW_PRICE_CHANGE":
  93. // //RefreshPriceChangeTable();
  94. // break;
  95. // case "EVT_NEW_PRICE_CHANGE_APPLIED":
  96. // //SendFuelPriceChange();
  97. // break;
  98. // case "REQ_RECEIVE_PRESET_FROM_FORECOURT":
  99. // //ProcessPresetFromFPOS(parameters, Convert.ToInt32(pumpId));
  100. // break;
  101. // case "REQ_RECEIVE_OUTDOOR_TRANSACTION_DENIED":
  102. // //ProcessOutdoorTrxDeniedFromFPOS(parameters, Convert.ToInt32(pumpId));
  103. // break;
  104. // case "REQ_RECEIVE_OUTDOOR_TRANSACTION_APPROVED":
  105. // //ProcessOutdoorTrxApprovedFromFPOS(parameters, Convert.ToInt32(pumpId));
  106. // break;
  107. // case "REQ_RECEIVE_OUTDOOR_AIRLOCK":
  108. // //ProcessOutdoorTrxAirlock(parameters, Convert.ToInt32(pumpId));
  109. // break;
  110. // default:
  111. // break;
  112. // #endregion
  113. // }
  114. // }
  115. // private void ProcessPumpDeliveryProgressChange(StringDictionary parameters, int p)
  116. // {
  117. // if (string.IsNullOrEmpty(parameters["GR"]) || string.IsNullOrEmpty(parameters["AM"]) ||
  118. // string.IsNullOrEmpty(parameters["PU"]) || string.IsNullOrEmpty(parameters["VO"]))
  119. // {
  120. // debugLogger.Add("Ignore ProcessPumpDeliveryProgressChange event for pump: " + p, DebugLogLevel.Normal);
  121. // return;
  122. // }
  123. // try
  124. // {
  125. // var gradeId = parameters["GR"];
  126. // var logicalHoseId = int.Parse(parameters["ho"]);
  127. // var gradeFriendlyName = Translator.GetFriendlyGradeName(SiteConfigUtility.Default.GetGradeNameByGradeId(int.Parse(gradeId)));
  128. // var currentQty = float.Parse(parameters["VO"]);
  129. // var currentAmount = float.Parse(parameters["AM"]);
  130. // using (var posSqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["PosDatabaseConnStr"].ConnectionString))
  131. // {
  132. // try
  133. // {
  134. // var updatePumpOnFuelingCommand =
  135. // new SqlCommand(string.Format("Update jy_info set [status] = '{1}', youpin = N'{2}', qty= {3}, amount= {4} where jihao = {0}"
  136. // , SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(p, logicalHoseId),
  137. // 'B',
  138. // gradeFriendlyName,
  139. // currentQty,
  140. // currentAmount),
  141. // posSqlConnection);
  142. // debugLogger.Add("updatePumpOnFuelingCommand: " + updatePumpOnFuelingCommand.CommandText, DebugLogLevel.Maximized);
  143. // posSqlConnection.Open();
  144. // updatePumpOnFuelingCommand.ExecuteNonQuery();
  145. // }
  146. // catch (Exception ex)
  147. // {
  148. // debugLogger.Add("executing updatePumpOnFuelingCommand failed, exception detail: " + ex,
  149. // DebugLogLevel.Normal);
  150. // }
  151. // }
  152. // }
  153. // catch (Exception ex)
  154. // {
  155. // debugLogger.Add("Exception in handling ProcessPumpDeliveryProgressChange:" + ex, DebugLogLevel.Normal);
  156. // }
  157. // }
  158. // private void ProcessPumpStatusChange(StringDictionary parameters, int p)
  159. // {
  160. // var pumpStatusStr = parameters["ST"];
  161. // if (pumpStatusStr == "AUTHORIZED")
  162. // {
  163. // /* indicate a nozzle was lifted, and pending for start fueling */
  164. // }
  165. // else if (pumpStatusStr == "STARTING")
  166. // {
  167. // /* I understood this state as an intermidea, very short period once the trigger was clicked on nozzle, can be treated as indicator for fueling is ongoing
  168. // */
  169. // var gradeId = parameters["GR"];
  170. // var hoseId = int.Parse(parameters["ho"]);
  171. // var gradeFriendlyName = Translator.GetFriendlyGradeName(SiteConfigUtility.Default.GetGradeNameByGradeId(int.Parse(gradeId)));
  172. // using (var posSqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["PosDatabaseConnStr"].ConnectionString))
  173. // {
  174. // try
  175. // {
  176. // var setPumpOnStartingCommand =
  177. // new SqlCommand(string.Format(
  178. // "Update jy_info set [status] = '{1}', youpin = N'{2}', qty= 0, amount= 0 where jihao = {0}"
  179. // , SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(p, hoseId), 'B', gradeFriendlyName), posSqlConnection);
  180. // debugLogger.Add("setPumpOnStartingCommand: " + setPumpOnStartingCommand.CommandText, DebugLogLevel.Maximized);
  181. // posSqlConnection.Open();
  182. // setPumpOnStartingCommand.ExecuteNonQuery();
  183. // }
  184. // catch (Exception ex)
  185. // {
  186. // debugLogger.Add("executing setPumpOnStartingCommand failed, exception detail: " + ex,
  187. // DebugLogLevel.Normal);
  188. // }
  189. // }
  190. // }
  191. // else if (pumpStatusStr == "FUELLING")
  192. // {
  193. // /* indicate for fueling is ongoing */
  194. // }
  195. // else if (pumpStatusStr == "IDLE")
  196. // {
  197. // /* indicate for nozzle if replaced back */
  198. // var sizeLevelNozzleIdsOnPump = SiteConfigUtility.Default.GetSiteLevelNozzleIdsByPumpId(p);
  199. // if (!sizeLevelNozzleIdsOnPump.Any())
  200. // {
  201. // debugLogger.Add("Could not found any site level nozzle ids for pump: " + p, DebugLogLevel.Normal);
  202. // return;
  203. // }
  204. // using (var posSqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["PosDatabaseConnStr"].ConnectionString))
  205. // {
  206. // try
  207. // {
  208. // /* idle would not carry nozzle id, so here reset all nozzles on target pump.*/
  209. // var setPumpOnIdleCommand
  210. // = new SqlCommand(sizeLevelNozzleIdsOnPump.Select(siteLevelNozzleId =>
  211. // {
  212. // var totalizer = SiteConfigUtility.Default.GetTotalizer(siteLevelNozzleId);
  213. // return
  214. // string.Format(
  215. // "Update jy_info set [status] = '{1}', qty=0, amount=0, fzqty='{2}', fzamount={3}" +
  216. // " where jihao = {0}", siteLevelNozzleId, 'F',
  217. // totalizer.Item1, totalizer.Item2);
  218. // })
  219. // .Aggregate((acc, n) => acc + " " + n), posSqlConnection);
  220. // debugLogger.Add("setPumpOnIdleCommand: " + setPumpOnIdleCommand.CommandText, DebugLogLevel.Maximized);
  221. // posSqlConnection.Open();
  222. // setPumpOnIdleCommand.ExecuteNonQuery();
  223. // }
  224. // catch (Exception ex)
  225. // {
  226. // debugLogger.Add("executing setPumpOnIdleCommand failed, exception detail: " + ex,
  227. // DebugLogLevel.Normal);
  228. // }
  229. // }
  230. // }
  231. // }
  232. // private void SendSubscriptions()
  233. // {
  234. // Thread.Sleep(100);
  235. // // pump events
  236. // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribePumpStatusChange());
  237. // Thread.Sleep(100);
  238. // // pump delivery
  239. // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribePumpDeliveryProgress());
  240. // Thread.Sleep(100);
  241. // // fuel price change events
  242. // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeNewPriceChangeApplied());
  243. // Thread.Sleep(100);
  244. // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeRefreshPriceChangeTbl());
  245. // Thread.Sleep(100);
  246. // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeSetNewPriceChange());
  247. // Thread.Sleep(100);
  248. // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceivePresetFromForecourt());
  249. // Thread.Sleep(100);
  250. // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceiveOutdoorTrxDeniedFromForecourt());
  251. // Thread.Sleep(100);
  252. // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceiveOutdoorTrxApprovedFromForecourt());
  253. // Thread.Sleep(100);
  254. // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceiveOutdoorTrxAirlockFromForecourt());
  255. // }
  256. // public bool Start()
  257. // {
  258. // if (0 == Interlocked.CompareExchange(ref this.isStarted, 1, 0))
  259. // {
  260. // this.msgRouterClient.Start();
  261. // return true;
  262. // }
  263. // else
  264. // {
  265. // throw new InvalidOperationException("Already started.");
  266. // }
  267. // }
  268. // public bool IsStarted
  269. // {
  270. // get { return this.isStarted == 1; }
  271. // }
  272. // public void Dispose()
  273. // {
  274. // this.msgRouterClient.Dispose();
  275. // if (this.debugLogger != null) debugLogger.Dispose();
  276. // }
  277. // }
  278. //}