diff --git a/GPW.CORE.Comp/CalendarMonth.razor b/GPW.CORE.Comp/CalendarMonth.razor index 4904dc5..b7e954c 100644 --- a/GPW.CORE.Comp/CalendarMonth.razor +++ b/GPW.CORE.Comp/CalendarMonth.razor @@ -114,10 +114,10 @@ else
- +
- +
diff --git a/GPW.CORE.Comp/CalendarMonth.razor.cs b/GPW.CORE.Comp/CalendarMonth.razor.cs index f4d3647..64f8d3a 100644 --- a/GPW.CORE.Comp/CalendarMonth.razor.cs +++ b/GPW.CORE.Comp/CalendarMonth.razor.cs @@ -80,6 +80,28 @@ namespace GPW.CORE.Comp [Parameter] public string WeekEndCss { get; set; } = "bg-secondary text-light bg-opacity-75"; + /// + /// titolo che verrà inserito in gauge + /// + [Parameter] + public string RightGaugeTitle { get; set; } = "--:--"; + /// + /// testo che verrà inserito in gauge + /// + [Parameter] + public string RightGaugeText { get; set; } = "-----"; + + /// + /// titolo che verrà inserito in gauge + /// + [Parameter] + public string LeftGaugeTitle { get; set; } = "--:--"; + /// + /// testo che verrà inserito in gauge + /// + [Parameter] + public string LeftGaugeText { get; set; } = "-----"; + #endregion Public Properties #region Protected Methods diff --git a/GPW.CORE.Comp/GPW.CORE.Comp.csproj b/GPW.CORE.Comp/GPW.CORE.Comp.csproj index 55f72a9..b7c5e76 100644 --- a/GPW.CORE.Comp/GPW.CORE.Comp.csproj +++ b/GPW.CORE.Comp/GPW.CORE.Comp.csproj @@ -41,4 +41,8 @@ + + + + diff --git a/GPW.CORE.SMART/Components/Calendario.razor b/GPW.CORE.SMART/Components/Calendario.razor index ef89396..02e5478 100644 --- a/GPW.CORE.SMART/Components/Calendario.razor +++ b/GPW.CORE.SMART/Components/Calendario.razor @@ -1,5 +1,9 @@ -
- -
+@if (timbratureOggi != null) +{ +
+ +
+ +} diff --git a/GPW.CORE.SMART/Components/Calendario.razor.cs b/GPW.CORE.SMART/Components/Calendario.razor.cs index af97abb..b052039 100644 --- a/GPW.CORE.SMART/Components/Calendario.razor.cs +++ b/GPW.CORE.SMART/Components/Calendario.razor.cs @@ -12,19 +12,33 @@ using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Components.Web.Virtualization; using Microsoft.JSInterop; using GPW.CORE.Smart; +using GPW.CORE.Data; using GPW.CORE.Smart.Shared; using GPW.CORE.Comp; +using GPW.CORE.Data.DTO; +using GPW.CORE.Data.Controllers; namespace GPW.CORE.Smart.Components { public partial class Calendario { + [Inject] + protected GPWController GPWContr { get; set; } = null!; + #region Protected Methods protected override async Task OnInitializedAsync() { dtCurr = DateTime.Today; await Task.Delay(1); + + listRecords = GPWContr.DailyDetails(56, DateTime.Now.AddDays(-3), DateTime.Now); + + timbratureOggi = listRecords.Where(x=> x.DtInizio == DateTime.Now.Date).FirstOrDefault(); + + oreCaricate = timbratureOggi.OreComm.ToString(); + oreLavorate = timbratureOggi.OreLav.ToString(); + DateCheck = new Dictionary(); Random rnd = new Random(); // random colorate... @@ -42,6 +56,12 @@ namespace GPW.CORE.Smart.Components } } + protected string oreCaricate = ""; + protected string oreLavorate = ""; + + protected List? listRecords = null; + protected DailyDataDTO? timbratureOggi = null; + #endregion Protected Methods #region Private Fields diff --git a/GPW.CORE.SMART/Data/CoreSmartDataService.cs b/GPW.CORE.SMART/Data/CoreSmartDataService.cs index da5bcb2..d04dc2b 100644 --- a/GPW.CORE.SMART/Data/CoreSmartDataService.cs +++ b/GPW.CORE.SMART/Data/CoreSmartDataService.cs @@ -1,11 +1,15 @@ -using GPW.CORE.Data.DTO; +using GPW.CORE.Data.DbModels; +using GPW.CORE.Data.DTO; using Microsoft.AspNetCore.Identity.UI.Services; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Memory; +using Microsoft.VisualBasic; using Newtonsoft.Json; using NLog; using StackExchange.Redis; using System.Diagnostics; +using System.Reflection.PortableExecutable; +using System.Text; namespace GPW.CORE.Smart.Data { @@ -62,6 +66,54 @@ namespace GPW.CORE.Smart.Data #region Public Methods + + public void Dispose() + { + // Clear database controller + dbController.Dispose(); + } + private readonly IDistributedCache distributedCache; + + + /// + /// Recupera l'elenco dei dettagli giornalieri attività di un dipendente, dato periodo riferimento + /// + /// Dipendente interessato + /// Data di riferimento (ultima/corrente) + /// NUm settimane precedenti da recuperare + /// + public async Task> DailyDetails(int idxDipendente, DateTime dtInizio, DateTime dtFine) + { + List? dbResult = new List(); + string currKey = $"{rKeyDailyData}:{idxDipendente}:{dtInizio.ToString("yyyy-MM-dd")}:{dtFine.ToString("yyyy-MM-dd")}"; + trackCache(currKey); + string rawData; + var redisDataList = await distributedCache.GetAsync(currKey); + if (redisDataList != null) + { + rawData = Encoding.UTF8.GetString(redisDataList); + dbResult = JsonConvert.DeserializeObject>(rawData); + } + else + { + Stopwatch stopWatch = new Stopwatch(); + stopWatch.Start(); + dbResult = dbController.DailyDetails(idxDipendente, dtInizio, dtFine); + rawData = JsonConvert.SerializeObject(dbResult, JSSettings); + redisDataList = Encoding.UTF8.GetBytes(rawData); + await distributedCache.SetAsync(currKey, redisDataList, cacheOpt(true)); + stopWatch.Stop(); + TimeSpan ts = stopWatch.Elapsed; + Log.Trace($"Effettuata lettura da DB + caching per DailyDetails: {ts.TotalMilliseconds} ms"); + } + if (dbResult == null) + { + dbResult = new List(); + } + return await Task.FromResult(dbResult); + } + +#if false /// /// Recupera l'elenco dei dettagli giornalieri attività di un dipendente, dato periodo riferimento /// @@ -104,79 +156,6 @@ namespace GPW.CORE.Smart.Data return dbResult; } - public void Dispose() - { - // Clear database controller - dbController.Dispose(); - } - - public async Task FlushRedisCache() - { - await Task.Delay(1); - RedisValue pattern = new RedisValue($"{redisBaseAddr}:*"); - bool answ = await ExecFlushRedisPattern(pattern); - return answ; - } - - public void rollBackEdit(object item) - { - dbController.rollBackEntity(item); - } - - #endregion Public Methods - - #region Protected Fields - - protected const string redisBaseAddr = "GPW:Smart"; - - protected const string rKeyAKV = $"{redisBaseAddr}:Cache:AKV"; - - protected const string rKeyAnOrDip = $"{redisBaseAddr}:Cache:AnOrariDip"; - - protected const string rKeyCalcOreFase = $"{redisBaseAddr}:Cache:CalcOreFase"; - - protected const string rKeyCalcOreProj = $"{redisBaseAddr}:Cache:CalcOreProj"; - - protected const string rKeyCalendari = $"{redisBaseAddr}:Cache:Calendari"; - - protected const string rKeyCliAll = $"{redisBaseAddr}:Cache:CliAll"; - - protected const string rKeyConfig = $"{redisBaseAddr}:Cache:Config"; - - protected const string rKeyDailyData = $"{redisBaseAddr}:Cache:DailyData"; - - protected const string rKeyDipendenti = $"{redisBaseAddr}:Cache:Dipendenti"; - - protected const string rKeyFasiAll = $"{redisBaseAddr}:Cache:FasiAll"; - - protected const string rKeyFasiByProj = $"{redisBaseAddr}:Cache:FasiByProj"; - - protected const string rKeyFasiSearch = $"{redisBaseAddr}:Cache:FasiSearch"; - - protected const string rKeyGiust = $"{redisBaseAddr}:Cache:Giustif"; - - protected const string rKeyGrpAll = $"{redisBaseAddr}:Cache:GrpAll"; - - protected const string rKeyGrpUser = $"{redisBaseAddr}:Cache:GrpUser"; - - protected const string rKeyParetoRegAtt = $"{redisBaseAddr}:Cache:ParetoRegAtt"; - - protected const string rKeyProjAll = $"{redisBaseAddr}:Cache:ProjAll"; - - protected const string rKeyRilTemp = $"{redisBaseAddr}:Cache:RilTemp"; - - protected const string rKeyVC19 = $"{redisBaseAddr}:Cache:VC19"; - - protected const string rKeyVetoIns = $"{redisBaseAddr}:Cache:VetoInsert"; - - protected const string rKeyWeekStats = $"{redisBaseAddr}:Cache:WeekStats"; - - protected static string connStringBBM = ""; - - #endregion Protected Fields - - #region Protected Methods - /// /// Invio email tramite libreria /// @@ -854,6 +833,7 @@ namespace GPW.CORE.Smart.Data return await Task.FromResult(keyResult); } + public async Task> DipendentiGetAll() { List? dbResult = new List(); @@ -883,6 +863,7 @@ namespace GPW.CORE.Smart.Data return await Task.FromResult(dbResult); } + /// /// invalida tutta la cache in caso di update /// @@ -1370,8 +1351,14 @@ namespace GPW.CORE.Smart.Data catch { } return answ; - } + } #endif + + public void rollBackEdit(object item) + { + dbController.rollBackEntity(item); + } + #if false /// /// Elenco timbrature di un giorno @@ -1419,7 +1406,133 @@ namespace GPW.CORE.Smart.Data catch { } return answ; - } + } #endif + + #endregion Public Methods + + #region Protected Fields + + protected const string rKeyAKV = "Cache:AKV"; + protected const string rKeyAnOrDip = "Cache:AnOrariDip"; + protected const string rKeyCalcOreFase = "Cache:CalcOreFase"; + protected const string rKeyCalcOreProj = "Cache:CalcOreProj"; + protected const string rKeyCalendari = "Cache:Calendari"; + protected const string rKeyCliAll = "Cache:CliAll"; + protected const string rKeyConfig = "Cache:Config"; + protected const string rKeyDailyData = "Cache:DailyData"; + protected const string rKeyDipendenti = "Cache:Dipendenti"; + protected const string rKeyFasiAll = "Cache:FasiAll"; + protected const string rKeyFasiByProj = "Cache:FasiByProj"; + protected const string rKeyFasiSearch = "Cache:FasiSearch"; + protected const string rKeyGiust = "Cache:Giustif"; + protected const string rKeyGrpAll = "Cache:GrpAll"; + protected const string rKeyGrpUser = "Cache:GrpUser"; + protected const string rKeyParetoRegAtt = "Cache:ParetoRegAtt"; + protected const string rKeyProjAll = "Cache:ProjAll"; + protected const string rKeyRilTemp = "Cache:RilTemp"; + protected const string rKeyVC19 = "Cache:VC19"; + protected const string rKeyVetoIns = "Cache:VetoInsert"; + protected const string rKeyWeekStats = "Cache:WeekStats"; + protected static string connStringBBM = ""; + + #endregion Protected Fields + + #region Protected Methods + + /// + /// Invio email tramite libreria + /// + /// + /// + /// + /// + protected async Task sendEmail(string destList, string subject, string message) + { + List emailDestList = destList.Split(",").ToList(); + foreach (var dest in emailDestList) + { + try + { + await _emailSender.SendEmailAsync(dest, subject, message); + } + catch (Exception exc) + { + Log.Error($"Eccezione durante invio email:{Environment.NewLine}dest: {dest} | subject {subject}{Environment.NewLine}{exc}"); + } + } + } + + /// + /// Registra in cache chiave se non fosse già in elenco + /// + /// + protected void trackCache(string newKey) + { + if (!cachedDataList.Contains(newKey)) + { + cachedDataList.Add(newKey); + } + } + + #endregion Protected Methods + + #region Private Fields + + private static IConfiguration _configuration = null!; + private static ILogger _logger = null!; + private static JsonSerializerSettings? JSSettings; + private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); + private readonly IEmailSender _emailSender; + + //private readonly IEmailSender _emailSender; + //private readonly UserManager _userManager; + + + /// + /// Oggetto per connessione a REDIS + /// + private IConnectionMultiplexer redisConn; + //private ConnectionMultiplexer redisConnMult = null!; + + //ISubscriber sub = redis.GetSubscriber(); + /// + /// Oggetto DB redis da impiegare x chiamate R/W + /// + private IDatabase redisDb = null!; + + private readonly IMemoryCache memoryCache; + private List cachedDataList = new List(); + + /// + /// 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 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)); + } + + private DistributedCacheEntryOptions cacheOpt(int multFact) + { + var numSecAbsExp = chAbsExp * multFact; + var numSecSliExp = chSliExp * multFact; + return new DistributedCacheEntryOptions().SetAbsoluteExpiration(DateTime.Now.AddSeconds(numSecAbsExp)).SetSlidingExpiration(TimeSpan.FromSeconds(numSecSliExp)); + } + + #endregion Private Methods } } \ No newline at end of file