using Edge.Core.Database; using Edge.Core.Processor; using Dfs.WayneChina.SpsDbManager; using Dfs.WayneChina.SpsDbManager.Models; using System; using System.Collections.Generic; using System.Timers; using System.Linq; using System.Threading.Tasks; using Edge.Core.Configuration; namespace Dfs.WayneChina.IMisPlus { public class ForecourtConfigManagerApp : IAppProcessor { #region Fields private string forecourtConfig; private ForecourtXml forecourtXml; private SpsManager spsManager; private Timer timer; #endregion #region Logger NLog.Logger logger = NLog.LogManager.LoadConfiguration("NLog.config").GetLogger("IMisPlusApp"); #endregion #region Properties public string MetaConfigName { get; set; } #endregion #region Constructor public ForecourtConfigManagerApp(string enabled, int interval, string forecourtConfig) { bool enableCheck = Convert.ToBoolean(enabled); var processConfig = Configurator.Default.DeviceProcessorConfiguration.Processor.FirstOrDefault(p => p.Name.ToLower().Contains("misforecourt")); if (processConfig != null) { this.forecourtConfig = processConfig.Parameter.First(p => p.Name == "forecourtConfig").Value; } else { this.forecourtConfig = forecourtConfig; } spsManager = new SpsManager("server=localhost;database=sps_db;uid=root;password=HS1205;treattinyasboolean=false;convert zero datetime=true;"); forecourtXml = new ForecourtXml(); forecourtXml.Parse(forecourtConfig); InitTimer(enableCheck, interval); } private void InitTimer(bool enabled, int interval) { timer = new Timer(); timer.Elapsed += Timer_Elapsed; timer.Interval = interval * 1000; timer.Enabled = enabled; } private void Timer_Elapsed(object sender, ElapsedEventArgs e) { logger.Info("Reaching timeout, initiate config check."); var currentConfig = forecourtXml.ForecourtConfig; if (currentConfig != null) { LogInfo($"Forecourt config, version: {forecourtXml.ForecourtConfig.CurrentVersion}"); var fuelLists = new List(); foreach (var fuel in currentConfig.Fuels) { var fuelList = new TFuellist(); fuelList.FuelNo = fuel.ProductCode; fuelList.ClassNo = fuel.ClassNo; fuelList.Name = fuel.Name; fuelList.Price = fuel.Price; fuelList.OldPrice = 0; fuelList.PriceTwo = 0; fuelList.OldPriceTwo = 0; fuelList.PriceThree = 0; fuelList.OldPriceThree = 0; fuelList.PriceFour = 0; fuelList.OldPriceFour = 0; fuelList.PriceFive = 0; fuelList.OldPriceFive = 0; fuelList.PriceSix = 0; fuelList.OldPriceSix = 0; fuelList.PriceSeven = 0; fuelList.OldPriceSeven = 0; fuelList.PriceEight = 0; fuelList.OldPriceEight = 0; fuelList.Unit = "升"; fuelList.Storage = 0; fuelList.TaxPer = 0; fuelList.Density = ""; fuelLists.Add(fuelList); } spsManager.InitializeFuelConfig(fuelLists.ToArray()); //Write tank config into database foreach (var tank in currentConfig.Tanks) { var addTankResult = spsManager.AddVirtualTank(Convert.ToByte(tank.Id), tank.ProductCode); LogInfo($"Add tank, id={tank.Id}, success? {addTankResult}"); } //Write pump and nozzle config into database foreach (var pump in currentConfig.Pumps) { var addPumpResult = spsManager.AddUpdatePump(pump.Id, pump.TankId, pump.PosId, Convert.ToString(pump.DispType), pump.AppProtocol, pump.ProtocolType, pump.Port, pump.SerialPort, pump.Mode, pump.PayStackSize, pump.CheckOutMode, pump.Node, pump.SubAddress, pump.NozzleCount, pump.PumpType, pump.MaxAmount, pump.MaxVolume); LogInfo($"Add pump, id={pump.Id}, success? {addPumpResult}"); if (pump.Nozzles.Count > 0) { foreach (var nozzle in pump.Nozzles) { int? nullValue = null; int? state = string.IsNullOrEmpty(nozzle.State) ? nullValue : Convert.ToInt32(nozzle.State); var addNozzleResult = spsManager.AddUpdateNozzle(nozzle.SiteNozzleNo, nozzle.PhysicalId, nozzle.TankId, pump.Id, state, nozzle.ProductCode, nozzle.VehicleIdReaderAddress); LogInfo($"Add nozzle, No={nozzle.SiteNozzleNo}, success? {addNozzleResult}"); } } } //Write terminal config into database var terminals = new List(); foreach (var terminal in currentConfig.Terminals) { TPayterm payterm = new TPayterm(); payterm.PayDevId = terminal.Id; payterm.PayType = terminal.PayMode; payterm.Protocl = terminal.ProtocolType; payterm.Address = terminal.Address; } spsManager.UpdateTerminals(terminals.ToArray()); //Write dispenser config into database foreach (var disp in currentConfig.Dispensers) { } } } #endregion #region IApplication implementation public void Init(IEnumerable processors) { } public Task Start() { logger.Info("Forecourt Manager App starting"); return Task.FromResult(true); } public Task Stop() { return Task.FromResult(true); } #endregion #region Logging private void LogInfo(string text) { logger.Info("\t" + text); } #endregion } }