Update sim past/new events
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
using EgwCoreLib.Lux.Core.Generic;
|
||||
using EgwMultiEngineManager.Data;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
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));
|
||||
}
|
||||
EventDto newEv = new EventDto()
|
||||
{
|
||||
CodTipo = codMacc,
|
||||
Abbrev = $"POR.{minDate.Year}.{currIdx:x8}",
|
||||
Titolo = $"POR.{minDate.Year}.{currIdx:x8}",
|
||||
Descrizione = $"Produzione {codMacc}",
|
||||
DtStart = dtStart,
|
||||
DtEnd = dtEnd,
|
||||
IsExpired = dtEnd < oggi.AddHours(-8),
|
||||
IsPlanned = dtEnd < maxPlan
|
||||
};
|
||||
currListEv.Add(newEv);
|
||||
dtStart = dtEnd.AddMinutes(rnd.Next(minWait, maxWait));
|
||||
currIdx++;
|
||||
maxSim--;
|
||||
}
|
||||
return currListEv;
|
||||
}
|
||||
|
||||
#endregion Private Methods
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user