using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using MP.Data.DatabaseModels; using MP.Data.DTO; using MP.Data.Objects; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.Threading.Tasks; using static MP.Data.Objects.Enums; namespace MP.Data.Services { public class TabDataService : BaseServ, IDisposable { #region Public Constructors /// /// Init servizio TAB /// /// public TabDataService(IConfiguration configuration) { _configuration = configuration; // setup compoenti REDIS redisConn = ConnectionMultiplexer.Connect(_configuration.GetConnectionString("Redis")); redisDb = redisConn.GetDatabase(); // conf DB ConnStr = _configuration.GetConnectionString("Mp.All"); if (string.IsNullOrEmpty(ConnStr)) { Log.Error("ConnString empty!"); } else { StringBuilder sb = new StringBuilder(); dbTabController = new Controllers.MpTabController(configuration); sb.AppendLine($"TabDataService | MpTabController OK"); dbIocController = new Controllers.MpIocController(configuration); sb.AppendLine($"TabDataService | MpIocController OK"); Log.Info(sb.ToString()); // sistemo i parametri x redHas... CodModulo = _configuration.GetValue("OptConf:CodModulo"); var cstringArray = ConnStr.Split(";"); foreach (var item in cstringArray) { var cData = item.Trim().Split("="); if (cData.Length == 2) { if (!connStrParams.ContainsKey(cData[0])) { connStrParams.Add(cData[0], cData[1]); } } } // sistemo DataSource = connStrParams["Server"]; DataBase = connStrParams["Database"]; } } #endregion Public Constructors #region Public Methods /// /// Elenco completo EVENTI /// /// public async Task> AnagEventiGetAll() { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:AnagEventi:ALL"; RedisValue rawData = await redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbTabController.AnagEventiGetAll(); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, LongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"AnagEventiGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Elenco EVENTI validi x macchina /// /// public async Task> AnagEventiGetByMacch(string IdxMacch) { // setup parametri costanti DateTime startDate = new DateTime(2000, 1, 1); DateTime endDate = DateTime.Today.AddDays(1); string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:VSEB:{IdxMacch}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbTabController.AnagEventiGetByMacc(IdxMacch); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, LongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"AnagEventiGetByMacch | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Elenco completo STATI /// /// public async Task> AnaStatiGetAll() { // setup parametri costanti DateTime startDate = new DateTime(2000, 1, 1); DateTime endDate = DateTime.Today.AddDays(1); string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:AnagStati"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbTabController.AnagStatiGetAll(); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, LongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"AnaStatiGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Recupera elenco ultimi commenti /// /// Idx macchina, "*" = tutte /// Num massimo di record da recuperare /// public async Task> CommentiGetLastByMacc(string idxMacchina, int maxRec) { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:Commenti:{idxMacchina}:{maxRec}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbTabController.CommentiGetLastByMacc(idxMacchina, maxRec); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"CommentiGetLastByMacc | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Effettua conferma prod macchina dell'intero periodo da confermare (ultima conferma /// --> dtEvent) /// /// idx macchina da confermare /// 0=periodo, 1 = giorno, 2 = turno /// qta pezzi BUONI da confermare /// qta pezzi SCARTO da confermare /// DataOra in cui registrare approvazione /// Matricola operatore /// public bool ConfermaProdMacchina(string idxMacchina, int modoConfProd, int numPzConfermati, int numPzScarto, DateTime DataOraApp, int MatrOpr) { bool answ = false; answ = dbTabController.ConfermaProdMacchina(idxMacchina, modoConfProd, numPzConfermati, numPzScarto, DataOraApp, MatrOpr); return answ; } /// /// Effettua conferma prod macchina dell'intero periodo da confermare (ultima conferma /// --> dtEvent) /// /// idx macchina da confermare /// 0=periodo, 1 = giorno, 2 = turno /// qta pezzi BUONI da confermare /// /// qta pezzi LASCIATI alla macchina da confermare (2 eventi 121 rettifica neg/pos) /// /// qta pezzi SCARTO da confermare /// DataOra in cui registrare approvazione /// Matricola operatore /// public bool ConfermaProdMacchinaFull(string idxMacchina, int modoConfProd, int numPzConfermati, int numPzLasciati, int numPzScarto, DateTime DataOraApp, int MatrOpr) { bool answ = false; answ = dbTabController.ConfermaProdMacchinaFull(idxMacchina, modoConfProd, numPzConfermati, numPzLasciati, numPzScarto, DataOraApp, MatrOpr); return answ; } /// /// Config values attivi /// /// public async Task> ConfigGetAll() { string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:Conf"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = await Task.FromResult(dbTabController.ConfigGetAll()); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, LongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"ConfigGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public void Dispose() { // Clear database controller dbTabController.Dispose(); dbIocController.Dispose(); } /// /// Elimina una riga in EventList se trovata /// /// /// /// public async Task EvListDelete(string idxMacchina, DateTime dtEvento) { bool fatto = false; try { // inserisco evento fatto = await dbTabController.EvListDelete(idxMacchina, dtEvento); // reset cache eventi/commenti await FlushCache("EvList"); await FlushCache("Commenti"); } catch (Exception exc) { string logMsg = $"Eccezione in EvListDelete | macchina: {idxMacchina} | DataEv: {dtEvento}{Environment.NewLine}{exc}"; Log.Error(logMsg); } return fatto; } /// /// Recupera record EventList date condizioni filtro /// /// Idx macchina, "*" = tutte /// Data limite per recupero antecedenti /// Tipo evento cercato, 0 = tutti /// Num massimo di record da recuperare /// public async Task> EvListGetLastBySearch(string idxMacchina, DateTime dtLimit, int idxTipo, int maxRec) { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:EvList:Last:{idxMacchina}:{idxTipo}:{dtLimit:yyyyMMdd-HHmm}:{maxRec}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = await dbTabController.EvListGetLastBySearch(idxMacchina, dtLimit, idxTipo, maxRec); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"EvListGetLastBySearch | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Scrive una riga in EventList inviato nel db + check /// /// Record da registrare /// public async Task EvListInsert(EventListModel newRec, tipoInputEvento tipoEv) { bool inserito = false; try { // inserisco evento inserito = await dbTabController.EvListInsert(newRec); // reset cache eventi/commenti await FlushCache("EvList"); await FlushCache("Commenti"); } catch (Exception exc) { string logMsg = $"Eccezione in fase di scrittura evento con i seguenti dati | macchina: {newRec.IdxMacchina} | IdxTipo: {newRec.IdxTipo} | CodArticolo: {newRec.CodArticolo} | Value {newRec.Value} | MatrOpr {newRec.MatrOpr} | Pallet {newRec.pallet}{Environment.NewLine}{exc}"; Log.Error(logMsg); } // se non è un commento... if (tipoEv != tipoInputEvento.commento) { try { // faccio controllo per eventuale cambio stato da tab transizioni... dbTabController.CheckCambiaStatoBatch(tipoEv, newRec.IdxMacchina, newRec.InizioStato ?? DateTime.Now, newRec.IdxTipo, newRec.CodArticolo, newRec.Value, newRec.MatrOpr, newRec.pallet); } catch (Exception exc) { string logMsg = $"Eccezione in checkCambiaStatoBatch(6) | tipoInputEvento: {tipoEv} |macchina: {newRec.IdxMacchina} | IdxTipo: {newRec.IdxTipo} | CodArticolo: {newRec.CodArticolo} | Value {newRec.Value} | MatrOpr {newRec.MatrOpr} | Pallet {newRec.pallet}{Environment.NewLine}{exc}"; Log.Error(logMsg); } } // formatto output inputComandoMapo answ = new inputComandoMapo(); answ.outValue = inserito.ToString(); answ.needStatusRefresh = true; return answ; } /// /// Recupera elenco fermi non qualificati da filtro /// /// Idx macchina, "*" = tutte /// Num massimo di giorni antecedenti /// Durata minima (in minuti) /// public async Task> FermiNonQualificatiFilt(string idxMacchina, int gg, double durataMin) { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:FNQ:{idxMacchina}:{gg}:{durataMin:N0}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbTabController.FermiNonQualificatiFilt(idxMacchina, gg, durataMin); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"FermiNonQualificatiFilt | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Pulizia cache Redis (tutta) /// /// public async Task FlushCache() { RedisValue pattern = new RedisValue($"{redisBaseKey}:*"); bool answ = await ExecFlushRedisPattern(pattern); return answ; } /// /// Pulizia cache Redis per chiave specifica (da redisBaseKey...) /// /// public async Task FlushCache(string KeyReq) { RedisValue pattern = new RedisValue($"{redisBaseKey}:{KeyReq}:*"); bool answ = await ExecFlushRedisPattern(pattern); return answ; } /// /// Recupero info IOB x TAB (da info registrate IOB-WIN--> MP-IO) /// /// /// public async Task IobInfo(string IdxMacchina) { string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); IOB_data? result = new IOB_data(); // cerco in redis... string currKey = redHash($"hM2IOB:{IdxMacchina}"); RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject($"{rawData}"); source = "REDIS"; } if (result == null) { result = new IOB_data(); } sw.Stop(); Log.Debug($"IobInfo | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Resetta (rileggendo) i dati della macchina /// /// /// public Dictionary resetDatiMacchina(string idxMacchina) { Dictionary answ = new Dictionary(); #if false string currHash = dtMaccHash(idxMacchina); // inizio con un bel reset... memLayer.ML.redFlushKey(currHash); DS_applicazione.MSFDDataTable tabMSFD = new DS_applicazione.MSFDDataTable(); // 2018.01.08 SEMPRE senza singleton: instanzio un nuovo oggetto MapoDb MapoDb connDb = new MapoDb(); tabMSFD = connDb.taMSFD.getByIdxMacc(idxMacchina); bool trovato = false; // se ho righe... DS_applicazione.MSFDDataTable tab = new DS_applicazione.MSFDDataTable(); DS_applicazione.MSFDRow rigaMSFD; if (tabMSFD.Rows.Count > 0) { try { rigaMSFD = tabMSFD[0]; trovato = true; } catch { rigaMSFD = tab.NewMSFDRow(); } } else { rigaMSFD = tab.NewMSFDRow(); } if (trovato) { // ora provo a compilare... try { // salvo 1:1 i valori... STATO answ.Add("IdxMicroStato", rigaMSFD.IdxMicroStato.ToString()); answ.Add("IdxStato", rigaMSFD.IdxStato.ToString()); answ.Add("CodArticolo", rigaMSFD.CodArticolo); answ.Add("insEnabled", rigaMSFD.insEnabled.ToString()); answ.Add("sLogEnabled", rigaMSFD.sLogEnabled.ToString()); answ.Add("pallet", rigaMSFD.pallet); answ.Add("CodArticolo_A", rigaMSFD.CodArticolo_A); answ.Add("CodArticolo_B", rigaMSFD.CodArticolo_B); answ.Add("TempoCicloBase", rigaMSFD.TempoCicloBase.ToString()); answ.Add("PzPalletProd", rigaMSFD.PzPalletProd.ToString()); answ.Add("MatrOpr", rigaMSFD.MatrOpr.ToString()); answ.Add("lastVal", rigaMSFD.lastVal); answ.Add("TCBase", rigaMSFD.TempoCicloBase.ToString()); //...e SETUP answ.Add("CodMacc", rigaMSFD.codmacchina); answ.Add("IdxFamIn", rigaMSFD.IdxFamigliaIngresso.ToString()); answ.Add("Multi", rigaMSFD.Multi.ToString()); answ.Add("BitFilt", rigaMSFD.BitFilt.ToString()); answ.Add("MaxVal", rigaMSFD.MaxVal.ToString()); answ.Add("BSR", rigaMSFD.BSR.ToString()); answ.Add("ExplodeBit", rigaMSFD.ExplodeBit.ToString()); answ.Add("NumBit", rigaMSFD.NumBit.ToString()); answ.Add("IdxFamMacc", rigaMSFD.IdxFamiglia.ToString()); answ.Add("simplePallet", rigaMSFD.simplePallet.ToString()); answ.Add("palletChange", rigaMSFD.palletChange.ToString()); } catch (Exception exc) { Log.Info(string.Format("Errore in compilazione dati MSFD:{0}{1}", Environment.NewLine, exc), tipoLog.EXCEPTION); } // cerco dati master/slave... string isMaster = connDb.taM2S.getByMaster(idxMacchina).Count > 0 ? "1" : "0"; string isSlave = connDb.taM2S.getBySlave(idxMacchina).Count > 0 ? "1" : "0"; answ.Add("Master", isMaster); answ.Add("Slave", isSlave); // verifico il timeout che cambia a seconda che sia vero o falso insEnabled... int tOutShort = memLayer.ML.cdvi("TmOut.MS.S"); int tOutLong = memLayer.ML.cdvi("TmOut.MS.L"); int redDtMacTOut = tOutLong; try { redDtMacTOut = (answ["insEnabled"].ToLower() == "true") ? tOutShort : tOutLong; } catch (Exception exc) { Log.Info($"Eccezione in calcolo timeout dati macchina: idxMacchina{idxMacchina} | TShort: {tOutShort} | TLong {tOutLong}{Environment.NewLine}{exc}"); } // salvo in redis! memLayer.ML.redSaveHashDict(currHash, answ, redDtMacTOut); } else { Log.Info("Errore in chiamata stp_MSFD_getMacc (connDb.taMSFD.getByIdxMacc(idxMacchina))"); } #endif return answ; } /// /// Effettua reset microstato macchina /// /// public void resetMicrostatoMacchina(string idxMacchina) { // salvo microstato 0... MicroStatoMacchinaModel newRecMS = new MicroStatoMacchinaModel() { IdxMacchina = idxMacchina, InizioStato = DateTime.Now, IdxMicroStato = 0, Value = "FER" }; var result = dbTabController.MicroStatoMacchinaUpsert(newRecMS); // reset in redis resetDatiMacchina(idxMacchina); } /// /// Effettua ricalcolo MSE x macchina indicata /// /// idx macchina da confermare /// Num massimo secondi di "vecchiaia" del dato /// public bool RicalcMse(string idxMacchina, int maxAgeSec) { bool answ = false; answ = dbTabController.RicalcMse(idxMacchina, maxAgeSec); return answ; } /// /// Recupero Righe (Actual) della scheda tecnica da GRUPPO + ODL /// /// /// /// public async Task> STAR_byGrpOdl(string codGruppo, int idxODL) { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:START:{codGruppo}:{idxODL}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbTabController.STAR_byGrpOdl(codGruppo, idxODL); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, LongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"STAR_byGrpOdl | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Recupero Righe (Actual) della scheda tecnica da GRUPPO + ODL /// /// /// /// /// public async Task> STAR_byGrpOdlLbl(string codGruppo, string label, int idxODL) { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:START:{codGruppo}:{label}:{idxODL}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbTabController.STAR_byGrpOdlLbl(codGruppo, label, idxODL); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, LongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"STAR_byGrpOdlLbl | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Stato macchina /// /// /// public async Task StatoMacchina(string idxMacchina) { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); StatoMacchineModel? result = new StatoMacchineModel(); // cerco in redis... string currKey = $"{redisBaseKey}:StatoMacc:{idxMacchina}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject($"{rawData}"); source = "REDIS"; } else { result = dbTabController.StatoMacchina(idxMacchina); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromSeconds(2)); } if (result == null) { result = new StatoMacchineModel(); } sw.Stop(); Log.Debug($"StatoMacchina | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Stato prod macchina (completo) /// /// /// /// public async Task StatoProdMacchina(string idxMacchina, DateTime dtReq) { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); StatoProdModel? result = new StatoProdModel(); // cerco in redis... string currKey = $"{redisBaseKey}:StatoProd:{idxMacchina}:{dtReq:HHmmss}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject($"{rawData}"); source = "REDIS"; } else { result = dbTabController.StatoProdMacchina(idxMacchina, dtReq); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, UltraFastCache); } if (result == null) { result = new StatoProdModel(); } sw.Stop(); Log.Debug($"StatoProdMacchina | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Intera vista v_MSFD /// /// public async Task> VMSFDGetAll() { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:MSFD:ALL"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbIocController.VMSFDGetAll(); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"VMSFDGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Vista v_MSFD x singola macchina (da stored) - singolo record /// /// /// public async Task> VMSFDGetByMacc(string idxMacc) { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:MSFD:MACCH:{idxMacc}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbIocController.VMSFDGetByMacc(idxMacc); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, UltraFastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"VMSFDGetByMacc | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Vista v_MSFD delle machine MULTI filtrato x macchina (da stored) /// /// /// public async Task> VMSFDGetMultiByMacc(string idxMacc) { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List? result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:MSFD:MULTI:{idxMacc}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbIocController.VMSFDGetByMacc(idxMacc); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"VMSFDGetMultiByMacc | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } #endregion Public Methods #region Protected Fields /// /// Oggetto per connessione a REDIS /// protected ConnectionMultiplexer redisConn = null!; /// /// Oggetto DB redis da impiegare x chiamate R/W /// protected IDatabase redisDb = null!; #endregion Protected Fields #region Private Fields private static Logger Log = LogManager.GetCurrentClassLogger(); private string CodModulo = ""; private string ConnStr = ""; private Dictionary connStrParams = new Dictionary(); private string DataBase = ""; private string DataSource = ""; private string redisBaseKey = "MP:TAB:Cache"; #endregion Private Fields #region Private Properties private static Controllers.MpIocController dbIocController { get; set; } = null!; private static Controllers.MpTabController dbTabController { get; set; } = null!; #endregion Private Properties #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); } answ = true; } } return answ; } private string redHash(string keyName) { string result = keyName; try { result = $"{CodModulo}:{DataSource}:{DataBase}:{keyName}".Replace("\\", "_"); } catch (Exception exc) { Log.Error($"Errore in redHash{Environment.NewLine}{exc}"); } return result; } #endregion Private Methods } }