Ulteriore ottimizzazione codice IOC x caching in memoria e obj scoped (da testare...)

This commit is contained in:
Samuele Locatelli
2026-05-06 10:08:09 +02:00
parent 0e6abf4f28
commit 5dab9100da
10 changed files with 217 additions and 16 deletions
+8
View File
@@ -102,6 +102,14 @@ namespace MP.Data.Repository.IOC
/// <returns></returns>
Task<List<TransizioneIngressiModel>> StateMachineIngressiAsync(int idxFam);
/// <summary>
/// Stato prod macchina (completo) Async
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="dtReq"></param>
/// <returns></returns>
Task<StatoProdModel> StatoProdMacchinaAsync(string idxMacchina, DateTime dtReq);
/// <summary>
/// Vista v_MSFD x singola macchina (da stored) - singolo record
/// </summary>
+17
View File
@@ -316,6 +316,23 @@ namespace MP.Data.Repository.IOC
return dbResult;
}
/// <inheritdoc />
public async Task<StatoProdModel> StatoProdMacchinaAsync(string idxMacchina, DateTime dtReq)
{
await using var dbCtx = await CreateContextAsync();
var IdxMacchina = new SqlParameter("@IdxMacchina", idxMacchina);
var DataOra = new SqlParameter("@DataOra ", dtReq);
var dbResult = (await dbCtx
.DbSetStatoProd
.FromSqlRaw("EXEC stp_StatoProd_getByMacchina @IdxMacchina, @DataOra ", IdxMacchina, DataOra)
.AsNoTracking()
.ToListAsync())
.FirstOrDefault();
return dbResult;
}
/// <inheritdoc />
public async Task<VMSFDModel?> VMSFDGetByMaccAsync(string idxMacc)
{
+31
View File
@@ -1,5 +1,6 @@
using MP.Data.DbModels;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using static MP.Core.Objects.Enums;
@@ -31,6 +32,21 @@ namespace MP.Data.Services.IOC
/// <returns></returns>
Task<bool> EvListMicroStatoInsertAsync(MicroStatoMacchinaModel newRecMsm, EventListModel newRecEv);
/// <summary>
/// Restituisce il valOut dell'ODL corrente (ODL deve esserci per gestione contapezzi, senza
/// ODL NO invio/gestione ODL)
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
Task<string> GetCurrOdlAsync(string idxMacchina);
/// <summary>
/// Restitusice elenco KVP dei TASK (da passare a IOB-WIN) per l'impianto indicato
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
Task<Dictionary<string, string>> GetTask2ExeMacchinaAsync(string idxMacchina);
/// <summary>
/// Restituisce il valOut booleano se la macchina sia abilitata all'input
/// </summary>
@@ -56,6 +72,21 @@ namespace MP.Data.Services.IOC
/// <returns></returns>
Task<string> ProcessInputAsync(string idxMacchina, string valore, string dtEve, string dtCurr, string contatore);
/// <summary>
/// Restituisce il contapezzi come CONTEGGIO da TCRilevati per la macchina - ASYNC
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
Task<int> PzCounterTcAsync(string idxMacchina);
/// <summary>
/// Processa registrazione di un counter x una data macchina IOB
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="counter">contapezzi</param>
/// <returns></returns>
Task<string> SaveCounterAsync(string idxMacchina, string counter);
/// <summary>
/// scrive un evento di keepalive sulla tabella
/// </summary>
+144 -2
View File
@@ -53,6 +53,34 @@ namespace MP.Data.Services.IOC
return success;
}
/// <inheritdoc />
public async Task<string> GetCurrOdlAsync(string idxMacchina)
{
string result = "";
string currKey = $"{MP.Data.Utils.redisOdlCurrByMac}:{idxMacchina}";
// cerco in redis dato valOut sel macchina...
RedisValue rawData = _redisDb.StringGet(currKey);
if (rawData.HasValue)
{
result = $"{rawData}";
}
else
{
result = await GetCurrOdlByProdAsync(idxMacchina);
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
_redisDb.StringSet(currKey, rawData, getRandTOut(redisLongTimeCache));
}
return result;
}
/// <inheritdoc />
public async Task<Dictionary<string, string>> GetTask2ExeMacchinaAsync(string idxMacchina)
{
var currHash = MP.Data.Utils.RedKeyTask2ExeMacc(idxMacchina, MpIoNS);
return await RedisGetHashDictAsync(currHash);
}
/// <inheritdoc />
public async Task<bool> IobInsEnabAsync(string idxMacchina)
{
@@ -84,7 +112,7 @@ namespace MP.Data.Services.IOC
public async Task<string> ProcessInputAsync(string idxMacchina, string valore, string dtEve, string dtCurr, string contatore)
{
string answ = "";
if (ValidateinputParams(idxMacchina, valore, dtEve, dtCurr))
if (ValidateInputParams(idxMacchina, valore, dtEve, dtCurr))
{
DateTime dataOraEvento = ParseEventTime(dtEve, dtCurr);
@@ -137,6 +165,66 @@ namespace MP.Data.Services.IOC
return answ;
}
/// <inheritdoc />
public async Task<int> PzCounterTcAsync(string idxMacchina)
{
int answ = -1;
DateTime dataRif = DateTime.Now;
var datiProd = await StatoProdMacchinaAsync(idxMacchina, dataRif);
if (datiProd != null)
{
answ = datiProd.PzTotODL;
}
return answ;
}
/// <inheritdoc />
public async Task<string> SaveCounterAsync(string idxMacchina, string counter)
{
string answ = "0";
// inizio processing vero e proprio INPUT...
if (string.IsNullOrEmpty(idxMacchina))
{
string errore = "Errore: parametro macchina vuoto";
Log.Warn(errore);
answ = errore;
}
else
{
if (string.IsNullOrEmpty(counter))
{
string errore = "Errore: parametro counter vuoto";
Log.Warn(errore);
answ = errore;
}
else
{
int newCounter = -1;
int.TryParse(counter, out newCounter);
// se il conteggio è >= 0 SALVO come nuovo conteggio...
if (newCounter >= 0)
{
var currKey = MP.Data.Utils.RedKeyPzCount(idxMacchina, MpIoNS);
RedisValue rawData = await _redisDb.StringGetAsync(currKey);
if (rawData.HasValue)
{
// salvo per + tempo...
await _redisDb.StringSetAsync(currKey, answ.ToString());
answ = counter;
}
else
{
int currCount = await PzCounterTcAsync(idxMacchina);
answ = currCount.ToString();
// salvo per meno tempo...
await _redisDb.StringSetAsync(currKey, answ);
}
}
}
}
return answ;
}
/// <inheritdoc />
public async Task ScriviKeepAliveAsync(string IdxMacchina, DateTime oraMacchina)
{
@@ -342,6 +430,26 @@ namespace MP.Data.Services.IOC
return s?.Length > 17 ? s[..17] : s?.PadRight(17, '0') ?? string.Empty;
}
/// <summary>
/// Recupero info ODL corrente da dati prod macchina
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
private async Task<string> GetCurrOdlByProdAsync(string idxMacchina)
{
string answ = "";
// recupero stato...
var datiProd = await StatoProdMacchinaAsync(idxMacchina, DateTime.Now);
if (datiProd != null)
{
answ = datiProd.IdxOdl.ToString();
}
// ultimo controllo su idxOdl...
answ = answ == "" ? "0" : answ;
// restituisco!
return answ;
}
/// <summary>
/// Implementa gestione recupero cache da memoria o da obj esterno + cache memoria
/// </summary>
@@ -897,6 +1005,40 @@ namespace MP.Data.Services.IOC
return answ;
}
/// <summary>
/// Stato prod macchina (completo)
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="dtReq"></param>
/// <returns></returns>
private async Task<StatoProdModel> StatoProdMacchinaAsync(string idxMacchina, DateTime dtReq, bool forceDb = false)
{
string cacheKey = $"IOC_StatoProd_{idxMacchina}";
return await GetOrFetchAsync(cacheKey, async () =>
{
StatoProdModel? result = new StatoProdModel();
// cerco in _redisConn...
string currKey = $"{MP.Data.Utils.redisStatoProd}:{idxMacchina}:{dtReq:HHmm}";
RedisValue rawData = await _redisDb.StringGetAsync(currKey);
if (rawData.HasValue && !forceDb)
{
result = JsonConvert.DeserializeObject<StatoProdModel>($"{rawData}");
}
else
{
result = await _repo.StatoProdMacchinaAsync(idxMacchina, dtReq);
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
await _redisDb.StringSetAsync(currKey, rawData, TimeSpan.FromSeconds(30));
}
if (result == null)
{
result = new StatoProdModel();
}
return result;
}, TimeSpan.FromSeconds(10));
}
/// <summary>
/// Restituisce valOut della stringa (SE disponibile)
/// </summary>
@@ -923,7 +1065,7 @@ namespace MP.Data.Services.IOC
/// <param name="dtEve"></param>
/// <param name="dtCurr"></param>
/// <returns></returns>
private bool ValidateinputParams(string idxMacchina, string valore, string dtEve, string dtCurr)
private bool ValidateInputParams(string idxMacchina, string valore, string dtEve, string dtCurr)
{
bool isValid = false;
// preparo stringa valori correnti
+9 -6
View File
@@ -429,7 +429,8 @@ namespace MP.IOC.Controllers
id = id.Replace("|", "#");
try
{
var pzCount = await DService.pzCounterTcAsync(id);
var pzCount = await IOCService.PzCounterTcAsync(id);
//var pzCount = await DService.PzCounterTcAsync(id);
return Ok(pzCount);
}
catch (Exception exc)
@@ -478,7 +479,8 @@ namespace MP.IOC.Controllers
id = id.Replace("|", "#");
try
{
var odl = await DService.GetCurrOdlAsync(id);
var odl = await IOCService.GetCurrOdlAsync(id);
//var odl = await DService.GetCurrOdlAsync(id);
return Ok($"{odl}");
}
catch (Exception exc)
@@ -815,7 +817,8 @@ namespace MP.IOC.Controllers
try
{
await DService.ScriviKeepAliveAsync(id, DateTime.UtcNow);
var valori = await DService.GetTask2ExeMacchinaAsync(id);
var valori = await IOCService.GetTask2ExeMacchinaAsync(id);
//var valori = await DService.GetTask2ExeMacchinaAsync(id);
if (valori == null || valori.Count == 0)
return Ok(new Dictionary<string, string>());
@@ -1206,8 +1209,7 @@ namespace MP.IOC.Controllers
/// <summary>
/// SALVA Counter x macchina restituendo il valore appena inviato o, se mancasse chiave
/// redis, del valore da DB
///
/// redis, valore da DB ///
/// GET: IOB/setCounter/5?counter=10
/// </summary>
/// <param name="id">cod macchina</param>
@@ -1226,7 +1228,8 @@ namespace MP.IOC.Controllers
Log.Debug($"Salvataggio counter | id: {id} | pzCount: {counter}");
try
{
answ = await DService.saveCounterAsync(id, counter);
answ = await IOCService.SaveCounterAsync(id, counter);
//answ = await DService.SaveCounterAsync(id, counter);
}
catch (Exception exc)
{
+4 -4
View File
@@ -3147,7 +3147,7 @@ namespace MP.IOC.Data
}
else
{
answ = await pzCounterTcAsync(idxMacchina);
answ = await PzCounterTcAsync(idxMacchina);
// salvo in _redisConn...
await redisDb.StringSetAsync(currKey, answ.ToString(), TimeSpan.FromSeconds(1));
}
@@ -3164,7 +3164,7 @@ namespace MP.IOC.Data
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
public async Task<int> pzCounterTcAsync(string idxMacchina)
public async Task<int> PzCounterTcAsync(string idxMacchina)
{
int answ = -1;
DateTime dataRif = DateTime.Now;
@@ -3741,7 +3741,7 @@ namespace MP.IOC.Data
/// <param name="idxMacchina"></param>
/// <param name="counter">contapezzi</param>
/// <returns></returns>
public async Task<string> saveCounterAsync(string idxMacchina, string counter)
public async Task<string> SaveCounterAsync(string idxMacchina, string counter)
{
string answ = "0";
// inizio processing vero e proprio INPUT...
@@ -3776,7 +3776,7 @@ namespace MP.IOC.Data
}
else
{
int currCount = await pzCounterTcAsync(idxMacchina);
int currCount = await PzCounterTcAsync(idxMacchina);
answ = currCount.ToString();
// salvo per meno tempo...
await redisDb.StringSetAsync(currKey, answ);
+1 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<Version>8.16.2605.609</Version>
<Version>8.16.2605.610</Version>
</PropertyGroup>
<ItemGroup>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MP-IOC </i>
<h4>Versione: 8.16.2605.609</h4>
<h4>Versione: 8.16.2605.610</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
8.16.2605.609
8.16.2605.610
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>8.16.2605.609</version>
<version>8.16.2605.610</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>