Files
Samuele Locatelli ced2cd90a3 COdeMaid cleanup
2025-05-15 16:11:21 +02:00

628 lines
20 KiB
C#

using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using MP.Data;
using MP.Data.DbModels;
using MP.SPEC.Data;
using MP.SPEC.Services;
using NLog;
namespace MP.SPEC.Components
{
public partial class ListPODL : IDisposable
{
#region Public Properties
[Parameter]
public SelectXdlParams actFilter { get; set; } = new SelectXdlParams();
[Parameter]
public string padCodXdl { get; set; } = "0000";
[Parameter]
public EventCallback<bool> PagerResetReq { get; set; }
[Parameter]
public EventCallback<PODLExpModel> RecordEdit { get; set; }
[Parameter]
public EventCallback<PODLExpModel> RecordSel { get; set; }
[Parameter]
public EventCallback<int> updateRecordCount { get; set; }
#endregion Public Properties
#region Public Methods
public string checkSelect(PODLExpModel record)
{
string answ = "";
if (currRecord != null)
{
try
{
answ = (currRecord.IdxPromessa == record.IdxPromessa) ? "table-info" : "";
//answ = ((SelRecord.IdxMacchina == record.IdxMacchina) && (SelRecord.CodArticolo == record.CodArticolo) && (SelRecord.CodFase == record.CodFase)) ? "table-info" : "";
}
catch
{ }
}
return answ;
}
public void Dispose()
{
currRecord = null;
SearchRecords = null;
ListRecords = null;
ListStati = null;
GC.Collect();
}
#endregion Public Methods
#region Protected Fields
protected bool enableForceSync = true;
protected bool enableStartPODL = true;
protected bool enableStopODL = true;
#endregion Protected Fields
#region Protected Properties
protected string header
{
get => actFilter.Header;
set => actFilter.Header = value;
}
[Inject]
protected IJSRuntime JSRuntime { get; set; } = null!;
[Inject]
protected MpDataService MDService { get; set; } = null!;
[Inject]
protected IOApiService MpIoApiCall { get; set; } = null!;
[Inject]
protected NavigationManager NavManager { get; set; } = null!;
#endregion Protected Properties
#region Protected Methods
/// <summary>
/// Verifica se sia un articolo di tipo "KIT" x mostrare show dettaglio
/// </summary>
/// <param name="CodArticolo"></param>
/// <returns></returns>
protected bool CheckIsKit(string CodArticolo)
{
bool answ = false;
if (ListArtKit != null && ListArtKit.Count > 0)
{
answ = ListArtKit.Count(x => x.CodArticolo == CodArticolo) > 0;
}
return answ;
}
protected async Task cloneRecord(PODLExpModel selRec)
{
currRecord = null;
// clono resettando ODL
var clonedRec = Utils.POdlExt.clone(selRec, true);
currRecord = clonedRec;
await RecordEdit.InvokeAsync(clonedRec);
header = "Duplica PODL";
}
/// <summary>
/// Eliminazione record selezionato (previa conferma)
/// </summary>
/// <param name="selRec"></param>
/// <returns></returns>
protected async Task deleteRecord(PODLExpModel selRec)
{
if (!await JSRuntime.InvokeAsync<bool>("confirm", "Eliminazione Record: sei sicuro di voler procedere?"))
return;
await Task.Delay(1);
var done = await MDService.POdlDeleteRecord(selRec);
await callSyncDb(selRec.IdxMacchina);
currRecord = null;
await ReloadData();
await Task.Delay(1);
}
protected void doShowRecipeArch(PODLExpModel selRec)
{
currRecord = selRec;
currRecipeArchPath = MDService.MacchineRecipeArchive(selRec.IdxMacchina);
showRecipeArch = true;
showRecipeConf = false;
}
protected void doShowRecipeConf(PODLExpModel selRec)
{
currRecord = selRec;
currRecipePath = MDService.MacchineRecipeConf(selRec.IdxMacchina);
showRecipeArch = false;
showRecipeConf = true;
}
protected async Task editRecord(PODLExpModel? selRec)
{
currRecord = selRec;
header = "Modifica PODL";
await RecordEdit.InvokeAsync(selRec);
}
protected void KitToggleDetail(PODLExpModel? recSel)
{
if (recSel != null)
{
ListKitTemplate = MDService.TemplateKitFilt(recSel.CodArticolo, "");
ListPOdlKit = MDService.POdlListByKitParent(recSel.IdxPromessa);
}
else
{
ListKitTemplate = null;
ListPOdlKit = null;
}
showKitDetail = !showKitDetail;
}
protected override async Task OnInitializedAsync()
{
ListStati = await MDService.AnagStatiComm();
ListArtKit = MDService.ArticoliGetByTipo("KIT", "*");
string strMachRecipe = await MDService.ConfigTryGetAsync("MachineWithRecipe");
if (!string.IsNullOrEmpty(strMachRecipe))
{
bool.TryParse(strMachRecipe, out MachineWithRecipe);
}
string SPEC_PODL_gest = await MDService.ConfigTryGetAsync("SPEC_PODL_gest");
if (!string.IsNullOrEmpty(SPEC_PODL_gest))
{
bool.TryParse(SPEC_PODL_gest, out enableStartPODL);
}
string SPEC_ODL_gest = await MDService.ConfigTryGetAsync("SPEC_ODL_gest");
if (!string.IsNullOrEmpty(SPEC_ODL_gest))
{
bool.TryParse(SPEC_ODL_gest, out enableStopODL);
}
string SPEC_XODL_sync = await MDService.ConfigTryGetAsync("SPEC_XODL_sync");
if (!string.IsNullOrEmpty(SPEC_XODL_sync))
{
bool.TryParse(SPEC_XODL_sync, out enableForceSync);
}
}
protected override async Task OnParametersSetAsync()
{
if (!lastFilter.Equals(actFilter))
{
lastFilter = actFilter.clone();
await ReloadData();
}
}
protected async void OnSeachUpdated()
{
await InvokeAsync(() =>
{
PagerResetReq.InvokeAsync(true);
Task task = UpdateData();
StateHasChanged();
});
}
protected bool POdlDelEnabled(int idxOdl)
{
return idxOdl == 0;
}
protected async Task ReloadData()
{
ListRecords = null;
isLoading = true;
SearchRecords = await MDService.POdlListGetFiltAsync(hasOdl, StatoSel, macchina, reparto, selDtStart, selDtEnd);
if (totalCount != SearchRecords.Count)
{
totalCount = SearchRecords.Count;
}
ListRecords = SearchRecords.Skip(numRecord * (currPage - 1)).Take(numRecord).ToList();
await Task.Delay(1);
await InvokeAsync(() => StateHasChanged());
isLoading = false;
}
protected async Task resetSel(bool forceUpdate)
{
currRecord = null;
currRecipePath = "";
showRecipeArch = false;
showRecipeConf = false;
if (forceUpdate)
{
await ReloadData();
}
await RecordEdit.InvokeAsync(null);
}
protected async Task selRecord(PODLExpModel? selRec)
{
currRecord = selRec;
header = "Dettaglio PODL";
await RecordSel.InvokeAsync(selRec);
}
protected async Task startOdl(PODLExpModel selRec)
{
if (!await JSRuntime.InvokeAsync<bool>("confirm", "Sei sicuro di voler avviare PODL selezionato?"))
return;
if (selRec != null)
{
int idxEvento = 0;
string evMess = "";
// verifico ancora NON ci sia ODL corrente/aperto
if (canStartOdl(selRec.IdxMacchina))
{
await callStartSetup(selRec.IdxMacchina);
await Task.Delay(1);
// chiamo stored stp_ODL_inizioSetupPromessa e recupero ODL corrente
bool fatto = await MDService.POdlDoSetup(selRec);
if (fatto)
{
var currPOdl = await MDService.POdlGetByKey(selRec.IdxPromessa);
var newOdl = await MDService.OdlGetByKey(currPOdl.IdxOdl);
// registro evento...
idxEvento = 2;
evMess = $"Inizio Setup | PODL {selRec.IdxPromessa}";
processaEvento(selRec.IdxMacchina, idxEvento, evMess, newOdl.IdxOdl, newOdl.CodArticolo);
// aspetto 1 sec
await Task.Delay(1000);
// registro inizio produzione
idxEvento = 1;
evMess = $"Registrata inizio Produzione | PODL {selRec.IdxPromessa} | ODL {newOdl.IdxOdl} | ART {newOdl.CodArticolo}";
processaEvento(selRec.IdxMacchina, idxEvento, evMess, newOdl.IdxOdl, newOdl.CodArticolo);
// imposto task x setComm, setArt, SetPzComm
await callTask2Exe(selRec.IdxMacchina, "setArt", newOdl.CodArticolo);
string odlPad = newOdl.IdxOdl.ToString(padCodXdl);
await callTask2Exe(selRec.IdxMacchina, "setComm", $"ODL{odlPad}");
await callTask2Exe(selRec.IdxMacchina, "setPzComm", $"{newOdl.NumPezzi}");
// chiamo task x IOB
await callForceUpdate(selRec.IdxMacchina);
await Task.Delay(1);
await callForceUpdate(selRec.IdxMacchina);
await Task.Delay(1);
await callSyncDb(selRec.IdxMacchina);
await Task.Delay(1);
// svuoto memorie pagina...
await MDService.FlushRedisCache();
// svuoto cache MpIoNsCache
await MDService.FlushMpIoOdlCache();
// ricarico pagina!
NavManager.NavigateTo(NavManager.Uri, true);
}
}
}
}
protected async Task UpdateData()
{
currRecord = null;
await ReloadData();
}
#endregion Protected Methods
#region Private Fields
private static Logger Log = LogManager.GetCurrentClassLogger();
private string currRecipeArchPath = "";
/// <summary>
/// Percorso ricetta corrente
/// </summary>
private string currRecipePath = "";
private PODLExpModel? currRecord = null;
/// <summary>
/// Elenco articoli tipo KIT
/// </summary>
private List<AnagArticoliModel>? ListArtKit;
private List<TemplateKitModel>? ListKitTemplate = null;
private List<PODLExpModel>? ListPOdlKit;
private List<PODLExpModel>? ListRecords;
/// <summary>
/// Elenco stati
/// </summary>
private List<ListValuesModel>? ListStati;
private bool MachineWithRecipe = false;
/// <summary>
/// scadenza validità lista ODL correnti
/// </summary>
private DateTime odlCurrExp = DateTime.Now.AddMinutes(-1);
/// <summary>
/// Elenco ODL correnti...
/// </summary>
private List<string> odlCurrList = new List<string>();
private List<PODLExpModel>? SearchRecords;
private bool showKitDetail = false;
private bool showRecipeArch = false;
private bool showRecipeConf = false;
#endregion Private Fields
#region Private Properties
private int _totalCount { get; set; } = -1;
private int currPage
{
get => actFilter.CurrPage;
set => actFilter.CurrPage = value;
}
private bool hasOdl
{
get => actFilter.HasOdl;
set => actFilter.HasOdl = value;
}
private bool isLoading { get; set; } = false;
private SelectXdlParams lastFilter { get; set; } = new SelectXdlParams() { CurrPage = -1 };
private string macchina
{
get => actFilter.IdxMacchina;
set => actFilter.IdxMacchina = value;
}
private string mainCss
{
get => (showRecipeConf || showRecipeArch) ? "col-6" : "col-12";
}
private int numRecord
{
get => actFilter.NumRec;
set => actFilter.NumRec = value;
}
private string reparto
{
get => actFilter.CodReparto;
set => actFilter.CodReparto = value;
}
private string SearchVal
{
get => string.IsNullOrEmpty(actFilter.SearchVal) ? "*" : actFilter.SearchVal;
}
private DateTime selDtEnd
{
get => actFilter.DtEnd;
set
{
if (!actFilter.DtEnd.Equals(value))
{
actFilter.DtEnd = value;
currPage = 1;
}
}
}
private DateTime selDtStart
{
get => actFilter.DtStart;
set
{
if (!actFilter.DtStart.Equals(value))
{
actFilter.DtStart = value;
currPage = 1;
}
}
}
private string StatoSel
{
get => actFilter.CodFase;
set => actFilter.CodFase = value;
}
private int totalCount
{
get => _totalCount;
set
{
if (_totalCount != value)
{
_totalCount = value;
updateRecordCount.InvokeAsync(value);
}
}
}
#endregion Private Properties
#region Private Methods
/// <summary>
/// Chiama metodo x chiedere sync DB
/// </summary>
/// <param name="selRec"></param>
/// <returns></returns>
private async Task addTask2Exe(string idxMacc, string taskName, string taskVal)
{
// compongo URL e chiamo
string restUrl = $"IOB/addTask2Exe/{idxMacc}?taskName={taskName}&taskVal={taskVal}";
try
{
var response = await MpIoApiCall.callMpIoUrlGet(restUrl);
}
catch (Exception exc)
{
Log.Error($"Errore durante chiamata: {Environment.NewLine}{exc}");
}
}
/// <summary>
/// Chiama metodo x chiedere force Update
/// </summary>
/// <param name="selRec"></param>
/// <returns></returns>
private async Task callForceUpdate(string IdxMacc)
{
// chiamo aggiunta task SyncDb...
await addTask2Exe(IdxMacc, "ForceUpdate", $"SPEC|TS:{DateTime.Now:yyMMddHHmmss}");
}
/// <summary>
/// Chiama metodo x indicare inizio setup
/// </summary>
/// <param name="selRec"></param>
/// <returns></returns>
private async Task callStartSetup(string IdxMacc)
{
// chiamo evento inizio setup
await addTask2Exe(IdxMacc, "startSetup", $"SPEC|TS:{DateTime.Now:yyMMddHHmmss}");
}
/// <summary>
/// Chiama metodo x chiedere sync DB
/// </summary>
/// <param name="IdxMacc"></param>
/// <returns></returns>
private async Task callSyncDb(string IdxMacc)
{
// chiamo aggiunta task SyncDb...
await addTask2Exe(IdxMacc, "syncDbData", "");
}
/// <summary>
/// Chiama metodo x chiedere registrazione di un Task2Exe a MP-IO
/// </summary>
/// <param name="IdxMacc">IdxMacchina interessata</param>
/// <param name="KeyReq">Richiesta da impostare</param>
/// <param name="ValReq">Valore da impostare</param>
/// <returns></returns>
private async Task callTask2Exe(string IdxMacc, string KeyReq, string ValReq)
{
// chiamo aggiunta task SyncDb...
await addTask2Exe(IdxMacc, KeyReq, ValReq);
}
/// <summary>
/// verifica se sia avviabile ODL x idxMaccSel
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
private bool canStartOdl(string idxMacchina)
{
// controllo se lista scaduta...
bool answ = false;
DateTime adesso = DateTime.Now;
if (adesso > odlCurrExp || odlCurrList == null || odlCurrList.Count == 0)
{
odlCurrList = MDService.OdlGetCurrent();
odlCurrExp = adesso.AddSeconds(2);
}
answ = !odlCurrList.Contains(idxMacchina);
return answ;
}
/// <summary>
/// Verifica se la idxMaccSel abbia associata un path x ricette (elenco)
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
private bool machineHasRecipeArch(string idxMacchina)
{
var recipeArchive = MDService.MacchineRecipeArchive(idxMacchina);
return !string.IsNullOrEmpty(recipeArchive);
}
/// <summary>
/// Verifica se la idxMaccSel abbia associata una ricetta (template)
/// </summary>
/// <param name="idxMacchina"></param>
/// <returns></returns>
private bool machineHasRecipeConf(string idxMacchina)
{
var recipePath = MDService.MacchineRecipeConf(idxMacchina);
return !string.IsNullOrEmpty(recipePath);
}
/// <summary>
/// processa evento richiesto
/// </summary>
/// <param name="idxMacc"></param>
/// <param name="idxEvento"></param>
/// <param name="userMsg"></param>
/// <param name="idxODL"></param>
private async void processaEvento(string idxMacc, int idxEvento, string userMsg, int idxODL, string codArticolo)
{
// se manca codart calcolo...
if (string.IsNullOrEmpty(codArticolo))
{
var currOdl = await MDService.OdlGetByKey(idxODL);
if (currOdl != null)
{
codArticolo = currOdl.CodArticolo;
}
}
// scrivo evento scriviRigaEventoBarcode
EventListModel newRec = new EventListModel()
{
IdxMacchina = idxMacc,
InizioStato = DateTime.Now,
IdxTipo = idxEvento,
CodArticolo = codArticolo,
MatrOpr = 0,
pallet = "",
Value = userMsg
};
await MDService.EvListInsert(newRec);
}
private string tradFase(string codFase)
{
string answ = codFase;
if (ListStati != null && ListStati.Count > 0)
{
var recSel = ListStati.FirstOrDefault(x => x.value == codFase);
if (recSel != null)
{
answ = recSel.label;
}
}
return answ;
}
#endregion Private Methods
}
}