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
}
}