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 Newtonsoft.Json;
using NLog;
using StackExchange.Redis;
using System.Diagnostics;
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();
_logger.LogInformation("DbController OK");
}
}
#endregion Public Constructors
#region Public Properties
public MessagePipe actLogPipe { get; set; } = null!;
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
public async Task> AlarmLogGetFilt(int machineId, int skipRec, int numRec)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
List? dbResult = dbController.AlarmLogGetFilt(machineId, skipRec, numRec);
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Trace($"Effettuata lettura da DB AlarmLogGetFilt: {ts.TotalMilliseconds} ms");
return await Task.FromResult(dbResult);
}
public async Task createMissingSchedTask(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);
}
public async Task> DataLogGetFilt(int machineId, string fluxType, DateTime inizio, DateTime fine)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
List? dbResult = dbController.DataLogGetFilt(machineId, fluxType, inizio, fine);
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Trace($"Effettuata lettura da DB ParamLogGetFilt: {ts.TotalMilliseconds} ms");
return await Task.FromResult(dbResult);
}
public void Dispose()
{
// Clear database controller
dbController.Dispose();
}
public async Task> getActLog()
{
List? dbResult = new List();
string rawData = await redisDb.StringGetAsync(Constants.ACT_LOG_CURR_KEY);
if (!string.IsNullOrEmpty(rawData))
{
dbResult = JsonConvert.DeserializeObject>(rawData);
}
if (dbResult == null)
{
dbResult = new List();
}
return await Task.FromResult(dbResult);
}
///
/// Conf allarmi (da ADAPTER) senza valori silenziati da app
///
///
public async Task> getAlarmConfig()
{
List? dbResult = new List();
string rawData = await redisDb.StringGetAsync(Constants.ALARMS_CONF_KEY);
if (!string.IsNullOrEmpty(rawData))
{
dbResult = JsonConvert.DeserializeObject>(rawData);
}
if (dbResult == null)
{
dbResult = new List();
}
return await Task.FromResult(dbResult);
}
public async Task> getAlarms()
{
List? dbResult = new List();
string 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);
}
///
/// Conf allarmi IMPOSTATA con valori silenziati
///
///
public async Task> getAlarmSetup()
{
List? dbResult = new List();
string rawData = await redisDb.StringGetAsync(Constants.ALARMS_SETT_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))
{
dbResult = JsonConvert.DeserializeObject>(rawData);
}
// altrimenti imposto vuoto
if (dbResult == null)
{
dbResult = new List();
}
return await Task.FromResult(dbResult);
}
public async Task> getEventHist()
{
List? dbResult = new List();
string 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();
string 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();
string 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();
string 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();
string 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();
string 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();
string 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();
string rawData = await redisDb.StringGetAsync(Constants.STATUS_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();
string 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);
}
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);
}
public async Task> SchedMaintTaskGetFilt(int machineId, int skipRec, int numRec, bool showCompleted)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
List? dbResult = dbController.SchedMaintTaskGetFilt(machineId, skipRec, numRec, showCompleted);
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Trace($"Effettuata lettura da DB SchedMaintTaskGetFilt: {ts.TotalMilliseconds} ms");
return await Task.FromResult(dbResult);
}
public async Task setAlarmSetup(List alarmConf)
{
bool answ = false;
string rawData = JsonConvert.SerializeObject(alarmConf);
await redisDb.StringSetAsync(Constants.ALARMS_SETT_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
}
}