using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Configuration; using System.Text; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using MP.Data; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json; namespace MP.Stats.Data { public class MpStatsService { #region Private Fields private static IConfiguration _configuration; private static ILogger _logger; private static List ActionsList = new List(); private readonly IDistributedCache distributedCache; private readonly IMemoryCache memoryCache; private DistributedCacheEntryOptions cacheOpt; /// /// Durata assoluta massima della cache /// private int chAbsExp = 15; /// /// Durata della cache in modalità inattiva (non acceduta) prima di venire rimossa /// NON estende oltre il tempo massimo di validità Abs della cache /// private int chSliExp = 5; #endregion Private Fields #region Protected Fields protected static string connStringBBM = ""; protected static string connStringFatt = ""; #endregion Protected Fields #region Public Fields public static MP.Data.Controllers.MpStatsController dbController; #endregion Public Fields #region Public Constructors public MpStatsService(IConfiguration configuration, ILogger logger, IMemoryCache memoryCache, IDistributedCache distributedCache) { _logger = logger; _configuration = configuration; // conf cache this.memoryCache = memoryCache; this.distributedCache = distributedCache; cacheOpt = new DistributedCacheEntryOptions().SetAbsoluteExpiration(DateTime.Now.AddMinutes(chAbsExp)).SetSlidingExpiration(TimeSpan.FromMinutes(chSliExp)); // conf DB string connStr = _configuration.GetConnectionString("Mp.Stats"); if (string.IsNullOrEmpty(connStr)) { _logger.LogError("ConnString empty!"); } else { dbController = new MP.Data.Controllers.MpStatsController(configuration); StringBuilder sb = new StringBuilder(); sb.AppendLine($"DbController OK"); //sb.AppendLine($"CST: {dbController.CustomersCount()} | CNT: {dbController.CountersCount()} | BSK: {dbController.BasketsCount()} | NGT: {dbController.NegotiationsCount()} | DOC: {dbController.DocsCount()} | ITM: {dbController.ItemsCount()} | RES: {dbController.ResourcesCount()}"); _logger.LogInformation(sb.ToString()); } } #endregion Public Constructors #region Protected Methods protected string getCacheKey(string TableName, SelectData CurrFilter) { string answ = $"{TableName}:M_{CurrFilter.IdxMacchina}:A_{CurrFilter.CodArticolo}:K_{CurrFilter.KeyRichiesta}:O_{CurrFilter.IdxOdl}:D_{CurrFilter.DateStart:yyyyMMddHHmm}_{CurrFilter.DateEnd:yyyyMMddHHmm}"; return answ; } #endregion Protected Methods #region Public Methods public Task ActionsGetAll() { return Task.FromResult(dbController.ActionsGetAll().ToArray()); } public void rollBackEdit(object item) { dbController.RollBackEntity(item); } public Task StatArticoliGetSearch(int numRecord, string searchVal = "") { return Task.FromResult(dbController.StatArticoliGetSearch(numRecord, searchVal).ToArray()); } public Task StatControlliGetAll(DateTime DataStart, DateTime DataEnd, string IdxMacchina, int IdxODL, string KeyRichiesta, string CodArticolo, string searchVal = "") { return Task.FromResult(dbController.StatControlliGetAll(DataStart, DataEnd, IdxMacchina, IdxODL, KeyRichiesta, CodArticolo).ToArray()); } public Task StatDdbGetAll(int numRecord, string searchVal = "") { return Task.FromResult(dbController.StatDdbGetAll(numRecord, searchVal).ToArray()); } public Task StatMacchineGetAll() { return Task.FromResult(dbController.StatMacchineGetAll().ToArray()); } public Task StatOdlGetAll(int numRecord, string searchVal = "") { return Task.FromResult(dbController.StatOdlGetAll(numRecord, searchVal).ToArray()); } public Task StatScartiGetAll(DateTime DataStart, DateTime DataEnd, string IdxMacchina, int IdxODL, string KeyRichiesta, string CodArticolo, string searchVal = "") { // filtra e restituisce SOLO i primi record... return Task.FromResult(dbController.StatScartiGetAll(DataStart, DataEnd, IdxMacchina, IdxODL, KeyRichiesta, CodArticolo).ToArray()); } 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 = "") { List dbResult = new List(); string cacheKey = getCacheKey("MP:STATS:OEE", CurrFilter); string rawData; var redisDataList = await distributedCache.GetAsync(cacheKey); if (redisDataList != null) { rawData = Encoding.UTF8.GetString(redisDataList); dbResult = JsonConvert.DeserializeObject>(rawData); } else { dbResult = dbController.StatTurniOeeGetAll(CurrFilter.DateStart, CurrFilter.DateEnd, CurrFilter.IdxMacchina, CurrFilter.IdxOdl, CurrFilter.KeyRichiesta, CurrFilter.CodArticolo); rawData = JsonConvert.SerializeObject(dbResult); redisDataList = Encoding.UTF8.GetBytes(rawData); await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt); } return await Task.FromResult(dbResult); } public Task StatTurniParetoGetAll(DateTime DataStart, DateTime DataEnd, string IdxMacchina, int IdxODL, string KeyRichiesta, string CodArticolo, string searchVal = "") { return Task.FromResult(dbController.StatTurniParetoGetAll(DataStart, DataEnd, IdxMacchina, IdxODL, KeyRichiesta, CodArticolo).ToArray()); } public Task StatTurniParetoOdlGetAll(DateTime DataStart, DateTime DataEnd, string IdxMacchina, int IdxODL, string KeyRichiesta, string CodArticolo, string searchVal = "") { return Task.FromResult(dbController.StatTurniParetoOdlGetAll(DataStart, DataEnd, IdxMacchina, IdxODL, KeyRichiesta, CodArticolo).ToArray()); } public Task StatUserLogGetAll(DateTime DataStart, DateTime DataEnd, string IdxMacchina, int IdxODL, string KeyRichiesta, string CodArticolo, string searchVal = "") { return Task.FromResult(dbController.StatUserLogGetAll(DataStart, DataEnd, IdxMacchina, IdxODL, KeyRichiesta, CodArticolo).ToArray()); } #endregion Public Methods } }