From d0f32c6c5d543fcc7fa91e3e8024296d4c1d709d Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 4 Nov 2025 17:21:06 +0100 Subject: [PATCH] Bozza modifica img unificata SVG/PNG --- EgwCoreLib.Lux.Data/ModelBuilderExtensions.cs | 8 +- .../Services/ImageCacheService.cs | 9 +- Lux.API/Controllers/GenericController.cs | 2 +- Lux.API/Controllers/ImageController.cs | 133 +++++++++++++++--- Lux.API/Controllers/WindowController.cs | 4 +- Lux.API/Lux.API.csproj | 2 +- Lux.UI/Components/Compo/OfferRowMan.razor | 1 - Lux.UI/Components/Compo/OfferRowMan.razor.cs | 19 ++- Lux.UI/Lux.UI.csproj | 2 +- Resources/ChangeLog.html | 2 +- Resources/VersNum.txt | 2 +- Resources/manifest.xml | 2 +- 12 files changed, 148 insertions(+), 38 deletions(-) diff --git a/EgwCoreLib.Lux.Data/ModelBuilderExtensions.cs b/EgwCoreLib.Lux.Data/ModelBuilderExtensions.cs index 4f48ae54..67ec17bf 100644 --- a/EgwCoreLib.Lux.Data/ModelBuilderExtensions.cs +++ b/EgwCoreLib.Lux.Data/ModelBuilderExtensions.cs @@ -44,10 +44,10 @@ namespace EgwCoreLib.Lux.Data // init dati x invio serializzazioni da environment modelBuilder.Entity().HasData( - new EnvirParamModel { EnvirID = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW, SerStrucKey = "Jwd" }, - new EnvirParamModel { EnvirID = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.BEAM, SerStrucKey = "Btl" }, - new EnvirParamModel { EnvirID = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.CABINET, SerStrucKey = "Btl" }, - new EnvirParamModel { EnvirID = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WALL, SerStrucKey = "Btl" } + new EnvirParamModel { EnvirID = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW, SerStrucKey = "SerializedData" }, + new EnvirParamModel { EnvirID = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.BEAM, SerStrucKey = "SerializedData" }, + new EnvirParamModel { EnvirID = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.CABINET, SerStrucKey = "SerializedData" }, + new EnvirParamModel { EnvirID = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WALL, SerStrucKey = "SerializedData" } ); modelBuilder.Entity().HasData( diff --git a/EgwCoreLib.Lux.Data/Services/ImageCacheService.cs b/EgwCoreLib.Lux.Data/Services/ImageCacheService.cs index 274b47be..b50ccdd1 100644 --- a/EgwCoreLib.Lux.Data/Services/ImageCacheService.cs +++ b/EgwCoreLib.Lux.Data/Services/ImageCacheService.cs @@ -123,12 +123,19 @@ namespace EgwCoreLib.Lux.Data.Services public string ImageUrl(string baseUrl, bool isLive, string imgUID, EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS envir = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW) { string tag = isLive ? liveTag : cacheTag; + string fType = "undef"; if (imgUID.EndsWith(".svg")) { + fType = "svg"; imgUID.Replace(".svg", ""); } + else if (imgUID.EndsWith(".png")) + { + fType = "png"; + imgUID.Replace(".png", ""); + } string rndImg = $"{DateTime.Now:HHmmssfff}"; - string fullUrl = $"{baseUrl}/{tag}/{imgUID}-{rndImg}.svg?envir={envir}".Replace("////", "//"); + string fullUrl = $"{baseUrl}/{tag}/{imgUID}-{rndImg}.{fType}?envir={envir}".Replace("////", "//"); return fullUrl; } diff --git a/Lux.API/Controllers/GenericController.cs b/Lux.API/Controllers/GenericController.cs index 048c9b62..fc1a9a72 100644 --- a/Lux.API/Controllers/GenericController.cs +++ b/Lux.API/Controllers/GenericController.cs @@ -92,7 +92,7 @@ namespace Lux.API.Controllers DictExec.Add("Mode", $"{(int)Enums.QuestionModes.BOM}"); // UID cablato x ora... DictExec.Add("UID", id); - DictExec.Add("Jwd", currSer); + DictExec.Add("SerializedData", currSer); int nId = 1; // da modificare con tipo richiesta... QuestionDTO currArgs = new QuestionDTO(nId, EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW, DictExec); diff --git a/Lux.API/Controllers/ImageController.cs b/Lux.API/Controllers/ImageController.cs index 9501e2d2..2cf19496 100644 --- a/Lux.API/Controllers/ImageController.cs +++ b/Lux.API/Controllers/ImageController.cs @@ -1,7 +1,9 @@ using EgwCoreLib.Lux.Data.Services; +using EgwMultiEngineManager.Data; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using NLog; +using System; using System.Diagnostics; using System.Text; @@ -11,11 +13,45 @@ namespace Lux.API.Controllers [ApiController] public class ImageController : ControllerBase { + #region Public Constructors + public ImageController(ImageCacheService imgServ, ILogger logger) { _imgService = imgServ; _logger = logger; } + + #endregion Public Constructors + + #region Public Methods + + /// + /// Chiamata GET: restituisce file PNG (da file o da cache) + /// PUT: api/image/png/00000000-0000-0000-0000-000000000000 + /// + /// id oggetto + /// + [HttpGet("png/{id}")] + public async Task png(string id) + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + string base64Encoded = ""; + byte[] decodedBytes = new byte[0]; + // ...se ricevo percorso --> leggo jwd/svg cablato + if (!string.IsNullOrEmpty(id)) + { + // bonifica nome svg da + base64Encoded = _imgService.LoadPng(id, EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.BEAM); + // converto base64 + decodedBytes = Convert.FromBase64String(base64Encoded); + } + sw.Stop(); + Log.Info($"pngString | {sw.Elapsed.TotalMilliseconds:N3} ms"); + //return Ok(decodedString); + return File(decodedBytes, "image/png"); + } + /// /// Chiamata GET: riceve Json in formato JwdDto, restituisce svg file /// GET: api/Jwd/svg/00000000-0000-0000-0000-000000000000 @@ -35,37 +71,98 @@ namespace Lux.API.Controllers return File(bytes, "image/svg+xml"); } - /// - /// Chiamata GET: restituisce file PNG (da file o da cache) - /// PUT: api/image/png/00000000-0000-0000-0000-000000000000 + /// Chiamata GET: restituisce file SVG/PNG (da file o cache REDIS), eliminando nome rand (x force refresh) + /// GET: api/image/file/OFF0000001.001.svg?env=WINDOW + /// GET: api/image/cache/OFF0000001.001.svg?env=WINDOW + /// GET: api/image/file/OFF0000002.001.png?env=WINDOW + /// GET: api/image/cache/OFF0000002.001.png?env=WINDOW + /// GET: api/image/file/OFF0000002.002-123456.png?env=WINDOW + /// GET: api/image/cache/OFF0000002.002-123456.png?env=WINDOW /// - /// id oggetto + /// uid oggetto + /// environment oggetto /// - [HttpGet("png/{id}")] - public async Task png(string id) + [HttpGet("{id}")] + //[HttpGet("file/{id}")] + //[HttpGet("cache/{id}")] + public async Task cacheFile(string id, EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS env = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW) { Stopwatch sw = new Stopwatch(); sw.Start(); - string base64Encoded = ""; - byte[] decodedBytes = new byte[0]; + + if (string.IsNullOrEmpty(id)) + return NotFound(); + + string mimeType = "txt"; + byte[] bytes = new byte[0]; // ...se ricevo percorso --> leggo jwd/svg cablato if (!string.IsNullOrEmpty(id)) { - // bonifica nome svg da - base64Encoded = _imgService.LoadPng(id, EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.BEAM); - // converto base64 - decodedBytes = Convert.FromBase64String(base64Encoded); + // se contiene ".svg" lo levo... + if (id.EndsWith(".svg")) + { + mimeType = "image/svg+xml"; + //id = id.Replace(".svg", ""); + } + else if (id.EndsWith(".png")) + { + mimeType = "image/png"; + //id.Replace(".png", ""); + } + // se contiene i caratteri casuali x forzare reload --> li levo + if (id.Contains("-")) + { + id = id.Substring(0, id.IndexOf("-")); + } + + // secondo del tipo + envr decodifico valore corretto + switch (env) + { + case Constants.EXECENVIRONMENTS.NULL: + break; + case Constants.EXECENVIRONMENTS.WINDOW: + mimeType = "image/svg+xml"; + string svgContent = await _imgService.LoadSvgAsync(id, env); + // se vuoto --> leggo img logo... + if (string.IsNullOrEmpty(svgContent)) + { + string filePath = Path.Combine("DemoImg", "LogoEgalware.svg"); + svgContent = await System.IO.File.ReadAllTextAsync(filePath); + } + bytes = Encoding.UTF8.GetBytes(svgContent); + break; + case Constants.EXECENVIRONMENTS.BEAM: + case Constants.EXECENVIRONMENTS.WALL: + case Constants.EXECENVIRONMENTS.CABINET: + default: + mimeType = "image/png"; + string base64Encoded = _imgService.LoadPng(id, EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.BEAM); + // converto base64 + bytes = Convert.FromBase64String(base64Encoded); + break; + } } sw.Stop(); - Log.Info($"pngString | {sw.Elapsed.TotalMilliseconds:N3} ms"); - //return Ok(decodedString); - return File(decodedBytes, "image/png"); + Log.Info($"{mimeType} | {sw.Elapsed.TotalMilliseconds:N3} ms"); + return File(bytes, mimeType); } - private ImageCacheService _imgService { get; set; } - private readonly ILogger _logger; + + #endregion Public Methods + + #region Private Fields + private static Logger Log = LogManager.GetCurrentClassLogger(); + private readonly ILogger _logger; + + #endregion Private Fields + + #region Private Properties + + private ImageCacheService _imgService { get; set; } + + #endregion Private Properties } -} +} \ No newline at end of file diff --git a/Lux.API/Controllers/WindowController.cs b/Lux.API/Controllers/WindowController.cs index 479b52aa..3e6b752d 100644 --- a/Lux.API/Controllers/WindowController.cs +++ b/Lux.API/Controllers/WindowController.cs @@ -64,7 +64,7 @@ namespace Lux.API.Controllers DictExec.Add("Mode", $"{(int)Egw.Window.Data.Enums.QuestionModes.BOM}"); // UID cablato x ora... DictExec.Add("UID", id); - DictExec.Add("Jwd", currJwd); + DictExec.Add("SerializedData", currJwd); int nId = 1; // da modificare con tipo richiesta... QuestionDTO currArgs = new QuestionDTO(nId, EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW, DictExec); @@ -242,7 +242,7 @@ namespace Lux.API.Controllers DictExec.Add("Mode", $"{(int)Egw.Window.Data.Enums.QuestionModes.PREVIEW}"); // UID cablato x ora... DictExec.Add("UID", id); - DictExec.Add("Jwd", currJwd); + DictExec.Add("SerializedData", currJwd); int nId = 1; // da modificare con tipo richiesta... QuestionDTO currArgs = new QuestionDTO(nId, EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.WINDOW, DictExec); diff --git a/Lux.API/Lux.API.csproj b/Lux.API/Lux.API.csproj index 2918b445..15480cf1 100644 --- a/Lux.API/Lux.API.csproj +++ b/Lux.API/Lux.API.csproj @@ -4,7 +4,7 @@ net8.0 enable enable - 0.9.2511.0318 + 0.9.2511.0417 diff --git a/Lux.UI/Components/Compo/OfferRowMan.razor b/Lux.UI/Components/Compo/OfferRowMan.razor index ff07f72c..87df8a22 100644 --- a/Lux.UI/Components/Compo/OfferRowMan.razor +++ b/Lux.UI/Components/Compo/OfferRowMan.razor @@ -88,7 +88,6 @@ else - @* @item.RowNum *@ @if (DisplayMode == EgwCoreLib.Lux.Core.Enums.DisplayMode.Edit) diff --git a/Lux.UI/Components/Compo/OfferRowMan.razor.cs b/Lux.UI/Components/Compo/OfferRowMan.razor.cs index 72375eeb..0681cfa2 100644 --- a/Lux.UI/Components/Compo/OfferRowMan.razor.cs +++ b/Lux.UI/Components/Compo/OfferRowMan.razor.cs @@ -711,9 +711,9 @@ namespace Lux.UI.Components.Compo await reqBomUpdate(EditRecord); } // aggiorno nel dizionari - if (reqDict.ContainsKey("Jwd")) + if (reqDict.ContainsKey("SerializedData")) { - reqDict["Jwd"] = prevJwd; + reqDict["SerializedData"] = prevJwd; } if (reqDict != null && reqDict.Count > 0) @@ -1058,7 +1058,7 @@ namespace Lux.UI.Components.Compo Dictionary DictExec = new Dictionary(); // verifico parametri da conf envir... var envRec = AllConfEnvir.FirstOrDefault(x => x.EnvirID == currRec.Envir); - string serKey = envRec != null ? envRec.SerStrucKey : "Jwd"; + string serKey = envRec != null ? envRec.SerStrucKey : "SerializedData"; // cablata la BOM DictExec.Add("Mode", $"{(int)Egw.Window.Data.Enums.QuestionModes.BOM}"); // UID cablato x ora... @@ -1108,9 +1108,9 @@ namespace Lux.UI.Components.Compo if (EditRecord != null) { // SE contiene il mio Jwd... - if (args.ContainsKey("Jwd")) + if (args.ContainsKey("SerializedData")) { - string serStruct = args["Jwd"]; + string serStruct = args["SerializedData"]; // controllo SE variato... if (!prevJwd.Equals(serStruct) || !EgwCoreLib.Utils.DictUtils.DictAreEqual(reqDict, args)) { @@ -1231,13 +1231,20 @@ namespace Lux.UI.Components.Compo // parametri richiesta fileArgs.Add("Mode", $"{(int)Egw.Window.Data.Enums.QuestionModes.PREVIEW}"); - fileArgs.Add("Btl", rawContent); + fileArgs.Add("SubMode", "2"); + fileArgs.Add("FileName", $"{file.Name}"); + fileArgs.Add("Height", "1200"); + fileArgs.Add("Width", "1800"); + //fileArgs.Add("Btl", rawContent); + fileArgs.Add("SerializedData", rawContent); // invio! CalcRequestDTO calcRequestDTO = new CalcRequestDTO(); calcRequestDTO.EnvType = EgwMultiEngineManager.Data.Constants.EXECENVIRONMENTS.BEAM; calcRequestDTO.DictExec = fileArgs; await ICService.CallRestPost($"{apiUrl}/{genericBasePath}", $"{calcTag}/{EditRecord.OfferRowUID}", calcRequestDTO); + // ora chiedo anche la BOM! + #if false // salvo in locale il file: SISTEMARE PERMESSI saveFileContent(EditFileRecord.OfferRowUID, trustedFileName, rawContent); diff --git a/Lux.UI/Lux.UI.csproj b/Lux.UI/Lux.UI.csproj index 9b58d213..e2fcfaf3 100644 --- a/Lux.UI/Lux.UI.csproj +++ b/Lux.UI/Lux.UI.csproj @@ -5,7 +5,7 @@ enable enable aspnet-Lux.UI-a758c101-a2f4-4e38-977d-1c4887dbbd50 - 0.9.2511.0318 + 0.9.2511.0417 diff --git a/Resources/ChangeLog.html b/Resources/ChangeLog.html index 277c271a..13597d39 100644 --- a/Resources/ChangeLog.html +++ b/Resources/ChangeLog.html @@ -1,6 +1,6 @@ LUX - Web Windows MES -

Versione: 0.9.2511.0318

+

Versione: 0.9.2511.0417


Note di rilascio:
  • diff --git a/Resources/VersNum.txt b/Resources/VersNum.txt index 081d5110..3fcebeaf 100644 --- a/Resources/VersNum.txt +++ b/Resources/VersNum.txt @@ -1 +1 @@ -0.9.2511.0318 +0.9.2511.0417 diff --git a/Resources/manifest.xml b/Resources/manifest.xml index 803dc1a4..63fb2cc5 100644 --- a/Resources/manifest.xml +++ b/Resources/manifest.xml @@ -1,6 +1,6 @@ - 0.9.2511.0318 + 0.9.2511.0417 http://nexus.steamware.net/repository/SWS/GPW/stable/GPW.UI.zip http://nexus.steamware.net/repository/SWS/GPW/stable/ChangeLog.html false