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 MP.MONO.Data.DTO; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System.Diagnostics; using System.Reflection.PortableExecutable; using static MP.MONO.Core.Enums; 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 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(configuration); _logger.LogInformation("DbController OK"); } } #endregion Public Constructors #region Public Properties public MessagePipe actLogPipe { get; set; } = null!; /// /// Verifica se gli AlarmLog sia attivi/da mostrare /// public bool AlarmLogActive { get { bool answ = false; var rawVal = redisDb.StringGet(Constants.ALARM_LOG_ENABLED); if (!string.IsNullOrEmpty(rawVal)) { bool.TryParse(rawVal, out answ); } return answ; } } 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 /// /// Elenco records anagrafica allarmi /// /// public async Task> AlarmListGetAll() { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var dbResult = dbController.AlarmListGetAll(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB AlarmListGetAll: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Inserisce nuovo record in anagrafica allarmi dato testo (o restituisce se esistente) /// /// public async Task AlarmListInsert(string AlarmText) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var dbResult = dbController.AlarmListInsert(AlarmText); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB AlarmListInsert: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// restituisce lista di allarmi (ultimi dati "skip") public async Task> AlarmLogGetFilt(int machineId, int skipRec, int numRec) { string source = "DB"; List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); string currKey = $"{Constants.ALARM_LOG}:{machineId}:{skipRec}:{numRec}"; stopWatch.Start(); var rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>($"{rawData}"); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = await dbController.AlarmLogGetFilt(machineId, skipRec, numRec); rawData = JsonConvert.SerializeObject(dbResult); await redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromMilliseconds(250)); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Debug($"AlarmLogGetFilt | {source} in : {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// Recupero elenco allarmi con data <= alla data di riferimento (ultimi dati /// "skip") public async Task> AlarmLogGetFiltByDate(int machineId, DateTime dtRif, int skipRec, int numRec) { string source = "DB"; Stopwatch stopWatch = new Stopwatch(); List dbResult = new List(); string currKey = $"{Constants.ALARM_LOG}"; stopWatch.Start(); stopWatch.Stop(); var rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>($"{rawData}"); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.AlarmLogGetFiltByDate(machineId, dtRif, skipRec, numRec); rawData = JsonConvert.SerializeObject(dbResult); await redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromMilliseconds(30000)); } TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da {source} AlarmLogGetFilt: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Chiude ultimo record dato Id (se fossero + di 1 chiude tutti...) /// /// Id Allarme /// public async Task AlarmRecCloseActive(int AlarmId) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var dbResult = await dbController.AlarmRecCloseActive(AlarmId); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB AlarmRecCloseActive: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Recupero elenco allarmi Rec (ultimi dato "skip") /// /// /// /// /// public async Task> AlarmRecGetFilt(int MachineId, int skipRec, int numRec) { string source = "DB"; List dbResult = new List(); string currKey = $"{Constants.ALARM_REC}:{MachineId}:{skipRec}:{numRec}"; string currKeyLog = $"{Constants.ALARM_LOG}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>($"{rawData}"); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = await dbController.AlarmRecGetFilt(MachineId, skipRec, numRec); rawData = JsonConvert.SerializeObject(dbResult); await redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromMilliseconds(5000)); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; //Log.Trace($"Effettuata lettura da DB AlarmRecGetFilt: {ts.TotalMilliseconds} ms"); Log.Debug($"AlarmRecGetFilt | {source} in: {ts.TotalMilliseconds} ms"); //return await Task.FromResult(dbResult); return dbResult; } /// Recupero elenco allarmi Rec con data <= alla data di riferimento (ultimi dato /// "skip") public async Task> AlarmRecGetFiltByDate(int MachineId, DateTime dtRif, int skipRec, int numRec) { string source = "DB"; List dbResult = new List(); string currKeyLog = $"{Constants.ALARM_LOG}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var rawData = await redisDb.StringGetAsync(currKeyLog); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>($"{rawData}"); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = dbController.AlarmRecGetFiltByDate(MachineId, dtRif, skipRec, numRec); rawData = JsonConvert.SerializeObject(dbResult); await redisDb.StringSetAsync(currKeyLog, rawData, TimeSpan.FromMilliseconds(30000)); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da {source} AlarmRecGetFilt: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Recupero lista sommatoria durata eventi allarme per analisi, ordinati in logica di /// pareto (Max-min) /// /// Id Macchina /// inizio analisi (evento deve iniziare/finire entro periodo) /// fine analisi (evento deve iniziare/finire entro periodo) /// durata minima evento per venire considerato, -1 = tutti /// durata massima evento per venire considerato, -1 = tutti /// public async Task> AlarmRecGetParetoDur(int machineId, DateTime dtFrom, DateTime dtTo, int minDur = -1, int maxDur = -1) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var dbResult = dbController.AlarmRecGetParetoDur(machineId, dtFrom, dtTo, minDur, maxDur); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB AlarmRecGetParetoDur: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// Recupero lista di conteggio eventi allarme per analisi, ordinati in logica di pareto (Max-min) /// /// Id Macchina /// inizio analisi (evento deve iniziare DOPO questa data) /// fine analisi (evento deve iniziare prima di questa data) /// durata minima evento per venire considerato, -1 = tutti /// durata massima evento per venire considerato, -1 = tutti public async Task> AlarmRecGetParetoFreq(int machineId, DateTime dtFrom, DateTime dtTo, int minDur = -1, int maxDur = -1) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var dbResult = dbController.AlarmRecGetParetoFreq(machineId, dtFrom, dtTo, minDur, maxDur); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura da DB AlarmRecGetParetoFreq: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } /// /// TimeSearie in formato DataLogDTO /// /// ID macchina /// Tipologia di dato richiesto da enum /// Tipo di Flusso /// DT Inizio estrazione /// DT Fine estrazione /// public async Task> DataLogDtoGetFilt(int machineId, DataLogType dataType, string fluxType, DateTime inizio, DateTime fine) { string source = "DB"; List dbResult = new List(); string currKey = $"{Constants.DATA_LOG_DTO_KEY}:{machineId}:{dataType}:{fluxType.Replace(" ", "_")}:{inizio:yyyyMMdd}:{fine:yyyyMMdd}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>($"{rawData}"); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = await dbController.DataLogDtoGetFilt(machineId, dataType, fluxType, inizio, fine); // salvo per 2 min... rawData = JsonConvert.SerializeObject(dbResult); await redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromSeconds(120)); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; int sizeKb = rawData.HasValue ? $"{rawData}".Length / 1024 : 0; Log.Info($"DataLogDtoGetFilt | {machineId} | {dataType} | {fluxType} | {inizio:yyyyMMdd}-{fine:yyyyMMdd} | {source} | {ts.TotalMilliseconds} ms | {sizeKb} kb"); return dbResult; } /// /// TimeSearie in formato DataLogModel /// /// Tipologia di dato richiesto da enum /// DT Inizio estrazione /// DT Fine estrazione /// ID macchina /// Tipo di Flusso /// public async Task> DataLogGetFilt(DataLogType dataType, DateTime inizio, DateTime fine, int machineId, string fluxType) { string source = "DB"; List dbResult = new List(); string currKey = $"{Constants.DATA_LOG_KEY}:{dataType}:{machineId}:{fluxType.Replace(" ", "_")}:{inizio:yyyyMMdd}:{fine:yyyyMMdd}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>($"{rawData}"); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = await dbController.DataLogGetFilt(dataType, inizio, fine, machineId, fluxType); // salvo per 2 min... rawData = JsonConvert.SerializeObject(dbResult); await redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromSeconds(120)); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; int sizeKb = rawData.HasValue ? $"{rawData}".Length / 1024 : 0; Log.Info($"DataLogGetFilt | {source} | dataType: {dataType} | machineId: {machineId} | fluxType: {fluxType} | {inizio:yyyyMMdd}-{fine:yyyyMMdd} | {ts.TotalMilliseconds} ms | {sizeKb} kb"); return dbResult; } /// /// TimeSearie in formato DataLogModel /// /// Tipologia di dato richiesto da enum /// DT Inizio estrazione /// DT Fine estrazione /// public async Task> DataLogGetFilt(DataLogType dataType, DateTime inizio, DateTime fine) { string source = "DB"; List dbResult = new List(); string currKey = $"{Constants.DATA_LOG_KEY}:{dataType}:ALL:{inizio:yyyyMMdd}:{fine:yyyyMMdd}"; Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty(rawData)) { source = "REDIS"; var tempResult = JsonConvert.DeserializeObject>($"{rawData}"); if (tempResult == null) { dbResult = new List(); } else { dbResult = tempResult; } } else { dbResult = await dbController.DataLogGetFilt(dataType, inizio, fine); // salvo per 2 min... rawData = JsonConvert.SerializeObject(dbResult); await redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromSeconds(120)); } stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; int sizeKb = rawData.HasValue ? $"{rawData}".Length / 1024 : 0; Log.Info($"DataLogGetFilt | {source} | dataType: {dataType} | ALL | {inizio:yyyyMMdd}-{fine:yyyyMMdd} | {ts.TotalMilliseconds} ms | {sizeKb} kb"); return dbResult; } public void Dispose() { // Clear database controller dbController.Dispose(); } public async Task FlushRedisCache() { await Task.Delay(1); RedisValue pattern = new RedisValue($"{Constants.BASE_HASH}:Cache*"); bool answ = await ExecFlushRedisPattern(pattern); return answ; } public async Task> getActLog() { List? answ = new List(); var rawData = await redisDb.StringGetAsync(Constants.ACT_LOG_CURR_KEY); if (!string.IsNullOrEmpty(rawData)) { answ = JsonConvert.DeserializeObject>($"{rawData}"); } if (answ == null) { answ = new List(); } return await Task.FromResult(answ); } /// /// Conf allarmi (BankBit) IMPOSTATA con valori silenziati /// /// public async Task> getAlarmBankBitSetup() { List? redResult = new List(); var rawData = await redisDb.StringGetAsync(Constants.ALARMS_SETT_BBIT_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)) { redResult = JsonConvert.DeserializeObject>($"{rawData}"); } // altrimenti imposto vuoto if (redResult == null) { redResult = new List(); } return await Task.FromResult(redResult); } /// /// Conf allarmi (da ADAPTER) tipo BankBit senza valori silenziati da app /// /// public async Task> getAlarmBBConfig() { List? dbResult = new List(); var rawData = await redisDb.StringGetAsync(Constants.ALARMS_CONF_BBIT_KEY); if (!string.IsNullOrEmpty(rawData)) { dbResult = JsonConvert.DeserializeObject>($"{rawData}"); } if (dbResult == null) { dbResult = new List(); } return await Task.FromResult(dbResult); } public async Task getAlarmMode() { AlarmReportingMode answ = AlarmReportingMode.ND; var rawData = await redisDb.StringGetAsync(Constants.ALARMS_MODE_KEY); if (!string.IsNullOrEmpty(rawData)) { answ = JsonConvert.DeserializeObject($"{rawData}"); } if (answ == AlarmReportingMode.ND) { answ = AlarmReportingMode.RawList; } return await Task.FromResult(answ); } /// /// Elenco ID allarmi (RawList) x gestione stato silenziati /// /// public async Task> getAlarmRawSetup() { List? mutedList = new List(); var rawData = await redisDb.StringGetAsync(Constants.ALARMS_SETT_RLIST_KEY); // ora provo a deserializzare if (!string.IsNullOrEmpty(rawData)) { mutedList = JsonConvert.DeserializeObject>($"{rawData}"); } // altrimenti imposto vuoto if (mutedList == null) { mutedList = dbController.AlarmListGetAll(); } return await Task.FromResult(mutedList); } /// /// Conf allarmi (da ADAPTER) tipo RawList senza valori silenziati da app /// /// public async Task> getAlarmRLConfig() { List? redResult = dbController.AlarmListGetAll(); return await Task.FromResult(redResult); } public async Task> getAlarms() { List? dbResult = new List(); var 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); } public async Task> getEventHist() { List? dbResult = new List(); var 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(); var 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(); var 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(); var 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(); var 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(); var 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(); var 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(); var rawData = await redisDb.StringGetAsync(Constants.DISPLSTATUS_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(); var 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 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); } /// /// 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); } /// /// 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); } /// /// 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); } /// /// 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); } /// /// Salva in settings la conf allarmi tipo BankBit /// /// /// public async Task setAlarmSetupBankBit(List alarmConf) { bool answ = false; string rawData = JsonConvert.SerializeObject(alarmConf); await redisDb.StringSetAsync(Constants.ALARMS_SETT_BBIT_KEY, rawData); return await Task.FromResult(answ); } /// /// Salva in settings la conf allarmi tipo RawList /// /// /// public async Task setAlarmSetupRawList(List alarmConf) { bool answ = false; string rawData = JsonConvert.SerializeObject(alarmConf); await redisDb.StringSetAsync(Constants.ALARMS_SETT_RLIST_KEY, rawData); return await Task.FromResult(answ); } #endregion Public Methods #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 Private Methods /// /// Esegue flush memoria redis dato pattern /// /// /// private async Task ExecFlushRedisPattern(RedisValue pattern) { bool answ = false; var listEndpoints = redisConn.GetEndPoints(); foreach (var endPoint in listEndpoints) { //var server = redisConnAdmin.GetServer(listEndpoints[0]); var server = redisConn.GetServer(endPoint); if (server != null) { var keyList = server.Keys(redisDb.Database, pattern); foreach (var item in keyList) { await redisDb.KeyDeleteAsync(item); } // brutalmente rimuovo intero contenuto DB... DANGER //await server.FlushDatabaseAsync(); answ = true; } } return answ; } #endregion Private Methods } }