Aggiunta metodi ulog

This commit is contained in:
Samuele Locatelli
2026-04-14 16:10:50 +02:00
parent a6d49bae99
commit 53bf6ba5b3
10 changed files with 370 additions and 31 deletions
+32
View File
@@ -0,0 +1,32 @@
namespace MP.Core.DTO
{
/// <summary>
/// Tracciato UserLog in formato JSON valido
/// </summary>
public class ULogDataDto : EvDataDto
{
#region Public Properties
/// <summary>
/// Nome del flusso (RC/RS/DI)
/// </summary>
public string flux { get; set; } = "DI";
/// <summary>
/// [OPZIONALE] label = causale scarto / tagCode
/// </summary>
public string label { get; set; } = "";
/// <summary>
/// Operatore di riferimento
/// </summary>
public int matrOpr { get; set; } = 0;
/// <summary>
/// [OPZIONALE] valNum = esitoOk (0/1) / Quantità di scarto associata
/// </summary>
public int valNum { get; set; } = 0;
#endregion Public Properties
}
}
+14
View File
@@ -0,0 +1,14 @@
namespace MP.Core.DTO
{
/// <summary>
/// Array valori tipo UserLogData inviati come JSon
/// </summary>
public class ULogJsonPayloadDto
{
#region Public Properties
public List<ULogDataDto> fluxData { get; set; }
#endregion Public Properties
}
}
+106
View File
@@ -704,6 +704,112 @@ namespace MP.Data.Controllers
return answ;
}
/// <summary>
/// Registra controllo
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="matrOpr"></param>
/// <param name="esitoOk"></param>
/// <param name="note"></param>
/// <param name="dataOra"></param>
/// <returns></returns>
public async Task<bool> RegControlliInsert(string idxMacchina, int matrOpr, bool esitoOk, string note, DateTime dataOra)
{
bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration))
{
var IdxMacc = new SqlParameter("@IdxMacchina", idxMacchina);
var MatrOpr = new SqlParameter("@MatrOpr", matrOpr);
var EsitoOk = new SqlParameter("@EsitoOk", esitoOk);
var Note = new SqlParameter("@Note", note);
var DataOra = new SqlParameter("@DataOra", dataOra);
var result = await dbCtx
.Database
.ExecuteSqlRawAsync("EXEC stp_RC_insert @IdxMacchina, @MatrOpr, @EsitoOk, @Note, @DataOra", IdxMacc, MatrOpr, EsitoOk, Note, DataOra);
fatto = result != 0;
}
return fatto;
}
/// <summary>
/// Aggiunta record Registro Dichiarazioni
/// </summary>
/// <param name="newRec"></param>
/// <returns></returns>
public async Task<bool> RegDichiarInsert(RegistroDichiarazioniModel newRec)
{
bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration))
{
var TagCode = new SqlParameter("@TagCode", newRec.TagCode);
var IdxMacchina = new SqlParameter("@IdxMacchina", newRec.IdxMacchina);
var DtRec = new SqlParameter("@DtRec", newRec.DtRec);
var MatrOpr = new SqlParameter("@MatrOpr", newRec.MatrOpr);
var ValString = new SqlParameter("@ValString", newRec.ValString);
var result = await dbCtx
.Database
.ExecuteSqlRawAsync("exec dbo.stp_DD_insertQuery @TagCode, @IdxMacchina, @DtRec, @MatrOpr, @ValString", TagCode, IdxMacchina, DtRec, MatrOpr, ValString);
// indico eseguito!
fatto = result > 0;
}
return fatto;
}
/// <summary>
/// Update record Registro Dichiarazioni
/// </summary>
/// <param name="newRec"></param>
/// <returns></returns>
public async Task<bool> RegDichiarUpdate(RegistroDichiarazioniModel newRec)
{
bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration))
{
var Original_IdxDich = new SqlParameter("@Original_IdxDich", newRec.IdxDich);
var DtRec = new SqlParameter("@DtRec", newRec.DtRec);
var TagCode = new SqlParameter("@TagCode", newRec.TagCode);
var ValString = new SqlParameter("@ValString", newRec.ValString);
var MatrOpr = new SqlParameter("@MatrOpr", newRec.MatrOpr);
var result = await dbCtx
.Database
.ExecuteSqlRawAsync("exec dbo.stp_DD_updateQuery @Original_IdxDich, @DtRec, @TagCode, @ValString, @MatrOpr", Original_IdxDich, DtRec, TagCode, ValString, MatrOpr);
// indico eseguito!
fatto = result > 0;
}
return fatto;
}
/// <summary>
/// Aggiunta record RegistroScarti
/// </summary>
/// <param name="newRec"></param>
/// <returns></returns>
public async Task<bool> RegScartiInsert(RegistroScartiModel newRec)
{
bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration))
{
var IdxMacchina = new SqlParameter("@idxMacchina", newRec.IdxMacchina);
var DataOra = new SqlParameter("@DataOra", newRec.DataOra);
var Causale = new SqlParameter("@Causale", newRec.Causale);
var Qta = new SqlParameter("@Qta", newRec.Qta);
var Note = new SqlParameter("@Note", newRec.Note);
var MatrOpr = new SqlParameter("@MatrOpr", newRec.MatrOpr);
var result = await dbCtx
.DbSetRegWithCheck
.FromSqlRaw("exec dbo.stp_RS_Insert_withCheck @idxMacchina, @DataOra, @Causale, @Qta, @Note, @MatrOpr", IdxMacchina, DataOra, Causale, Qta, Note, MatrOpr)
.AsNoTracking()
.ToListAsync();
// indico eseguito!
// -1 = restituisce una select
fatto = result.Count > 0;
}
return fatto;
}
/// <summary>
/// Annulla modifiche su una specifica entity (cancel update)
/// </summary>
@@ -8,7 +8,7 @@ using System.ComponentModel.DataAnnotations.Schema;
// </Auto-Generated>
namespace MP.Data.DbModels
{
//[Table("DiarioDichiarazioni")]
[Table("DiarioDichiarazioni")]
public partial class RegistroDichiarazioniModel
{
#region Public Properties
+119
View File
@@ -534,6 +534,77 @@ namespace MP.IOC.Controllers
}
}
/// <summary>
/// Processa una chiamata GET x salvare UserLog
/// GET: IOB/ulog/SIMUL_03?flux=PROG&valore=P0001&dtEve=20161223180600000&dtCurr=20161223180600000&cnt=999&matrOpr=0=0&label=&valNum
/// </summary>
/// <param name="id"></param>
/// <param name="flux"></param>
/// <param name="valore"></param>
/// <param name="dtEve"></param>
/// <param name="dtCurr"></param>
/// <param name="cnt"></param>
/// <param name="matrOpr"></param>
/// <param name="label"></param>
/// <param name="valNum"></param>
/// <returns></returns>
[HttpGet("ulog/{id}")]
public async Task<IActionResult> ULog(string id, string flux, string valore, string dtEve, string dtCurr, string cnt, string matrOpr, string label, string valNum)
{
if (string.IsNullOrEmpty(id)) return BadRequest("Missing ID");
// Multi: gestione carattere "|" trasformato in "#"
id = id.Replace("|", "#");
string answ = "";
// formato yyyymmddHHMMSSnnn ovvero da anno a millisecondi
if (string.IsNullOrEmpty(cnt))
{
cnt = "0";
}
DateTime dataOraEvento = DateTime.Now;
try
{
int count = 0;
int nMatrOpr = 0;
int nValNum = 0;
Int32.TryParse(cnt, out count);
Int32.TryParse(matrOpr, out nMatrOpr);
Int32.TryParse(valNum, out nValNum);
answ = await DService.ProcessUserLogAsync(id, flux, valore, dtEve, dtCurr, count, nMatrOpr, label, nValNum);
return Ok(answ);
}
catch (Exception exc)
{
Log.Error($"Errore in ulog{Environment.NewLine}{exc}");
return StatusCode(StatusCodes.Status500InternalServerError, "NO");
}
}
/// <summary>
/// Processa una chiamata POST per l'invio di una List Json 1+ UserAction (contiene
/// controlli, scarti, dichiarazioni)
/// POST: IOB/ulogJson/SIMUL_03
/// </summary>
/// <param name="id">ID dell'IOB</param>
/// <returns></returns>
[HttpPost("ulogJson/{id}")]
public async Task<IActionResult> ulogJson(string id, [FromBody] string content = "")
{
string answ = "-";
// se ho dati...
if (content != "")
{
answ = await processULogJsonAsync(id, content);
return Ok(answ);
}
else
{
Log.Error($"Errore in ULogJson - no content");
return StatusCode(StatusCodes.Status500InternalServerError, "NO");
}
}
/// <summary>
/// Processa una chiamata POST per l'invio di una List Json di UNO O PIU' oggetti objItem
/// POST: IOB/upsertObjItems/SIMUL_03
@@ -716,6 +787,54 @@ namespace MP.IOC.Controllers
return answ;
}
/// <summary>
/// Effettua processing UserLog
/// </summary>
/// <param name="id"></param>
/// <param name="content"></param>
/// <returns></returns>
private async Task<string> processULogJsonAsync(string id, string content)
{
string answ = "";
int insDone = 0;
// procedo a deserializzare in blocco l'oggetto...
ULogJsonPayloadDto receivedData = new ULogJsonPayloadDto();
try
{
// deserializzo.
receivedData = JsonConvert.DeserializeObject<ULogJsonPayloadDto>(content) ?? new();
}
catch (Exception exc)
{
Log.Error($"Errore in fase deserializzazione ulogJson{Environment.NewLine}{exc}");
answ = "NO";
}
// se ho qualcosa da processare...
if (receivedData != null)
{
// per ogni valore --> salvo!
try
{
foreach (var item in receivedData.fluxData)
{
// formato datetime come yyyyMMddHHmmssfff -->es: 20181223180600000
answ = await DService.ProcessUserLogAsync(id, item.flux, item.valore, item.dtEve.ToString("yyyyMMddHHmmssfff"), item.dtCurr.ToString("yyyyMMddHHmmssfff"), item.cnt, item.matrOpr, item.label, item.valNum);
}
// se vuoto --> OK!
if (string.IsNullOrEmpty(answ))
{
answ = $"OK {insDone} processed";
}
}
catch (Exception exc)
{
Log.Error($"Errore in fase invio valori ulogJson{Environment.NewLine}{exc}");
answ = "NO";
}
}
return answ;
}
#endregion Private Methods
}
}
+94 -26
View File
@@ -2116,39 +2116,107 @@ namespace MP.IOC.Data
string answ = "";
DateTime dataOraEvento = GetSrvDtEvent(dtEve, dtCurr);
// inizio processing vero e proprio INPUT...
if (idxMacchina != null && valore != null)
if (string.IsNullOrEmpty(idxMacchina) || string.IsNullOrEmpty(valore))
{
if (idxMacchina != "" && valore != "")
{
FluxLogModel newRec = new FluxLogModel()
{
IdxMacchina = idxMacchina,
dtEvento = dataOraEvento,
CodFlux = flux,
Valore = valore,
Cnt = contatore
};
await IocDbController.FluxLogInsertAsync(newRec);
// 2022.06.06 salvo su redis il valore ULTIMO del flux x recupero rapido ultimo valore
var currKey = Utils.RedKeyLastFLog(idxMacchina, flux, MpIoNS);
// 10 min cache max...
await redisDb.StringSetAsync(currKey, valore, TimeSpan.FromMinutes(10));
// registro in risposta che è andato tutto bene...
answ = "OK";
}
else
{
string errore = "processFluxLog | Errore: parametri macchina/valore vuoti";
Log.Error(errore);
answ = errore;
}
string errore = "processFluxLog | Errore: parametri macchina/valore vuoti";
Log.Error(errore);
answ = errore;
}
else
{
string errore = "processFluxLog | Errore: mancano parametri macchina/valore";
FluxLogModel newRec = new FluxLogModel()
{
IdxMacchina = idxMacchina,
dtEvento = dataOraEvento,
CodFlux = flux,
Valore = valore,
Cnt = contatore
};
await IocDbController.FluxLogInsertAsync(newRec);
// 2022.06.06 salvo su redis il valore ULTIMO del flux x recupero rapido ultimo valore
var currKey = Utils.RedKeyLastFLog(idxMacchina, flux, MpIoNS);
// 10 min cache max...
await redisDb.StringSetAsync(currKey, valore, TimeSpan.FromMinutes(10));
// registro in risposta che è andato tutto bene...
answ = "OK";
}
return answ;
}
/// <summary>
/// Processa registrazione UserLog da IOB
/// </summary>
/// <param name="idxMacchina">Macchina</param>
/// <param name="flux">Flusso: DI/RC/RC</param>
/// <param name="valore">valore = note/valString</param>
/// <param name="dtEve">data evento</param>
/// <param name="dtCurr">data corrente</param>
/// <param name="contatore">contatore invio</param>
/// <param name="matrOpr">Matricola Operatore</param>
/// <param name="label">label = causale scarto / tagCode</param>
/// <param name="valNum">valNum = esitoOk (0/1) / Quantità di scarto associata</param>
/// <returns></returns>
public async Task<string> ProcessUserLogAsync(string idxMacchina, string flux, string valore, string dtEve, string dtCurr, int contatore, int matrOpr, string label, int valNum)
{
// scrivo keep alive!!! (se necessario, altrimenti è in cache...)
ScriviKeepAlive(idxMacchina, DateTime.Now);
// 2017.09.14 trimmo eventualmente lo zero finale dalle date SE supera i millisecondi...
dtEve = dtEve.Length > 17 ? dtEve.Substring(0, 17) : dtEve;
dtCurr = dtCurr.Length > 17 ? dtCurr.Substring(0, 17) : dtCurr;
string answ = "";
DateTime dataOraEvento = GetSrvDtEvent(dtEve, dtCurr);
// inizio processing vero e proprio INPUT...
if (string.IsNullOrEmpty(idxMacchina) || string.IsNullOrEmpty(flux))
{
string errore = "processFluxLog | Errore: parametri macchina/flux vuoti";
Log.Error(errore);
answ = errore;
}
else
{
// in base al flusso decido dove e cosa scrivere...
switch (flux)
{
case "DI":
RegistroDichiarazioniModel recDich = new RegistroDichiarazioniModel()
{
IdxMacchina = idxMacchina,
DtRec = dataOraEvento,
MatrOpr = matrOpr,
ValString = valore,
TagCode = label
};
await IocDbController.RegDichiarInsert(recDich);
break;
case "RC":
bool esitoOk = valNum != 0;
await IocDbController.RegControlliInsert(idxMacchina, matrOpr, esitoOk, valore, dataOraEvento);
break;
case "RS":
RegistroScartiModel recSca = new RegistroScartiModel()
{
IdxMacchina = idxMacchina,
DataOra = dataOraEvento,
Causale = label,
Qta = valNum,
Note = valore,
MatrOpr = matrOpr
};
await IocDbController.RegScartiInsert(recSca);
break;
default:
break;
}
// registro in risposta che è andato tutto bene...
answ = "OK";
}
return answ;
}
+1 -1
View File
@@ -4,7 +4,7 @@
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<Version>6.16.2604.1409</Version>
<Version>6.16.2604.1416</Version>
</PropertyGroup>
<ItemGroup>
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MP-IOC </i>
<h4>Versione: 6.16.2604.1409</h4>
<h4>Versione: 6.16.2604.1416</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
6.16.2604.1409
6.16.2604.1416
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2604.1409</version>
<version>6.16.2604.1416</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>