Bozza gestione ripresa stato prec in SPEC (da stop per fermo reparto)

This commit is contained in:
Samuele Locatelli
2026-03-20 07:49:09 +01:00
parent 95ffa4356b
commit 7a2ae4c2cd
4 changed files with 139 additions and 49 deletions
+31 -2
View File
@@ -746,11 +746,11 @@ namespace MP.Data.Controllers
using (var dbCtx = new MoonProContext(_configuration))
{
var IdxMacc = new SqlParameter("@IdxMacchina", idxMacchina);
var DataElab = new SqlParameter("@DataElab", dtCurr);
var DataElab = new SqlParameter("@pDataOra", dtCurr);
var dbResult = await dbCtx
.Database
.ExecuteSqlRawAsync("EXEC stp_IM_ElaboraInsManuali @IdxMacchina, @DataElab", IdxMacc, DataElab);
.ExecuteSqlRawAsync("EXEC stp_IM_ElaboraInsManuali @IdxMacchina, @pDataOra", IdxMacc, DataElab);
fatto = dbResult > 0;
}
@@ -2056,6 +2056,35 @@ namespace MP.Data.Controllers
return answ;
}
/// <summary>
/// Esegue il ripristino stato precedente x una macchina che abbia una dichiarazione manuale (es Pausa pranzo) da cui "uscire"
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="dtCurr"></param>
/// <param name="valore"></param>
/// <param name="idxStato"></param>
/// <param name="matrOpr"></param>
/// <returns></returns>
public async Task<bool> RipristinaStatoPrec(string idxMacchina, DateTime dtCurr, string valore, int idxStato = 0, int matrOpr = 0)
{
bool fatto = false;
using (var dbCtx = new MoonProContext(_configuration))
{
var pIdxMacc = new SqlParameter("@IdxMacchina", idxMacchina);
var pDataOra = new SqlParameter("@DataOra", dtCurr);
var pIdxStato = new SqlParameter("@IdxStato", idxStato);
var pMatrOpr = new SqlParameter("@MatrOpr", matrOpr);
var pValueEv = new SqlParameter("@ValueEv", valore);
var dbResult = await dbCtx
.Database
.ExecuteSqlRawAsync("EXEC stp_DDB_RipristinaStato @IdxMacchina, @DataOra, @IdxStato, @MatrOpr, @ValueEv", pIdxMacc, pDataOra, pIdxStato, pMatrOpr, pValueEv);
fatto = dbResult > 0;
}
return fatto;
}
public bool SetDerogaSt(StCheckOverride deroga)
{
bool fatto = false;
+30 -2
View File
@@ -9,7 +9,6 @@ using NLog;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Diagnostics;
using System.Globalization;
@@ -3034,6 +3033,35 @@ namespace MP.Data.Services
return answ;
}
/// <summary>
/// Esegue il ripristino stato precedente x una macchina che abbia una dichiarazione manuale (es Pausa pranzo) da cui "uscire"
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="dtCurr"></param>
/// <param name="valore"></param>
/// <param name="idxStato"></param>
/// <param name="matrOpr"></param>
/// <returns></returns>
public async Task<bool> RipristinaStatoPrec(string idxMacchina, DateTime dtCurr, string valore, int idxStato = 0, int matrOpr = 0)
{
bool inserito = false;
try
{
// inserisco evento
inserito = await dbTabController.RipristinaStatoPrec(idxMacchina, dtCurr, valore, idxStato, matrOpr);
// reset cache eventi/commenti
await FlushCache("EvList");
await FlushCache("Commenti");
}
catch (Exception exc)
{
string logMsg = $"Eccezione in fase di RipristinaStatoPrec | macchina: {idxMacchina} | dtCurr: {dtCurr} | valore: {valore} | idxStato {idxStato} | matrOpr {matrOpr}{Environment.NewLine}{exc}";
Log.Error(logMsg);
}
return inserito;
}
/// <summary>
/// Processa registrazione di un counter x una data macchina IOB
/// </summary>
@@ -3989,7 +4017,7 @@ namespace MP.Data.Services
}
answ = true;
}
}
}
#endif
// notifico update ai client in ascolto x reset cache
NotifyReloadRequest($"FlushRedisCache | {pat2Flush}");
+2
View File
@@ -29,6 +29,8 @@
<div class="col-7">
@if (showFermate)
{
<button class="btn btn-lg btn-primary" title="Ripristina stato precedente (se è stato registrata una dichiarazione manuale)" @onclick="DoRestorePrevious"><i class="fa-solid fa-clock-rotate-left"></i> Ripristina Stato Precedente</button>
<hr />
<ListFerm ListaFermate="SearchFermate" EC_EventSelected="EventRecord"></ListFerm>
}
else
+76 -45
View File
@@ -4,17 +4,24 @@ using MP.Core.DTO;
using MP.Data;
using MP.Data.DbModels;
using MP.Data.Services;
using MP.SPEC.Components.Reparti;
using MP.SPEC.Data;
using Newtonsoft.Json;
using NLog.LayoutRenderers;
using static MP.Core.Objects.Enums;
using static MP.Data.Services.ExecStatsCollector;
namespace MP.SPEC.Pages
{
public partial class RepStop: IDisposable
public partial class RepStop : IDisposable
{
#region Public Methods
public void Dispose()
{
TDFeeder.pauseTimers();
TDFeeder.dataPipe.EA_NewMessage -= DataPipe_EA_NewMessage;
}
#endregion Public Methods
#region Protected Properties
[Inject]
@@ -23,12 +30,18 @@ namespace MP.SPEC.Pages
[Inject]
protected MpDataService MDService { get; set; } = null!;
[Inject]
protected MsgServiceSpec MService { get; set; } = null!;
[Inject]
protected SharedMemService SMServ { get; set; } = null!;
[Inject]
protected TabDataService TabDServ { get; set; } = null!;
[Inject]
protected TabDataFeeder TDFeeder { get; set; } = null!;
#endregion Protected Properties
#region Protected Methods
@@ -40,43 +53,6 @@ namespace MP.SPEC.Pages
TDFeeder.resumeTimers();
}
[Inject]
protected TabDataFeeder TDFeeder { get; set; } = null!;
public void Dispose()
{
TDFeeder.pauseTimers();
TDFeeder.dataPipe.EA_NewMessage -= DataPipe_EA_NewMessage;
}
/// <summary>
/// Ricevuto nuovi dati da mostrare!
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DataPipe_EA_NewMessage(object? sender, EventArgs e)
{
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly List<string> --> allarmi
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
try
{
List<MappaStatoExplModel>? dataList = JsonConvert.DeserializeObject<List<MappaStatoExplModel>>(currArgs.newMessage);
if (dataList != null)
{
InvokeAsync(() => SaveData(dataList));
}
}
catch
{ }
}
InvokeAsync(() =>
{
StateHasChanged();
});
}
protected async Task SaveData(List<MappaStatoExplModel> newList)
{
// salvo valori ricevuti
@@ -108,6 +84,34 @@ namespace MP.SPEC.Pages
showFermate = listSelezione.Count > 0;
}
/// <summary>
/// Ricevuto nuovi dati da mostrare!
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DataPipe_EA_NewMessage(object? sender, EventArgs e)
{
PubSubEventArgs currArgs = (PubSubEventArgs)e;
// conversione on-the-fly List<string> --> allarmi
if (!string.IsNullOrEmpty(currArgs.newMessage))
{
try
{
List<MappaStatoExplModel>? dataList = JsonConvert.DeserializeObject<List<MappaStatoExplModel>>(currArgs.newMessage);
if (dataList != null)
{
InvokeAsync(() => SaveData(dataList));
}
}
catch
{ }
}
InvokeAsync(() =>
{
StateHasChanged();
});
}
private async Task DoReload(bool forceReload)
{
isLoading = true;
@@ -116,9 +120,36 @@ namespace MP.SPEC.Pages
isLoading = false;
}
/// <summary>
/// Gestione ritorno a stato precedente, tramite stored
/// </summary>
/// <returns></returns>
private async Task DoRestorePrevious()
{
if (!await JSRuntime.InvokeAsync<bool>("confirm", $"Hai {CurrMachSel.Count} impianti selezionati.{Environment.NewLine}Confermi di voler registrare il ritorno all'ultimo stato precedente le dichiarazioni manuali?{Environment.NewLine}La procedura verificherà l'applicabilità per ogni impianto selezionato."))
return;
[Inject]
protected MsgServiceSpec MService { get; set; } = null!;
isLoading = true;
await InvokeAsync(StateHasChanged);
// se conferma ciclo x ogni macchina e registro
foreach (var idxMacc in CurrMachSel)
{
DateTime adesso = DateTime.Now.Floor(TimeSpan.FromSeconds(1));
var rigaStato = MDService.StatoMacchina(idxMacc);
string valData = $"SPEC | {MService.DomainName}\\{MService.UserName}";
// chiamo stored
await TabDServ.RipristinaStatoPrec(idxMacc, adesso, valData, rigaStato.IdxStato, 0);
// resetta il microstato in modo da ricevere successive info HW
await TabDServ.resetMicrostatoMacchina(idxMacc);
}
var ListMSE = await MDService.MseGetAll(true);
await Task.Delay(250);
await ReloadData();
isLoading = false;
}
/// <summary>
/// Gestione selezione evento da registrare x le macchine selezionate
@@ -142,7 +173,7 @@ namespace MP.SPEC.Pages
{
var rigaStato = MDService.StatoMacchina(idxMacc);
// mpreparo info utente x Value...
// preparo info utente x Value...
string valData = $"SPEC | {MService.DomainName}\\{MService.UserName}";
// processo evento...
DateTime adesso = DateTime.Now.Floor(TimeSpan.FromSeconds(1));
@@ -153,7 +184,7 @@ namespace MP.SPEC.Pages
IdxTipo = selEv.IdxEv,
CodArticolo = rigaStato.CodArticolo,
Value = valData,
MatrOpr = 0,
MatrOpr = 0,
pallet = rigaStato.pallet
};
// FORZO con metodo TAB