using Dfs.WayneChina.GilbarcoDispenserPayTerminal; using Dfs.WayneChina.GilbarcoDispenserPayTerminal.MessageEntities.Incoming; using Edge.Core.Processor; using NLog.LayoutRenderers; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace Dfs.WayneChina.GilbarcoPos { /// /// A POS like component against ChangGi (Gilbarco China) dispenser with Sinopec IC card protocol. /// 长吉加油机带中石化卡机联动协议的后台类POS模块。 /// public class GilbarcoPosApp : IAppProcessor { #region IApplication implementation public string MetaConfigName { get; set; } private List paymentTerminalHandlers; private List terminalManagers; private int _posId; private int _interval; private string _versionInfoList; public VersionInfo CurrentVersionInfo { get; private set; } #region Logger private NLog.Logger logger = NLog.LogManager.LoadConfiguration("NLog.config").GetLogger("IPosPlusApp"); #endregion public GilbarcoPosApp(int posId, int interval, string versionInfoList) { _posId = posId; _interval = interval; _versionInfoList = versionInfoList; SetVersionInfo(_versionInfoList); MetaConfigName = "GilbarcoPosApp"; paymentTerminalHandlers = new List(); terminalManagers = new List(); } public void Init(IEnumerable processors) { foreach (dynamic p in processors) { if (p is IAppProcessor) continue; var handler = p.Context.Handler; if (handler is GilbarcoPayTerminalHandler) { paymentTerminalHandlers.Add(handler); } } SetupTerminalManagers(); } public Task Start() { foreach (var handler in paymentTerminalHandlers) { logger.Info("Hooking up the terminal message event handler"); handler.OnTerminalMessageReceived += IcCardPaymentTerminalMessageReceived; } foreach (var terminalManager in terminalManagers) { terminalManager.Start(); } return Task.FromResult(true); } public Task Stop() { foreach (var handler in paymentTerminalHandlers) { logger.Info("Unhooking the terminal message event handler"); handler.OnTerminalMessageReceived -= IcCardPaymentTerminalMessageReceived; } return Task.FromResult(true); } #endregion private void SetVersionInfo(string versionInfoList) { var versions = versionInfoList.Split(','); if (versions.Length == 8) { CurrentVersionInfo = new VersionInfo(); CurrentVersionInfo.BaseBlacklistVersion = ushort.Parse(versions[0]); CurrentVersionInfo.AddBlacklistVersion = Convert.ToByte(versions[1]); CurrentVersionInfo.DeleteBlacklistVersion = Convert.ToByte(versions[2]); CurrentVersionInfo.WhitelistVersion = Convert.ToByte(versions[3]); CurrentVersionInfo.PriceVersion = Convert.ToByte(versions[4]); CurrentVersionInfo.StationGeneralInfoVersion = Convert.ToByte(versions[5]); CurrentVersionInfo.PrivateDataDownloadFlag = Convert.ToByte(versions[6]); CurrentVersionInfo.SoftwareDownloadFlag = Convert.ToByte(versions[7]); } } private void IcCardPaymentTerminalMessageReceived(object sender, TerminalMessageEventArgs e) { HandlerTerminalMessage(e); } private void HandlerTerminalMessage(TerminalMessageEventArgs messageEventArgs) { var currentTerminalManager = terminalManagers.FirstOrDefault(m => m.PumpId == messageEventArgs.PumpId); if (currentTerminalManager != null) { if (messageEventArgs.Message is InfoCommand) { currentTerminalManager.HandleInfoCommand((InfoCommand)messageEventArgs.Message); } else if (messageEventArgs.Message is TransactionData) { currentTerminalManager.HandleTransactionData((TransactionData)messageEventArgs.Message); } } } #region Set up terminals private void SetupTerminalManagers() { foreach (var handler in paymentTerminalHandlers) { var terminalManager = new TerminalManager(this, handler, _interval); if (!terminalManagers.Contains(terminalManager)) terminalManagers.Add(terminalManager); } } #endregion } }