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 Public Fields /// /// Controller dati da DB /// public static MpDbController dbController = null!; #endregion Public Fields #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 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 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); } public async Task> DataLogGetFilt(int machineId, string fluxType, DateTime inizio, DateTime fine) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); List? dbResult = dbController.DataLogGetFilt(machineId, fluxType, inizio, fine); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB ParamLogGetFilt: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } 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); } /// /// 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); } 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); } /// /// Ri-abilita un record PM disabilitato /// /// /// /// public async Task PMTaskEnableRecord(PrevMaintTaskModel currRec) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); bool answ = await dbController.PMTaskEnableRecord(currRec); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata chiamata a PMTaskEnableRecord: {ts.TotalMilliseconds} ms"); return await Task.FromResult(answ); } /// /// Eliminazione Record /// /// /// /// public async Task PMTaskDeleteRecord(PrevMaintTaskModel currRec, bool forceDelete) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); bool answ = await dbController.PMTaskDeleteRecord(currRec, forceDelete); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata chiamata a PMTaskDeleteRecord: {ts.TotalMilliseconds} ms"); return await Task.FromResult(answ); } /// /// 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> 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); } /// /// Recupera elenco task Schedulati /// /// /// /// /// public async Task> PrevMaintTaskGetFilt(int machineId, int skipRec, int numRec) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); List? dbResult = dbController.PrevMaintTaskGetFilt(machineId, skipRec, numRec); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB PrevMaintTaskGetFilt: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Effettua upsert del record di manutenzione /// /// /// public async Task PrevMaintTaskUpdate(PrevMaintTaskModel editRec) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); bool dbResult = await dbController.PrevMaintTaskUpdate(editRec); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata upsert DB per PrevMaintTaskUpdate: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Recupera elenco task pending /// /// /// public async Task SchedMaintTaskCreateMissing(int machineId) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); bool answ = await dbController.SchedMaintTaskCreateMissing(machineId); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata chiamata a createMissingSchedTask: {ts.TotalMilliseconds} ms"); return await Task.FromResult(answ); } /// /// Recupero elenco Task Schedulati dati Macchina ed intervento "master" /// /// Macchina selezionata /// ID del PMTask parent /// Num record da saltare /// num rec da recuperare /// public async Task> SchedMaintTaskGetByPMTask(int MachineId, int PMTaskId, int skipRec, int numRec) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); // ricerca sul DB "raw" List? dbResult = dbController.SchedMaintTaskGetByPMTask(MachineId, PMTaskId, skipRec, numRec); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB SchedMaintTaskGetByPMTask: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Recupero elenco Task Schedulati (ultimi dato "skip") /// /// Macchina selezionata /// Num record da saltare /// num rec da recuperare /// public async Task> SchedMaintTaskGetFilt(int machineId, int maxRemain, int skipRec, int numRec) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); // ricerca sul DB "raw" List? rawResult = dbController.SchedMaintTaskGetFilt(machineId, skipRec, numRec); // filtro ulteriormente ora... var dbResult = rawResult.Where(x => x.CountRemainVal <= maxRemain || maxRemain == 0).ToList(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB SchedMaintTaskGetFilt: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Registro esecuzione task schedualto /// /// /// /// /// /// public async Task SchedMaintTaskSetDone(int MachineId, int SMTaskId, DateTime ExecDT, string ExecUser) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); bool answ = await dbController.SchedMaintTaskSetDone(MachineId, SMTaskId, ExecDT, ExecUser); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata chiamata a SchedMaintTaskSetDone: {ts.TotalMilliseconds} ms"); return await Task.FromResult(answ); } 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); } /// /// Recupera elenco contatori ammessi /// /// public async Task> PMCounterModelGetAll() { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var dbResult = dbController.PMCounterModelGetAll(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB PMCounterModelGetAll: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Recupera elenco Gruppi Macchina PM ammessi /// /// public async Task> PMMachGroupGetAll() { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var dbResult = dbController.PMMachGroupGetAll(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB PMMachGroupGetAll: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Recupera elenco Topics PM ammessi /// /// public async Task> PMTaskTopicGetAll() { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var dbResult = dbController.PMTaskTopicGetAll(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB PMTaskTopicGetAll: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Recupera elenco User Team PM ammessi /// /// public async Task> PMUTeamGetAll() { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var dbResult = dbController.PMUTeamGetAll(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB PMUTeamGetAll: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } #endregion Public Methods } }