//using System; //using System.Collections; //using System.Collections.Generic; //using System.Collections.Specialized; //using System.Configuration; //using System.Data.SqlClient; //using System.Linq; //using System.Text; //using System.Threading; //using Wayne.Fusion.Framework.Core; //using Wayne.Lib; //using Wayne.Lib.Log; //namespace SinoChemFC2PosProxy //{ // class MessageRouterCommunicator : IDisposable, ICommunicator // { // /// // /// 0 for not started, 1 for started already. // /// // private int isStarted = 0; // private const string DEFAULT_FUSION_USER_NAME = "SSF"; // default fusion user id // private const string DEFAULT_FUSION_PASSWORD = "MINIMEINFINITERINGTONES"; // default fusion password // private readonly DebugLogger debugLogger = // new DebugLogger(new IdentifiableEntity(0, "FC2PosProxyMain", "", null)); // private readonly MessageRouterClient msgRouterClient; // /// // /// Will automatically call the Start() for MessageRouterClient. // /// // /// unstarted MessageRouterClient // public MessageRouterCommunicator(MessageRouterClient msgRouterClient) // { // this.msgRouterClient = msgRouterClient; // this.msgRouterClient.OnConnect += (conn, reconnect) => // { // debugLogger.Add("Connected with MessageRouterServer", DebugLogLevel.Normal); // string clientId = DEFAULT_FUSION_USER_NAME; // string password = DEFAULT_FUSION_PASSWORD; // string userName = clientId; // userName = MsgRouterMessageUtility.AppendSpaceOnRight(userName, 20); // password = MsgRouterMessageUtility.AppendSpaceOnRight(password, 25); // char[] cryptedPwd = MsgRouterMessageUtility.Crypt(password.ToCharArray(), 25, userName.ToCharArray(), 20); // password = MsgRouterMessageUtility.BinToHexString(cryptedPwd, 25); // if (!msgRouterClient.SendMessage(MsgRouterMessageUtility.Login(clientId.ToUpper(), password))) // debugLogger.Add("Login failed to send to msgRouter server", DebugLogLevel.Normal); // SendSubscriptions(); // }; // this.msgRouterClient.OnDisconnect += (client, exp) => debugLogger.Add("!!!msgRouterClient disconnected with MessageRouterServer"); // this.msgRouterClient.OnMessageRouterMessageReceived += this.OnMessageRouterMessageReceived; // } // private void OnMessageRouterMessageReceived(MessageRouterClient client, string msgType, string evtType, StringDictionary parameters) // { // debugLogger.Add("Message received from MessageRouterServer", DebugLogLevel.Detailed); // debugLogger.Add(" message type: " + msgType, DebugLogLevel.Detailed); // debugLogger.Add(" event type: " + evtType, DebugLogLevel.Detailed); // debugLogger.Add(" params(name->value): " + (parameters.Count == 0 ? "" : parameters.Keys.Cast().Select(k => k + "->" + parameters[k]).Aggregate((acc, n) => acc + ", " + n)), DebugLogLevel.Detailed); // ProcessMessage(msgType, evtType, parameters); // } // private void ProcessMessage(string msgType, string evtType, StringDictionary parameters) // { // if (msgType != "POST") return; // string evt = ""; // string pumpId = ""; // if (evtType.IndexOf("_ID_") > 0) // { // evt = evtType.Substring(0, evtType.Length - 7); // pumpId = evtType.Substring(evtType.Length - 3, 3); // } // else // { // evt = evtType; // } // switch (evt) // { // #region // case "RES_GENERIC_ERROR": // break; // case "RES_FCRT_PUMPS_CONFIG": // break; // case "EVT_PUMP_STATUS_CHANGE": // ProcessPumpStatusChange(parameters, Convert.ToInt32(pumpId)); // break; // case "EVT_PUMP_DELIVERY_PROGRESS": // ProcessPumpDeliveryProgressChange(parameters, Convert.ToInt32(pumpId)); // break; // case "RES_SECU_LOGIN": // break; // case "RES_SECU_ACCESS_DENIED": // break; // case "RES_PRICES_REFRESH_PRICE_CHANGE_TBL": // //LoadNewPrices(); // break; // case "RES_PRICES_SET_NEW_PRICE_CHANGE": // //RefreshPriceChangeTable(); // break; // case "EVT_NEW_PRICE_CHANGE_APPLIED": // //SendFuelPriceChange(); // break; // case "REQ_RECEIVE_PRESET_FROM_FORECOURT": // //ProcessPresetFromFPOS(parameters, Convert.ToInt32(pumpId)); // break; // case "REQ_RECEIVE_OUTDOOR_TRANSACTION_DENIED": // //ProcessOutdoorTrxDeniedFromFPOS(parameters, Convert.ToInt32(pumpId)); // break; // case "REQ_RECEIVE_OUTDOOR_TRANSACTION_APPROVED": // //ProcessOutdoorTrxApprovedFromFPOS(parameters, Convert.ToInt32(pumpId)); // break; // case "REQ_RECEIVE_OUTDOOR_AIRLOCK": // //ProcessOutdoorTrxAirlock(parameters, Convert.ToInt32(pumpId)); // break; // default: // break; // #endregion // } // } // private void ProcessPumpDeliveryProgressChange(StringDictionary parameters, int p) // { // if (string.IsNullOrEmpty(parameters["GR"]) || string.IsNullOrEmpty(parameters["AM"]) || // string.IsNullOrEmpty(parameters["PU"]) || string.IsNullOrEmpty(parameters["VO"])) // { // debugLogger.Add("Ignore ProcessPumpDeliveryProgressChange event for pump: " + p, DebugLogLevel.Normal); // return; // } // try // { // var gradeId = parameters["GR"]; // var logicalHoseId = int.Parse(parameters["ho"]); // var gradeFriendlyName = Translator.GetFriendlyGradeName(SiteConfigUtility.Default.GetGradeNameByGradeId(int.Parse(gradeId))); // var currentQty = float.Parse(parameters["VO"]); // var currentAmount = float.Parse(parameters["AM"]); // using (var posSqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["PosDatabaseConnStr"].ConnectionString)) // { // try // { // var updatePumpOnFuelingCommand = // new SqlCommand(string.Format("Update jy_info set [status] = '{1}', youpin = N'{2}', qty= {3}, amount= {4} where jihao = {0}" // , SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(p, logicalHoseId), // 'B', // gradeFriendlyName, // currentQty, // currentAmount), // posSqlConnection); // debugLogger.Add("updatePumpOnFuelingCommand: " + updatePumpOnFuelingCommand.CommandText, DebugLogLevel.Maximized); // posSqlConnection.Open(); // updatePumpOnFuelingCommand.ExecuteNonQuery(); // } // catch (Exception ex) // { // debugLogger.Add("executing updatePumpOnFuelingCommand failed, exception detail: " + ex, // DebugLogLevel.Normal); // } // } // } // catch (Exception ex) // { // debugLogger.Add("Exception in handling ProcessPumpDeliveryProgressChange:" + ex, DebugLogLevel.Normal); // } // } // private void ProcessPumpStatusChange(StringDictionary parameters, int p) // { // var pumpStatusStr = parameters["ST"]; // if (pumpStatusStr == "AUTHORIZED") // { // /* indicate a nozzle was lifted, and pending for start fueling */ // } // else if (pumpStatusStr == "STARTING") // { // /* 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 // */ // var gradeId = parameters["GR"]; // var hoseId = int.Parse(parameters["ho"]); // var gradeFriendlyName = Translator.GetFriendlyGradeName(SiteConfigUtility.Default.GetGradeNameByGradeId(int.Parse(gradeId))); // using (var posSqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["PosDatabaseConnStr"].ConnectionString)) // { // try // { // var setPumpOnStartingCommand = // new SqlCommand(string.Format( // "Update jy_info set [status] = '{1}', youpin = N'{2}', qty= 0, amount= 0 where jihao = {0}" // , SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(p, hoseId), 'B', gradeFriendlyName), posSqlConnection); // debugLogger.Add("setPumpOnStartingCommand: " + setPumpOnStartingCommand.CommandText, DebugLogLevel.Maximized); // posSqlConnection.Open(); // setPumpOnStartingCommand.ExecuteNonQuery(); // } // catch (Exception ex) // { // debugLogger.Add("executing setPumpOnStartingCommand failed, exception detail: " + ex, // DebugLogLevel.Normal); // } // } // } // else if (pumpStatusStr == "FUELLING") // { // /* indicate for fueling is ongoing */ // } // else if (pumpStatusStr == "IDLE") // { // /* indicate for nozzle if replaced back */ // var sizeLevelNozzleIdsOnPump = SiteConfigUtility.Default.GetSiteLevelNozzleIdsByPumpId(p); // if (!sizeLevelNozzleIdsOnPump.Any()) // { // debugLogger.Add("Could not found any site level nozzle ids for pump: " + p, DebugLogLevel.Normal); // return; // } // using (var posSqlConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["PosDatabaseConnStr"].ConnectionString)) // { // try // { // /* idle would not carry nozzle id, so here reset all nozzles on target pump.*/ // var setPumpOnIdleCommand // = new SqlCommand(sizeLevelNozzleIdsOnPump.Select(siteLevelNozzleId => // { // var totalizer = SiteConfigUtility.Default.GetTotalizer(siteLevelNozzleId); // return // string.Format( // "Update jy_info set [status] = '{1}', qty=0, amount=0, fzqty='{2}', fzamount={3}" + // " where jihao = {0}", siteLevelNozzleId, 'F', // totalizer.Item1, totalizer.Item2); // }) // .Aggregate((acc, n) => acc + " " + n), posSqlConnection); // debugLogger.Add("setPumpOnIdleCommand: " + setPumpOnIdleCommand.CommandText, DebugLogLevel.Maximized); // posSqlConnection.Open(); // setPumpOnIdleCommand.ExecuteNonQuery(); // } // catch (Exception ex) // { // debugLogger.Add("executing setPumpOnIdleCommand failed, exception detail: " + ex, // DebugLogLevel.Normal); // } // } // } // } // private void SendSubscriptions() // { // Thread.Sleep(100); // // pump events // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribePumpStatusChange()); // Thread.Sleep(100); // // pump delivery // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribePumpDeliveryProgress()); // Thread.Sleep(100); // // fuel price change events // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeNewPriceChangeApplied()); // Thread.Sleep(100); // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeRefreshPriceChangeTbl()); // Thread.Sleep(100); // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeSetNewPriceChange()); // Thread.Sleep(100); // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceivePresetFromForecourt()); // Thread.Sleep(100); // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceiveOutdoorTrxDeniedFromForecourt()); // Thread.Sleep(100); // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceiveOutdoorTrxApprovedFromForecourt()); // Thread.Sleep(100); // this.msgRouterClient.SendMessage(MsgRouterMessageUtility.SubscribeReceiveOutdoorTrxAirlockFromForecourt()); // } // public bool Start() // { // if (0 == Interlocked.CompareExchange(ref this.isStarted, 1, 0)) // { // this.msgRouterClient.Start(); // return true; // } // else // { // throw new InvalidOperationException("Already started."); // } // } // public bool IsStarted // { // get { return this.isStarted == 1; } // } // public void Dispose() // { // this.msgRouterClient.Dispose(); // if (this.debugLogger != null) debugLogger.Dispose(); // } // } //}