GilbarcoPosApp.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using Dfs.WayneChina.GilbarcoDispenserPayTerminal;
  2. using Dfs.WayneChina.GilbarcoDispenserPayTerminal.MessageEntities.Incoming;
  3. using Edge.Core.Processor;
  4. using NLog.LayoutRenderers;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9. namespace Dfs.WayneChina.GilbarcoPos
  10. {
  11. /// <summary>
  12. /// A POS like component against ChangGi (Gilbarco China) dispenser with Sinopec IC card protocol.
  13. /// 长吉加油机带中石化卡机联动协议的后台类POS模块。
  14. /// </summary>
  15. public class GilbarcoPosApp : IAppProcessor
  16. {
  17. #region IApplication implementation
  18. public string MetaConfigName { get; set; }
  19. private List<GilbarcoPayTerminalHandler> paymentTerminalHandlers;
  20. private List<TerminalManager> terminalManagers;
  21. private int _posId;
  22. private int _interval;
  23. private string _versionInfoList;
  24. public VersionInfo CurrentVersionInfo { get; private set; }
  25. #region Logger
  26. private NLog.Logger logger = NLog.LogManager.LoadConfiguration("NLog.config").GetLogger("IPosPlusApp");
  27. #endregion
  28. public GilbarcoPosApp(int posId, int interval, string versionInfoList)
  29. {
  30. _posId = posId;
  31. _interval = interval;
  32. _versionInfoList = versionInfoList;
  33. SetVersionInfo(_versionInfoList);
  34. MetaConfigName = "GilbarcoPosApp";
  35. paymentTerminalHandlers = new List<GilbarcoPayTerminalHandler>();
  36. terminalManagers = new List<TerminalManager>();
  37. }
  38. public void Init(IEnumerable<IProcessor> processors)
  39. {
  40. foreach (dynamic p in processors)
  41. {
  42. if (p is IAppProcessor)
  43. continue;
  44. var handler = p.Context.Handler;
  45. if (handler is GilbarcoPayTerminalHandler)
  46. {
  47. paymentTerminalHandlers.Add(handler);
  48. }
  49. }
  50. SetupTerminalManagers();
  51. }
  52. public Task<bool> Start()
  53. {
  54. foreach (var handler in paymentTerminalHandlers)
  55. {
  56. logger.Info("Hooking up the terminal message event handler");
  57. handler.OnTerminalMessageReceived += IcCardPaymentTerminalMessageReceived;
  58. }
  59. foreach (var terminalManager in terminalManagers)
  60. {
  61. terminalManager.Start();
  62. }
  63. return Task.FromResult(true);
  64. }
  65. public Task<bool> Stop()
  66. {
  67. foreach (var handler in paymentTerminalHandlers)
  68. {
  69. logger.Info("Unhooking the terminal message event handler");
  70. handler.OnTerminalMessageReceived -= IcCardPaymentTerminalMessageReceived;
  71. }
  72. return Task.FromResult(true);
  73. }
  74. #endregion
  75. private void SetVersionInfo(string versionInfoList)
  76. {
  77. var versions = versionInfoList.Split(',');
  78. if (versions.Length == 8)
  79. {
  80. CurrentVersionInfo = new VersionInfo();
  81. CurrentVersionInfo.BaseBlacklistVersion = ushort.Parse(versions[0]);
  82. CurrentVersionInfo.AddBlacklistVersion = Convert.ToByte(versions[1]);
  83. CurrentVersionInfo.DeleteBlacklistVersion = Convert.ToByte(versions[2]);
  84. CurrentVersionInfo.WhitelistVersion = Convert.ToByte(versions[3]);
  85. CurrentVersionInfo.PriceVersion = Convert.ToByte(versions[4]);
  86. CurrentVersionInfo.StationGeneralInfoVersion = Convert.ToByte(versions[5]);
  87. CurrentVersionInfo.PrivateDataDownloadFlag = Convert.ToByte(versions[6]);
  88. CurrentVersionInfo.SoftwareDownloadFlag = Convert.ToByte(versions[7]);
  89. }
  90. }
  91. private void IcCardPaymentTerminalMessageReceived(object sender, TerminalMessageEventArgs e)
  92. {
  93. HandlerTerminalMessage(e);
  94. }
  95. private void HandlerTerminalMessage(TerminalMessageEventArgs messageEventArgs)
  96. {
  97. var currentTerminalManager = terminalManagers.FirstOrDefault(m => m.PumpId == messageEventArgs.PumpId);
  98. if (currentTerminalManager != null)
  99. {
  100. if (messageEventArgs.Message is InfoCommand)
  101. {
  102. currentTerminalManager.HandleInfoCommand((InfoCommand)messageEventArgs.Message);
  103. }
  104. else if (messageEventArgs.Message is TransactionData)
  105. {
  106. currentTerminalManager.HandleTransactionData((TransactionData)messageEventArgs.Message);
  107. }
  108. }
  109. }
  110. #region Set up terminals
  111. private void SetupTerminalManagers()
  112. {
  113. foreach (var handler in paymentTerminalHandlers)
  114. {
  115. var terminalManager = new TerminalManager(this, handler, _interval);
  116. if (!terminalManagers.Contains(terminalManager))
  117. terminalManagers.Add(terminalManager);
  118. }
  119. }
  120. #endregion
  121. }
  122. }