Fix metodo GetArtNum

This commit is contained in:
Samuele Locatelli
2026-04-15 18:11:08 +02:00
parent 0e4efcd209
commit 257ddbf775
8 changed files with 183 additions and 11 deletions
+2
View File
@@ -20,6 +20,8 @@ namespace MP.Core
public const string redisConfKey = redisBaseAddr + "Cache:Config";
public const string redisDecNumArtKey = redisBaseAddr + "Cache:DecNumArt";
public const string redisDossByMac = redisBaseAddr + "Cache:DossByMac";
public const string redisEventList = redisBaseAddr + "Cache:EventList";
+27 -4
View File
@@ -2,6 +2,7 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using MP.Data.DbModels;
using MP.Data.DbModels.Anag;
using NLog;
using System;
using System.Collections.Generic;
@@ -55,6 +56,28 @@ namespace MP.Data.Controllers
return fatto;
}
/// <summary>
/// Elenco tabella decodifica articoli / codice decimale
/// </summary>
/// <param name="codArt">Vuoto = tutti / Singolo CodArt</param>
/// <returns></returns>
public async Task<List<DecNumArticoliModel>> DecNumArtGetFiltAsync(string codArt = "")
{
List<DecNumArticoliModel> dbResult = new List<DecNumArticoliModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
var query = dbCtx.DbSetDecNumArt
.AsNoTracking()
.AsQueryable();
if (!string.IsNullOrEmpty(codArt))
query = query.Where(x => x.CodArticolo == codArt);
dbResult = await query.ToListAsync();
}
return dbResult;
}
/// <summary>
/// Elenco da tabella Config
/// </summary>
@@ -65,10 +88,10 @@ namespace MP.Data.Controllers
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetConfig
.AsNoTracking()
.OrderBy(x => x.Chiave)
.ToList();
.DbSetConfig
.AsNoTracking()
.OrderBy(x => x.Chiave)
.ToList();
}
return dbResult;
}
+106 -3
View File
@@ -32,7 +32,7 @@ namespace MP.IOC.Controllers
[HttpGet("addOptPar/{id}")]
public async Task<IActionResult> AddOptPar(string id, string pName, string pValue)
{
DService.ScriviKeepAlive(id, DateTime.Now);
await DService.ScriviKeepAliveAsync(id, DateTime.Now);
try
{
DService.AddOptPar4Machine(id, pName, pValue);
@@ -440,7 +440,7 @@ namespace MP.IOC.Controllers
id = id.Replace("|", "#");
string answ = "";
// scrivo keep alive!!! (se necessario, altrimenti è in cache...)
DService.ScriviKeepAlive(id, DateTime.Now);
await DService.ScriviKeepAliveAsync(id, DateTime.Now);
try
{
// leggo da REDIS eventuale elenco task x macchina...
@@ -452,6 +452,109 @@ namespace MP.IOC.Controllers
return Ok(answ);
}
/// <summary>
/// Recupera ArtNum dato CodXdl (per impianti che accettano solo INT in scrittura):
/// GET: IOB/getArtNum/SIMUL_03?CodXdl=ABC123
/// </summary>
/// <param name="id">IdxMacchina (NON considerato)</param>
/// <param name="CodArt">CodXdl richiesto, se vuoto restituisce TUTTI i valori in tabella di decodifica</param>
/// <returns>Json contenente le righe delle codifiche attive Articolo/Numero</returns>
[HttpGet("getArtNum/{id}")]
public async Task<IActionResult> GetArtNum(string id, string CodArt = "")
{
// in realtà ID macchina non conterebbe...
if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID");
// Multi: gestione carattere "|" trasformato in "#"
id = id.Replace("|", "#");
string answ = "";
try
{
await DService.ScriviKeepAliveAsync(id, DateTime.Now);
// leggo da REDIS eventuale elenco task x macchina...
Dictionary<string, int> valori = await DService.GetArtNumAsync(CodArt);
answ = JsonConvert.SerializeObject(valori);
}
catch (Exception exc)
{
Log.Error($"Errore in GetArtNum{Environment.NewLine}{exc}");
return StatusCode(StatusCodes.Status500InternalServerError, "NO");
}
return Ok(answ);
}
#if false
/// <summary>
/// Restituisce il valore dello stato di IDLE della macchina, quindi SOLO SE NON é in lavoro
/// e già convertito in minuti...
/// GET: IOB/getIdlePeriod/SIMUL_01
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("getIdlePeriod/{id}")]
public int GetIdlePeriod(string id)
{
// attenzione! poiché nell'URL il carattere "#" viene filtrato ci aspettiamo il
// carattere "|" che poi trasformiamo ora in "#"
id = id.Replace("|", "#");
int answ = 0;
DataLayer DataLayerObj = new DataLayer();
DS_applicazione.StatoMacchineDataTable currData = null;
// chiamo metodo redis/db...
try
{
currData = DataLayerObj.currSMTab(id);
if (currData.Count > 0)
{
// recupero da redis elenco stati
DS_applicazione.AnagraficaStatiDataTable anagStati = DataLayerObj.AnagraficaStati();
DS_applicazione.AnagraficaStatiRow currStato = anagStati.FindByIdxStato(currData[0].IdxStato);
// calcolo SE sia idle... OVVERO SEMAFORO NON VERDE!!!
if (currStato.Semaforo != "sVe")
{
// calcolo durata...
answ = (int)DateTime.Now.Subtract(currData[0].InizioStato).TotalMinutes;
}
}
}
catch (Exception exc)
{
logger.lg.scriviLog($"Eccezione in recupero getIdlePeriod{Environment.NewLine}{exc}", tipoLog.EXCEPTION);
}
return answ;
}
/// <summary>
/// Recupera codice numerico ODL/PODL dato CodXdl, in pratica la parte finale SENZA ODL/PODL
/// Funzione per impianti che accettano solo INT in scrittura:
///
/// GET: IOB/getXdlNum/SIMUL_03?CodXdl=ODL00000123
/// </summary>
/// <param name="id">IdxMacchina (NON considerato)</param>
/// <param name="CodXdl">
/// CodXdl richiesto, se vuoto restituisce TUTTI i valori in tabella di decodifica
/// </param>
/// <returns>SINGOLO VALORE calcolato on the fly</returns>
[HttpGet("getXdlNum/{id}")]
public string GetXdlNum(string id, string CodXdl = "")
{
// in realtà ID macchina non conta e lo ignoriamo...
string answ = "";
// scrivo keep alive!!! (se necessario, altrimenti è in cache...)
MapoDb.MapoDb connDb = new MapoDb.MapoDb();
DataLayer DataLayerObj = new DataLayer();
connDb.scriviKeepAlive(id, DateTime.Now);
try
{
// sostituisco PODL/ODL con "" e lascio zero iniziali (conversione INT in IOB)
answ = CodXdl.Replace("PODL", "").Replace("ODL", "");
}
catch
{ }
return answ;
}
#endif
/// <summary>
/// Recupera TASK richiesto x macchina:
/// GET: IOB/getTask2Exe/SIMUL_03
@@ -468,7 +571,7 @@ namespace MP.IOC.Controllers
string answ = "";
try
{
DService.ScriviKeepAlive(id, DateTime.Now);
await DService.ScriviKeepAliveAsync(id, DateTime.Now);
// leggo da REDIS eventuale elenco task x macchina...
Dictionary<string, string> valori = await DService.GetTask2ExeMacchinaAsync(id);
answ = JsonConvert.SerializeObject(valori);
+44
View File
@@ -3,6 +3,7 @@ using MP.Core.DTO;
using MP.Core.Objects;
using MP.Data;
using MP.Data.DbModels;
using MP.Data.DbModels.Anag;
using MP.Data.MgModels;
using Newtonsoft.Json;
using NLog;
@@ -687,6 +688,27 @@ namespace MP.IOC.Data
return result;
}
public async Task<List<DecNumArticoliModel>> DecNumArtGetFiltAsync(string codArt = "")
{
List<DecNumArticoliModel> result = new();
string tag = string.IsNullOrEmpty(codArt) ? "ALL" : codArt;
string currKey = $"{Utils.redisDecNumArtKey}:{tag}";
// cerco in redis dato valore sel macchina...
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (rawData.HasValue)
{
result = JsonConvert.DeserializeObject<List<DecNumArticoliModel>>($"{rawData}") ?? new();
}
else
{
result = await IocDbController.DecNumArtGetFiltAsync(codArt);
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
redisDb.StringSet(currKey, rawData, getRandTOut(redisLongTimeCache));
}
return result;
}
/// <summary>
/// Dispose del connettore ai dati
/// </summary>
@@ -3593,6 +3615,28 @@ namespace MP.IOC.Data
#endregion Public Methods
#region Internal Methods
/// <summary>
/// Recupera ArtNum dato CodArt (per impianti che accettano solo INT in scrittura)
/// </summary>
/// <param name="CodArt">
/// CodArt richiesto, se vuoto restituisce TUTTI i valori in tabella di decodifica
/// </param>
/// <returns>Dizionario contenente le righe delle codifiche attive Articolo/Numero</returns>
internal async Task<Dictionary<string, int>> GetArtNumAsync(string codArt)
{
Dictionary<string, int> answ = new Dictionary<string, int>();
var currData = await DecNumArtGetFiltAsync(codArt);
foreach (var item in currData)
{
answ.Add(item.CodArticolo, item.NumART);
}
return answ;
}
#endregion Internal Methods
#region Protected Fields
protected Random rand = new Random();
+1 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<Version>6.16.2604.1517</Version>
<Version>6.16.2604.1518</Version>
</PropertyGroup>
<ItemGroup>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MP-IOC </i>
<h4>Versione: 6.16.2604.1517</h4>
<h4>Versione: 6.16.2604.1518</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
6.16.2604.1517
6.16.2604.1518
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2604.1517</version>
<version>6.16.2604.1518</version>
<url>https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/MP.IOC.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-IOC/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>