Aggiunto parametro disabilitazione KeepAlive per salvataggio FluxLog (singolo o json) da IOB

This commit is contained in:
Samuele E. Locatelli
2025-06-27 14:20:21 +02:00
parent 8aef753487
commit 3e64170d1b
4 changed files with 160 additions and 77 deletions
+150 -72
View File
@@ -15,6 +15,7 @@ namespace MP_IO.Controllers
{
public class IOBController : Controller
{
#region Public Methods
/// <summary> SALVA x macchina KVP parametro/valore:
@@ -450,8 +451,35 @@ namespace MP_IO.Controllers
return answ;
}
// GET: IOB/flog/SIMUL_03?flux=PROG&valore=P0001&dtEve=20161223180600000&dtCurr=20161223180600000&cnt=999
/// <summary>
/// Invio record flog secco
/// GET: IOB/flog/SIMUL_03?flux=PROG&valore=P0001&dtEve=20161223180600000&dtCurr=20161223180600000&cnt=999
/// </summary>
/// <param name="id">IdxMacchina</param>
/// <param name="flux">CodFlux</param>
/// <param name="valore">Valore da registrare</param>
/// <param name="dtEve">DataOra evento (IOB time)</param>
/// <param name="dtCurr">DataOra corrente (IOB time)</param>
/// <param name="cnt">Contatore eventi (IOB)</param>
/// <returns></returns>
public string flog(string id, string flux, string valore, string dtEve, string dtCurr, string cnt)
{
return flog(id, flux, valore, dtEve, dtCurr, cnt, "false");
}
/// <summary>
/// Invio record flog secco
/// GET: IOB/flog/SIMUL_03?flux=PROG&valore=P0001&dtEve=20161223180600000&dtCurr=20161223180600000&cnt=999&disabKA=false
/// </summary>
/// <param name="id">IdxMacchina</param>
/// <param name="flux">CodFlux</param>
/// <param name="valore">Valore da registrare</param>
/// <param name="dtEve">DataOra evento (IOB time)</param>
/// <param name="dtCurr">DataOra corrente (IOB time)</param>
/// <param name="cnt">Contatore eventi (IOB)</param>
/// <param name="disabKA">Disabilitazione scrittura record KeepAlive</param>
/// <returns></returns>
public string flog(string id, string flux, string valore, string dtEve, string dtCurr, string cnt, string disabKA)
{
string answ = "";
// formato yyyymmddHHMMSSnnn ovvero da anno a millisecondi
@@ -470,7 +498,9 @@ namespace MP_IO.Controllers
DataLayer DataLayerObj = new DataLayer();
int count = 0;
Int32.TryParse(cnt, out count);
answ = DataLayerObj.processFluxLog(id, flux, valore, dtEve, dtCurr, count);
int disKa = false;
bool.TryParse(disabKA, out disKa);
answ = DataLayerObj.processFluxLog(id, flux, valore, dtEve, dtCurr, count, disKa);
}
catch (Exception exc)
{
@@ -504,92 +534,140 @@ namespace MP_IO.Controllers
// se ho dati...
if (content != "")
{
DataLayer DataLayerObj = new DataLayer();
// procedo a deserializzare in blocco l'oggetto...
flogJsonPayload receivedData = new flogJsonPayload();
answ = processFLogJson(id, false, insDone, answ, content);
}
return answ;
}
/// <summary>
/// Processa una chiamata POST per l'invio di un array Json di oggetti fluxLog
/// PUT: IOB/flogJson/SIMUL_03
/// </summary>
/// <param name="id">ID dell'IOB</param>
/// <param name="disabKA">Disabilitazione della scrittura del record KeepAlive</param>
/// <returns></returns>
[HttpPost]
public string flogJson(string id, bool disabKA)
{
int insDone = 0;
int disKa = false;
bool.TryParse(disabKA, out disKa);
string answ = "-";
// questa classe è derivata da Controller.Response... x cui recupero lo stream in altro modo...
string content = "";
System.Web.HttpContext.Current.Request.InputStream.Position = 0;
using (var reader = new StreamReader(
Request.InputStream, System.Text.Encoding.UTF8, true, 4096, true))
{
content = reader.ReadToEnd();
}
//Rest
System.Web.HttpContext.Current.Request.InputStream.Position = 0;
// se ho dati...
if (content != "")
{
answ = processFLogJson(id, disabKA, insDone, answ, content);
}
return answ;
}
/// <summary>
/// Effettivo processing FLogJson
/// </summary>
/// <param name=""></param>
/// <param name="disabKA"></param>
/// <param name="insDone"></param>
/// <param name="answ"></param>
/// <param name="content"></param>
/// <returns></returns>
private string processFLogJson(stringid, bool disabKA, int insDone, string answ, string content)
{
DataLayer DataLayerObj = new DataLayer();
// procedo a deserializzare in blocco l'oggetto...
flogJsonPayload receivedData = new flogJsonPayload();
try
{
// deserializzo.
receivedData = JsonConvert.DeserializeObject<flogJsonPayload>(content);
}
catch (Exception exc)
{
logger.lg.scriviLog($"Errore in fase deserializzazione flogJson{Environment.NewLine}{exc}");
answ = "NO";
}
// se ho qualcosa da processare...
if (receivedData != null)
{
// per ogni valore --> salvo!
try
{
// deserializzo.
receivedData = JsonConvert.DeserializeObject<flogJsonPayload>(content);
foreach (var item in receivedData.fluxData)
{
// formato datetime come yyyyMMddHHmmssfff -->es: 20181223180600000
answ = DataLayerObj.processFluxLog(id, item.flux, item.valore, item.dtEve.ToString("yyyyMMddHHmmssfff"), item.dtCurr.ToString("yyyyMMddHHmmssfff"), item.cnt, disabKA);
}
// se vuoto --> OK!
if (string.IsNullOrEmpty(answ))
{
answ = $"OK {insDone} processed";
}
}
catch (Exception exc)
{
logger.lg.scriviLog($"Errore in fase deserializzazione flogJson{Environment.NewLine}{exc}");
logger.lg.scriviLog($"Errore in fase invio valori flogJson{Environment.NewLine}{exc}");
answ = "NO";
}
// se ho qualcosa da processare...
if (receivedData != null)
// leggo parametri correnti...
try
{
// per ogni valore --> salvo!
try
List<objItem> currParams = DataLayerObj.getCurrObjItems(id);
// ora per ogni valore RICEVUTO costruisco un oggetto in innovazioni da
// inviare...x salvare in stato parametri...
List<objItem> innovazioni = new List<objItem>();
foreach (var item in receivedData.fluxData)
{
foreach (var item in receivedData.fluxData)
// flux = uuid del parametro
objItem trovato = currParams.Find(obj => obj.uid == item.flux);
// se lo trovo aggiorno...
if (trovato != null)
{
// formato datetime come yyyyMMddHHmmssfff -->es: 20181223180600000
answ = DataLayerObj.processFluxLog(id, item.flux, item.valore, item.dtEve.ToString("yyyyMMddHHmmssfff"), item.dtCurr.ToString("yyyyMMddHHmmssfff"), item.cnt);
}
// se vuoto --> OK!
if (string.IsNullOrEmpty(answ))
{
answ = $"OK {insDone} processed";
}
}
catch (Exception exc)
{
logger.lg.scriviLog($"Errore in fase invio valori flogJson{Environment.NewLine}{exc}");
answ = "NO";
}
// leggo parametri correnti...
try
{
List<objItem> currParams = DataLayerObj.getCurrObjItems(id);
// ora per ogni valore RICEVUTO costruisco un oggetto in innovazioni da
// inviare...x salvare in stato parametri...
List<objItem> innovazioni = new List<objItem>();
foreach (var item in receivedData.fluxData)
{
// flux = uuid del parametro
objItem trovato = currParams.Find(obj => obj.uid == item.flux);
// se lo trovo aggiorno...
if (trovato != null)
// aggiorno valore e data
trovato.value = item.valore;
trovato.lastRead = DateTime.Now;
// se fosse un valore WRITE e mi ha dato un valore vuoto --> mando
// un fix x riscrittura
if (trovato.writable && string.IsNullOrEmpty(item.valore))
{
// aggiorno valore e data
trovato.value = item.valore;
trovato.lastRead = DateTime.Now;
// se fosse un valore WRITE e mi ha dato un valore vuoto --> mando
// un fix x riscrittura
if (trovato.writable && string.IsNullOrEmpty(item.valore))
{
logger.lg.scriviLog($"flogJson | verifica parametri | {trovato.uid} | reqVal: {trovato.reqValue}");
taskType currTask = (taskType)Enum.Parse(typeof(taskType), trovato.uid);
DataLayerObj.addCheckTask4Machine(id, currTask, item.valore);
}
logger.lg.scriviLog($"flogJson | verifica parametri | {trovato.uid} | reqVal: {trovato.reqValue}");
taskType currTask = (taskType)Enum.Parse(typeof(taskType), trovato.uid);
DataLayerObj.addCheckTask4Machine(id, currTask, item.valore);
}
// altrimenti AGGIUNGO (READ ONLY)...
else
{
trovato = new objItem
{
uid = item.flux,
name = item.flux,
value = item.valore,
lastRead = DateTime.Now,
writable = false
};
}
// lo carico in innovation
innovazioni.Add(trovato);
}
// faccio upsert innovations!
DataLayerObj.upsertCurrObjItems(id, innovazioni);
}
catch (Exception exc)
{
logger.lg.scriviLog($"Errore in fase salvataggio innovazioni parametri correnti da flogJson{Environment.NewLine}{exc}");
answ = "NO";
// altrimenti AGGIUNGO (READ ONLY)...
else
{
trovato = new objItem
{
uid = item.flux,
name = item.flux,
value = item.valore,
lastRead = DateTime.Now,
writable = false
};
}
// lo carico in innovation
innovazioni.Add(trovato);
}
// faccio upsert innovations!
DataLayerObj.upsertCurrObjItems(id, innovazioni);
}
catch (Exception exc)
{
logger.lg.scriviLog($"Errore in fase salvataggio innovazioni parametri correnti da flogJson{Environment.NewLine}{exc}");
answ = "NO";
}
}
return answ;
}
+1 -1
View File
@@ -10,7 +10,7 @@
<IISExpressWindowsAuthentication />
<IISExpressUseClassicPipelineMode />
<UseGlobalApplicationHostFile />
<LastActiveSolutionConfig>Release|Any CPU</LastActiveSolutionConfig>
<LastActiveSolutionConfig>Debug|Any CPU</LastActiveSolutionConfig>
<Controller_SelectedScaffolderID>MvcControllerEmptyScaffolder</Controller_SelectedScaffolderID>
<Controller_SelectedScaffolderCategoryPath>root/Common/MVC/Controller</Controller_SelectedScaffolderCategoryPath>
<WebStackScaffolding_ControllerDialogWidth>600</WebStackScaffolding_ControllerDialogWidth>
+1 -1
View File
@@ -8,7 +8,7 @@
<IISExpressWindowsAuthentication />
<IISExpressUseClassicPipelineMode />
<UseGlobalApplicationHostFile />
<LastActiveSolutionConfig>Release|Any CPU</LastActiveSolutionConfig>
<LastActiveSolutionConfig>Debug|Any CPU</LastActiveSolutionConfig>
<ProjectView>ShowAllFiles</ProjectView>
<NameOfLastUsedPublishProfile>C:\Users\samuele.steamw\source\MoonPro.net\MP-SITE\Properties\PublishProfiles\IIS03.pubxml</NameOfLastUsedPublishProfile>
</PropertyGroup>
+8 -3
View File
@@ -2553,13 +2553,18 @@ namespace MapoDb
/// <param name="dtEve"></param>
/// <param name="dtCurr"></param>
/// <param name="contatore"></param>
/// <param name="disabKA"></param>
/// <returns></returns>
public string processFluxLog(string idxMacchina, string flux, string valore, string dtEve, string dtCurr, int contatore)
public string processFluxLog(string idxMacchina, string flux, string valore, string dtEve, string dtCurr, int contatore, bool disabKA)
{
// instanzio un nuovo oggetto MapoDb
MapoDb connDb = new MapoDb();
// scrivo keep alive!!! (se necessario, altrimenti è in cache...)
connDb.scriviKeepAlive(idxMacchina, DateTime.Now);
// se non vietato...
if (!disabKA)
{
// scrivo keep alive!!! (se necessario, altrimenti è in cache...)
connDb.scriviKeepAlive(idxMacchina, DateTime.Now);
}
// registro conteggio impiego chiamate REDIS
if (memLayer.ML.CRB("IOB_RedEnab"))
{