Porting a versione 8 della struttura app x SPEC

This commit is contained in:
Samuele Locatelli
2026-05-26 17:49:32 +02:00
parent a94e40a6aa
commit 1cefa18895
25 changed files with 97 additions and 242 deletions
+3 -3
View File
@@ -412,17 +412,17 @@ namespace MP.Data.Controllers
/// <param name="azienda"></param>
/// </summary>
/// <returns></returns>
public List<AnagArticoliModel> ArticoliGetByTipo(string tipo, string azienda = "*")
public async Task<List<AnagArticoliModel>> ArticoliGetByTipoAsync(string tipo, string azienda = "*")
{
List<AnagArticoliModel> dbResult = new List<AnagArticoliModel>();
using (var dbCtx = new MoonProContext(options))
{
dbResult = dbCtx
dbResult = await dbCtx
.DbSetArticoli
.AsNoTracking()
.Where(x => x.Tipo.ToUpper() == tipo.ToUpper() && (azienda == "*" || x.Azienda.ToUpper() == azienda.ToUpper()))
.OrderBy(x => x.CodArticolo)
.ToList();
.ToListAsync();
}
return dbResult;
}
+1 -1
View File
@@ -392,7 +392,7 @@ namespace MP.Data.Services
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
Log.Debug($"ArticoliGetByTipo | Read from {readType}: {ts.TotalMilliseconds}ms");
Log.Debug($"ArticoliGetByTipoAsync | Read from {readType}: {ts.TotalMilliseconds}ms");
return result;
}
-14
View File
@@ -1,14 +0,0 @@
<CascadingAuthenticationState>
<Router AppAssembly="@typeof(App).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
</CascadingAuthenticationState>
+43
View File
@@ -0,0 +1,43 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="google" content="notranslate" />
@* <base href="/" /> *@
@* <base href="/MP/SPEC" /> *@
<meta name="description" content="MAPO SPEC Site" />
<meta name="author" content="EgalWare" />
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico" />
<title>MP-SPEC</title>
<!-- CSS -->
<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css" />
<link rel="stylesheet" href="lib/bootstrap-icons/font/bootstrap-icons.min.css" />
<link rel="stylesheet" href="css/site.min.css" />
<link rel="stylesheet" href="lib/font-awesome/css/all.min.css" />
<link rel="stylesheet" href="MP.SPEC.styles.css" />
@* <link rel="icon" type="image/png" href="favicon.ico" /> *@
<HeadOutlet @rendermode="@(new InteractiveServerRenderMode(prerender: false))" />
</head>
<body>
<Routes @rendermode="@(new InteractiveServerRenderMode(prerender: false))" />
<script src="_framework/blazor.web.js"></script>
<div id="blazor-error-ui">
<span>An error has occurred.</span>
<a href="" class="reload">Reload</a>
<a class="dismiss">🗙</a>
</div>
<!-- JS -->
<script src="lib/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="lib/chartBoot.js"></script>
<script src="lib/modalHandler.js"></script>
<script src="lib/Chart.js/chart.js"></script>
</body>
</html>
@@ -1,4 +1,4 @@
namespace MP.SPEC.Shared
namespace MP.SPEC.Components.Layout
{
public partial class MainLayout
{
@@ -2,7 +2,7 @@ using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Mvc.RazorPages;
using MP.SPEC.Data;
namespace MP.SPEC.Shared
namespace MP.SPEC.Components.Layout
{
public partial class NavMenu : IDisposable
{
+1 -3
View File
@@ -1,8 +1,6 @@
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.JSInterop;
using MP.Data.DbModels;
using MP.SPEC.Components;
using MP.SPEC.Data;
using MP.SPEC.Services;
using NLog;
@@ -209,7 +207,7 @@ namespace MP.SPEC.Components
protected override async Task OnInitializedAsync()
{
ListStati = await MDService.AnagStatiComm();
ListArtKit = MDService.ArticoliGetByTipo("KIT", "*");
ListArtKit = await MDService.ArticoliGetByTipoAsync("KIT", "*");
string SPEC_PODL_gest = await MDService.ConfigTryGetAsync("SPEC_PODL_gest");
if (!string.IsNullOrEmpty(SPEC_PODL_gest))
{
+1 -2
View File
@@ -216,9 +216,8 @@ namespace MP.SPEC.Components
.Select(x => x.IdxMacchina)
.ToHashSet();
ListStati = await MDService.AnagStatiComm();
ListArtKit = MDService.ArticoliGetByTipo("KIT", "*");
ListArtKit = await MDService.ArticoliGetByTipoAsync("KIT", "*");
string strMachRecipe = await MDService.ConfigTryGetAsync("MachineWithRecipe");
if (!string.IsNullOrEmpty(strMachRecipe))
{
+12
View File
@@ -0,0 +1,12 @@
<Router AppAssembly="typeof(Program).Assembly">
<Found Context="routeData">
<AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
</Found>
<NotFound>
<PageTitle>Not found</PageTitle>
<LayoutView Layout="@typeof(MainLayout)">
<p role="alert">Sorry, there's nothing at this address.</p>
</LayoutView>
</NotFound>
</Router>
+9 -95
View File
@@ -417,15 +417,15 @@ namespace MP.SPEC.Data
/// <param name="tipo"></param>
/// <param name="azienda"></param>
/// <returns></returns>
public List<AnagArticoliModel> ArticoliGetByTipo(string tipo, string azienda = "*")
public async Task<List<AnagArticoliModel>> ArticoliGetByTipoAsync(string tipo, string azienda = "*")
{
using var activity = ActivitySource.StartActivity("ArticoliGetByTipo");
using var activity = ActivitySource.StartActivity("ArticoliGetByTipoAsync");
List<AnagArticoliModel>? result = new List<AnagArticoliModel>();
string source = "DB";
string sKey = string.IsNullOrEmpty(tipo) ? "ALL" : tipo;
string currKey = $"{Utils.redisArtList}:{azienda}:Tipo:{sKey}";
// cerco in redis dato valore sel idxMaccSel...
RedisValue rawData = redisDb.StringGet(currKey);
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (rawData.HasValue)
{
result = JsonConvert.DeserializeObject<List<AnagArticoliModel>>($"{rawData}");
@@ -433,10 +433,10 @@ namespace MP.SPEC.Data
}
else
{
result = dbController.ArticoliGetByTipo(tipo, azienda);
result = await dbController.ArticoliGetByTipoAsync(tipo, azienda);
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
redisDb.StringSet(currKey, rawData, getRandTOut(redisLongTimeCache));
await redisDb.StringSetAsync(currKey, rawData, getRandTOut(redisLongTimeCache));
}
if (result == null)
{
@@ -445,7 +445,7 @@ namespace MP.SPEC.Data
activity?.SetTag("data.source", source);
activity?.SetTag("result.count", result.Count);
activity?.Stop();
LogTrace($"ArticoliGetByTipo | Read from {source}: {activity?.Duration.TotalMilliseconds}ms");
LogTrace($"ArticoliGetByTipoAsync | Read from {source}: {activity?.Duration.TotalMilliseconds}ms");
return result;
}
@@ -685,34 +685,6 @@ namespace MP.SPEC.Data
LogTrace($"ConfigTryGet Read from {source}: {activity?.Duration.TotalMilliseconds}ms");
return value ?? "";
#if false
string answ = "";
using var activity = ActivitySource.StartActivity("ConfigTryGet");
string source = "DB+REDIS";
// preselezione valori
if (configData == null || configData.Count == 0)
{
configData = ConfigGetAll();
}
var currRec = configData.FirstOrDefault(x => x.Chiave == keyName);
// se non trovato provo a ricaricare..
if (currRec == null)
{
configData = ConfigGetAll();
currRec = configData.FirstOrDefault(x => x.Chiave == keyName);
}
// verifico se ci sia il dato...
if (currRec != null)
{
answ = currRec.Valore;
}
activity?.SetTag("data.source", source);
activity?.Stop();
LogTrace($"ConfigTryGet Read from {source}: {activity?.Duration.TotalMilliseconds}ms");
return answ;
#endif
}
/// <summary>
@@ -732,36 +704,8 @@ namespace MP.SPEC.Data
activity?.SetTag("data.source", source);
activity?.Stop();
LogTrace($"ConfigTryGetAsync Read from {source}: {activity?.Duration.TotalMilliseconds}ms");
LogTrace($"ConfigTryGetAsync | {keyName} | Read from {source}: {activity?.Duration.TotalMilliseconds}ms");
return value ?? "";
#if false
string answ = "";
using var activity = ActivitySource.StartActivity("ConfigTryGetAsync");
string source = "DB+REDIS";
// preselezione valori
if (configData == null || configData.Count == 0)
{
configData = await ConfigGetAllAsync();
}
var currRec = configData.FirstOrDefault(x => x.Chiave == keyName);
// se non trovato provo a ricaricare..
if (currRec != null)
{
configData = await ConfigGetAllAsync();
currRec = configData.FirstOrDefault(x => x.Chiave == keyName);
}
// verifico se ci sia il dato...
if (currRec != null)
{
answ = currRec.Valore;
}
activity?.SetTag("data.source", source);
activity?.Stop();
LogTrace($"ConfigTryGetAsync Read from {source}: {activity?.Duration.TotalMilliseconds}ms");
return answ;
#endif
}
/// <summary>
@@ -2070,27 +2014,6 @@ namespace MP.SPEC.Data
// chiamo metodo conferma!
fatto = await dbController.ODLClose(idxOdl, idxMacchina, matrOpr, confPezzi, confRett, modoConfProd);
#if false
// recupero dati x conf modalità conferma
var configData = await ConfigGetAllAsync();
if (configData != null)
{
bool confRett = false;
var currRec = configData.FirstOrDefault(x => x.Chiave == "confRett");
if (currRec != null)
{
bool.TryParse(currRec.Valore, out confRett);
}
int modoConfProd = 0;
currRec = configData.FirstOrDefault(x => x.Chiave == "modoConfProd");
if (currRec != null)
{
int.TryParse(currRec.Valore, out modoConfProd);
}
// chiamo metodo conferma!
fatto = await dbController.ODLClose(idxOdl, idxMacchina, matrOpr, confPezzi, confRett, modoConfProd);
}
#endif
activity?.SetTag("data.source", source);
activity?.Stop();
LogTrace($"ODLClose | Read from {source}: {activity?.Duration.TotalMilliseconds}ms");
@@ -3344,17 +3267,6 @@ namespace MP.SPEC.Data
#endregion Private Fields
#region Private Properties
#if false
/// <summary>
/// Cache dati config
/// </summary>
private List<ConfigModel> configData { get; set; } = new List<ConfigModel>();
#endif
#endregion Private Properties
#region Private Methods
/// <summary>
@@ -3368,6 +3280,7 @@ namespace MP.SPEC.Data
ExecFlushRedisPattern(pattern);
}
}
private void EnsureConfigLoaded()
{
if (_configData.Count == 0)
@@ -3379,6 +3292,7 @@ namespace MP.SPEC.Data
.ToDictionary(g => g.Key, g => g.First().Valore);
}
}
private async Task EnsureConfigLoadedAsync()
{
if (_configData.Count == 0)
+1 -1
View File
@@ -5,7 +5,7 @@
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>MP.SPEC</RootNamespace>
<Version>8.16.2605.2616</Version>
<Version>8.16.2605.2617</Version>
<UserSecretsId>1800a78a-6ff1-40f9-b490-87fb8bfc1394</UserSecretsId>
<SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>
-8
View File
@@ -1,8 +0,0 @@
@page "/"
@namespace MP.SPEC.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@{
Layout = "_Layout";
}
<component type="typeof(App)" render-mode="Server" />
-69
View File
@@ -1,69 +0,0 @@
@using Microsoft.AspNetCore.Components.Web
@namespace MP.SPEC.Pages
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<!DOCTYPE html>
<html lang="en">
<head>
<title>MP-SPEC</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="google" content="notranslate">
<base href="~/" />
<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css" />
<link rel="stylesheet" href="lib/bootstrap-icons/font/bootstrap-icons.min.css" />
<link rel="stylesheet" href="css/site.min.css" />
<link rel="stylesheet" href="lib/font-awesome/css/all.min.css" />
<link href="MP.SPEC.styles.css" rel="stylesheet" />
<link rel="icon" type="image/png" href="favicon.ico" />
<component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
</head>
<body>
@RenderBody()
<div id="blazor-error-ui">
<environment include="Staging,Production">
An error has occurred. This application may no longer respond until reloaded.
</environment>
<environment include="Development">
An unhandled exception has occurred. See browser dev tools for details.
</environment>
<a href="" class="reload">Reload</a>
<a class="dismiss">🗙</a>
</div>
<script src="lib/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="lib/chartBoot.js"></script>
<script src="lib/modalHandler.js"></script>
<script src="lib/Chart.js/chart.js"></script>
<script src="_framework/blazor.server.js" autostart="false"></script>
@*Gestione autoriconnessione: https://github.com/dotnet/aspnetcore/issues/38305 (vedere anche https://docs.microsoft.com/it-it/aspnet/core/blazor/fundamentals/signalr?view=aspnetcore-6.0#modify-the-reconnection-handler-blazor-server)*@
<script>
Blazor.start({
reconnectionOptions: {
maxRetries: 600,
retryIntervalMilliseconds: 1000
},
reconnectionHandler: {
onConnectionDown: (options, error) => console.error(error),
onConnectionUp: () => console.log("Client reconnected!")
}
}).then(() => {
Object.defineProperty(Blazor.defaultReconnectionHandler, '_reconnectionDisplay', {
get() {
return this.__reconnectionDisplay;
},
set(value) {
this.__reconnectionDisplay = {
show: () => value.show(),
update: (d) => value.update(d),
rejected: (d) => document.location.reload()
}
}
});
});
</script>
</body>
</html>
+18 -40
View File
@@ -1,10 +1,6 @@
using Microsoft.AspNetCore.Authentication.Negotiate;
using Microsoft.AspNetCore.Components;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.FileProviders;
using Microsoft.JSInterop;
using MP.AppAuth.Services;
using MP.Data.Services;
using MP.SPEC.Components;
@@ -12,7 +8,6 @@ using MP.SPEC.Data;
using MP.SPEC.Services;
using NLog;
using NLog.Targets;
using NLog.Targets.OpenTelemetryProtocol;
using NLog.Web;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
@@ -21,14 +16,6 @@ using StackExchange.Redis;
var builder = WebApplication.CreateBuilder(args);
/*--------------------
* Note migrazione startup.cs --> program.cs:
*
* - https://stackoverflow.com/questions/69722872/asp-net-core-6-how-to-access-ConfMan-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
*
* */
ConfigurationManager configuration = builder.Configuration;
var logger = LogManager.Setup()
@@ -141,10 +128,13 @@ builder.Services.AddAuthorization(options =>
options.FallbackPolicy = options.DefaultPolicy;
});
// redis replliminare
//setup Blazor
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
// redis preliminare
builder.Services.AddSingleton<IConnectionMultiplexer>(redisMultiplexer);
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddSingleton<MpDataService>();
builder.Services.AddSingleton<ListSelectDataSrv>();
builder.Services.AddSingleton<IOApiService>();
@@ -153,20 +143,10 @@ builder.Services.AddScoped<MsgServiceSpec>();
builder.Services.AddSingleton<SharedMemService>();
builder.Services.AddSingleton<TabDataService>();
builder.Services.AddSingleton<TabDataFeeder>();
#if false
builder.Services.AddBlazoredLocalStorage();
builder.Services.AddBlazoredSessionStorage();
#endif
// aggiunta helper local/session storage service
builder.Services.AddScoped<ISessionStorageService, SessionStorageService>();
builder.Services.AddScoped<ILocalStorageService, LocalStorageService>();
//builder.Services.AddScoped<SessionStorageService>();
//builder.Services.AddScoped<LocalStorageService>();
//builder.Services.AddScoped<ISessionStorageService>(sp =>
// new SessionStorageService(sp.GetRequiredService<IJSRuntime>()));
//builder.Services.AddScoped<ILocalStorageService>(sp =>
// new LocalStorageService(sp.GetRequiredService<IJSRuntime>()));
builder.Services.AddHttpClient();
@@ -179,7 +159,9 @@ logger.Info("Build App");
// aggiunt base URL x routing corretto
app.UsePathBase(configuration.GetValue<string>("SpecialConf:AppUrl"));
string baseUrl = configuration.GetValue<string>("SpecialConf:AppUrl") ?? "";
app.UsePathBase(baseUrl);
logger.Info($"BaseUrl: {baseUrl}");
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
@@ -193,6 +175,13 @@ app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseAntiforgery();
// gestione static files: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-8.0
string BasePathOdlReturn = configuration.GetValue<string>("ServerConf:BasePathOdlReturn") ?? configuration.GetValue<string>("OptConf:BasePathOdlReturn") ?? "";
if (!string.IsNullOrEmpty(BasePathOdlReturn))
@@ -234,19 +223,8 @@ if (!string.IsNullOrEmpty(BasePathOdlReturn))
}
}
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});
//app.MapBlazorHub();
//app.MapFallbackToPage("/_Host");
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
logger.Info("Run App");
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MAPOSPEC </i>
<h4>Versione: 8.16.2605.2616</h4>
<h4>Versione: 8.16.2605.2617</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
8.16.2605.2616
8.16.2605.2617
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>8.16.2605.2616</version>
<version>8.16.2605.2617</version>
<url>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/MP.SPEC.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-SPEC/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
+2
View File
@@ -1,5 +1,6 @@
@using System.Net.Http
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@@ -15,6 +16,7 @@
@using MP.SPEC.Components
@using MP.SPEC.Components.Chart
@using MP.SPEC.Components.Fermate
@using MP.SPEC.Components.Layout
@using MP.SPEC.Components.ProdKit
@using MP.SPEC.Components.Reparti
@using EgwCoreLib.Razor
+1 -1
View File
@@ -81,7 +81,7 @@
"maxChar4Scroll": 21
},
"SpecialConf": {
"AppUrl": "/MP/SPEC",
"AppUrl": "/MP/SPEC/",
"CodApp": "MP-SPEC",
"CodModulo": "MP-SPEC"
}