using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using MP.Data.DatabaseModels;
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
}
}