OK esecuzione registrazione ODL Energy
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
@@ -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,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 @@
|
||||
6.16.2404.0211
|
||||
6.16.2404.0219
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user