using Microsoft.Extensions.Configuration; using MP.Data.DatabaseModels; using MP.Data.DTO; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.Threading.Tasks; namespace MP.Data.Services { public class TabDataService : BaseServ, IDisposable { #region Public Constructors public TabDataService(IConfiguration configuration) { _configuration = configuration; // setup compoenti REDIS redisConn = ConnectionMultiplexer.Connect(_configuration.GetConnectionString("Redis")); redisDb = redisConn.GetDatabase(); // conf DB string 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()); } } #endregion Public Constructors #region Public Properties private static Controllers.MpIocController dbIocController { get; set; } = null!; private static Controllers.MpTabController dbTabController { get; set; } = null!; #endregion Public Properties #region Public Methods public async Task> AnagEventiGetAll() { // 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}:AnagEventi"; RedisValue rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty($"{rawData}")) { 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; } /// /// 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}")) { 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 async Task IobInfo(string IdxMacchina) { string source = "DB"; Stopwatch sw = new Stopwatch(); sw.Start(); IobInfoDTO? result = new IobInfoDTO(); // cerco in redis... string currKey = $"{moonProRedisBaseKey}:{IdxMacchina}"; RedisValue rawData = await redisDb.StringGetAsync(currKey); if (!string.IsNullOrEmpty($"{rawData}")) { result = JsonConvert.DeserializeObject($"{rawData}"); source = "REDIS"; } if (result == null) { result = new IobInfoDTO(); } sw.Stop(); Log.Debug($"IobInfo | {source} | {sw.Elapsed.TotalMilliseconds}ms"); return result; } public void Dispose() { // Clear database controller dbTabController.Dispose(); } /// /// 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}")) { 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}")) { 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 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}")) { 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}")) { 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}")) { 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}")) { 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 redisBaseKey = "MP:TAB:Cache"; private string moonProRedisBaseKey = "MoonPro:SQL2016DEV:MoonPro:hM2IOB"; #endregion Private Fields } }