370 lines
12 KiB
C#
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
|
|
}
|
|
} |