diff --git a/MP.Data/Controllers/MpStatsController.cs b/MP.Data/Controllers/MpStatsController.cs index 603e9a0c..327a490b 100644 --- a/MP.Data/Controllers/MpStatsController.cs +++ b/MP.Data/Controllers/MpStatsController.cs @@ -1,4 +1,5 @@ -using Microsoft.Data.SqlClient; +using DnsClient.Protocol; +using Microsoft.Data.SqlClient; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using MP.Data.DatabaseModels; @@ -371,6 +372,118 @@ namespace MP.Data.Controllers return dbResult; } + public DateTime CalcNextExe(TaskListModel taskRec) + { + DateTime dtNext = DateTime.Today; + try + { + // calcolo next exec da tipo... + switch (taskRec.Freq) + { + case TaskFreqType.ND: + dtNext = taskRec.DtLastExec.AddDays(taskRec.Cad); + break; + case TaskFreqType.Sec: + dtNext = taskRec.DtLastExec.AddSeconds(taskRec.Cad); + break; + case TaskFreqType.Min: + dtNext = taskRec.DtLastExec.AddMinutes(taskRec.Cad); + break; + case TaskFreqType.Hour: + dtNext = taskRec.DtLastExec.AddHours(taskRec.Cad); + break; + case TaskFreqType.Day: + dtNext = taskRec.DtLastExec.AddDays(taskRec.Cad); + break; + case TaskFreqType.Week: + dtNext = taskRec.DtLastExec.AddDays(7 * taskRec.Cad); + break; + case TaskFreqType.Month: + dtNext = taskRec.DtLastExec.AddMonths(taskRec.Cad); + break; + case TaskFreqType.Year: + dtNext = taskRec.DtLastExec.AddYears(taskRec.Cad); + break; + default: + dtNext = taskRec.DtLastExec.AddDays(taskRec.Cad); + break; + } + } + catch (Exception exc) + { + Log.Error($"Eccezione in CalcNextExe{Environment.NewLine}{exc}"); + } + return dtNext; + } + + /// + /// Chiamata esecuzione di un singolo task programmato + /// + /// + /// + public TaskResultModel ExecuteTask(int TaskId) + { + TaskResultModel callRes = new TaskResultModel(); + using (var dbCtx = new MoonPro_STATSContext(_configuration)) + { + // imposto timeout a 5 min + dbCtx.Database.SetCommandTimeout(TimeSpan.FromMinutes(5)); + try + { + DateTime dtStart = DateTime.Now; + // recupero i dati da richiamare... + var currRec = dbCtx + .DbSetTaskList + .Where(x => x.TaskId == TaskId) + .FirstOrDefault(); + if (currRec != null) + { + // recupero comando + string sqlCommand = currRec.Command; + string rawParams = currRec.Args; + callRes = dbCtx + .DbSetTaskResult + .FromSqlRaw($"EXEC {sqlCommand} {rawParams}") + .AsNoTracking() + .AsEnumerable() + .FirstOrDefault(); + DateTime dtEnd = DateTime.Now; + + // preparo record esecuzione... + TaskExecModel resRec = new TaskExecModel() + { + TaskId = TaskId, + DtStart = dtStart, + DtEnd = dtEnd, + IsError = callRes.ExecResult < 0, + Result = callRes.TextResult + }; + dbCtx + .DbSetTaskExe + .Add(resRec); + + // aggiorno record chiamata... + currRec.DtLastExec = dtStart; + currRec.LastResult = resRec.Result; + currRec.LastDuration = dtEnd.Subtract(dtStart).TotalSeconds; + // calcolo prossima esecuzione... + currRec.DtNextExec = CalcNextExe(currRec); + // segno modificato + dbCtx.Entry(currRec).State = EntityState.Modified; + + // salvo modifiche! + dbCtx.SaveChanges(); + } + + } + catch (Exception exc) + { + Log.Error($"Eccezione in ExecuteSqlCommand{Environment.NewLine}{exc}"); + } + } + return callRes; + } + /// /// Upsert record TaskExec /// diff --git a/MP.Data/DatabaseModels/TaskResultModel.cs b/MP.Data/DatabaseModels/TaskResultModel.cs new file mode 100644 index 00000000..881fe60d --- /dev/null +++ b/MP.Data/DatabaseModels/TaskResultModel.cs @@ -0,0 +1,37 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using static MP.Data.Objects.Enums; + +#nullable disable +// +// This is here so CodeMaid doesn't reorganize this document +// +namespace MP.Data.DatabaseModels +{ + [Keyless] + public partial class TaskResultModel + { + #region Public Properties + + /// + /// Tipo di task eseguito + /// + public string Task { get; set; } = ""; + + /// + /// Risultato: >0 = successo, <0 = errore + /// + public int ExecResult { get; set; } = 0; + + /// + /// Risultato esecuzione testuale + /// + public string TextResult { get; set; } = ""; + + + #endregion Public Properties + } +} \ No newline at end of file diff --git a/MP.Data/MoonPro_STATSContext.cs b/MP.Data/MoonPro_STATSContext.cs index 0c5645c3..f84c7f2f 100644 --- a/MP.Data/MoonPro_STATSContext.cs +++ b/MP.Data/MoonPro_STATSContext.cs @@ -48,6 +48,7 @@ namespace MP.Data public virtual DbSet DbSetOdlEnergy { get; set; } public virtual DbSet DbSetTaskList { get; set; } public virtual DbSet DbSetTaskExe { get; set; } + public virtual DbSet DbSetTaskResult { get; set; } #endregion Public Properties diff --git a/MP.Stats/Components/TaskEdit.razor.cs b/MP.Stats/Components/TaskEdit.razor.cs index a4b79dc6..21d75d2d 100644 --- a/MP.Stats/Components/TaskEdit.razor.cs +++ b/MP.Stats/Components/TaskEdit.razor.cs @@ -38,37 +38,8 @@ namespace MP.Stats.Components await Task.Delay(1); if (CurrRecord != null) { - // calcolo next exec da tipo... - switch (CurrRecord.Freq) - { - case MP.Data.Objects.Enums.TaskFreqType.ND: - CurrRecord.DtNextExec = CurrRecord.DtLastExec.AddDays(CurrRecord.Cad); - break; - case MP.Data.Objects.Enums.TaskFreqType.Sec: - CurrRecord.DtNextExec = CurrRecord.DtLastExec.AddSeconds(CurrRecord.Cad); - break; - case MP.Data.Objects.Enums.TaskFreqType.Min: - CurrRecord.DtNextExec = CurrRecord.DtLastExec.AddMinutes(CurrRecord.Cad); - break; - case MP.Data.Objects.Enums.TaskFreqType.Hour: - CurrRecord.DtNextExec = CurrRecord.DtLastExec.AddHours(CurrRecord.Cad); - break; - case MP.Data.Objects.Enums.TaskFreqType.Day: - CurrRecord.DtNextExec = CurrRecord.DtLastExec.AddDays( CurrRecord.Cad); - break; - case MP.Data.Objects.Enums.TaskFreqType.Week: - CurrRecord.DtNextExec = CurrRecord.DtLastExec.AddDays(7*CurrRecord.Cad); - break; - case MP.Data.Objects.Enums.TaskFreqType.Month: - CurrRecord.DtNextExec = CurrRecord.DtLastExec.AddMonths(CurrRecord.Cad); - break; - case MP.Data.Objects.Enums.TaskFreqType.Year: - CurrRecord.DtNextExec = CurrRecord.DtLastExec.AddYears(CurrRecord.Cad); - break; - default: - CurrRecord.DtNextExec = CurrRecord.DtLastExec.AddDays(CurrRecord.Cad); - break; - } + var nextDt = StatService.CalcNextExe(CurrRecord); + CurrRecord.DtNextExec = nextDt; fatto = await StatService.TaskListUpsert(CurrRecord); } await EC_update.InvokeAsync(fatto); diff --git a/MP.Stats/Components/TaskExeList.razor b/MP.Stats/Components/TaskExeList.razor index b21f8d94..1874a952 100644 --- a/MP.Stats/Components/TaskExeList.razor +++ b/MP.Stats/Components/TaskExeList.razor @@ -46,15 +46,24 @@ @record.TaskExecId - @($"{record.DtStart:HH:mm:ss}") + @($"{record.DtStart:HH:mm:ss.fff}")
@($"{record.DtStart:yyyy-MM.dd ddd}")
- @($"{record.DtEnd:HH:mm:ss}") + @($"{record.DtEnd:HH:mm:ss.fff}")
@($"{record.DtEnd:yyyy-MM.dd ddd}")
-
@record.IsError
+
+ @if (@record.IsError) + { + + } + else + { + + } +
@record.Result
diff --git a/MP.Stats/Data/MpStatsService.cs b/MP.Stats/Data/MpStatsService.cs index 82ec3dc5..09827a00 100644 --- a/MP.Stats/Data/MpStatsService.cs +++ b/MP.Stats/Data/MpStatsService.cs @@ -122,6 +122,35 @@ namespace MP.Stats.Data // Clear database controller dbController.Dispose(); } + /// + /// Aggiorna record calcolando prossima scadenza dato ultima esecuzione + /// + /// + /// + public DateTime CalcNextExe(TaskListModel? taskRec) + { + DateTime dtNext = DateTime.Today; + if (taskRec != null) + { + dtNext = dbController.CalcNextExe(taskRec); + } + return dtNext; + } + /// + /// Chiamata esecuzione di un singolo task programmato + /// + /// + /// + public async Task ExecuteTask(int TaskId) + { + TaskResultModel dbResult = dbController.ExecuteTask(TaskId); + // svuoto cache! + string cacheKey = $"MP:STATS:TaskList"; + await distributedCache.RemoveAsync(cacheKey); + cacheKey = $"MP:STATS:TaskExecList"; + await distributedCache.RemoveAsync(cacheKey); + return await Task.FromResult(dbResult); + } public Task> MacchineGetAll() { diff --git a/MP.Stats/MP.Stats.csproj b/MP.Stats/MP.Stats.csproj index 52c9fd94..081b985d 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.0211 - 6.16.2404.0211 + 6.16.2404.0219 + 6.16.2404.0219 diff --git a/MP.Stats/Pages/TaskScheduler.razor b/MP.Stats/Pages/TaskScheduler.razor index ec139b99..fd62f9de 100644 --- a/MP.Stats/Pages/TaskScheduler.razor +++ b/MP.Stats/Pages/TaskScheduler.razor @@ -32,7 +32,11 @@
- @if (ListRecords == null) + @if (isLoading) + { + + } + else if (ListRecords == null) { } @@ -61,6 +65,7 @@ Next Result } + @@ -103,10 +108,13 @@
@($"{record.DtNextExec:ddd HH:mm:ss}")
-
@record.LastDuration sec
+
@record.LastDuration.ToString("N3") sec
@record.LastResult
} + + + } diff --git a/MP.Stats/Pages/TaskScheduler.razor.cs b/MP.Stats/Pages/TaskScheduler.razor.cs index b81b6e8a..40991053 100644 --- a/MP.Stats/Pages/TaskScheduler.razor.cs +++ b/MP.Stats/Pages/TaskScheduler.razor.cs @@ -140,6 +140,18 @@ namespace MP.Stats.Pages await ReloadData(); } + protected async Task doRun(TaskListModel selRec) + { + isLoading = true; + detRecord = null; + await Task.Delay(100); + // chiama esecuzione task + var result = await StatService.ExecuteTask(selRec.TaskId); + isLoading = false; + detRecord = selRec; + await ReloadData(); + } + protected async Task ForceReload(int newNum) { numRecord = newNum; diff --git a/MP.Stats/Program.cs b/MP.Stats/Program.cs index 1726dc14..0922ce22 100644 --- a/MP.Stats/Program.cs +++ b/MP.Stats/Program.cs @@ -23,7 +23,8 @@ namespace MP.Stats .ConfigureLogging(logging => { logging.ClearProviders(); - logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); + logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Debug); + //logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace); }) .UseNLog(); diff --git a/MP.Stats/Resources/ChangeLog.html b/MP.Stats/Resources/ChangeLog.html index 91755965..32d8d55c 100644 --- a/MP.Stats/Resources/ChangeLog.html +++ b/MP.Stats/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo statistiche MAPO -

Versione: 6.16.2404.0211

+

Versione: 6.16.2404.0219


Note di rilascio:
    diff --git a/MP.Stats/Resources/VersNum.txt b/MP.Stats/Resources/VersNum.txt index 1e2cfa9a..c2805d00 100644 --- a/MP.Stats/Resources/VersNum.txt +++ b/MP.Stats/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2404.0211 +6.16.2404.0219 diff --git a/MP.Stats/Resources/manifest.xml b/MP.Stats/Resources/manifest.xml index 61ca7d63..65fc5426 100644 --- a/MP.Stats/Resources/manifest.xml +++ b/MP.Stats/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2404.0211 + 6.16.2404.0219 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