using EgwCoreLib.Lux.Core.Generic; namespace EgwCoreLib.Lux.Data.Controllers { public class DataSimulatorController { #region Public Constructors /// /// Controller per generazioen dati simulati /// public DataSimulatorController() { rnd = new Random(); } #endregion Public Constructors #region Internal Methods /// /// Restituisce un dizionario di dati simulati x rappresentazione in planner /// /// /// /// internal Dictionary>? PlannerGetEvents(DateTime dtStart, DateTime dtEnd) { var dictAnsw = new Dictionary>(); 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 /// /// Genera un set di elementi simulati secondo i criteri ricevuti /// /// /// /// /// /// /// /// /// /// private List 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 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 } }