Files
lux/EgwCoreLib.Lux.Data/Controllers/DataSimulatorController.cs
T

127 lines
4.7 KiB
C#

using EgwCoreLib.Lux.Core.Generic;
namespace EgwCoreLib.Lux.Data.Controllers
{
public class DataSimulatorController
{
#region Public Constructors
/// <summary>
/// Controller per generazioen dati simulati
/// </summary>
public DataSimulatorController()
{
rnd = new Random();
}
#endregion Public Constructors
#region Internal Methods
/// <summary>
/// Restituisce un dizionario di dati simulati x rappresentazione in planner
/// </summary>
/// <param name="dtStart"></param>
/// <param name="dtEnd"></param>
/// <returns></returns>
internal Dictionary<string, List<EventDto>>? PlannerGetEvents(DateTime dtStart, DateTime dtEnd)
{
var dictAnsw = new Dictionary<string, List<EventDto>>();
int idx = 1;
var simSaomad = DoSimPeriod("Saomad", idx, dtStart, dtEnd, 8, 19);
dictAnsw.Add("Saomad", simSaomad);
idx += simSaomad.Count();
var simEssetre = DoSimPeriod("Essetre", idx, dtStart, dtEnd, 8, 19);
dictAnsw.Add("Essetre", simEssetre);
return dictAnsw;
}
#endregion Internal Methods
#region Private Fields
private Random rnd = new Random();
#endregion Private Fields
#region Private Methods
/// <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 = 120, int maxDur = 360, int maxSim = 300, int minWait = 5, int maxWait = 25)
{
List<EventDto> currListEv = new();
// init date cursore
DateTime oggi = DateTime.Today;
DateTime maxPlan = oggi.AddDays(20);
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));
}
// calcolo il tipo sim da expired/planned..
bool isExp = dtEnd < oggi.AddHours(-8);
bool isPlan = dtEnd < maxPlan;
string ordCode = isExp ? "ODL" : isPlan ? "PODL" : "POR";
EventDto newEv = new EventDto()
{
CodTipo = codMacc,
Abbrev = $"{ordCode}.{minDate.Year}.{currIdx:x8}",
Titolo = $"{ordCode}.{minDate.Year}.{currIdx:x8}",
Descrizione = $"Produzione {codMacc}",
DtStart = dtStart,
DtEnd = dtEnd,
IsExpired = isExp,
IsPlanned = isPlan
};
currListEv.Add(newEv);
dtStart = dtEnd.AddMinutes(rnd.Next(minWait, maxWait));
currIdx++;
maxSim--;
}
return currListEv;
}
#endregion Private Methods
}
}