Stats: update displays cadenza dati energy

This commit is contained in:
Samuele Locatelli
2026-05-04 09:51:40 +02:00
parent 75e4b539a9
commit aad546ed72
13 changed files with 286 additions and 27 deletions
+2 -2
View File
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.32126.317
# Visual Studio Version 18
VisualStudioVersion = 18.5.11723.231 stable
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MP.Stats", "MP.Stats\MP.Stats.csproj", "{D9901B50-E61C-400C-B62C-FA060CF72C29}"
EndProject
+19 -5
View File
@@ -1,16 +1,14 @@
using DnsClient.Protocol;
using Microsoft.Data.SqlClient;
using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using MP.Data.DbModels;
using MP.Data.DbModels.Energy;
using NLog;
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing.Drawing2D;
using System.Linq;
using ZXing;
using static MP.Core.Objects.Enums;
using System.Threading.Tasks;
namespace MP.Data.Controllers
{
@@ -199,6 +197,22 @@ namespace MP.Data.Controllers
}
return dbResult;
}
/// <summary>
/// Elenco controllo stato Macchine Energy x check
/// </summary>
/// <returns></returns>
public async Task<List<MacchineEnergyCheckModel>> MacchineEnergyCheckGetAllAsync()
{
List<MacchineEnergyCheckModel> dbResult = new List<MacchineEnergyCheckModel>();
using (var dbCtx = new MoonPro_STATSContext(_configuration))
{
dbResult = await dbCtx
.DbSetMacchineCheck
.OrderBy(x => x.IdxMacchina)
.ToListAsync();
}
return dbResult;
}
/// <summary>
/// Annulla modifiche su una specifica entity (cancel update)
@@ -0,0 +1,35 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace MP.Data.DbModels.Energy
{
public class MacchineEnergyCheckModel
{
public string IdxMacchina { get; set; } = "";
/// <summary>
/// Nome macchina
/// </summary>
[MaxLength(50)]
public string Nome { get; set; } = "";
/// <summary>
/// Descrizione macchina
/// </summary>
public string Descrizione { get; set; } = "";
/// <summary>
/// DataOra ultimo evento
/// </summary>
public DateTime dtEvento { get; set; }
/// <summary>
/// Flusso registrato
/// </summary>
public string CodFlux { get; set; }
/// <summary>
/// Valore registrato
/// </summary>
public string Valore { get; set; }
}
}
+11 -3
View File
@@ -1,8 +1,7 @@
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using MP.Data.DbModels;
using MP.Data.DbModels.Energy;
using NLog;
#nullable disable
@@ -45,6 +44,8 @@ namespace MP.Data
public virtual DbSet<DdbTurni> DbSetDdbTurni { get; set; }
public virtual DbSet<FLModel> DbSetFL { get; set; }
public virtual DbSet<MacchineModel> DbSetMacchine { get; set; }
public virtual DbSet<MacchineEnergyCheckModel> DbSetMacchineCheck { get; set; }
public virtual DbSet<StatsODL> DbSetODL { get; set; }
public virtual DbSet<OdlEnergyModel> DbSetOdlEnergy { get; set; }
public virtual DbSet<ResScarti> DbSetScarti { get; set; }
@@ -138,6 +139,13 @@ namespace MP.Data
.HasMaxLength(5);
});
modelBuilder.Entity<MacchineEnergyCheckModel>(entity =>
{
entity.HasNoKey();
entity.ToView("v_UI_MacchineEnergyCheck");
});
modelBuilder.Entity<StatsAnagArticoli>(entity =>
{
entity.HasNoKey();
+38 -1
View File
@@ -1,5 +1,6 @@
using Microsoft.Extensions.Configuration;
using MP.Data.DbModels;
using MP.Data.DbModels.Energy;
using MP.Data.Services;
using Newtonsoft.Json;
using NLog;
@@ -359,7 +360,7 @@ namespace MP.Stats.Data
}
else
{
result = dbController.MacchineGetAll().ToList();
result = dbController.MacchineGetAll();
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
_redisDb.StringSet(currKey, rawData, FastCache);
@@ -373,6 +374,42 @@ namespace MP.Stats.Data
return result;
}
/// <summary>
/// Elenco check stato Macchine Energy
/// </summary>
/// <returns></returns>
public async Task<List<MacchineEnergyCheckModel>> MacchineEnergyCheckGetAll()
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<MacchineEnergyCheckModel> result = new List<MacchineEnergyCheckModel>();
// cerco in redis...
DateTime adesso = DateTime.Now;
string currKey = $"{redisBaseKey}:Cache:MacchineEnegyCheck";
RedisValue rawData = await _redisDb.StringGetAsync(currKey);
if (rawData.HasValue)
{
result = JsonConvert.DeserializeObject<List<MacchineEnergyCheckModel>>($"{rawData}");
source = "REDIS";
}
else
{
result = await dbController.MacchineEnergyCheckGetAllAsync();
// serializzp e salvo...
rawData = JsonConvert.SerializeObject(result);
await _redisDb.StringSetAsync(currKey, rawData, FastCache);
}
if (result == null)
{
result = new List<MacchineEnergyCheckModel>();
}
sw.Stop();
Log.Debug($"MacchineEnergyCheckGetAllAsync | {source} | {sw.Elapsed.TotalMilliseconds}ms");
return result;
}
public Task<List<AutocompleteModel>> MachineList(bool onlyEnergy = false)
{
List<AutocompleteModel> answ = new List<AutocompleteModel>();
+1 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<RootNamespace>MP.Stats</RootNamespace>
<UserSecretsId>826e877c-ba70-4253-84cb-d0b1cafd4440</UserSecretsId>
<Version>8.16.2604.2718</Version>
<Version>8.16.2605.0409</Version>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>
+47
View File
@@ -0,0 +1,47 @@
@page "/StatusChecks"
<div class="card">
<div class="card-header table-primary p-1 d-flex justify-content-between">
<div class="px-0">
<b class="fs-4">Status Checks</b>
</div>
<div class="px-0">
<div class="input-group">
<span class="input-group-text">Scdenza (minuti)</span>
<input type="number" class="form-control" @bind="@timeoutMin">
</div>
</div>
</div>
<div class="card-body py-0 px-1">
<table class="table table-sm table-striped">
<thead>
<tr>
<th class="text-start">Idx</th>
<th class="text-start">Macchina</th>
<th class="text-start">descr</th>
<th class="text-start">Flux</th>
<th class="text-end">Last Event</th>
<th class="text-end">Valore</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var record in ListPaged)
{
<tr class="@CheckScadute(record)">
<td>@record.IdxMacchina</td>
<td>@record.Nome</td>
<td>@record.Descrizione</td>
<td>@record.CodFlux</td>
<td class="text-end">@record.dtEvento</td>
<td class="text-end">@record.Valore</td>
</tr>
}
</tbody>
</table>
</div>
<div class="card-footer py-0 px-1 small">
<EgwCoreLib.Razor.DataPager currPage="@pageNum" PageSize="@numRecPage" totalCount="@totalCount" numPageChanged="SavePage" numRecordChanged="SaveNumRec" DisplSize="DataPager.ObjSize.small"></EgwCoreLib.Razor.DataPager>
</div>
</div>
+108
View File
@@ -0,0 +1,108 @@
using Microsoft.AspNetCore.Components;
using Microsoft.Extensions.Configuration;
using MP.Data.DbModels.Energy;
using MP.Stats.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MP.Stats.Pages
{
public partial class StatusChecks
{
#region Protected Properties
[Inject]
protected IConfiguration ConfMan { get; set; } = null!;
[Inject]
protected MpStatsService StatService { get; set; } = null!;
#endregion Protected Properties
#region Protected Methods
protected override void OnInitialized()
{
timeoutMin = ConfMan.GetValue<int>("SpecialConf:TimeoutEnergyFlux");
}
protected override async Task OnParametersSetAsync()
{
await ReloadDataAsync();
UpdateTable();
}
#endregion Protected Methods
#region Private Fields
private List<MacchineEnergyCheckModel> AllRecord = new();
private List<MacchineEnergyCheckModel> ListPaged = new();
private int numRecPage = 10;
private int pageNum = 1;
private int timeoutMin = 30;
private int totalCount = 0;
#endregion Private Fields
#region Private Methods
/// <summary>
/// Scadute se evento > 5 minuti
/// </summary>
/// <param name="item"></param>
/// <returns></returns>
private string CheckScadute(MacchineEnergyCheckModel item)
{
DateTime adesso = DateTime.Now;
var dataAge = adesso.Subtract(item.dtEvento).TotalMinutes;
string status = "";
// se supero limite
if (dataAge >= timeoutMin)
{
// se doppio del limite danger sennò warning...
status = dataAge <= 2 * timeoutMin ? "table-warning" : "table-danger";
}
return status;
}
private async Task ReloadDataAsync()
{
AllRecord = await StatService.MacchineEnergyCheckGetAll();
totalCount = AllRecord.Count;
}
private void SaveNumRec(int newNum)
{
numRecPage = newNum;
UpdateTable();
}
private void SavePage(int newNum)
{
pageNum = newNum;
UpdateTable();
}
private void UpdateTable()
{
// esegue paginazione
if (totalCount > numRecPage)
{
ListPaged = AllRecord.Skip((pageNum - 1) * numRecPage).Take(numRecPage).ToList();
}
else
{
ListPaged = AllRecord;
}
}
#endregion Private Methods
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo statistiche MAPO</i>
<h4>Versione: 8.16.2604.2718</h4>
<h4>Versione: 8.16.2605.0409</h4>
<br />
Note di rilascio:
<ul>
+1 -1
View File
@@ -1 +1 @@
8.16.2604.2718
8.16.2605.0409
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>8.16.2604.2718</version>
<version>8.16.2605.0409</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>
+21 -12
View File
@@ -16,7 +16,7 @@
<ul class="nav flex-column">
<li class="nav-item px-2">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span>
<span class="fa fa-home pe-2" aria-hidden="true"></span>
@if (showText)
{
<span class="@hideText">Home</span>
@@ -25,7 +25,7 @@
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="Oee">
<span class="oi oi-monitor" aria-hidden="true"></span>
<span class="fa fa-display pe-2" aria-hidden="true"></span>
@if (showText)
{
<span class="@hideText">TRS/OEE %</span>
@@ -34,7 +34,7 @@
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="Energy">
<span class="oi oi-bar-chart" aria-hidden="true"></span>
<span class="fa fa-chart-column pe-2" aria-hidden="true"></span>
@if (showText)
{
<span class="@hideText">ENERGY</span>
@@ -43,7 +43,7 @@
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="trend-analysis">
<i class="fa-solid fa-arrow-trend-up pe-3"></i>
<i class="fa fa-arrow-trend-up pe-2"></i>
@if (showText)
{
<span class="@hideText">TREND Analisys</span>
@@ -52,7 +52,7 @@
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="ReportODL">
<span class="oi oi-book" aria-hidden="true" title="Dati di Produzione (P)ODL/Commesse"></span>
<span class="fa fa-bookmark pe-2" aria-hidden="true" title="Dati di Produzione (P)ODL/Commesse"></span>
@if (showText)
{
<span class="@hideText">Rep. ODL/Comm</span>
@@ -61,7 +61,7 @@
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="Diario">
<span class="oi oi-clipboard" aria-hidden="true" title="Dettaglio dati di Produzione"></span>
<span class="fa fa-clipboard pe-2" aria-hidden="true" title="Dettaglio dati di Produzione"></span>
@if (showText)
{
<span class="@hideText">Diario Produzione</span>
@@ -70,7 +70,7 @@
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="UserLog">
<span class="oi oi-document" aria-hidden="true" title="Statistiche Controlli"></span>
<span class="fa fa-document pe-2" aria-hidden="true" title="Statistiche Controlli"></span>
@if (showText)
{
<span class="@hideText">User ActionLog</span>
@@ -79,7 +79,7 @@
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="Controlli">
<span class="oi oi-beaker" aria-hidden="true" title="Registro Controlli"></span>
<span class="fa fa-flask pe-2" aria-hidden="true" title="Registro Controlli"></span>
@if (showText)
{
<span class="@hideText">Registro Controlli</span>
@@ -88,7 +88,7 @@
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="Scarti">
<span class="oi oi-warning" aria-hidden="true" title="Registro Scarti"></span>
<span class="fa fa-warning pe-2" aria-hidden="true" title="Registro Scarti"></span>
@if (showText)
{
<span class="@hideText">Registro Scarti</span>
@@ -97,22 +97,31 @@
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="TaskScheduler">
<span class="oi oi-clock" aria-hidden="true"></span>
<span class="fa fa-clock pe-2" aria-hidden="true"></span>
@if (showText)
{
<span class="@hideText">Task Scheduler</span>
}
</NavLink>
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="StatusChecks">
<span class="fa fa-solid fa-list-check pe-2" aria-hidden="true"></span>
@if (showText)
{
<span class="@hideText">Status Check</span>
}
</NavLink>
</li>
<li class="nav-item px-2">
<NavLink class="nav-link" href="ForceReset">
<span class="oi oi-reload" aria-hidden="true"></span>
<span class="fa fa-rotate pe-2" aria-hidden="true"></span>
@if (showText)
{
<span class="@hideText">Force Reset</span>
}
</NavLink>
</li>
</li>
</ul>
</div>
+1
View File
@@ -61,6 +61,7 @@
"FormatDur": "HH:mm.ss.ff",
"SpecialConf": {
"AppUrl": "/MP/STATS",
"TimeoutEnergyFlux": 60,
"TaskEnableRedis": false,
"TaskManConn": "MP.Stats",
"RedisBaseConf": "MP:TASK:STATS"