diff --git a/MP.Stats/Components/TaskExeList.razor b/MP.Stats/Components/TaskExeList.razor index ae7c9327..b21f8d94 100644 --- a/MP.Stats/Components/TaskExeList.razor +++ b/MP.Stats/Components/TaskExeList.razor @@ -1,5 +1,71 @@ -

TaskExeList

- -@code { - -} + +
+
+
+
+ History +
+
+
+ +
+
+
+
+
+ @if (ListRecords == null) + { + + } + else if (totalCount == 0) + { +
Nessun record trovato
+ } + else + { +
+
+ + + + + + + + + + + @foreach (var record in ListRecords) + { + + + + + + + } + +
#InizioFineEsito
+ @record.TaskExecId + + @($"{record.DtStart:HH:mm:ss}") +
@($"{record.DtStart:yyyy-MM.dd ddd}")
+
+ @($"{record.DtEnd:HH:mm:ss}") +
@($"{record.DtEnd:yyyy-MM.dd ddd}")
+
+
@record.IsError
+
@record.Result
+
+
+
+ } +
+ +
\ No newline at end of file diff --git a/MP.Stats/Components/TaskExeList.razor.cs b/MP.Stats/Components/TaskExeList.razor.cs new file mode 100644 index 00000000..a03381fa --- /dev/null +++ b/MP.Stats/Components/TaskExeList.razor.cs @@ -0,0 +1,89 @@ +using Microsoft.AspNetCore.Components; +using MP.Data.DatabaseModels; +using MP.Stats.Data; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace MP.Stats.Components +{ + public partial class TaskExeList + { + #region Public Properties + + [Parameter] + public TaskListModel? CurrRecord { get; set; } = null; + + #endregion Public Properties + + #region Protected Fields + + protected bool isLoading = false; + + #endregion Protected Fields + + #region Protected Properties + + [Inject] + protected NavigationManager NavManager { get; set; } + + /// + /// Show error mode: 0 = tutti 1 = solo errori 2 = solo ok + /// + protected int ShowErrorMode { get; set; } = 0; + + [Inject] + protected MpStatsService StatService { get; set; } + + protected int totalCount { get; set; } = 0; + + #endregion Protected Properties + + #region Protected Methods + + protected async Task ForceReload(int newNum) + { + numRecord = newNum; + await ReloadData(); + } + + protected async Task ForceReloadPage(int newNum) + { + currPage = newNum; + await ReloadData(); + } + + protected override async Task OnInitializedAsync() + { + await ReloadData(); + } + + #endregion Protected Methods + + #region Private Fields + + private List ListRecords; + private List SearchRecords; + + #endregion Private Fields + + #region Private Properties + + private int currPage { get; set; } = 1; + + private int numRecord { get; set; } = 10; + + #endregion Private Properties + + #region Private Methods + + private async Task ReloadData() + { + SearchRecords = await StatService.TaskExecGetFilt(CurrRecord.TaskId, 1000, ""); + totalCount = SearchRecords.Count; + ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList(); + } + + #endregion Private Methods + } +} \ No newline at end of file diff --git a/MP.Stats/Data/MpStatsService.cs b/MP.Stats/Data/MpStatsService.cs index 674ad6f4..82ec3dc5 100644 --- a/MP.Stats/Data/MpStatsService.cs +++ b/MP.Stats/Data/MpStatsService.cs @@ -17,39 +17,6 @@ namespace MP.Stats.Data { public class MpStatsService : IDisposable { - #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; - - /// - /// 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à della cache (chAbsExp) - /// - 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; @@ -82,42 +49,6 @@ namespace MP.Stats.Data #endregion Public Constructors - #region Private Properties - - private DistributedCacheEntryOptions cacheOpt - { - get - { - return new DistributedCacheEntryOptions().SetAbsoluteExpiration(DateTime.Now.AddMinutes(chAbsExp)).SetSlidingExpiration(TimeSpan.FromMinutes(chSliExp)); - } - } - - private DistributedCacheEntryOptions cacheOptLong - { - get - { - return new DistributedCacheEntryOptions().SetAbsoluteExpiration(DateTime.Now.AddMinutes(chAbsExp * 10)).SetSlidingExpiration(TimeSpan.FromMinutes(chSliExp)); - } - } - - #endregion Private Properties - - #region Protected Methods - - protected string getCacheKey(string TableName, SelectData CurrFilter) - { - string answ = $"{TableName}:M_{CurrFilter.IdxMacchina}:AZ_{CurrFilter.Azione}:ART_{CurrFilter.CodArticolo}:KR_{CurrFilter.KeyRichiesta}:O_{CurrFilter.IdxOdl}:D_{CurrFilter.DateStart:yyyyMMddHHmm}_{CurrFilter.DateEnd:yyyyMMddHHmm}"; - return answ; - } - - protected string getCacheKeyPaged(string TableName, SelectData CurrFilter) - { - string answ = $"{TableName}:M_{CurrFilter.IdxMacchina}:A_{CurrFilter.CodArticolo}:K_{CurrFilter.KeyRichiesta}:O_{CurrFilter.IdxOdl}:D_{CurrFilter.DateStart:yyMMddHHmm}_{CurrFilter.DateEnd:yyMMddHHmm}:R_{CurrFilter.FirstRecord}_{CurrFilter.FirstRecord + CurrFilter.NumRecord}"; - return answ; - } - - #endregion Protected Methods - #region Public Methods public async Task> ActionsGetAll() @@ -315,6 +246,7 @@ namespace MP.Stats.Data } return await Task.FromResult(numRec); } + /// /// Statistiche ODL /// @@ -379,62 +311,6 @@ namespace MP.Stats.Data return await Task.FromResult(dbResult); } - - /// - /// Elenco TaskList gestiti - /// - /// - /// - /// - public async Task> TaskListAll(Task2ExeType TType, string searchVal = "") - { - List dbResult = new List(); - string cacheKey = $"MP:STATS:TaskList:{TType}"; - 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.TaskListGetAll(TType); - rawData = JsonConvert.SerializeObject(dbResult); - redisDataList = Encoding.UTF8.GetBytes(rawData); - await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt); - stopWatch.Stop(); - TimeSpan ts = stopWatch.Elapsed; - _logger.LogTrace($"Effettuata lettura da DB + caching per TaskList: {ts.TotalMilliseconds} ms"); - } - // se necessario filtro.. - if (!string.IsNullOrEmpty(searchVal)) - { - dbResult = dbResult - .Where(x => x.Name.Contains(searchVal, StringComparison.InvariantCultureIgnoreCase) - || x.Descript.Contains(searchVal, StringComparison.InvariantCultureIgnoreCase)) - .ToList(); - } - return await Task.FromResult(dbResult); - } - /// - /// Update/Insert record TaskList - /// - /// - /// - public async Task TaskListUpsert(TaskListModel rec2upd) - { - bool dbResult = dbController.TaskListUpsert(rec2upd); - // svuoto cache! - string cacheKey = $"MP:STATS:TaskList:{rec2upd.TType}"; - await distributedCache.RemoveAsync(cacheKey); - cacheKey = $"MP:STATS:TaskList:ND"; - await distributedCache.RemoveAsync(cacheKey); - return await Task.FromResult(dbResult); - } - public async Task> StatScartiGetAll(SelectData CurrFilter, string searchVal = "") { //return Task.FromResult(dbController.StatScartiGetAll(DataStart, DataEnd, IdxMacchina, IdxODL, KeyRichiesta, CodArticolo).ToArray()); @@ -525,6 +401,169 @@ namespace MP.Stats.Data return await Task.FromResult(dbResult); } + /// + /// Ricerca task dato tipo + num max (desc) + /// + /// TaskId da cui deriva + /// + public async Task> TaskExecGetFilt(int TaskId, int maxRec, string searchVal) + { + List dbResult = new List(); + DateTime adesso = DateTime.Now; + string cacheKey = $"MP:STATS:TaskExecList:{TaskId}:{adesso:yyMMdd}:{adesso:HHmm}:{maxRec}"; + 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.TaskExecGetFilt(TaskId, maxRec); + rawData = JsonConvert.SerializeObject(dbResult); + redisDataList = Encoding.UTF8.GetBytes(rawData); + await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt); + stopWatch.Stop(); + TimeSpan ts = stopWatch.Elapsed; + _logger.LogTrace($"Effettuata lettura da DB + caching per TaskExecGetFilt: {ts.TotalMilliseconds} ms"); + } + // se necessario filtro.. + if (!string.IsNullOrEmpty(searchVal)) + { + dbResult = dbResult + .Where(x => x.Result.Contains(searchVal, StringComparison.InvariantCultureIgnoreCase)) + .ToList(); + } + return await Task.FromResult(dbResult); + } + + /// + /// Elenco TaskList gestiti + /// + /// + /// + /// + public async Task> TaskListAll(Task2ExeType TType, string searchVal = "") + { + List dbResult = new List(); + string cacheKey = $"MP:STATS:TaskList:{TType}"; + 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.TaskListGetAll(TType); + rawData = JsonConvert.SerializeObject(dbResult); + redisDataList = Encoding.UTF8.GetBytes(rawData); + await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt); + stopWatch.Stop(); + TimeSpan ts = stopWatch.Elapsed; + _logger.LogTrace($"Effettuata lettura da DB + caching per TaskList: {ts.TotalMilliseconds} ms"); + } + // se necessario filtro.. + if (!string.IsNullOrEmpty(searchVal)) + { + dbResult = dbResult + .Where(x => x.Name.Contains(searchVal, StringComparison.InvariantCultureIgnoreCase) + || x.Descript.Contains(searchVal, StringComparison.InvariantCultureIgnoreCase)) + .ToList(); + } + return await Task.FromResult(dbResult); + } + + /// + /// Update/Insert record TaskList + /// + /// + /// + public async Task TaskListUpsert(TaskListModel rec2upd) + { + bool dbResult = dbController.TaskListUpsert(rec2upd); + // svuoto cache! + string cacheKey = $"MP:STATS:TaskList:{rec2upd.TType}"; + await distributedCache.RemoveAsync(cacheKey); + cacheKey = $"MP:STATS:TaskList:ND"; + await distributedCache.RemoveAsync(cacheKey); + return await Task.FromResult(dbResult); + } + #endregion Public Methods + + #region Protected Fields + + protected static string connStringBBM = ""; + protected static string connStringFatt = ""; + + #endregion Protected Fields + + #region Protected Methods + + protected string getCacheKey(string TableName, SelectData CurrFilter) + { + string answ = $"{TableName}:M_{CurrFilter.IdxMacchina}:AZ_{CurrFilter.Azione}:ART_{CurrFilter.CodArticolo}:KR_{CurrFilter.KeyRichiesta}:O_{CurrFilter.IdxOdl}:D_{CurrFilter.DateStart:yyyyMMddHHmm}_{CurrFilter.DateEnd:yyyyMMddHHmm}"; + return answ; + } + + protected string getCacheKeyPaged(string TableName, SelectData CurrFilter) + { + string answ = $"{TableName}:M_{CurrFilter.IdxMacchina}:A_{CurrFilter.CodArticolo}:K_{CurrFilter.KeyRichiesta}:O_{CurrFilter.IdxOdl}:D_{CurrFilter.DateStart:yyMMddHHmm}_{CurrFilter.DateEnd:yyMMddHHmm}:R_{CurrFilter.FirstRecord}_{CurrFilter.FirstRecord + CurrFilter.NumRecord}"; + return answ; + } + + #endregion Protected Methods + + #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; + + /// + /// 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à della cache (chAbsExp) + /// + private int chSliExp = 5; + + #endregion Private Fields + + #region Private Properties + + private DistributedCacheEntryOptions cacheOpt + { + get + { + return new DistributedCacheEntryOptions().SetAbsoluteExpiration(DateTime.Now.AddMinutes(chAbsExp)).SetSlidingExpiration(TimeSpan.FromMinutes(chSliExp)); + } + } + + private DistributedCacheEntryOptions cacheOptLong + { + get + { + return new DistributedCacheEntryOptions().SetAbsoluteExpiration(DateTime.Now.AddMinutes(chAbsExp * 10)).SetSlidingExpiration(TimeSpan.FromMinutes(chSliExp)); + } + } + + #endregion Private Properties } } \ No newline at end of file diff --git a/MP.Stats/MP.Stats.csproj b/MP.Stats/MP.Stats.csproj index ff2c7f38..52c9fd94 100644 --- a/MP.Stats/MP.Stats.csproj +++ b/MP.Stats/MP.Stats.csproj @@ -4,8 +4,8 @@ net6.0 MP.Stats 826e877c-ba70-4253-84cb-d0b1cafd4440 - 6.16.2404.0210 - 6.16.2404.0210 + 6.16.2404.0211 + 6.16.2404.0211 diff --git a/MP.Stats/Pages/TaskScheduler.razor b/MP.Stats/Pages/TaskScheduler.razor index 55994218..ec139b99 100644 --- a/MP.Stats/Pages/TaskScheduler.razor +++ b/MP.Stats/Pages/TaskScheduler.razor @@ -122,8 +122,8 @@ @if (detRecord != null) { -
- +
+
}
\ No newline at end of file diff --git a/MP.Stats/Pages/TaskScheduler.razor.cs b/MP.Stats/Pages/TaskScheduler.razor.cs index 977a744e..b81b6e8a 100644 --- a/MP.Stats/Pages/TaskScheduler.razor.cs +++ b/MP.Stats/Pages/TaskScheduler.razor.cs @@ -76,18 +76,7 @@ namespace MP.Stats.Pages [Inject] protected MpStatsService StatService { get; set; } - protected int totalCount - { - get - { - int answ = 0; - if (SearchRecords != null) - { - answ = SearchRecords.Count; - } - return answ; - } - } + protected int totalCount { get; set; } = 0; protected Task2ExeType TypeSel { @@ -100,7 +89,6 @@ namespace MP.Stats.Pages var pUpd = Task.Run(async () => { await ReloadData(); - //await InvokeAsync(StateHasChanged); }); pUpd.Wait(); } @@ -278,6 +266,7 @@ namespace MP.Stats.Pages private async Task ReloadData() { SearchRecords = await StatService.TaskListAll(TypeSel, ""); + totalCount = SearchRecords.Count; ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList(); } diff --git a/MP.Stats/Resources/ChangeLog.html b/MP.Stats/Resources/ChangeLog.html index ce6dd787..91755965 100644 --- a/MP.Stats/Resources/ChangeLog.html +++ b/MP.Stats/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo statistiche MAPO -

Versione: 6.16.2404.0210

+

Versione: 6.16.2404.0211


Note di rilascio:
    diff --git a/MP.Stats/Resources/VersNum.txt b/MP.Stats/Resources/VersNum.txt index 08eaa4b9..1e2cfa9a 100644 --- a/MP.Stats/Resources/VersNum.txt +++ b/MP.Stats/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2404.0210 +6.16.2404.0211 diff --git a/MP.Stats/Resources/manifest.xml b/MP.Stats/Resources/manifest.xml index e3d67763..61ca7d63 100644 --- a/MP.Stats/Resources/manifest.xml +++ b/MP.Stats/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2404.0210 + 6.16.2404.0211 https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html false