OK esecuzione registrazione ODL Energy

This commit is contained in:
Samuele Locatelli
2024-04-02 19:24:11 +02:00
parent 5240ffe2f6
commit 8be883256e
13 changed files with 224 additions and 43 deletions
+114 -1
View File
@@ -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;
}
/// <summary>
/// Chiamata esecuzione di un singolo task programmato
/// </summary>
/// <param name="TaskId"></param>
/// <returns></returns>
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;
}
/// <summary>
/// Upsert record TaskExec
/// </summary>
+37
View File
@@ -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
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DatabaseModels
{
[Keyless]
public partial class TaskResultModel
{
#region Public Properties
/// <summary>
/// Tipo di task eseguito
/// </summary>
public string Task { get; set; } = "";
/// <summary>
/// Risultato: >0 = successo, <0 = errore
/// </summary>
public int ExecResult { get; set; } = 0;
/// <summary>
/// Risultato esecuzione testuale
/// </summary>
public string TextResult { get; set; } = "";
#endregion Public Properties
}
}
+1
View File
@@ -48,6 +48,7 @@ namespace MP.Data
public virtual DbSet<OdlEnergyModel> DbSetOdlEnergy { get; set; }
public virtual DbSet<TaskListModel> DbSetTaskList { get; set; }
public virtual DbSet<TaskExecModel> DbSetTaskExe { get; set; }
public virtual DbSet<TaskResultModel> DbSetTaskResult { get; set; }
#endregion Public Properties
+2 -31
View File
@@ -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);
+12 -3
View File
@@ -46,15 +46,24 @@
@record.TaskExecId
</td>
<td>
@($"{record.DtStart:HH:mm:ss}")
@($"{record.DtStart:HH:mm:ss.fff}")
<div class="small">@($"{record.DtStart:yyyy-MM.dd ddd}")</div>
</td>
<td>
@($"{record.DtEnd:HH:mm:ss}")
@($"{record.DtEnd:HH:mm:ss.fff}")
<div class="small">@($"{record.DtEnd:yyyy-MM.dd ddd}")</div>
</td>
<td class="text-right">
<div>@record.IsError</div>
<div>
@if (@record.IsError)
{
<i class="far fa-thumbs-down text-danger"></i>
}
else
{
<i class="far fa-thumbs-up text-success"></i>
}
</div>
<div class="small">@record.Result</div>
</td>
</tr>
+29
View File
@@ -122,6 +122,35 @@ namespace MP.Stats.Data
// Clear database controller
dbController.Dispose();
}
/// <summary>
/// Aggiorna record calcolando prossima scadenza dato ultima esecuzione
/// </summary>
/// <param name="taskRec"></param>
/// <returns></returns>
public DateTime CalcNextExe(TaskListModel? taskRec)
{
DateTime dtNext = DateTime.Today;
if (taskRec != null)
{
dtNext = dbController.CalcNextExe(taskRec);
}
return dtNext;
}
/// <summary>
/// Chiamata esecuzione di un singolo task programmato
/// </summary>
/// <param name="TaskId"></param>
/// <returns></returns>
public async Task<TaskResultModel> 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<List<Macchine>> MacchineGetAll()
{
+2 -2
View File
@@ -4,8 +4,8 @@
<TargetFramework>net6.0</TargetFramework>
<RootNamespace>MP.Stats</RootNamespace>
<UserSecretsId>826e877c-ba70-4253-84cb-d0b1cafd4440</UserSecretsId>
<Version>6.16.2404.0211</Version>
<Version>6.16.2404.0211</Version>
<Version>6.16.2404.0219</Version>
<Version>6.16.2404.0219</Version>
</PropertyGroup>
<ItemGroup>
+10 -2
View File
@@ -32,7 +32,11 @@
<TaskEdit CurrRecord="@currRecord" EC_update="forceUpdate"></TaskEdit>
</div>
<div class="card-body py-0 px-1">
@if (ListRecords == null)
@if (isLoading)
{
<LoadingData DisplayMode="LoadingData.SpinMode.BounceLine" DisplaySize="LoadingData.CtrlSize.Large"></LoadingData>
}
else if (ListRecords == null)
{
<LoadingData></LoadingData>
}
@@ -61,6 +65,7 @@
<th class="text-right">Next</th>
<th class="text-right">Result</th>
}
<th></th>
</tr>
</thead>
<tbody>
@@ -103,10 +108,13 @@
<div class="small">@($"{record.DtNextExec:ddd HH:mm:ss}")</div>
</td>
<td class="text-right">
<div>@record.LastDuration sec</div>
<div>@record.LastDuration.ToString("N3") sec</div>
<div class="small">@record.LastResult</div>
</td>
}
<td>
<button class="btn btn-sm btn-success me-1" @onclick="()=>doRun(record)" title="Run Now"><i class="fas fa-play"></i></button>
</td>
</tr>
}
</tbody>
+12
View File
@@ -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;
+2 -1
View File
@@ -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();
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo statistiche MAPO</i>
<h4>Versione: 6.16.2404.0211</h4>
<h4>Versione: 6.16.2404.0219</h4>
<br />
Note di rilascio:
<ul>
+1 -1
View File
@@ -1 +1 @@
6.16.2404.0211
6.16.2404.0219
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2404.0211</version>
<version>6.16.2404.0219</version>
<url>https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/MP.Stats.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-STATS/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>