using Microsoft.Extensions.Configuration; using MP.Data.DbModels; using MP.Data.DbModels.Energy; using MP.Data.Services; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Data; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; namespace MP.Stats.Data { public class MpStatsService : BaseServ { #region Public Fields public static MP.Data.Controllers.MpStatsController dbController; #endregion Public Fields #region Public Constructors public MpStatsService(IConfiguration configuration, IConnectionMultiplexer redConn) : base(configuration, redConn) { Stopwatch sw = Stopwatch.StartNew(); sw.Start(); // conf DB string connStr = _configuration.GetConnectionString("MP.Stats"); if (string.IsNullOrEmpty(connStr)) { Log.Error("MP.Stats: ConnString empty!"); } else { dbController = new MP.Data.Controllers.MpStatsController(configuration); InitDict(); sw.Stop(); Log.Info($"MpStatsService | MpStatsController OK | {sw.Elapsed.TotalMilliseconds} ms"); } } #endregion Public Constructors #region Public Events /// /// Evento richiesta rilettura dati pagina (x refresh pagine aperte) /// public event EventHandler ReloadRequest = delegate { }; #endregion Public Events #region Public Methods public async Task> ActionsGetAll() { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = $"{redisBaseKey}:Cache:AZIONI_ALL"; RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.ActionsGetAll(); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"ActionsGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public async Task> AnagFLTransGetAll() { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = $"{redisBaseKey}:Cache:FLTrans"; RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.AnagFLTransGetAll(); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"AnagFLTransGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public Task> ArticoliGetSearch(int numRecord, string searchVal = "") { List answ = new List(); answ.Add(new AutocompleteModel { LabelField = "--- TUTTE ---", ValueField = "*" }); if (numRecord > -1) { answ.AddRange(dbController.ArticoliGetSearch(numRecord, searchVal).Select(x => new AutocompleteModel { LabelField = $"{x.CodArticolo} {x.DescArticolo} {x.Disegno}", ValueField = x.CodArticolo }).ToList()); } return Task.FromResult(answ); } public async Task> ArticoliList(string searchVal) { List answ = new List(); answ.Add(new AutocompleteModel { LabelField = "--- TUTTE ---", ValueField = "*" }); var listMacchine = dbController.MacchineGetAll(); answ.AddRange(listMacchine.Select(x => new AutocompleteModel { LabelField = x.IdxMacchina, ValueField = x.IdxMacchina }).ToList()); return await Task.FromResult(answ); } public Task> AzioniList() { List answ = new List(); answ.Add(new AutocompleteModel { LabelField = "--- TUTTE ---", ValueField = "*" }); answ.AddRange(dbController.ActionsGetAll().Select(x => new AutocompleteModel { LabelField = $"{x.Descrizione}", ValueField = x.Azione }).ToList()); return Task.FromResult(answ); } public Task> CommesseGetSearch(int numRecord, string searchVal = "") { List answ = new List(); answ.Add(new AutocompleteModel { LabelField = "--- TUTTE ---", ValueField = "*" }); if (numRecord > -1) { answ.AddRange(dbController.CommesseGetSearch(numRecord, searchVal).GroupBy(x => x.KeyRichiesta).Select(x => new AutocompleteModel { LabelField = $"{x.First().CodArticolo} | {x.First().KeyRichiesta}", ValueField = x.First().KeyRichiesta }).ToList()); } return Task.FromResult(answ); } /// /// Recupero elenco config /// /// 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 = dbController.ConfigGetAll(); // serializzo e salvo... rawData = JsonConvert.SerializeObject(result); _redisDb.StringSet(currKey, rawData, LongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"ConfigGetAll | {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); // rileggo conf UM! var rawData = await AnagFLTransGetAll(); DictFluxUm = rawData.ToDictionary(kvp => $"{kvp.CodFluxOut}", kvp => kvp.UM); 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; } /// /// Restituisce UM del flusso configurato /// /// public string FluxGetUM(string codFlux) { string answ = "#"; if (DictFluxUm.ContainsKey(codFlux)) { answ = DictFluxUm[codFlux]; } return answ; } /// /// Recupero dati FluxLog secondo filtro + richiesta raggruppamento /// /// /// /// /// public async Task> FluxLogRawData(SelectData CurrFilter, string fluxType, string searchVal = "") { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = getCacheKey($"{redisBaseKey}:FL_DATA:FT_{fluxType}", CurrFilter); RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.FluxLogRawData(CurrFilter.IdxMacchina, CurrFilter.DateStart, CurrFilter.DateEnd, fluxType); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"FluxLogRawData | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Elenco di tipi flusso disponibili /// /// public async Task> FluxTypeList() { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = $"{redisBaseKey}:FTList"; RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.FluxTypeList(); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, UltraLongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"FluxTypeList | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public List MacchineEnergy() { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = $"{redisBaseKey}:Cache:MacchineEnergy"; RedisValue rawData = _redisDb.StringGet(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.MacchineEnergy(); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); _redisDb.StringSet(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"MacchineEnergy | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public List MacchineGetAll() { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = $"{redisBaseKey}:Cache:Macchine"; RedisValue rawData = _redisDb.StringGet(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.MacchineGetAll(); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); _redisDb.StringSet(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"MacchineGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Elenco check stato Macchine Energy /// /// public async Task> MacchineEnergyCheckGetAll() { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = $"{redisBaseKey}:Cache:MacchineEnegyCheck"; RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue && rawData.Length() > 2) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = await dbController.MacchineEnergyCheckGetAllAsync(); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromSeconds(60)); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"MacchineEnergyCheckGetAllAsync | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public Task> MachineList(bool onlyEnergy = false) { List answ = new List(); answ.Add(new AutocompleteModel { LabelField = "--- TUTTE ---", ValueField = "*" }); if (onlyEnergy) { answ.AddRange(dbController .MacchineEnergy() .Select(x => new AutocompleteModel { LabelField = $"{x.IdxMacchina} | {x.Nome} {x.Descrizione} ", ValueField = x.IdxMacchina }) .ToList()); } else { answ.AddRange(dbController .MacchineGetAll() .Select(x => new AutocompleteModel { LabelField = $"{x.IdxMacchina} | {x.Nome} {x.Descrizione} ", ValueField = x.IdxMacchina }) .ToList()); } return Task.FromResult(answ); } /// /// Invio notifica rilettura (con parametro) /// /// public void NotifyReloadRequest(string message) { if (ReloadRequest != null) { // messaggio ReloadEventArgs rea = new ReloadEventArgs(message); ReloadRequest.Invoke(this, rea); } } public void rollBackEdit(object item) { dbController.RollBackEntity(item); } public async Task> StatControlliGetAll(SelectData CurrFilter, string searchVal = "") { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = getCacheKey($"{redisBaseKey}:CONTROLLI", CurrFilter); RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.StatControlliGetAll(CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxMacchina, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } // se necessario filtro.. if (!string.IsNullOrEmpty(searchVal)) { result = result .Where(x => x.Note.Contains(searchVal, StringComparison.InvariantCultureIgnoreCase)) .ToList(); } sw.Stop(); Log.Debug($"StatControlliGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public async Task> StatDdbGetAll(SelectData CurrFilter, string searchVal = "") { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = getCacheKeyPaged($"{redisBaseKey}:DDBT", CurrFilter); RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.StatDdbGetAll(CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxMacchina, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo, CurrFilter.FirstRecord, CurrFilter.NumRecord); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"StatDdbGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Recupera TUTTI x export /// /// /// /// public async Task> StatDdbGetAllExport(SelectData CurrFilter, string searchVal = "") { //return Task.FromResult(dbController.StatDdbGetAll(numRecord, searchVal).ToArray()); List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.StatDdbGetAll(CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxMacchina, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo, 1, 0); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Trace($"Effettuata lettura COMPLETA da DB + caching per StatDdbGetAllExport: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public async Task StatDdbGetCount(SelectData CurrFilter, string searchVal = "") { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); int numRec = 0; // cerco in redis... DateTime adesso = DateTime.Now; string currKey = getCacheKey($"{redisBaseKey}:DDBT-COUNT", CurrFilter); RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { numRec = JsonConvert.DeserializeObject($"{rawData}"); source = "REDIS"; } else { numRec = dbController.StatDdbGetCount(CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxMacchina, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo); // serializzp e salvo... rawData = JsonConvert.SerializeObject(numRec); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } sw.Stop(); Log.Debug($"StatDdbGetCount | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return numRec; } /// /// Statistiche ODL /// /// /// /// public async Task> StatOdlEnergyGetAll(SelectData CurrFilter, string searchVal = "") { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = getCacheKey($"{redisBaseKey}:ODL_ENERGY", CurrFilter); RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.StatOdlEnergyGetFilt(CurrFilter.IdxMacchina, CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"StatOdlEnergyGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Statistiche Energia x ODL /// /// /// /// public async Task> StatOdlGetAll(SelectData CurrFilter, string searchVal = "") { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = getCacheKey($"{redisBaseKey}:ODL", CurrFilter); RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.StatOdlGetAll(CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxMacchina, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"StatOdlEnergyGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public async Task> StatScartiGetAll(SelectData CurrFilter, string searchVal = "") { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = getCacheKey($"{redisBaseKey}:SCARTI:RAW", CurrFilter); RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.StatScartiGetAll(CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxMacchina, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"StatScartiGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public async Task> StatTurniOeeGetAllAsync(DateTime DataStart, DateTime DataEnd, string IdxMacchina, int IdxODL, string KeyRichiesta, string CodArticolo, string searchVal = "") { return await Task.FromResult(dbController.StatTurniOeeGetAll(DataStart, DataEnd, IdxMacchina, IdxODL, KeyRichiesta, CodArticolo)); } public async Task> StatTurniOeeGetAllCached(SelectData CurrFilter, string searchVal = "") { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = getCacheKey($"{redisBaseKey}:OEE", CurrFilter); RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.StatTurniOeeGetAll(CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxMacchina, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo); // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"StatTurniOeeGetAllCached | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public async Task> StatUserLogGetAll(SelectData CurrFilter, string searchVal = "") { // setup parametri costanti string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... DateTime adesso = DateTime.Now; string currKey = getCacheKey($"{redisBaseKey}:USRACTLOG", CurrFilter); RedisValue rawData = await _redisDb.StringGetAsync(currKey); if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.StatUserLogGetAll(CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxMacchina, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo); // filtro x tipo azione "a mano" prima di salvare... if (CurrFilter.Azione != "*") { result = result.Where(x => x.Azione == CurrFilter.Azione).ToList(); } // serializzp e salvo... rawData = JsonConvert.SerializeObject(result); await _redisDb.StringSetAsync(currKey, rawData, FastCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"StatUserLogGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } /// /// Recupero vocabolario /// /// public async Task> VocabolarioGetAll() { string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); List result = new List(); // cerco in redis... string currKey = $"{redisBaseKey}:Vocabolario"; RedisValue rawData = await _redisDb.StringGetAsync(currKey); //if (!string.IsNullOrEmpty($"{rawData}")) if (rawData.HasValue) { result = JsonConvert.DeserializeObject>($"{rawData}"); source = "REDIS"; } else { result = dbController.VocabolarioGetAll(); // serializzo e salvo... rawData = JsonConvert.SerializeObject(result); _redisDb.StringSet(currKey, rawData, LongCache); } if (result == null) { result = new List(); } sw.Stop(); Log.Debug($"VocabolarioGetAll | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } #endregion Public Methods #region Protected Fields protected static string connStringBBM = ""; protected static string connStringFatt = ""; /// /// Vocabolario x recupero rapido traduzioni /// protected static Dictionary DictFluxUm = new Dictionary(); #endregion Protected Fields #region Protected Methods protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // Free managed resources here dbController.Dispose(); } // Free unmanaged resources here _disposed = true; } // Call base class implementation. base.Dispose(disposing); } protected string getCacheKey(string TableName, SelectData CurrFilter) { string answ = $"{TableName}:M_{CurrFilter.IdxMacchina}:AZ_{CurrFilter.Azione}:ART_{CurrFilter.CodArticolo}:KR_{CurrFilter.KeyRichiesta}:O_{CurrFilter.IdxOdl}:D_{CurrFilter.DateStart:yyyyMMddHHmm}_{CurrFilter.DateEnd:yyyyMMddHHmm}"; return answ; } protected string getCacheKeyPaged(string TableName, SelectData CurrFilter) { string answ = $"{TableName}:M_{CurrFilter.IdxMacchina}:A_{CurrFilter.CodArticolo}:K_{CurrFilter.KeyRichiesta}:O_{CurrFilter.IdxOdl}:D_{CurrFilter.DateStart:yyMMddHHmm}_{CurrFilter.DateEnd:yyMMddHHmm}:R_{CurrFilter.FirstRecord}_{CurrFilter.FirstRecord + CurrFilter.NumRecord}"; return answ; } #endregion Protected Methods #region Private Fields private static Logger Log = LogManager.GetCurrentClassLogger(); private bool _disposed = false; private string redisBaseKey = "MP:STATS"; #endregion Private Fields #region Private Methods /// /// Inizializzazione dict vari /// private static void InitDict() { // inizializzo dizionario vocabolario var rawData = dbController.AnagFLTransGetAll(); DictFluxUm = rawData.ToDictionary(kvp => $"{kvp.CodFluxOut}", kvp => kvp.UM); } /// /// Esegue flush memoria redis dato pat2Flush /// /// /// private async Task ExecFlushRedisPattern(RedisValue pat2Flush) { bool answ = false; var masterEndpoint = _redisConn.GetEndPoints() .Where(ep => _redisConn.GetServer(ep).IsConnected && !_redisConn.GetServer(ep).IsReplica) .FirstOrDefault(); // sepattern è "*" elimino intero DB... if (masterEndpoint != null && (pat2Flush.Equals(new RedisValue("*")) || pat2Flush == RedisValue.Null)) { _redisConn.GetServer(masterEndpoint).FlushDatabase(database: _redisDb.Database); } else { var server = _redisConn.GetServer(masterEndpoint); var keys = server.Keys(database: _redisDb.Database, pattern: pat2Flush, pageSize: 1000); var deleteTasks = new List(); foreach (var key in keys) { deleteTasks.Add(_redisDb.KeyDeleteAsync(key)); if (deleteTasks.Count >= 1000) { await Task.WhenAll(deleteTasks); deleteTasks.Clear(); } } if (deleteTasks.Count > 0) { await Task.WhenAll(deleteTasks); } } answ = true; #if 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; } } #endif // notifico update ai client in ascolto x reset cache NotifyReloadRequest($"FlushRedisCache | {pat2Flush}"); return answ; } #endregion Private Methods } }