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 GWMS.Data; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Memory; using Newtonsoft.Json; using System.Diagnostics; using NLog; using GWMS.Data.DTO; using GWMS.Data.DatabaseModels; namespace GWMS.UI.Data { public class GWMSDataService { #region Private Fields private static IConfiguration _configuration; private static ILogger _logger; private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); private readonly IDistributedCache distributedCache; private readonly IMemoryCache memoryCache; /// /// Durata assoluta massima della cache IN SECONDI /// private int chAbsExp = 60 * 5; /// /// Durata della cache IN SECONDI in modalità inattiva (non acceduta) prima di venire rimossa /// NON estende oltre il tempo massimo di validità della cache (chAbsExp) /// private int chSliExp = 60 * 1; #endregion Private Fields #region Protected Fields protected static string connStringBBM = ""; #endregion Protected Fields #region Public Fields public static GWMS.Data.Controllers.GWMSController dbController; #endregion Public Fields #region Public Constructors public GWMSDataService(IConfiguration configuration, ILogger logger, IMemoryCache memoryCache, IDistributedCache distributedCache) { _logger = logger; _configuration = configuration; // conf cache this.memoryCache = memoryCache; this.distributedCache = distributedCache; // conf DB string connStr = _configuration.GetConnectionString("GWMS.Data"); if (string.IsNullOrEmpty(connStr)) { _logger.LogError("ConnString empty!"); } else { dbController = new GWMS.Data.Controllers.GWMSController(configuration); StringBuilder sb = new StringBuilder(); sb.AppendLine($"DbController OK"); _logger.LogInformation(sb.ToString()); } } #endregion Public Constructors #region Private Methods private DistributedCacheEntryOptions cacheOpt(bool fastCache) { var numSecAbsExp = fastCache ? chAbsExp : chAbsExp * 10; var numSecSliExp = fastCache ? chSliExp : chSliExp * 10; return new DistributedCacheEntryOptions().SetAbsoluteExpiration(DateTime.Now.AddSeconds(numSecAbsExp)).SetSlidingExpiration(TimeSpan.FromSeconds(numSecSliExp)); } #endregion Private Methods #region Protected Methods protected string getCacheKey(string TableName, SelectOrderData CurrFilter) { string answ = $"{TableName}:P_{CurrFilter.PlantId:00}:S_{CurrFilter.SupplierId:00}:T_{CurrFilter.TransporterId:00}:D_{CurrFilter.DateStart:yyyyMMddHHmm}_{CurrFilter.DateEnd:yyyyMMddHHmm}"; return answ; } #endregion Protected Methods #region Public Methods public async Task> ConfigGetAll() { //return Task.FromResult(dbController.ActionsGetAll()); List dbResult = new List(); string cacheKey = "DATA:CONFIG"; string rawData; var redisDataList = await distributedCache.GetAsync(cacheKey); if (redisDataList != null) { rawData = Encoding.UTF8.GetString(redisDataList); dbResult = JsonConvert.DeserializeObject>(rawData); } else { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.GetConfig(); rawData = JsonConvert.SerializeObject(dbResult); redisDataList = Encoding.UTF8.GetBytes(rawData); await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt(false)); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"Effettuata lettura da DB + caching per ConfigGetAll: {ts.TotalMilliseconds} ms"); } return await Task.FromResult(dbResult); } public async Task HasPlantLog() { return await Task.FromResult(dbController.HasPlantLog()); } public async Task> ItemsGetAll() { //return Task.FromResult(dbController.ActionsGetAll()); List dbResult = new List(); string cacheKey = "DATA:ITEMS"; string rawData; var redisDataList = await distributedCache.GetAsync(cacheKey); if (redisDataList != null) { rawData = Encoding.UTF8.GetString(redisDataList); dbResult = JsonConvert.DeserializeObject>(rawData); } else { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.GetItems(); rawData = JsonConvert.SerializeObject(dbResult); redisDataList = Encoding.UTF8.GetBytes(rawData); await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt(false)); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"Effettuata lettura da DB + caching per ItemsGetAll: {ts.TotalMilliseconds} ms"); } return await Task.FromResult(dbResult); } public async Task> OrdersGetFilt(SelectOrderData CurrFilter) { List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.GetOrdersFilt(CurrFilter.PlantId, CurrFilter.SupplierId, CurrFilter.TransporterId, CurrFilter.DateStart, CurrFilter.DateEnd); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"Effettuata lettura da DB per OrdersGetFilt: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public void OrderUpdate(OrderModel currItem) { try { dbController.OrderUpdate(currItem); } catch { } } public async Task> PlantsGetAll() { List dbResult = new List(); string cacheKey = "DATA:PLANTS:ListDTO"; string rawData; var redisDataList = await distributedCache.GetAsync(cacheKey); if (redisDataList != null) { rawData = Encoding.UTF8.GetString(redisDataList); dbResult = JsonConvert.DeserializeObject>(rawData); } else { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.GetPlantsDTO(); rawData = JsonConvert.SerializeObject(dbResult); redisDataList = Encoding.UTF8.GetBytes(rawData); await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt(true)); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"Effettuata lettura da DB + caching per PlantsGetAll: {ts.TotalMilliseconds} ms"); } return await Task.FromResult(dbResult); } public async Task RegenDB(int numDays, int stepMin = 30, int maxHourRate = 800) { return await Task.FromResult(dbController.RegenDB(1, numDays, stepMin, maxHourRate)); } public void rollBackEdit(object item) { dbController.rollBackEntity(item); } public async Task> SuppliersGetAll() { List dbResult = new List(); string cacheKey = "DATA:SUPPL:List"; string rawData; var redisDataList = await distributedCache.GetAsync(cacheKey); if (redisDataList != null) { rawData = Encoding.UTF8.GetString(redisDataList); dbResult = JsonConvert.DeserializeObject>(rawData); } else { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.GetSuppliers(); rawData = JsonConvert.SerializeObject(dbResult); redisDataList = Encoding.UTF8.GetBytes(rawData); await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt(true)); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"Effettuata lettura da DB + caching per PlantsGetAll: {ts.TotalMilliseconds} ms"); } return await Task.FromResult(dbResult); } public async Task> TransportersGetAll() { List dbResult = new List(); string cacheKey = $"DATA:TRANSP:List"; string rawData; var redisDataList = await distributedCache.GetAsync(cacheKey); if (redisDataList != null) { rawData = Encoding.UTF8.GetString(redisDataList); dbResult = JsonConvert.DeserializeObject>(rawData); } else { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.GetTransporters(); rawData = JsonConvert.SerializeObject(dbResult); redisDataList = Encoding.UTF8.GetBytes(rawData); await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt(true)); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"Effettuata lettura da DB + caching per PlantsGetAll: {ts.TotalMilliseconds} ms"); } return await Task.FromResult(dbResult); } public async Task> UsersGetFilt(UserLevel UsrLvl, int PlantId, int SupplierId, int TransporterId) { List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.GetUsersFilt(UsrLvl, PlantId, SupplierId, TransporterId); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"Effettuata lettura da DB per UsersGetFilt: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public void UserUpdate(UserModel currItem) { try { dbController.UserUpdate(currItem); } catch { } } public async void WeekPlanDelete(WeekPlanModel currItem) { try { //dbController.ResetController(); dbController.WeekPlanDelete(currItem); string cacheKey = $"DATA:WEEKPLAN:List"; var redisDataList = Encoding.UTF8.GetBytes(""); await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt(true)); } catch { } } public async Task> WeekPlanGet() { List dbResult = new List(); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); dbResult = dbController.GetWeekPlan(); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; Log.Info($"Effettuata lettura da DB + caching per WeekPlanGet: {ts.TotalMilliseconds} ms"); return await Task.FromResult(dbResult); } public async void WeekPlanUpdate(WeekPlanModel currItem) { try { //dbController.ResetController(); dbController.WeekPlanUpdate(currItem); string cacheKey = $"DATA:WEEKPLAN:List"; var redisDataList = Encoding.UTF8.GetBytes(""); await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt(true)); } catch { } } #endregion Public Methods } }