using Microsoft.AspNetCore.Components; using MP.Data.DbModels; using MP.Data; using MP.Data.Services; using Newtonsoft.Json; using MP_TAB3.Components; namespace MP_TAB3.Pages { /// /// Pagina base da cui ereditare metodi x refresh dati da RedisChannel (MessagePipe) /// public partial class BasePage : IDisposable { #region Public Properties /// /// Dato di dettaglio MSE per macchina /// public MappaStatoExplModel? CurrMSE { get; set; } = null; [Inject] public MessageService MsgServ { get; set; } = null!; [Inject] public TabDataFeeder TDFeeder { get; set; } = null!; #endregion Public Properties #region Public Methods /// /// Metodo dispose /// public virtual void Dispose() { IdxMacc = ""; CurrMSE = null; TDFeeder.dataPipe.EA_NewMessage -= DataPipe_EA_NewMessage; } #endregion Public Methods #region Protected Fields /// /// IdxMacchinaSub (tavola) /// protected string IdxMaccSubSel = ""; #endregion Protected Fields #region Protected Properties /// /// Macchina selezionata /// protected string IdxMacc { get; set; } = ""; protected bool IsManual { get; set; } = false; [Inject] protected SharedMemService MStor { get; set; } = null!; #endregion Protected Properties #region Protected Methods /// /// Override Oninit x aggancio evento update da MessagePipe /// /// protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); TDFeeder.dataPipe.EA_NewMessage += DataPipe_EA_NewMessage; } protected override async Task OnParametersSetAsync() { await ReloadData(); } /// /// Metodo refresh con controllo salvataggio in LocalStorage ogni 5 sec /// /// /// protected async Task RefreshData(List ListMSE) { // se vecchio salvo sul browser... if (DateTime.Now.Subtract(lastSave).TotalSeconds > 5) { // salvo in LocalStorage... await MsgServ.SaveMse(ListMSE); lastSave = DateTime.Now; } if (!string.IsNullOrEmpty(IdxMacc)) { var rawData = ListMSE.Find(x => x.IdxMacchina == IdxMacc); if (rawData != null) { CurrMSE = rawData; } else { await RefreshMBlock(); } } } /// /// Refresh con rilettura da LocalStorage /// /// protected async Task RefreshMBlock() { // recupero MSE macchina.... if (!string.IsNullOrEmpty(IdxMacc)) { CurrMSE = await MsgServ.GetMachineMse(IdxMacc); } } protected virtual async Task ReloadData() { if (string.IsNullOrEmpty(IdxMacc)) { IdxMacc = await MsgServ.IdxMaccGet(); } // recupero MSE macchina.... if (!string.IsNullOrEmpty(IdxMacc)) { CurrMSE = await MsgServ.GetMachineMse(IdxMacc); } if (!string.IsNullOrEmpty(IdxMacc) && MStor.DictMacchManual.ContainsKey(IdxMacc)) { IsManual = MStor.DictMacchManual[IdxMacc]; } else { IsManual = false; } } /// /// Selezione macchina SUB /// /// protected void SetMacc(string selIdxMacc) { IdxMaccSubSel = selIdxMacc; } /// /// Variabile caricamento /// protected bool IsLoading = false; #endregion Protected Methods #region Private Fields private bool doBlink = false; /// /// DateTime ultimo salvataggio in LocalStorage /// private DateTime lastSave = DateTime.Now; #endregion Private Fields #region Private Methods /// /// Ricevuto nuovi dati da mostrare! /// /// /// /// private void DataPipe_EA_NewMessage(object? sender, EventArgs e) { PubSubEventArgs currArgs = (PubSubEventArgs)e; // conversione on-the-fly List --> allarmi if (!string.IsNullOrEmpty(currArgs.newMessage)) { try { List? dataList = JsonConvert.DeserializeObject>(currArgs.newMessage); if (dataList != null) { InvokeAsync(() => RefreshData(dataList)); } } catch { } } InvokeAsync(() => { StateHasChanged(); }); } #endregion Private Methods } }