- aggiunta pagina elenco conferme prod
This commit is contained in:
Samuele Locatelli
2025-07-23 19:29:01 +02:00
parent b18b770725
commit 2deb5238b2
13 changed files with 560 additions and 12 deletions
+1 -1
View File
@@ -33,7 +33,7 @@ namespace MP_TAB3.Components
await Task.Delay(1);
if (!string.IsNullOrEmpty(IdxMaccSel))
{
ListComplete = await TabDServ.RegControlliFilt(IdxMaccSel, IdxOdl, CurrPeriodo.Inizio, CurrPeriodo.Fine, false);
ListComplete = await TabDServ.RegControlliFiltAsync(IdxMaccSel, IdxOdl, CurrPeriodo.Inizio, CurrPeriodo.Fine, false);
TotalCount = ListComplete.Count;
// esegue paginazione
UpdateTable();
+77
View File
@@ -0,0 +1,77 @@
<MachSel RecMSE="RecMSE" E_MachSel="SetMacc"></MachSel>
<ShowProcessing Message="Caricamento" IsProcessing="@isProcessing"></ShowProcessing>
<div class="cardObj p-2 mt-2">
<div class="mb-1 fs-6">
<div class="row">
<div class="col-6">
<h2>Tipo Selezione</h2>
</div>
<div class="col-6">
<div class="form-check form-switch fs-3">
<input class="form-check-input" type="checkbox" @bind="@UseOdl">
<label class="form-check-label">@selMessage</label>
</div>
</div>
</div>
@if (useOdl)
{
<MachineSelOdl IdxMacchina="@IdxMaccSel" E_OdlSel="SetOdl"></MachineSelOdl>
}
else
{
<EgwCoreLib.Razor.PeriodoSel CurrPeriodo="CurrPeriodo" E_PeriodoSel="SetPeriodo"></EgwCoreLib.Razor.PeriodoSel>
}
</div>
<div class="bg-secondary p-1 mb-1">
<div class="row">
<div class="col-12">
<table class="table table-dark table-sm table-striped">
<thead>
<tr class="text-start1">
<th>DataOra</th>
<th>ODL/Comm</th>
<th>Articolo</th>
<th class="text-end"># Pz Conf</th>
<th class="text-end"># Pz Scarto</th>
@if (ShowRilav)
{
<th class="text-end"># Pz Rilav</th>
}
<th class="text-end">Operatore</th>
</tr>
</thead>
<tbody>
@foreach (var item in ListPaged)
{
var actOdl = ActiveOdl(item.DataTo);
<tr>
<td class="text-nowrap">
<div>@($"{item.DataOraConf:yyyy-MM-dd}")</div>
<div>@($"{item.DataOraConf:ddd, HH:mm:ss}")</div>
</td>
<td class="text-nowrap">
<div>@($"ODL{actOdl.IdxOdl:00000000}")</div>
<div>@item.CommessaEsterna</div>
</td>
<td class="fs-4 fw-bold">@actOdl.CodArticolo</td>
<td class="fs-4 fw-bold text-end">@item.PezziConf</td>
<td class="fs-4 fw-bold text-end text-danger">@item.PezziScar</td>
@if (ShowRilav)
{
<td class="text-end">@item.PezziDaRilav</td>
}
<td class="text-end">@OperDto(item.MatrApp)</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>
<div class="cad-footer">
<EgwCoreLib.Razor.DataPager currPage="@PageNum" PageSize="@NumRecPage" totalCount="@TotalCount" numPageChanged="SetPage" numRecordChanged="SetNumRec"></EgwCoreLib.Razor.DataPager>
</div>
</div>
+312
View File
@@ -0,0 +1,312 @@
using Microsoft.AspNetCore.Components;
using MP.Data.DbModels;
using MP.Data.Services;
using NLog;
using static EgwCoreLib.Utils.DtUtils;
namespace MP_TAB3.Components
{
public partial class ProdConfMan
{
#region Public Properties
[Parameter]
public EventCallback<string> E_MachSel { get; set; }
[Parameter]
public EventCallback<bool> E_Updated { get; set; }
[Parameter]
public string IdxMacchSub { get; set; } = "";
[Parameter]
public bool ShowRilav { get; set; } = false;
[Parameter]
public MappaStatoExplModel? RecMSE { get; set; } = null;
#endregion Public Properties
#region Protected Properties
protected List<ElencoConfermeProdModel> ListComplete { get; set; } = new List<ElencoConfermeProdModel>();
protected List<ElencoConfermeProdModel> ListPaged { get; set; } = new List<ElencoConfermeProdModel>();
[Inject]
protected MessageService MServ { get; set; } = null!;
[Inject]
protected SharedMemService SMServ { get; set; } = null!;
[Inject]
protected TabDataService TabDServ { get; set; } = null!;
#endregion Protected Properties
#region Protected Methods
protected override async Task OnInitializedAsync()
{
await Task.Delay(1);
await ReloadBaseList();
if (RecMSE != null)
{
IdxMaccSel = RecMSE.IdxMacchina;
isMulti = SMServ.DictMacchMulti[IdxMaccSel] == 1;
if (isMulti)
{
var idxMSel = MServ.UserPrefGet(IdxMaccSel);
if (!string.IsNullOrEmpty(idxMSel))
{
IdxMaccSel = idxMSel;
}
}
setupPeriodo();
await ReloadData();
}
}
private void setupPeriodo()
{
DateTime fine = DateTime.Today.AddDays(1);
DateTime inizio = fine.AddDays(-7);
CurrPeriodo = new Periodo(inizio, fine);
}
protected async Task SetMacc(string selIdxMacc)
{
isProcessing = true;
await Task.Delay(1);
IdxMaccSel = selIdxMacc;
await ReloadData();
await Task.Delay(1);
isProcessing = false;
await E_MachSel.InvokeAsync(selIdxMacc);
}
protected void SetNumRec(int newNum)
{
NumRecPage = newNum;
UpdateTable();
}
protected async Task SetOdl(int selIdxOdl)
{
isProcessing = true;
IdxOdl = selIdxOdl;
// se ho odl --> imposto periodo
if (IdxOdl > 0)
{
var recOdl = GetOdl(IdxOdl);
if (recOdl != null && recOdl.IdxOdl == IdxOdl)
{
DateTime fine = DateTime.Today.AddDays(1);
DateTime inizio = fine.AddDays(-7);
CurrPeriodo = new Periodo(recOdl.DataInizio ?? inizio, recOdl.DataFine ?? fine);
}
}
// altrimenti reset..
else
{
setupPeriodo();
}
await ReloadData();
isProcessing = false;
//await Task.Delay(1);
}
protected void SetPage(int newNum)
{
PageNum = newNum;
UpdateTable();
}
protected async Task SetPeriodo(Periodo newPeriodo)
{
CurrPeriodo = newPeriodo;
await ReloadData();
}
protected void UpdateTable()
{
// esegue paginazione
if (TotalCount > NumRecPage)
{
ListPaged = ListComplete
.OrderByDescending(x => x.DataTo)
.Skip((PageNum - 1) * NumRecPage)
.Take(NumRecPage)
.ToList();
}
else
{
ListPaged = ListComplete;
}
}
#endregion Protected Methods
#region Private Fields
private static Logger Log = LogManager.GetCurrentClassLogger();
private Dictionary<int, string> DictOpr = new Dictionary<int, string>();
private bool isMulti = false;
private bool isProcessing = false;
private List<ODLModel> ListaOdl = new List<ODLModel>();
private List<AnagOperatoriModel> ListaOper = new List<AnagOperatoriModel>();
private int NumRecPage = 10;
private int PageNum = 1;
private int TotalCount = 0;
private bool useOdl = false;
#endregion Private Fields
#region Private Properties
private Periodo CurrPeriodo { get; set; } = new Periodo();
private string IdxMaccAltra { get; set; } = "";
/// <summary>
/// Restituisce il codice IdxMacchina dell'altra tavola (se multi) altrimenti la stessa macchina...
/// </summary>
private string idxMaccAltraTav
{
get
{
string answ = "";
if (RecMSE != null)
{
try
{
// verifico se SIA una tavola (ha char "#")
int iSharp = IdxMaccMain.IndexOf('#');
if (iSharp > 0)
{
// ora verifico SE ALTRA TAVOLA ha ODL...
string nomeTav = IdxMaccMain.Substring(iSharp);
string altraTav = nomeTav.Substring(0, nomeTav.Length - 1);
altraTav += nomeTav.EndsWith("1") ? "2" : "1";
// sistemo nome
answ = IdxMaccMain.Replace(nomeTav, altraTav);
}
}
catch
{ }
}
return answ;
}
}
/// <summary>
/// Macchina selezionata MAIN
/// </summary>
private string IdxMaccMain
{
get => RecMSE != null ? RecMSE.IdxMacchina : "";
}
private string IdxMaccSel { get; set; } = "";
private int IdxOdl { get; set; } = 0;
private string selMessage
{
get => useOdl ? "Periodo da ODL" : "Periodo Libero";
}
private bool UseOdl
{
get => useOdl;
set
{
useOdl = value;
if (!value)
{
IdxOdl = 0;
}
}
}
#endregion Private Properties
#region Private Methods
private MarkupString OperDto(int matr)
{
string answ = $"[{matr}]";
// cerco in dizionario
if (DictOpr.ContainsKey(matr))
{
answ = DictOpr[matr];
}
else
{
// altrimenti cerco da lista e inserisco in dizionario
var recOpr = ListaOper.Where(x => x.MatrOpr == matr).FirstOrDefault();
if (recOpr != null)
{
answ = $"{recOpr.Cognome} {recOpr.Nome}<br/>[{matr}]";
}
DictOpr.Add(matr, answ);
}
return (MarkupString)answ;
}
private ODLModel ActiveOdl(DateTime dtRif)
{
var recOdl = ListaOdl
.Where(x => x.DataInizio <= dtRif && (x.DataFine >= dtRif || x.DataFine == null))
.FirstOrDefault();
return recOdl ?? new ODLModel();
}
private ODLModel GetOdl(int idxOdl)
{
var recOdl = ListaOdl
.Where(x => x.IdxOdl == idxOdl)
.FirstOrDefault();
return recOdl ?? new ODLModel();
}
/// <summary>
/// Rileggo anagrafiche di base
/// </summary>
/// <returns></returns>
private async Task ReloadBaseList()
{
ListaOper = await TabDServ.ElencoOperatori();
}
/// <summary>
/// Aggiorno valori produzione alla data richiesta...
/// </summary>
/// <param name="newDate"></param>
private async Task ReloadData()
{
isProcessing = true;
await Task.Delay(1);
if (!string.IsNullOrEmpty(IdxMaccSel))
{
ListaOdl = await TabDServ.OdlListByMaccPeriodo(IdxMaccSel, CurrPeriodo.Inizio, CurrPeriodo.Fine);
ListComplete = await TabDServ.ElencoConfProdFiltAsync(IdxMaccSel, CurrPeriodo.Inizio, CurrPeriodo.Fine);
TotalCount = ListComplete.Count;
// esegue paginazione
UpdateTable();
}
isProcessing = false;
}
#endregion Private Methods
}
}
+1 -1
View File
@@ -3,7 +3,7 @@
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<Version>6.16.2507.1117</Version>
<Version>6.16.2507.2319</Version>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>MP_TAB3</RootNamespace>
</PropertyGroup>
+16
View File
@@ -0,0 +1,16 @@
@page "/ProdConf"
@page "/prod-conf"
@inherits BasePage
@if (string.IsNullOrEmpty(IdxMacc) || CurrMSE == null || IsLoading)
{
<EgwCoreLib.Razor.LoadingData></EgwCoreLib.Razor.LoadingData>
}
else
{
<CheckControls RecMSE="CurrMSE"></CheckControls>
<MachineBlock RecMSE="CurrMSE" FullMode="false" IdxMacchSub="@IdxMaccSubSel"></MachineBlock>
<ProdConfMan RecMSE="CurrMSE" IdxMacchSub="@IdxMaccSubSel"></ProdConfMan>
}
+35
View File
@@ -0,0 +1,35 @@
namespace MP_TAB3.Pages
{
public partial class ProdConf
{
#region Protected Methods
protected async Task ForceReload()
{
IsLoading = true;
await Task.Delay(5);
IsLoading = false;
}
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
await ReloadData();
}
protected void SetMacc(string selIdxMacc)
{
IdxMaccSubSel = selIdxMacc;
}
#endregion Protected Methods
#region Private Fields
private string IdxMaccSubSel = "";
private bool IsLoading = false;
#endregion Private Fields
}
}
+1 -1
View File
@@ -1,6 +1,6 @@
<body>
<i>Modulo MAPOSPEC </i>
<h4>Versione: 6.16.2507.1117</h4>
<h4>Versione: 6.16.2507.2319</h4>
<br /> Note di rilascio:
<ul>
<li>
+1 -1
View File
@@ -1 +1 @@
6.16.2507.1117
6.16.2507.2319
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<item>
<version>6.16.2507.1117</version>
<version>6.16.2507.2319</version>
<url>https://nexus.steamware.net/repository/SWS/MP-TAB3/stable/LAST/MP-TAB3.zip</url>
<changelog>https://nexus.steamware.net/repository/SWS/MP-TAB3/stable/LAST/ChangeLog.html</changelog>
<mandatory>false</mandatory>
+23
View File
@@ -1717,6 +1717,29 @@ namespace MP.Data.Controllers
return dbResult;
}
/// <summary>
/// Restituisce elenco RC filtrato
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="dataFrom"></param>
/// <param name="dataTo"></param>
/// <returns></returns>
public List<ElencoConfermeProdModel> ElencoConfProdFilt(string idxMacchina, DateTime dataFrom, DateTime dataTo)
{
List<ElencoConfermeProdModel> dbResult = new List<ElencoConfermeProdModel>();
using (var dbCtx = new MoonProContext(_configuration))
{
dbResult = dbCtx
.DbSetElConfProd
.Where (x => x.IdxMacchina== idxMacchina && (dataFrom <= x.DataOraConf && x.DataOraConf <= dataTo))
.AsNoTracking()
.ToList();
}
return dbResult;
}
/// <summary>
/// Registra controllo
/// </summary>
@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
#nullable disable
// <Auto-Generated>
// This is here so CodeMaid doesn't reorganize this document
// </Auto-Generated>
namespace MP.Data.DbModels
{
[Table("ElencoConfermeProd")]
public partial class ElencoConfermeProdModel
{
#region Public Properties
public DateTime DataOraConf { get; set; } = DateTime.Now;
[MaxLength(50), Column("idxMacchina")]
public string IdxMacchina { get; set; } = "";
public int MatrApp { get; set; } = 0;
[Column("dataFrom")]
public DateTime DataFrom { get; set; } = DateTime.Now;
[Column("dataTo")]
public DateTime DataTo { get; set; } = DateTime.Now;
[Column("pezziConf")]
public int PezziConf { get; set; } = 0;
[Column("pezziScar")]
public int PezziScar { get; set; } = 0;
[Column("pezziDaRilav")]
public int PezziDaRilav { get; set; } = 0;
[MaxLength(50)]
public string CommessaEsterna { get; set; } = "";
public int TipoConf { get; set; } = 1;
#endregion Public Properties
}
}
+6
View File
@@ -49,6 +49,7 @@ namespace MP.Data
public virtual DbSet<AnagTagsModel> DbSetAnagTags { get; set; }
public virtual DbSet<AnagArticoliModel> DbSetArticoli { get; set; }
public virtual DbSet<ConfigModel> DbSetConfig { get; set; }
public virtual DbSet<ElencoConfermeProdModel> DbSetElConfProd { get; set; }
public virtual DbSet<LinkMenuModel> DbSetLinkMenu { get; set; }
public virtual DbSet<ListValuesModel> DbSetListValues { get; set; }
public virtual DbSet<MacchineModel> DbSetMacchine { get; set; }
@@ -196,6 +197,11 @@ namespace MP.Data
.IsRequired()
.HasMaxLength(50);
});
modelBuilder.Entity<ElencoConfermeProdModel>(entity =>
{
entity.HasKey(e => new { e.DataOraConf, e.IdxMacchina });
});
modelBuilder.Entity<MacchineModel>(entity =>
{
+47 -7
View File
@@ -2644,7 +2644,7 @@ namespace MP.Data.Services
/// <param name="dataFrom"></param>
/// <param name="dataTo"></param>
/// <returns></returns>
public async Task<List<RegistroControlliModel>> RegControlliFilt(string idxMacchina, int idxODL, DateTime dataFrom, DateTime dataTo, bool showMulti)
public async Task<List<RegistroControlliModel>> RegControlliFiltAsync(string idxMacchina, int idxODL, DateTime dataFrom, DateTime dataTo, bool showMulti)
{
int rndWait = rnd.Next(0, 2);
await Task.Delay(rndWait);
@@ -2655,10 +2655,10 @@ namespace MP.Data.Services
List<RegistroControlliModel>? result = new List<RegistroControlliModel>();
// cerco in redis...
string currKey = $"{redisBaseKey}:RecContr:{idxMacchina}:{idxODL}:{dataFrom:yyyyyMMdd-HHmm}:{dataFrom:yyyyyMMdd-HHmm}:{showMulti}";
RedisValue rawData = redisDb.StringGet(currKey);
#if false
RedisValue rawData = await redisDb.StringGetAsync(currKey);
RedisValue rawData = redisDb.StringGet(currKey);
#endif
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (rawData.HasValue)
{
result = JsonConvert.DeserializeObject<List<RegistroControlliModel>>($"{rawData}");
@@ -2669,10 +2669,10 @@ namespace MP.Data.Services
result = dbTabController.RegControlliFilt(idxMacchina, idxODL, dataFrom, dataTo, showMulti);
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
redisDb.StringSet(currKey, rawData, UltraLongCache);
#if false
await redisDb.StringSetAsync(currKey, rawData, UltraLongCache);
redisDb.StringSet(currKey, rawData, UltraLongCache);
#endif
await redisDb.StringSetAsync(currKey, rawData, UltraLongCache);
}
if (result == null)
{
@@ -2680,9 +2680,49 @@ namespace MP.Data.Services
}
sw.Stop();
#if false
Log.Debug($"RegControlliFilt | {source} | {sw.Elapsed.TotalMilliseconds}ms");
Log.Debug($"RegControlliFiltAsync | {source} | {sw.Elapsed.TotalMilliseconds}ms");
#endif
string callName = $"RegControlliFilt.{source}";
string callName = $"RegControlliFiltAsync.{source}";
int numRec = esCollect.RecordCall(callName, sw.Elapsed.TotalMilliseconds);
if (numRec >= nRecLog)
{
Log.Debug(esCollect.GetCallSum(callName, true));
}
return result;
}
/// <summary>
/// Restituisce elenco ElencoConfermeProd filtrato e async
/// </summary>
/// <param name="idxMacchina"></param>
/// <param name="dataFrom"></param>
/// <param name="dataTo"></param>
/// <returns></returns>
public async Task<List<ElencoConfermeProdModel>> ElencoConfProdFiltAsync(string idxMacchina, DateTime dataFrom, DateTime dataTo)
{
// setup parametri costanti
string source = "DB";
Stopwatch sw = new Stopwatch();
sw.Start();
List<ElencoConfermeProdModel> result = new List<ElencoConfermeProdModel>();
// cerco in redis...
string currKey = $"{redisBaseKey}:ElConfProd:{idxMacchina}:{dataFrom:yyyyyMMdd-HHmm}:{dataFrom:yyyyyMMdd-HHmm}";
RedisValue rawData = await redisDb.StringGetAsync(currKey);
if (rawData.HasValue)
{
result = JsonConvert.DeserializeObject<List<ElencoConfermeProdModel>>($"{rawData}")?? new List<ElencoConfermeProdModel>();
source = "REDIS";
}
else
{
result = dbTabController.ElencoConfProdFilt(idxMacchina, dataFrom, dataTo);
// serializzo e salvo...
rawData = JsonConvert.SerializeObject(result);
await redisDb.StringSetAsync(currKey, rawData, UltraLongCache);
}
sw.Stop();
string callName = $"ElencoConfProdFiltAsync.{source}";
int numRec = esCollect.RecordCall(callName, sw.Elapsed.TotalMilliseconds);
if (numRec >= nRecLog)
{