PumpHandlerGroupApp.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using Edge.Core.Configuration;
  2. using Edge.Core.IndustryStandardInterface.Pump;
  3. using Edge.Core.Processor;
  4. using Edge.Core.Processor.Dispatcher.Attributes;
  5. using Edge.Core.UniversalApi;
  6. using Microsoft.Extensions.DependencyInjection;
  7. using Microsoft.Extensions.Logging;
  8. using System;
  9. using System.Collections;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Threading.Tasks;
  13. using Wayne.FDCPOSLibrary;
  14. namespace EagleStar_Pump
  15. {
  16. [MetaPartsDescriptor(
  17. "lang-zh-cn:英高系统数据库lang-en-us:EagleStar System Database",
  18. "lang-zh-cn:用于连接英高系统数据库,抓取Fairbanks所需要的数据.lang-en-us:Used for connecting to EagleStar system database, auto timely grab the data required by Fairbanks",
  19. new[] { "lang-zh-cn:加油机lang-en-us:Pump" })]
  20. public class PumpHandlerGroupApp : IEnumerable<IFdcPumpController>, IFdcCommunicableController, IAppProcessor, IDisposable
  21. {
  22. private List<PumpHandler> pumpHandlers = new List<PumpHandler>();
  23. private ILogger logger = null;
  24. [ParamsJsonSchemas("PumpGroupCtorParamsJsonSchemas")]
  25. public PumpHandlerGroupApp(PumpGroupConfiguration pumpGroupConfiguration, IServiceProvider services)
  26. {
  27. if (services != null)
  28. {
  29. var loggerFactory = services.GetRequiredService<ILoggerFactory>();
  30. logger = loggerFactory.CreateLogger("DynamicPrivate_PumpHandler");
  31. }
  32. logger.LogInformation("EagleStar pump app, Will create.");
  33. pumpHandlers.Add(new PumpHandler(pumpGroupConfiguration, logger, services));
  34. }
  35. public string MetaConfigName { get; set; }
  36. public Func<string, bool> BroadcastMessageViaFdc { get; set; }
  37. public Func<string, string, string, bool> SendMessageViaFdc { get; set; }
  38. public Func<string, Tuple<string, OverallResult>> OnMessageReceivedViaFdc { get; set; }
  39. private IEnumerable<NozzleExtraInfo> nozzleExtraInfos = null;
  40. public void Dispose()
  41. {
  42. this.pumpHandlers?.ForEach(ph => ph.Dispose());
  43. }
  44. public IEnumerator<IFdcPumpController> GetEnumerator()
  45. {
  46. return this.pumpHandlers.GetEnumerator();
  47. }
  48. IEnumerator IEnumerable.GetEnumerator()
  49. {
  50. return this.pumpHandlers.GetEnumerator();
  51. }
  52. public void Init(IEnumerable<IProcessor> processors)
  53. {
  54. }
  55. public void OnFdcServerInit(Dictionary<string, object> parameters)
  56. {
  57. if (parameters != null && parameters.TryGetValue("NozzleProductMapping", out object param))
  58. {
  59. this.nozzleExtraInfos = param as IEnumerable<NozzleExtraInfo>;
  60. }
  61. }
  62. [UniversalApi]
  63. public async Task<bool> ChangePumpStateTo(int siteLevelNozzleId, LogicalDeviceState pumpNewState,
  64. int? amountWithoutDecimalPoint, int? volumeWithoutDecimalPoint, int? priceWithoutDecimalPoint)
  65. {
  66. var targetNozzleInfo = this.nozzleExtraInfos.FirstOrDefault(i => i.SiteLevelNozzleId == siteLevelNozzleId);
  67. if (targetNozzleInfo == null) return false;
  68. var targetPump = this.pumpHandlers.FirstOrDefault(ph => ph.PumpId == targetNozzleInfo.PumpId);
  69. if (targetPump == null) return false;
  70. targetPump.DrivenPumpStateTo((byte?)(targetNozzleInfo.NozzleLogicalId), pumpNewState, amountWithoutDecimalPoint, volumeWithoutDecimalPoint, priceWithoutDecimalPoint);
  71. return true;
  72. }
  73. }
  74. #region Ctor parameters
  75. public class PumpGroupConfiguration
  76. {
  77. public string DatabaseConnectionString { get; set; }
  78. public byte AmountDecimalDigits { get; set; }
  79. public byte VolumeDecimalDigits { get; set; }
  80. public byte PriceDecimalDigits { get; set; }
  81. public byte VolumeTotalizerDecimalDigits { get; set; }
  82. }
  83. #endregion
  84. }