using MP.MONO.Core; using MP.MONO.Core.CONF; using MP.MONO.Core.DTO; using MP.MONO.Data; using MP.MONO.Data.Controllers; using MP.MONO.Data.DbModels; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System.Diagnostics; namespace MP.MONO.UI.Data { public class CurrentDataService : IDisposable { #region Private Fields private static IConfiguration _configuration = null!; private static ILogger _logger = null!; private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); /// /// Oggetto per connessione a REDIS /// private ConnectionMultiplexer redisConn = null!; //ISubscriber sub = redis.GetSubscriber(); /// /// Oggetto DB redis da impiegare x chiamate R/W /// private IDatabase redisDb = null!; #endregion Private Fields #region Public Fields /// /// Controller dati da DB /// public static MpDbController dbController = null!; #endregion Public Fields #region Public Constructors public CurrentDataService(IConfiguration configuration, ILogger logger, IConnectionMultiplexer redisConn) { _logger = logger; _configuration = configuration; // setup compoenti REDIS this.redisConn = ConnectionMultiplexer.Connect(_configuration.GetConnectionString("Redis")); this.redisDb = this.redisConn.GetDatabase(); // setup canali pub/sub actLogPipe = new MessagePipe(redisConn, Constants.ACT_LOG_M_QUEUE); alarmPipe = new MessagePipe(redisConn, Constants.ALARM_M_QUEUE); machEvPipe = new MessagePipe(redisConn, Constants.EVENT_LOG_M_QUEUE); parametersPipe = new MessagePipe(redisConn, Constants.PARAMS_M_QUEUE); productionPipe = new MessagePipe(redisConn, Constants.PROD_M_QUEUE); machStatsPipe = new MessagePipe(redisConn, Constants.MACH_STATS_M_QUEUE); maintPipe = new MessagePipe(redisConn, Constants.MAINT_STATS_M_QUEUE); statusPipe = new MessagePipe(redisConn, Constants.STATUS_M_QUEUE); toolsPipe = new MessagePipe(redisConn, Constants.TOOLS_M_QUEUE); // conf DB string connStr = _configuration.GetConnectionString("MP.MONO.Data"); if (string.IsNullOrEmpty(connStr)) { _logger.LogError("ConnString empty!"); } else { dbController = new MpDbController(); _logger.LogInformation("DbController OK"); } } #endregion Public Constructors #region Public Properties public MessagePipe actLogPipe { get; set; } = null!; public MessagePipe alarmPipe { get; set; } = null!; public MessagePipe machEvPipe { get; set; } = null!; public MessagePipe machStatsPipe { get; set; } = null!; public MessagePipe maintPipe { get; set; } = null!; public MessagePipe parametersPipe { get; set; } = null!; public MessagePipe productionPipe { get; set; } = null!; public MessagePipe statusPipe { get; set; } = null!; public MessagePipe toolsPipe { get; set; } = null!; #endregion Public Properties #region Public Methods public void Dispose() { // Clear database controller dbController.Dispose(); } public async Task> getActLog() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.ACT_LOG_CURR_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } public async Task> getAlarms() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.ALARM_CURR_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } /// /// Conf allarmi (da ADAPTER) senza valori silenziati da app /// /// public async Task> getAlarmConfig() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.ALARMS_CONF_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } /// /// Conf allarmi IMPOSTATA con valori silenziati /// /// public async Task> getAlarmSetup() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.ALARMS_SETT_KEY); //se non avessi trovato valori cerco quelli di setup... if (string.IsNullOrEmpty(rawData)) { rawData = await redisDb.StringGetAsync(Constants.ALARMS_CONF_KEY); } // ora provo a deserializzare if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } // altrimenti imposto vuoto if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } public async Task setAlarmSetup(List alarmConf) { bool answ = false; string rawData = JsonConvert.SerializeObject(alarmConf); await redisDb.StringSetAsync(Constants.ALARMS_SETT_KEY, rawData); return await Task.FromResult(answ); } public async Task> getEventHist() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.EVENT_LOG_CURR_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } public async Task> getMaintenance() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.MAINT_STATS_CURR_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } public async Task> getModesList() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.MODE_CONF_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } public async Task> getParameters() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.PARAMS_CURR_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } public async Task getProd() { ProductionDTO? dbResult = new ProductionDTO(); string rawData = await redisDb.StringGetAsync(Constants.PROD_CURR_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject(rawData); } if (dbResult == null) { dbResult = new ProductionDTO(); } return await Task.FromResult(dbResult); } public async Task> getStats() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.MACH_STATS_CURR_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } public async Task getStatus() { MachineDTO? dbResult = new MachineDTO(); string rawData = await redisDb.StringGetAsync(Constants.STATUS_CURR_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject(rawData); } if (dbResult == null) { dbResult = new MachineDTO(); } return await Task.FromResult(dbResult); } public async Task> getStatusList() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.STATUS_CONF_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } public async Task> getTools() { List? dbResult = new List(); string rawData = await redisDb.StringGetAsync(Constants.TOOLS_CURR_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>(rawData); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } public async Task> AlarmLogGetFilt(int machineId, int skipRec, int numRec) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); List? dbResult = dbController.AlarmLogGetFilt(machineId, skipRec, numRec); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB AlarmLogGetFilt: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } #endregion Public Methods } }