127 lines
4.7 KiB
C#
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
|
|
}
|
|
} |