Files
lux/Lux.UI/Components/Pages/ProdPlanner.razor.cs
T

154 lines
5.3 KiB
C#

using EgwCoreLib.Lux.Core.Generic;
using System.Collections.Generic;
namespace Lux.UI.Components.Pages
{
public partial class ProdPlanner
{
#region Protected Methods
#endregion Protected Methods
#region Private Fields
private List<EventDto> ListEventi { get; set; } = new();
/// <summary>
/// Periodo selezionato attuale
/// </summary>
private EgwCoreLib.Utils.DtUtils.Periodo PeriodoSel = new EgwCoreLib.Utils.DtUtils.Periodo(EgwCoreLib.Utils.DtUtils.PeriodSet.ThisYear);
private Random rnd = new Random();
#endregion Private Fields
#region Private Methods
/// <summary>
/// Sim modalità iniziale
/// </summary>
/// <returns></returns>
private async Task DoSimData()
{
// simulo eventi...
DateTime limStart = new DateTime(DateTime.Today.Year, 1, 1);
DateTime limEnd = new DateTime(DateTime.Today.Year, 12, 31);
await Task.Delay(50);
int idx = 1;
var simSaomad = DoSimPeriod("Saomad", idx, limStart, limEnd, 8, 19);
ListEventi.AddRange(simSaomad);
idx += ListEventi.Count();
var simEssetre = DoSimPeriod("Essetre", idx, limStart, limEnd, 8, 19);
ListEventi.AddRange(simEssetre);
}
/// <summary>
/// Genera un set di elementi simulati secondo i criteri ricevuti
/// </summary>
/// <param name="codMacc"></param>
/// <param name="minDate"></param>
/// <param name="maxDate"></param>
/// <param name="hStart"></param>
/// <param name="hEnd"></param>
/// <param name="minDur"></param>
/// <param name="maxDur"></param>
/// <param name="maxSim"></param>
/// <returns></returns>
private List<EventDto> DoSimPeriod(string codMacc, int currIdx, DateTime minDate, DateTime maxDate, int hStart = 8, int hEnd = 18, int minDur = 60, int maxDur = 360, int maxSim = 500)
{
List<EventDto> currListEv = new();
// init date cursore
DateTime dtStart = minDate.AddHours(hStart);
DateTime dtEnd = dtStart;
// ciclo principale entro limiti...
while (dtStart < maxDate && maxSim > 0)
{
// definisce limite giornaliero
DateTime fineGiornata = dtStart.Date.AddHours(hEnd);
// Verifica dtStart sia entro limite giornaliero altrimenti va alla mattina dopo..
if (dtStart >= fineGiornata.AddMinutes(-30))
{
dtStart = dtStart.Date.AddDays(1).AddHours(hStart);
fineGiornata = dtStart.Date.AddHours(hEnd);
}
// Trova il prossimo giorno lavorativo (lunedì-venerdì) dopo dtStart
while (dtStart.DayOfWeek == DayOfWeek.Saturday || dtStart.DayOfWeek == DayOfWeek.Sunday)
{
dtStart = dtStart.AddDays(1);
fineGiornata = dtStart.Date.AddHours(hEnd);
}
// Se siamo oltre la data di limEnd, interrompi
if (dtStart > maxDate)
break;
// Calcola la fine dell'evento
dtEnd = dtStart.AddMinutes(rnd.Next(minDur, maxDur));
// Verifica se l'evento supera il limite orario
if (dtEnd > fineGiornata)
{
// Se supera il limite, taglia l'evento entro +/-30 minuti da hEnd
dtEnd = fineGiornata.AddMinutes(rnd.Next(-30, 30));
}
EventDto newEv = new EventDto()
{
CodTipo = codMacc,
Abbrev = $"POR.{minDate.Year}.{currIdx:x8}",
Titolo = $"POR.{minDate.Year}.{currIdx:x8}",
Descrizione = $"Produzione {codMacc}",
DtStart = dtStart,
DtEnd = dtEnd
};
currListEv.Add(newEv);
dtStart = dtEnd.AddMinutes(rnd.Next(5, 25));
currIdx++;
maxSim--;
}
return currListEv;
}
/// <summary>
/// Legge i dati dei record completi
/// </summary>
private async Task ReloadData()
{
if (ListEventi.Count == 0)
{
ListEventi = new List<EventDto>();
//ListEventi.Clear();
await DoSimData();
}
}
/// <summary>
/// Imposta periodo da filtro
/// </summary>
/// <param name="newPeriod"></param>
/// <returns></returns>
private async Task SetPeriodo(EgwCoreLib.Utils.DtUtils.Periodo newPeriod)
{
PeriodoSel = newPeriod;
await ReloadData();
UpdateTable();
}
/// <summary>
/// Filtro e paginazione
/// </summary>
private void UpdateTable()
{
#if false
// fix paginazione
ListRecords = ListFilt
.Skip(numRecord * (currPage - 1))
.Take(numRecord)
.ToList();
#endif
}
#endregion Private Methods
}
}