diff --git a/MP.Data/Controllers/MpSpecController.cs b/MP.Data/Controllers/MpSpecController.cs index 1dac52bb..b8d88d7e 100644 --- a/MP.Data/Controllers/MpSpecController.cs +++ b/MP.Data/Controllers/MpSpecController.cs @@ -401,7 +401,44 @@ namespace MP.Data.Controllers .CountAsync(); return result; } + /// + /// Conteggio articoli data condizione ricerca + /// + /// + /// + /// + /// + public async Task ArticoliCountSearchAsync(string tipoArt = "*", string azienda = "*", string searchVal = "") + { + using var dbCtx = new MoonProContext(options); + IQueryable query = dbCtx.DbSetArticoli.AsNoTracking(); + // filtro tipo articolo + if (tipoArt != "*") + { + //query = query.Where(x => x.Tipo.ToLower() == tipoArt.ToLower()); + query = query.Where(x => EF.Functions.Like(x.Tipo, tipoArt)); + } + // filtro azienda + if (azienda != "*") + { + //query = query.Where(x => x.Azienda.ToLower() == azienda.ToLower()); + query = query.Where(x => EF.Functions.Like(x.Azienda, azienda)); + } + // filtro ricerca + if (!string.IsNullOrWhiteSpace(searchVal)) + { + string pattern = $"%{searchVal}%"; + query = query.Where(x => + EF.Functions.Like(x.CodArticolo, pattern) || + EF.Functions.Like(x.DescArticolo, pattern) || + EF.Functions.Like(x.Disegno, pattern)); + } + + return await query + .OrderBy(x => x.CodArticolo) + .CountAsync(); + } /// /// Elenco tabella Articoli IMPIEGATI (da stored stp_ART_getUsed) Async /// @@ -499,10 +536,6 @@ namespace MP.Data.Controllers // filtro ricerca if (!string.IsNullOrWhiteSpace(searchVal)) { - //query = query.Where(x => - // x.CodArticolo.Contains(searchVal) || - // x.DescArticolo.Contains(searchVal) || - // x.Disegno.Contains(searchVal)); string pattern = $"%{searchVal}%"; query = query.Where(x => EF.Functions.Like(x.CodArticolo, pattern) || @@ -651,16 +684,12 @@ namespace MP.Data.Controllers /// public async Task> ConfigGetAllAsync() { - List dbResult = new List(); - using (var dbCtx = new MoonProContext(options)) - { - dbResult = await dbCtx - .DbSetConfig - .AsNoTracking() - .OrderBy(x => x.Chiave) - .ToListAsync(); - } - return dbResult; + using var dbCtx = new MoonProContext(options); + return await dbCtx + .DbSetConfig + .AsNoTracking() + .OrderBy(x => x.Chiave) + .ToListAsync() ?? new(); } /// diff --git a/MP.SPEC/Components/ListDossiers.razor.cs b/MP.SPEC/Components/ListDossiers.razor.cs index 72530118..31d1b9b3 100644 --- a/MP.SPEC/Components/ListDossiers.razor.cs +++ b/MP.SPEC/Components/ListDossiers.razor.cs @@ -224,7 +224,7 @@ namespace MP.SPEC.Components protected override async Task OnInitializedAsync() { - await MDService.ConfigResetCache(); + await MDService.ConfigResetCacheAsync(); ListGruppiFase = await MDService.ElencoGruppiFaseAsync(); ListStati = await MDService.AnagStatiCommAsync(); selAzienda = await MDService.ConfigTryGetAsync("AZIENDA"); diff --git a/MP.SPEC/Components/ParamsFilter.razor.cs b/MP.SPEC/Components/ParamsFilter.razor.cs index ad7246bb..8b3c784d 100644 --- a/MP.SPEC/Components/ParamsFilter.razor.cs +++ b/MP.SPEC/Components/ParamsFilter.razor.cs @@ -171,7 +171,7 @@ namespace MP.SPEC.Components protected override async Task OnInitializedAsync() { SelFilter = new SelectFluxParams(); - await MDService.ConfigResetCache(); + await MDService.ConfigResetCacheAsync(); var result = await MDService.ConfigTryGetAsync("SPEC_ParamTempoAgg"); if (result != null) { diff --git a/MP.SPEC/Data/MpDataService.cs b/MP.SPEC/Data/MpDataService.cs index c378c733..4becd8d6 100644 --- a/MP.SPEC/Data/MpDataService.cs +++ b/MP.SPEC/Data/MpDataService.cs @@ -90,6 +90,15 @@ namespace MP.SPEC.Data public MessagePipe BroadastMsgPipe { get; set; } = null!; public Dictionary> currTagConf { get; set; } = new Dictionary>(); + /// + /// Expiry DateTime x refresh pagina parametri + /// + public DateTime DtParamExpiry + { + get => _dtParamExpiry; + set => _dtParamExpiry = value; + } + #endregion Public Properties #region Public Methods @@ -252,6 +261,33 @@ namespace MP.SPEC.Data ); } + public async Task ArticoliCountAsync() + { + string redisKey = $"{Utils.redisArtList}:Count"; + return await GetOrFetchAsync( + operationName: "ArticoliCountAsync", + cacheKey: redisKey, + expiration: getRandTOut(redisLongTimeCache), + fetchFunc: async () => + await dbController.ArticoliCountAsync(), + tagList: [Utils.redisArtList, $"{Utils.redisArtList}:CountAll"] + ); + } + + public async Task ArticoliCountSearchAsync(string tipo = "*", string azienda = "*", string searchVal = "") + { + string sKey = string.IsNullOrWhiteSpace(tipo) ? "ALL" : tipo.Trim(); + string redisKey = $"{Utils.redisArtList}:{azienda}:{sKey}:{searchVal}:Count"; + return await GetOrFetchAsync( + operationName: "ArticoliCountSearchAsync", + cacheKey: redisKey, + expiration: getRandTOut(redisLongTimeCache), + fetchFunc: async () => + await dbController.ArticoliCountSearchAsync(tipo, azienda, searchVal), + tagList: [Utils.redisArtList, $"{Utils.redisArtList}:CountSearch"] + ); + } + /// /// Eliminazione record selezionato /// @@ -278,7 +314,7 @@ namespace MP.SPEC.Data public async Task> ArticoliGetByTipoAsync(string tipo, string azienda = "*") { string sKey = string.IsNullOrWhiteSpace(tipo) ? "ALL" : tipo.Trim(); - string redisKey = $"{Utils.redisArtList}:{azienda}:Tipo:{sKey}"; + string redisKey = $"{Utils.redisArtList}:{azienda}:{sKey}"; return await GetOrFetchAsync( operationName: "ArticoliGetByTipoAsync", cacheKey: redisKey, @@ -289,23 +325,6 @@ namespace MP.SPEC.Data ); } - /// - /// Elenco articoli contenuti in Kit (come child), non eliminabli - /// - /// - public async Task> ArticoliInKitAsync() - { - string redisKey = $"{Utils.redisArtList}:InKit"; - return await GetOrFetchAsync( - operationName: "ArticoliInKitAsync", - cacheKey: redisKey, - expiration: getRandTOut(redisLongTimeCache), - fetchFunc: async () => - await dbController.ArticoliInKitAsync() ?? new List(), - tagList: [Utils.redisArtList, $"{Utils.redisArtList}:InKit"] - ); - } - /// /// Restitusice elenco articoli cercati /// @@ -328,6 +347,23 @@ namespace MP.SPEC.Data ); } + /// + /// Elenco articoli contenuti in Kit (come child), non eliminabli + /// + /// + public async Task> ArticoliInKitAsync() + { + string redisKey = $"{Utils.redisArtList}:InKit"; + return await GetOrFetchAsync( + operationName: "ArticoliInKitAsync", + cacheKey: redisKey, + expiration: getRandTOut(redisLongTimeCache), + fetchFunc: async () => + await dbController.ArticoliInKitAsync() ?? new List(), + tagList: [Utils.redisArtList, $"{Utils.redisArtList}:InKit"] + ); + } + /// /// Aggiornamento record selezionato /// @@ -458,14 +494,14 @@ namespace MP.SPEC.Data /// Reset dati cache config /// /// - public async Task ConfigResetCache() + public async Task ConfigResetCacheAsync() { - using var activity = ActivitySource.StartActivity("ConfigResetCache"); + using var activity = ActivitySource.StartActivity("ConfigResetCacheAsync"); string source = "REDIS"; await ResetConfigCache(); activity?.SetTag("data.source", source); activity?.Stop(); - LogTrace($"ConfigResetCache Read from {source}: {activity?.Duration.TotalMilliseconds}ms"); + LogTrace($"ConfigResetCacheAsync Read from {source}: {activity?.Duration.TotalMilliseconds}ms"); } /// @@ -696,7 +732,6 @@ namespace MP.SPEC.Data ); } - /// /// Elenco link validi per il menu /// @@ -901,47 +936,6 @@ namespace MP.SPEC.Data return answ; } - /// - /// Imposta in redis la scadenza della pagina x il reload - /// - /// - /// - public DateTime ExpiryReloadParamGet() - { - using var activity = ActivitySource.StartActivity("ExpiryReloadParamGet"); - string source = "REDIS"; - DateTime dtRif = DateTime.Now; - string currKey = $"{Utils.redisParamPageExp}"; - RedisValue rawData = redisDb.StringGet(currKey); - if (rawData.HasValue) - { - dtRif = JsonConvert.DeserializeObject($"{rawData}"); - } - activity?.SetTag("data.source", source); - activity?.Stop(); - LogTrace($"ExpiryReloadParamGet | Read from {source}: {activity?.Duration.TotalMilliseconds}ms"); - return dtRif; - } - - /// - /// Imposta in redis la scadenza della pagina x il reload - /// - /// - /// - public bool ExpiryReloadParamSet(DateTime expTime) - { - using var activity = ActivitySource.StartActivity("ExpiryReloadParamSet"); - string source = "REDIS"; - bool fatto = false; - string currKey = $"{Utils.redisParamPageExp}"; - string rawData = JsonConvert.SerializeObject(expTime); - fatto = redisDb.StringSet(currKey, rawData); - activity?.SetTag("data.source", source); - activity?.Stop(); - LogTrace($"ExpiryReloadParamSet | Read from {source}: {activity?.Duration.TotalMilliseconds}ms"); - return fatto; - } - /// /// Cancellazione FusionCache (totale) /// @@ -1449,24 +1443,6 @@ namespace MP.SPEC.Data ); } - /// - /// Elenco operatori filtrati x gruppo - /// - /// - /// - public async Task> OperatoriGetFiltAsync(string codGruppo) - { - string keyGrp = codGruppo != "*" ? codGruppo : "ALL"; - string currKey = $"{Utils.redisOprList}:{keyGrp}"; - - return await GetOrFetchAsync( - operationName: "OperatoriGetFiltAsync", - cacheKey: currKey, - expiration: getRandTOut(redisLongTimeCache), - fetchFunc: async () => await dbController.OperatoriGetFiltAsync(codGruppo) ?? new List(), - tagList: [Utils.redisOprList] - ); - } /// /// Elenco id Macchine che abbiano dati FLuxLog, nel periodo indicato /// @@ -1534,33 +1510,6 @@ namespace MP.SPEC.Data }, tagList: [Utils.redisIobConf] ); -#if false - using var activity = ActivitySource.StartActivity("MachIobConfAsync"); - string source = "DB"; - Dictionary result = new Dictionary(); - // cerco in redis... - string currKey = redHashMpIO($"IOB:{IdxMacchina}:MachIobConfAsync"); - try - { - result = (await redisDb.HashGetAllAsync(currKey)) - .ToDictionary(x => $"{x.Name}", x => $"{x.Value}"); - source = "REDIS"; - } - catch (Exception exc) - { - Log.Error($"Errore in MachIobConfAsync{Environment.NewLine}{exc}"); - } - if (result == null) - { - result = new Dictionary(); - LogTrace($"Init valore default MachIobConfAsync | IdxMacchina: {IdxMacchina}"); - } - activity?.SetTag("data.source", source); - activity?.SetTag("result.count", result.Count); - activity?.Stop(); - LogTrace($"MachIobConfAsync per {IdxMacchina} | {source} | {activity?.Duration.TotalMilliseconds}ms"); - return result; -#endif } /// @@ -1728,7 +1677,6 @@ namespace MP.SPEC.Data /// public async Task> OdlListGetFiltAsync(bool inCorso, string codArt, string keyRichPart, string Reparto, string IdxMacchina, DateTime startDate, DateTime endDate) { - string currKey = $"{Utils.redisOdlList}:{inCorso}:{codArt}:{keyRichPart}:{Reparto}:{IdxMacchina}:{startDate:yyyyMMdd_HHmmss}:{endDate:yyyyMMdd_HHmmss}"; return await GetOrFetchAsync( operationName: "OdlListGetFiltAsync", @@ -1737,36 +1685,25 @@ namespace MP.SPEC.Data fetchFunc: async () => await dbController.ListODLFiltAsync(inCorso, codArt, keyRichPart, Reparto, IdxMacchina, startDate, endDate) ?? new(), tagList: [Utils.redisOdlList] ); + } -#if false - using var activity = ActivitySource.StartActivity("OdlListGetFiltAsync"); - List? result = new List(); - string source = "DB"; - string currKey = $"{Utils.redisOdlList}:{inCorso}:{codArt}:{keyRichPart}:{Reparto}:{IdxMacchina}:{startDate:yyyyMMdd_HHmmss}:{endDate:yyyyMMdd_HHmmss}"; - // cerco in redis dato valore sel idxMaccSel... - RedisValue rawData = redisDb.StringGet(currKey); - if (rawData.HasValue) - { - result = JsonConvert.DeserializeObject>($"{rawData}"); - source = "REDIS"; - } - else - { - result = await dbController.ListODLFiltAsync(inCorso, codArt, keyRichPart, Reparto, IdxMacchina, startDate, endDate); - // serializzo e salvo... - rawData = JsonConvert.SerializeObject(result); - redisDb.StringSet(currKey, rawData, TimeSpan.FromSeconds(redisShortTimeCache)); - } - if (result == null) - { - result = new List(); - } - activity?.SetTag("data.source", source); - activity?.SetTag("result.count", result.Count); - activity?.Stop(); - LogTrace($"OdlListGetFiltAsync | Read from {source}: {activity?.Duration.TotalMilliseconds}ms"); - return result; -#endif + /// + /// Elenco operatori filtrati x gruppo + /// + /// + /// + public async Task> OperatoriGetFiltAsync(string codGruppo) + { + string keyGrp = codGruppo != "*" ? codGruppo : "ALL"; + string currKey = $"{Utils.redisOprList}:{keyGrp}"; + + return await GetOrFetchAsync( + operationName: "OperatoriGetFiltAsync", + cacheKey: currKey, + expiration: getRandTOut(redisLongTimeCache), + fetchFunc: async () => await dbController.OperatoriGetFiltAsync(codGruppo) ?? new List(), + tagList: [Utils.redisOprList] + ); } /// @@ -1786,6 +1723,75 @@ namespace MP.SPEC.Data ); } + /// + /// Restituisce dizionario ODL/PODL data lista IdxOdl + /// + /// + /// + public async Task> PODL_getDictOdlPodlAsync(List idxOdlList) + { + if (idxOdlList == null || !idxOdlList.Any()) + return new Dictionary(); + + var distinctIds = idxOdlList.Distinct().ToList(); + + var resultDictionary = new Dictionary(); + var missingIds = new List(); + + // STEP 1: Controllo rapido in FusionCache (L1/Memory cache) + foreach (var id in distinctIds) + { + var cacheKey = $"val:{id}"; + var cachedValue = await _cache.TryGetAsync(cacheKey); + + if (cachedValue.HasValue) + { + resultDictionary[id] = cachedValue.Value; + } + else + { + // ID non presente in cache, andrà cercato tramite il servizio EF + missingIds.Add(id); + } + } + + // STEP 2: Se ci sono cache miss, interroghiamo il servizio EF Core + if (missingIds.Any()) + { + // Riceviamo direttamente un Dictionary ottimizzato da EF Core + Dictionary dbResults = await dbController.PODL_getDictOdlPodlAsync(missingIds); + + // STEP 3: Scriviamo i risultati in cache e li uniamo al dizionario finale + foreach (var kvp in dbResults) + { + var id = kvp.Key; + var targetValue = kvp.Value; + + resultDictionary[id] = targetValue; + + // Salvataggio atomico e globale su FusionCache + var cacheKey = $"val:{id}"; + await _cache.SetAsync(cacheKey, targetValue, TimeSpan.FromMinutes(30)); + } + + // STEP 4 [Altamente Consigliato]: Cache Penetration Protection + // Se un ID era tra i "missing" ma NON è presente nei risultati del DB, significa che non esiste. + // Salviamo un valore sentinella (es. 0 o -1) per evitare di ricontrollare il DB al prossimo giro. + foreach (var id in missingIds) + { + if (!dbResults.ContainsKey(id)) + { + resultDictionary[id] = 0; // Imposta un default per l'output corrente + + var cacheKey = $"val:{id}"; + await _cache.SetAsync(cacheKey, 0, TimeSpan.FromMinutes(2)); // Scadenza breve per i record inesistenti + } + } + } + + return resultDictionary; + } + /// /// Eliminazione record selezionato /// @@ -1886,75 +1892,6 @@ namespace MP.SPEC.Data ); } - /// - /// Restituisce dizionario ODL/PODL data lista IdxOdl - /// - /// - /// - public async Task> PODL_getDictOdlPodlAsync(List idxOdlList) - { - if (idxOdlList == null || !idxOdlList.Any()) - return new Dictionary(); - - var distinctIds = idxOdlList.Distinct().ToList(); - - var resultDictionary = new Dictionary(); - var missingIds = new List(); - - // STEP 1: Controllo rapido in FusionCache (L1/Memory cache) - foreach (var id in distinctIds) - { - var cacheKey = $"val:{id}"; - var cachedValue = await _cache.TryGetAsync(cacheKey); - - if (cachedValue.HasValue) - { - resultDictionary[id] = cachedValue.Value; - } - else - { - // ID non presente in cache, andrà cercato tramite il servizio EF - missingIds.Add(id); - } - } - - // STEP 2: Se ci sono cache miss, interroghiamo il servizio EF Core - if (missingIds.Any()) - { - // Riceviamo direttamente un Dictionary ottimizzato da EF Core - Dictionary dbResults = await dbController.PODL_getDictOdlPodlAsync(missingIds); - - // STEP 3: Scriviamo i risultati in cache e li uniamo al dizionario finale - foreach (var kvp in dbResults) - { - var id = kvp.Key; - var targetValue = kvp.Value; - - resultDictionary[id] = targetValue; - - // Salvataggio atomico e globale su FusionCache - var cacheKey = $"val:{id}"; - await _cache.SetAsync(cacheKey, targetValue, TimeSpan.FromMinutes(30)); - } - - // STEP 4 [Altamente Consigliato]: Cache Penetration Protection - // Se un ID era tra i "missing" ma NON è presente nei risultati del DB, significa che non esiste. - // Salviamo un valore sentinella (es. 0 o -1) per evitare di ricontrollare il DB al prossimo giro. - foreach (var id in missingIds) - { - if (!dbResults.ContainsKey(id)) - { - resultDictionary[id] = 0; // Imposta un default per l'output corrente - - var cacheKey = $"val:{id}"; - await _cache.SetAsync(cacheKey, 0, TimeSpan.FromMinutes(2)); // Scadenza breve per i record inesistenti - } - } - } - - return resultDictionary; - } - /// /// Effettua il task di eliminazione PODL KIT + istanze + riattivazione PODL originali disattivate tramite stored /// @@ -2281,35 +2218,6 @@ namespace MP.SPEC.Data fetchFunc: async () => await dbController.StatoMacchinaAsync(idxMacchina) ?? new(), tagList: [Utils.redisStatoMacch] ); -#if false - using var activity = ActivitySource.StartActivity("StatoMacchinaAsync"); - // setup parametri costanti - string source = "DB"; - StatoMacchineModel? result = new StatoMacchineModel(); - // cerco in redisConn... - string currKey = $"{Utils.redisStatoMacch}:{idxMacchina}"; - RedisValue rawData = await redisDb.StringGetAsync(currKey); - if (rawData.HasValue) - { - result = JsonConvert.DeserializeObject($"{rawData}"); - source = "REDIS"; - } - else - { - result = dbController.StatoMacchina(idxMacchina); - // serializzo e salvo... - rawData = JsonConvert.SerializeObject(result); - await redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromSeconds(1)); - } - if (result == null) - { - result = new StatoMacchineModel(); - } - activity?.SetTag("data.source", source); - activity?.Stop(); - LogTrace($"StatoMacchinaAsync | {source} | {activity?.Duration.TotalMilliseconds}ms"); - return result; -#endif } /// @@ -2385,7 +2293,7 @@ namespace MP.SPEC.Data if (ForceDb) { - // Se ForceDb è true, saltiamo il GetOrFetchAsync per forzare il fetch dal DB + // Se ForceDb è true, saltiamo il GetOrFetchAsync per forzare il fetch dal DB // e aggiornare la cache. var result = await dbController.TksScoreAsync(KeyFilt, MaxResult) ?? new List(); await _cache.SetAsync(currKey, result, TimeSpan.FromMinutes(redisLongTimeCache), tags: [Utils.redisKitScore]); @@ -2620,14 +2528,16 @@ namespace MP.SPEC.Data private static readonly ActivitySource ActivitySource = new ActivitySource("MP.DATA.Tracer"); private static IConfiguration _configuration = null!; - private static Logger Log = LogManager.GetCurrentClassLogger(); - private readonly IFusionCache _cache; - private DateTime _artCacheExpiry = DateTime.MinValue; - private Dictionary _configData = new(); + private DateTime _dtParamExpiry = DateTime.Now; + + /// + /// Elenco CodArticolo usati in istanza KIT (per verifica eliminabilità) + /// + private HashSet _listCodArtInKit = new(); /// /// Elenco CodArticolo NON usati (per verifica eliminabilità) @@ -2639,11 +2549,6 @@ namespace MP.SPEC.Data /// private HashSet _listCodArtUsed = new(); - /// - /// Elenco CodArticolo usati in istanza KIT (per verifica eliminabilità) - /// - private HashSet _listCodArtInKit = new(); - private string canCacheParametri = ""; private string MpIoNS = ""; @@ -2680,6 +2585,11 @@ namespace MP.SPEC.Data /// private int redisShortTimeCache = 5; + /// + /// Soglia minima (ms) per log timing in console + /// + private double slowLogThresh = 0; + private bool traceEnabled = false; #endregion Private Fields @@ -2722,11 +2632,6 @@ namespace MP.SPEC.Data } } - /// - /// Soglia minima (ms) per log timing in console - /// - private double slowLogThresh = 0; - /// /// Implementa gestione recupero cache da memoria o da obj esterno + cache memoria + tracking attività /// diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index 658f6ef1..c680ce10 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 8.16.2605.2819 + 8.16.2605.2907 1800a78a-6ff1-40f9-b490-87fb8bfc1394 en diff --git a/MP.SPEC/Pages/Articoli.razor b/MP.SPEC/Pages/Articoli.razor index b6acc65c..f50e61eb 100644 --- a/MP.SPEC/Pages/Articoli.razor +++ b/MP.SPEC/Pages/Articoli.razor @@ -19,8 +19,8 @@ -
-
+
+
- + + + - @if (ListAziende != null) { foreach (var item in ListAziende) @@ -45,8 +47,7 @@ } } - - + #: @availRecord
diff --git a/MP.SPEC/Pages/Articoli.razor.cs b/MP.SPEC/Pages/Articoli.razor.cs index 771bff51..47ac03bc 100644 --- a/MP.SPEC/Pages/Articoli.razor.cs +++ b/MP.SPEC/Pages/Articoli.razor.cs @@ -190,7 +190,9 @@ namespace MP.SPEC.Pages private List? ListAziende; private List? ListRecords; private List? ListTipoArt; - private int maxNumRecord = 5000; + private int maxNumRecord = 1000; + private int availRecord = 1000; + private int totRecord = 0; private List? SearchRecords; #endregion Private Fields @@ -256,7 +258,7 @@ namespace MP.SPEC.Pages Valore = selAzienda }; await MDService.ConfigUpdateAsync(updRec); - await MDService.ConfigResetCache(); + await MDService.ConfigResetCacheAsync(); // ricarico await ResetDataAsync(); } @@ -302,6 +304,7 @@ namespace MP.SPEC.Pages { isLoading = true; SearchRecords = await MDService.ArticoliGetSearchAsync(maxNumRecord, selTipoArt, selAzienda, SearchVal); + availRecord = await MDService.ArticoliCountSearchAsync(selTipoArt, selAzienda, searchVal); totalCount = SearchRecords.Count; UpdateTable(); } diff --git a/MP.SPEC/Pages/Giacenze.razor.cs b/MP.SPEC/Pages/Giacenze.razor.cs index 8f0907d9..479af5cd 100644 --- a/MP.SPEC/Pages/Giacenze.razor.cs +++ b/MP.SPEC/Pages/Giacenze.razor.cs @@ -26,7 +26,7 @@ namespace MP.SPEC.Pages protected override async Task OnInitializedAsync() { - await MDService.ConfigResetCache(); + await MDService.ConfigResetCacheAsync(); giacenzeConf = await MDService.ConfigTryGetAsync("SPEC_ShowGiacenze"); await Task.Delay(1); padCodXdl = await MDService.ConfigTryGetAsync("PadCodXdl"); diff --git a/MP.SPEC/Pages/PARAMS.razor.cs b/MP.SPEC/Pages/PARAMS.razor.cs index fd1a75e4..73204309 100644 --- a/MP.SPEC/Pages/PARAMS.razor.cs +++ b/MP.SPEC/Pages/PARAMS.razor.cs @@ -1,9 +1,8 @@ -using Microsoft.AspNetCore.Components; +using EgwCoreLib.Razor; +using Microsoft.AspNetCore.Components; using MP.Data.DbModels; -using MP.SPEC.Components; using MP.SPEC.Data; using NLog; -using EgwCoreLib.Razor; namespace MP.SPEC.Pages { @@ -23,7 +22,7 @@ namespace MP.SPEC.Pages public void ElapsedTimer(object? source, System.Timers.ElapsedEventArgs e) { // controllo se sia scaduto tempo massimo (in redis) x ricaricare pagina in modo completo... - var dtRif = MDService.ExpiryReloadParamGet(); + var dtRif = MDService.DtParamExpiry; if (dtRif > DateTime.Now) { Log.Trace("----- Elapsed check PARAMS.cs -----"); @@ -32,7 +31,7 @@ namespace MP.SPEC.Pages { var pUpd = Task.Run(async () => { - MDService.ExpiryReloadParamSet(DateTime.Now.AddSeconds(intForceReload)); + MDService.DtParamExpiry = DateTime.Now.AddSeconds(intForceReload); aTimer.Elapsed -= ElapsedTimer; aTimer.Stop(); aTimer.Close(); @@ -91,7 +90,6 @@ namespace MP.SPEC.Pages { updFilter.lastUpdate = updFilter.lastUpdate == "-" ? $"{adesso:yyyy/MM/dd HH:mm:ss}" : updFilter.lastUpdate; updFilter.IdxMacchina = newRec.IdxMacchina; - //updFilter.CodFlux = newRec.CodFlux; } else { @@ -124,7 +122,6 @@ namespace MP.SPEC.Pages currPage = newNum; DateTime adesso = DateTime.Now.AddSeconds(1); var updFilter = currFilter; - //updFilter.LiveUpdate = (currPage == 1); updFilter.LiveUpdate = (currFilter.CurrPage == 1); updFilter.lastUpdate = updFilter.LiveUpdate ? "-" : $"{adesso:yyyy/MM/dd HH:mm:ss}"; // salvo filtro @@ -211,10 +208,10 @@ namespace MP.SPEC.Pages private void setExpiryReload() { // verifico se ho una scadenza expiry del periodo desiderato, sennò imposto nuova... - var dtRif = MDService.ExpiryReloadParamGet(); + var dtRif = MDService.DtParamExpiry; if (dtRif <= DateTime.Now) { - MDService.ExpiryReloadParamSet(DateTime.Now.AddSeconds(intForceReload)); + MDService.DtParamExpiry = DateTime.Now.AddSeconds(intForceReload); } } @@ -222,18 +219,11 @@ namespace MP.SPEC.Pages { isFiltering = false; isLoading = true; - await Task.Delay(1); currPage = 1; if (newParams.CurrPage == 0) { newParams.CurrPage = 1; - //newParams.LiveUpdate = false; } - else - { - //newParams.LiveUpdate = (currPage == 1); - } - await Task.Delay(1); await InvokeAsync(() => StateHasChanged()); currFilter = newParams; isLoading = false; diff --git a/MP.SPEC/Resources/ChangeLog.html b/MP.SPEC/Resources/ChangeLog.html index f187aa8a..df4ddb74 100644 --- a/MP.SPEC/Resources/ChangeLog.html +++ b/MP.SPEC/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo MAPOSPEC -

Versione: 8.16.2605.2819

+

Versione: 8.16.2605.2907


Note di rilascio:
  • diff --git a/MP.SPEC/Resources/VersNum.txt b/MP.SPEC/Resources/VersNum.txt index aa4264a2..9badb5e0 100644 --- a/MP.SPEC/Resources/VersNum.txt +++ b/MP.SPEC/Resources/VersNum.txt @@ -1 +1 @@ -8.16.2605.2819 +8.16.2605.2907 diff --git a/MP.SPEC/Resources/manifest.xml b/MP.SPEC/Resources/manifest.xml index 24db78b5..c4e2bf54 100644 --- a/MP.SPEC/Resources/manifest.xml +++ b/MP.SPEC/Resources/manifest.xml @@ -1,6 +1,6 @@ - 8.16.2605.2819 + 8.16.2605.2907 https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html false