Files
lux/Lux.UI/Components/Pages/ProdPlanner.razor.cs
T
2026-01-14 18:45:45 +01:00

370 lines
12 KiB
C#

using EgwCoreLib.Lux.Core.Generic;
namespace Lux.UI.Components.Pages
{
public partial class ProdPlanner
{
#region Protected Methods
protected override async Task OnParametersSetAsync()
{
await ReloadData();
}
#endregion Protected Methods
#region Private Fields
private List<EventDto> ListEventi = 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();
/// <summary>
/// modo sim:
/// 1: qwen coder 30b
/// 2: qwen 2504 4b
/// 3: manuale
/// </summary>
private int simMode = 1;
#endregion Private Fields
#region Private Methods
/// <summary>
/// Sim modo 1 (QWEN 2504 30b)
/// </summary>
/// <returns></returns>
private async Task DoSimModeOne()
{
// qwen 2504 coder 30b
// simulo eventi...
ListEventi.Clear();
DateTime inizio = new DateTime(DateTime.Today.Year, 1, 1);
int numSim = 350;
int hStart = 8;
int hEnd = 18;
DateTime dtStart = inizio.AddHours(hStart);
int idx = 1;
// ordini Saomad
string codMacc = "Saomad";
for (int i = 0; i < numSim; i++)
{
// Calcola la fine dell'evento
DateTime dtEnd = dtStart.AddMinutes(rnd.Next(120, 960));
// Verifica se l'evento supera il limite orario
DateTime fineGiornata = dtStart.Date.AddHours(hEnd);
if (dtEnd > fineGiornata)
{
// Se supera il limite, taglia l'evento entro 30 minuti dopo hEnd
dtEnd = fineGiornata.AddMinutes(30);
}
EventDto newEv = new EventDto()
{
CodTipo = codMacc,
Abbrev = $"POR.{inizio.Year}.{idx++:x8}",
Titolo = $"POR.{inizio.Year}.{idx++:x8}",
Descrizione = $"Produzione {codMacc}",
DtStart = dtStart,
DtEnd = dtEnd
};
ListEventi.Add(newEv);
dtStart = dtEnd;
// se finisce di sabato/domenica --> scatta al lunedì!
if (dtStart.DayOfWeek >= DayOfWeek.Saturday)
{
dtStart = dtStart.AddDays(2);
// Assicurati che il nuovo inizio sia all'inizio della giornata lavorativa
dtStart = dtStart.Date.AddHours(hStart);
}
}
// ordini Essetre..
codMacc = "Essetre";
dtStart = inizio.AddHours(hStart);
for (int i = 0; i < numSim; i++)
{
// Calcola la fine dell'evento
DateTime dtEnd = dtStart.AddMinutes(rnd.Next(120, 960));
// Verifica se l'evento supera il limite orario
DateTime fineGiornata = dtStart.Date.AddHours(hEnd);
if (dtEnd > fineGiornata)
{
// Se supera il limite, taglia l'evento entro 30 minuti dopo hEnd
dtEnd = fineGiornata.AddMinutes(30);
}
EventDto newEv = new EventDto()
{
CodTipo = codMacc,
Abbrev = $"POR.{inizio.Year}.{idx++:x8}",
Titolo = $"POR.{inizio.Year}.{idx++:x8}",
Descrizione = $"Produzione {codMacc}",
DtStart = dtStart,
DtEnd = dtEnd
};
ListEventi.Add(newEv);
dtStart = dtEnd;
// se finisce di sabato/domenica --> scatta al lunedì!
if (dtStart.DayOfWeek >= DayOfWeek.Saturday)
{
dtStart = dtStart.AddDays(2);
// Assicurati che il nuovo inizio sia all'inizio della giornata lavorativa
dtStart = dtStart.Date.AddHours(hStart);
}
}
}
/// <summary>
/// Sim modalità iniziale
/// </summary>
/// <returns></returns>
private async Task DoSimModeThree()
{
// simulo eventi...
ListEventi.Clear();
DateTime inizio = new DateTime(DateTime.Today.Year, 1, 1);
int numSim = 365;
int hStart = 8;
int hEnd = 18;
DateTime dtStart = inizio.AddHours(hStart);
DateTime dtEnd = dtStart;
int idx = 1;
// ordini Saomad
string codMacc = "Saomad";
for (int i = 0; i < numSim; i++)
{
dtEnd = dtStart.AddMinutes(rnd.Next(120, 960));
// se vado oltre fine --> taglia!
var delta = dtEnd.Subtract(dtEnd.Date.AddHours(hEnd));
if (delta.TotalMinutes > 30)
{
dtEnd = dtEnd.AddMinutes(-(delta.TotalMinutes - rnd.Next(5, 25)));
}
EventDto newEv = new EventDto()
{
CodTipo = codMacc,
Abbrev = $"POR.{inizio.Year}.{idx++:x8}",
Titolo = $"POR.{inizio.Year}.{idx++:x8}",
Descrizione = $"Produzione {codMacc}",
DtStart = dtStart,
DtEnd = dtEnd
};
ListEventi.Add(newEv);
dtStart = dtEnd;
// se finisce di sabato/domenica --> scatta al lunedì!
if (dtStart.DayOfWeek >= DayOfWeek.Saturday)
{
dtStart = dtStart.AddDays(2);
}
}
// ordini Essetre..
codMacc = "Essetre";
dtStart = inizio.AddHours(hStart);
dtEnd = dtStart;
for (int i = 0; i < numSim; i++)
{
dtEnd = dtStart.AddMinutes(rnd.Next(120, 960));
// se vado oltre fine --> taglia!
var delta = dtEnd.Subtract(dtEnd.Date.AddHours(hEnd));
if (delta.TotalMinutes > 30)
{
dtEnd = dtEnd.AddMinutes(-(delta.TotalMinutes - rnd.Next(5, 25)));
}
EventDto newEv = new EventDto()
{
CodTipo = codMacc,
Abbrev = $"POR.{inizio.Year}.{idx++:x8}",
Titolo = $"POR.{inizio.Year}.{idx++:x8}",
Descrizione = $"Produzione {codMacc}",
DtStart = dtStart,
DtEnd = dtEnd
};
ListEventi.Add(newEv);
dtStart = dtEnd;
// se finisce di sabato/domenica --> scatta al lunedì!
if (dtStart.DayOfWeek >= DayOfWeek.Saturday)
{
dtStart = dtStart.AddDays(2);
}
}
}
/// <summary>
/// Sim modo 2 (QWEN 2504 4b)
/// </summary>
/// <returns></returns>
private async Task DoSimModeTwo()
{
// qwen 2504 4b
// simulo eventi...
ListEventi.Clear();
DateTime inizio = new DateTime(DateTime.Today.Year, 1, 1);
int numSim = 350;
int hStart = 8;
int hEnd = 18; // orario di fine (18:00)
// Durata massima consentita: 30 minuti dopo le 18:00 → max 18:30
DateTime dtStart = inizio.AddHours(hStart);
DateTime dtEnd = dtStart;
int idx = 1;
// --- Ordini Saomad ---
string codMacc = "Saomad";
for (int i = 0; i < numSim; i++)
{
// Genera una durata casuale (da 120 a 960 minuti) → ma non va oltre 18:30
// Quindi dobbiamo limitare il valore finale a 18:30
// Calcoliamo il massimo possibile: 18:30
DateTime maxEnd = inizio.AddHours(hEnd).AddMinutes(30); // 18:30
// Se il giorno è sabato/domenica, spostiamo il giorno al lunedì (come prima)
DateTime currentStart = dtStart;
// Calcoliamo il tempo massimo di fine: 18:30
DateTime endLimit = currentStart.AddHours(hEnd).AddMinutes(30); // 18:30
// Durata casuale (ma non superiore a 30 minuti dopo le 18:00)
int duration = rnd.Next(120, 960); // da 120 a 960 minuti
DateTime proposedEnd = currentStart.AddMinutes(duration);
// Se l'evento supera 18:30, lo tagliamo a 18:30
if (proposedEnd > endLimit)
{
proposedEnd = endLimit;
}
// Assicuriamo che l'evento non finisca dopo le 18:30
dtEnd = proposedEnd;
EventDto newEv = new EventDto()
{
CodTipo = codMacc,
Abbrev = $"POR.{inizio.Year}.{idx++:x8}",
Titolo = $"POR.{inizio.Year}.{idx++:x8}",
Descrizione = $"Produzione {codMacc}",
DtStart = currentStart,
DtEnd = dtEnd
};
ListEventi.Add(newEv);
// Passa al giorno successivo (se finisce sabato/domenica → passa al lunedì)
if (dtEnd.DayOfWeek >= DayOfWeek.Saturday)
{
dtStart = dtEnd.AddDays(2); // lunedì dopo sabato/domenica
}
else
{
dtStart = dtEnd; // continua il giorno successivo
}
}
// --- Ordini Essetre ---
codMacc = "Essetre";
dtStart = inizio.AddHours(hStart);
for (int i = 0; i < numSim; i++)
{
// Lo stesso ragionamento
DateTime currentStart = dtStart;
DateTime endLimit = currentStart.AddHours(hEnd).AddMinutes(30); // 18:30
int duration = rnd.Next(120, 960);
DateTime proposedEnd = currentStart.AddMinutes(duration);
if (proposedEnd > endLimit)
{
proposedEnd = endLimit;
}
dtEnd = proposedEnd;
EventDto newEv = new EventDto()
{
CodTipo = codMacc,
Abbrev = $"POR.{inizio.Year}.{idx++:x8}",
Titolo = $"POR.{inizio.Year}.{idx++:x8}",
Descrizione = $"Produzione {codMacc}",
DtStart = currentStart,
DtEnd = dtEnd
};
ListEventi.Add(newEv);
if (dtEnd.DayOfWeek >= DayOfWeek.Saturday)
{
dtStart = dtEnd.AddDays(2);
}
else
{
dtStart = dtEnd;
}
}
}
/// <summary>
/// Legge i dati dei record completi
/// </summary>
private async Task ReloadData()
{
switch (simMode)
{
case 1:
await DoSimModeOne();
break;
case 2:
await DoSimModeTwo();
break;
case 3:
default:
await DoSimModeThree();
break;
}
}
/// <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
}
}