diff --git a/MP.Data/Controllers/MpStatsController.cs b/MP.Data/Controllers/MpStatsController.cs index c5eccccf..2ebc43fa 100644 --- a/MP.Data/Controllers/MpStatsController.cs +++ b/MP.Data/Controllers/MpStatsController.cs @@ -4,7 +4,9 @@ using Microsoft.Extensions.Configuration; using NLog; using System; using System.Collections.Generic; +using System.Drawing.Drawing2D; using System.Linq; +using static MP.Data.Objects.Enums; namespace MP.Data.Controllers { @@ -224,17 +226,6 @@ namespace MP.Data.Controllers List dbResult = new List(); using (var dbCtx = new MoonPro_STATSContext(_configuration)) { - //dbResult = dbCtx - // .DbSetOdlEnergy - // .Where(x => - // (string.IsNullOrEmpty(IdxMacchina) || x.IdxMacchina == IdxMacchina) - // && ((x.DataInizio >= DtStart && x.DataInizio <= DtEnd) || (x.DataFine >= DtStart && x.DataFine <= DtEnd) || (x.DataFine == null && x.DataInizio <= DtStart)) - // && (IdxODL == 0 || x.IdxOdl == IdxODL) - // && (KeyRichiesta == "*" || x.KeyRichiesta == KeyRichiesta) - // && (CodArticolo == "*" || x.CodArticolo == CodArticolo) - // ) - // .ToList(); - var dataFrom = new SqlParameter("@dataFrom", DtStart); var dataTo = new SqlParameter("@dataTo", DtEnd); var idxMacchina = new SqlParameter("@idxMacchina", IdxMacchina); @@ -250,6 +241,48 @@ namespace MP.Data.Controllers return dbResult; } + /// + /// Ricerca task dato tipo e + /// + /// + /// + public List TaskListGetAll(Task2ExeType TType) + { + List dbResult = new List(); + using (var dbCtx = new MoonPro_STATSContext(_configuration)) + { + + dbResult = dbCtx + .DbSetTaskList + .Where(x => (TType == Task2ExeType.ND || x.TType == TType)) + .ToList(); + } + return dbResult; + } + + + /// + /// Ricerca task dato tipo + num max (desc) + /// + /// TaskId da cui deriva + /// + public List TaskExeGetFilt(int TaskId, int maxRec) + { + List dbResult = new List(); + using (var dbCtx = new MoonPro_STATSContext(_configuration)) + { + + dbResult = dbCtx + .DbSetTaskExe + .Include(x => x.TaskListNav) + .Where(x => (x.TaskId == TaskId)) + .OrderByDescending(x => x.DtStart) + .Take(maxRec) + .ToList(); + } + return dbResult; + } + /// /// Elenco tabella ODL da filtro /// diff --git a/MP.Data/DatabaseModels/TaskExecModel.cs b/MP.Data/DatabaseModels/TaskExecModel.cs new file mode 100644 index 00000000..72798e11 --- /dev/null +++ b/MP.Data/DatabaseModels/TaskExecModel.cs @@ -0,0 +1,64 @@ +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 +{ + [Table("TaskExec")] + public partial class TaskExecModel + { + #region Public Properties + + [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int TaskExecId { get; set; } = 0; + + /// + /// task Id di riferimento + /// + public int TaskId { get; set; } = 0; + + /// + /// DataOra inizio + /// + public DateTime DtStart { get; set; } = DateTime.Now; + + /// + /// DataOra fine + /// + public DateTime DtEnd { get; set; } = DateTime.Now.AddDays(-1); + + /// + /// Durata ultima esecuzione in secondi + /// + [NotMapped] + public double Duration + { + get => DtEnd.Subtract(DtStart).TotalSeconds; + } + + /// + /// Esito in Errore + /// + public bool IsError { get; set; } = false; + + /// + /// Ultimo risultato registrato + /// + public string Result { get; set; } = ""; + + /// + /// Navigazione oggetto TaskList + /// + [ForeignKey("TaskId")] + public virtual TaskListModel TaskListNav { get; set; } = null!; + + + #endregion Public Properties + } +} \ No newline at end of file diff --git a/MP.Data/DatabaseModels/TaskListModel.cs b/MP.Data/DatabaseModels/TaskListModel.cs new file mode 100644 index 00000000..c551fa6c --- /dev/null +++ b/MP.Data/DatabaseModels/TaskListModel.cs @@ -0,0 +1,77 @@ +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 +{ + [Table("TaskList")] + public partial class TaskListModel + { + #region Public Properties + + [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int TaskId { get; set; } = 0; + + /// + /// Nome Task + /// + public string Name { get; set; } = ""; + + /// + /// Descrizione Task + /// + public string Descript { get; set; } = ""; + + /// + /// Tipo Task + /// + public Task2ExeType TType { get; set; } = Task2ExeType.ND; + + /// + /// Comando da invocare + /// + public string Command { get; set; } = ""; + + /// + /// Elenco argomenti (json) + /// + public string Args { get; set; } = ""; + + /// + /// Frequenza esecuzione da enum + /// + public TaskFreqType Freq { get; set; } = TaskFreqType.ND; + + /// + /// Cadenza esecuzione + /// + public int Cad { get; set; } = 1; + + /// + /// DataOra ultima esecuzione + /// + public DateTime DtLastExec { get; set; } = DateTime.Today.AddYears(-10); + /// + /// DataOra ultima esecuzione + /// + public DateTime DtNextExec { get; set; } = DateTime.Today.AddYears(-9); + + /// + /// Durata ultima esecuzione in secondi + /// + public double LastDuration { get; set; } = 0; + + /// + /// Ultimo risultato registrato + /// + public string LastResult { 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 4af88c94..0c5645c3 100644 --- a/MP.Data/MoonPro_STATSContext.cs +++ b/MP.Data/MoonPro_STATSContext.cs @@ -46,6 +46,8 @@ namespace MP.Data public virtual DbSet DbSetTurniOee { get; set; } public virtual DbSet DbSetUserLog { get; set; } public virtual DbSet DbSetOdlEnergy { get; set; } + public virtual DbSet DbSetTaskList { get; set; } + public virtual DbSet DbSetTaskExe { get; set; } #endregion Public Properties diff --git a/MP.Data/Objects/Enums.cs b/MP.Data/Objects/Enums.cs index 7e9428af..e9b8f5ce 100644 --- a/MP.Data/Objects/Enums.cs +++ b/MP.Data/Objects/Enums.cs @@ -250,6 +250,74 @@ namespace MP.Data.Objects SS } + //[JsonConverter(typeof(StringEnumConverter))] + public enum Task2ExeType + { + /// + /// Tipo indefinito / ALL + /// + ND, + + /// + /// Chiamata exe esterno + /// + Exe, + + /// + /// Chiamata a SQL Command + /// + SqlCommand, + + /// + /// Chiamata a SQL Stored Procedure + /// + SqlStored + } + + //[JsonConverter(typeof(StringEnumConverter))] + public enum TaskFreqType + { + /// + /// Tipo indefinito / ALL + /// + ND, + + /// + /// Secondi + /// + Sec, + + /// + /// Minuti + /// + Min, + + /// + /// Ore + /// + Hour, + + /// + /// Giorni + /// + Day, + + /// + /// Settimane + /// + Week, + + /// + /// Mesi + /// + Month, + + /// + /// Anni + /// + Year + } + /// /// Elenco task ammessi (x IOB-WIN da eseguire...) /// diff --git a/MP.SPEC/Program.cs b/MP.SPEC/Program.cs index e650e8a4..e86fddac 100644 --- a/MP.SPEC/Program.cs +++ b/MP.SPEC/Program.cs @@ -11,7 +11,7 @@ using StackExchange.Redis; var builder = WebApplication.CreateBuilder(args); /*-------------------- - * Note migrazione startup.cs -_> program.cs: + * Note migrazione startup.cs --> program.cs: * * - https://stackoverflow.com/questions/69722872/asp-net-core-6-how-to-access-configuration-during-startup * - https://docs.microsoft.com/en-us/aspnet/core/migration/50-to-60?view=aspnetcore-5.0&tabs=visual-studio#where-do-i-put-state-that-was-stored-as-fields-in-my-program-or-startup-class diff --git a/MP.Stats/Components/TaskEdit.razor b/MP.Stats/Components/TaskEdit.razor new file mode 100644 index 00000000..245773d9 --- /dev/null +++ b/MP.Stats/Components/TaskEdit.razor @@ -0,0 +1,59 @@ +@if (CurrRecord != null) +{ +
+
+

Edit Rec

+
+
+ + +
+
+ + + +
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+ +
+
+} + diff --git a/MP.Stats/Components/TaskEdit.razor.cs b/MP.Stats/Components/TaskEdit.razor.cs new file mode 100644 index 00000000..f7363d49 --- /dev/null +++ b/MP.Stats/Components/TaskEdit.razor.cs @@ -0,0 +1,34 @@ +using DnsClient.Protocol; +using Microsoft.AspNetCore.Components; +using MP.Data.DatabaseModels; +using System.Threading.Tasks; + +namespace MP.Stats.Components +{ + public partial class TaskEdit + { + + [Parameter] + public TaskListModel? CurrRecord { get; set; } = null; + + [Parameter] + public EventCallback EC_update { get; set; } + + protected async Task doCancel() + { + await EC_update.InvokeAsync(false); + } + protected async Task doSave() + { + bool fatto = false; +#if false + await Task.Delay(1); + if (CurrRecord != null) + { + fatto = await MTService.CustomerUpdate(CurrRecord); + } +#endif + await EC_update.InvokeAsync(fatto); + } + } +} \ No newline at end of file diff --git a/MP.Stats/Data/MpStatsService.cs b/MP.Stats/Data/MpStatsService.cs index 0d4b28e5..f20533ec 100644 --- a/MP.Stats/Data/MpStatsService.cs +++ b/MP.Stats/Data/MpStatsService.cs @@ -9,6 +9,7 @@ using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; +using static MP.Data.Objects.Enums; namespace MP.Stats.Data { @@ -168,7 +169,7 @@ namespace MP.Stats.Data { List answ = new List(); answ.Add(new AutocompleteModel { LabelField = "--- TUTTE ---", ValueField = "*" }); - answ.AddRange(dbController.ActionsGetAll().Select(x => new AutocompleteModel { LabelField = $"{x.Descrizione}", ValueField = x.Azione}).ToList()); + answ.AddRange(dbController.ActionsGetAll().Select(x => new AutocompleteModel { LabelField = $"{x.Descrizione}", ValueField = x.Azione }).ToList()); return Task.FromResult(answ); } @@ -200,9 +201,11 @@ namespace MP.Stats.Data answ.Add(new AutocompleteModel { LabelField = "--- TUTTE ---", ValueField = "*" }); answ.AddRange(dbController .MacchineGetAll() - .Select(x => new AutocompleteModel { - LabelField = $"{x.IdxMacchina} | {x.Nome} {x.Descrizione} ", - ValueField = x.IdxMacchina }) + .Select(x => new AutocompleteModel + { + LabelField = $"{x.IdxMacchina} | {x.Nome} {x.Descrizione} ", + ValueField = x.IdxMacchina + }) .ToList()); return Task.FromResult(answ); } @@ -310,10 +313,14 @@ namespace MP.Stats.Data } return await Task.FromResult(numRec); } - + /// + /// Statistiche ODL + /// + /// + /// + /// public async Task> StatOdlEnergyGetAll(SelectData CurrFilter, string searchVal = "") { - //return Task.FromResult(dbController.StatOdlGetAll(numRecord, searchVal)); List dbResult = new List(); string cacheKey = getCacheKey("MP:STATS:ODL_ENERGY", CurrFilter); string rawData; @@ -333,15 +340,19 @@ namespace MP.Stats.Data await distributedCache.SetAsync(cacheKey, redisDataList, cacheOpt); stopWatch.Stop(); TimeSpan ts = stopWatch.Elapsed; - _logger.LogTrace($"Effettuata lettura da DB + caching per ODL: {ts.TotalMilliseconds} ms"); + _logger.LogTrace($"Effettuata lettura da DB + caching per ODL_Energy: {ts.TotalMilliseconds} ms"); } return await Task.FromResult(dbResult); } - + /// + /// Statistiche Energia x ODL + /// + /// + /// + /// public async Task> StatOdlGetAll(SelectData CurrFilter, string searchVal = "") { - //return Task.FromResult(dbController.StatOdlGetAll(numRecord, searchVal)); List dbResult = new List(); string cacheKey = getCacheKey("MP:STATS:ODL", CurrFilter); string rawData; @@ -366,6 +377,47 @@ 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); + } + public async Task> StatScartiGetAll(SelectData CurrFilter, string searchVal = "") { //return Task.FromResult(dbController.StatScartiGetAll(DataStart, DataEnd, IdxMacchina, IdxODL, KeyRichiesta, CodArticolo).ToArray()); @@ -444,7 +496,7 @@ namespace MP.Stats.Data // se richiesto filtro azioni effettuo ora selezione... if (CurrFilter.Azione != "*") { - dbResult= dbResult.Where(x => x.Azione == CurrFilter.Azione).ToList(); + dbResult = dbResult.Where(x => x.Azione == CurrFilter.Azione).ToList(); } rawData = JsonConvert.SerializeObject(dbResult); redisDataList = Encoding.UTF8.GetBytes(rawData); diff --git a/MP.Stats/MP.Stats.csproj b/MP.Stats/MP.Stats.csproj index 80e79535..553d3c20 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.2403.2811 - 6.16.2403.2811 + 6.16.2403.2817 + 6.16.2403.2817 diff --git a/MP.Stats/Pages/Energy.razor.cs b/MP.Stats/Pages/Energy.razor.cs index 3783c6f2..9e5fa476 100644 --- a/MP.Stats/Pages/Energy.razor.cs +++ b/MP.Stats/Pages/Energy.razor.cs @@ -22,7 +22,7 @@ namespace MP.Stats.Pages #region Protected Fields - protected string fileName = "ODL.csv"; + protected string fileName = "ODL_Energy.csv"; #endregion Protected Fields diff --git a/MP.Stats/Pages/TaskScheduler.razor b/MP.Stats/Pages/TaskScheduler.razor index 236a54a9..5e29d7d6 100644 --- a/MP.Stats/Pages/TaskScheduler.razor +++ b/MP.Stats/Pages/TaskScheduler.razor @@ -2,7 +2,22 @@
- +
+
+ TaskList +
+
+ +
+
+
@if (ListRecords == null) @@ -20,58 +35,59 @@ - - - - - - - - - - - + + + + + + + + + @foreach (var record in ListRecords) { - - + - - - - - + + + + + + + - - - } @@ -81,6 +97,6 @@ } \ No newline at end of file diff --git a/MP.Stats/Pages/TaskScheduler.razor.cs b/MP.Stats/Pages/TaskScheduler.razor.cs index e9ac2c56..6a78436f 100644 --- a/MP.Stats/Pages/TaskScheduler.razor.cs +++ b/MP.Stats/Pages/TaskScheduler.razor.cs @@ -6,6 +6,9 @@ using System.IO; using System.Threading.Tasks; using System; using System.Linq; +using StackExchange.Redis; +using MP.Data.DatabaseModels; +using static MP.Data.Objects.Enums; namespace MP.Stats.Pages { @@ -13,14 +16,14 @@ namespace MP.Stats.Pages { #region Public Methods - public string checkSelect(int IdxODL) + public string checkSelect(int TaskId) { string answ = ""; if (currRecord != null) { try { - answ = (currRecord.IdxOdl == IdxODL) ? "table-info" : ""; + answ = (currRecord.TaskId == TaskId) ? "table-info" : ""; } catch { } @@ -46,7 +49,7 @@ namespace MP.Stats.Pages #region Protected Fields - protected string fileName = "ODL.csv"; + protected string fileName = "TaskList.csv"; #endregion Protected Fields @@ -156,10 +159,10 @@ namespace MP.Stats.Pages #region Private Fields - private MP.Data.DatabaseModels.StatsODL currRecord = null; + private TaskListModel currRecord = null; - private List ListRecords; - private List SearchRecords; + private List ListRecords; + private List SearchRecords; #endregion Private Fields @@ -196,6 +199,50 @@ namespace MP.Stats.Pages await Task.Run(() => File.Delete(fullPath)); } + protected async Task doSave() + { + if (currRecord != null) + { +#if false + bool done = false; + // salvo verificando status... + if (currOrder.OrderStatus == 10 || currOrder.OrderStatus == 10000) + { + done = await WDService.OrderUpdateDescript(currOrder.OrderId, currOrder.OrderExtCode, currOrder.OrderDescript); + } + else + { + done = await WDService.OrderUpdatePromDate(currOrder.OrderId, currOrder.DateProm); + } + // resetto info + currOrder = null; + isEdit = false; + await WDService.OrdersFlushCache(); +#endif + await ReloadData(); + } + } + protected async Task doCancel() + { + currRecord = null; + await ReloadData(); + } + protected async Task doReset() + { + currRecord = null; + await ReloadData(); + } + + protected async Task forceUpdate(bool doForce) + { + currRecord = null; + await ReloadData(); + } + protected async Task doEdit(TaskListModel selRec) + { + currRecord = selRec; + await ReloadData(); + } private async Task ExportCsv() { isLoading = true; @@ -206,10 +253,29 @@ namespace MP.Stats.Pages private async Task ReloadData() { - SearchRecords = await StatService.StatOdlGetAll(currFilter, MessageService.SearchVal); + SearchRecords = await StatService.TaskListAll(TypeSel, ""); ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList(); } + protected Task2ExeType TypeSel + { + get => typeSel; + set + { + if (typeSel != value) + { + typeSel = value; + var pUpd = Task.Run(async () => + { + await ReloadData(); + //await InvokeAsync(StateHasChanged); + }); + pUpd.Wait(); + } + } + } + private Task2ExeType typeSel { get; set; } = Task2ExeType.ND; + #endregion Private Methods } } \ No newline at end of file diff --git a/MP.Stats/Resources/ChangeLog.html b/MP.Stats/Resources/ChangeLog.html index fa46a4ec..0ec2bd1d 100644 --- a/MP.Stats/Resources/ChangeLog.html +++ b/MP.Stats/Resources/ChangeLog.html @@ -1,6 +1,6 @@ Modulo statistiche MAPO -

Versione: 6.16.2403.2811

+

Versione: 6.16.2403.2817


Note di rilascio:
    diff --git a/MP.Stats/Resources/VersNum.txt b/MP.Stats/Resources/VersNum.txt index ff81f0c7..d0283c44 100644 --- a/MP.Stats/Resources/VersNum.txt +++ b/MP.Stats/Resources/VersNum.txt @@ -1 +1 @@ -6.16.2403.2811 +6.16.2403.2817 diff --git a/MP.Stats/Resources/manifest.xml b/MP.Stats/Resources/manifest.xml index 06b06c33..8d897ea2 100644 --- a/MP.Stats/Resources/manifest.xml +++ b/MP.Stats/Resources/manifest.xml @@ -1,6 +1,6 @@ - 6.16.2403.2811 + 6.16.2403.2817 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 diff --git a/MP.Stats/Shared/NavMenu.razor b/MP.Stats/Shared/NavMenu.razor index a64264f3..24998ad8 100644 --- a/MP.Stats/Shared/NavMenu.razor +++ b/MP.Stats/Shared/NavMenu.razor @@ -47,11 +47,11 @@ Registro Scarti - @* *@ +
MacchinaCommessa/ODLArticoloInizioFineUnitEnergyGasP1P2P3 + + #TaskTipoCommandSchedulazioneLastNextResult
@record.IdxMacchina
-
@record.KeyRichiesta
-
@record.IdxOdl
-
- @record.CodArticolo -
@record.DescArticolo
-
@record.DataInizio@record.DataFine@(record.NumPezziEv + 200) m - @{ - double currSim = simVal(record.NumPezzi, record.NumPezziEv + 200); - double currSimGas = simVal(record.NumPezzi, record.NumPezziEv + 200); + @if (currRecord == null) + { + } -
- @currSim.ToString("N2") kWh -
- - @righDiv(currSim, record.NumPezziEv + 200).ToString("N1") kWh/m - + else + { + @* *@ + + } +
@record.TaskId +
@record.Name
+
@record.Descript
+
+ @record.TType + +
@record.Command
+
@record.Args
+
@record.Freq × @record.Cad +
@($"{record.DtLastExec:yyyy-MM-dd}")
+
@($"{record.DtLastExec:ddd HH:mm:ss}")
-
- @currSim.ToString("N2") m3 -
- - @righDiv(currSim, record.NumPezziEv + 200).ToString("N1") m3/m - +
@($"{record.DtNextExec:yyyy-MM-dd}")
+
@($"{record.DtNextExec:ddd HH:mm:ss}")
+
+
@record.LastDuration sec
+
@record.LastResult
@($"{currSim:N1}")@($"{currSimGas:N1}")@($"{currSim + currSimGas:N1}")