/// <summary> /// Restituisce l'elenco delle azioni iniziali da aggiungere ad una richiesta. L'azione si /// limita alla composizione partenza, poiché ogni azione, all'atto della sua esecuzione, /// restituisce l'azione successiva da eseguire. /// </summary> /// <param name="richiesta">La richiesta alla quale aggiungere l'azione</param> /// <param name="parcoMezzi">Il parco mezzi sul quale insistono le richieste</param> /// <returns>L'elenco delle azioni da aggiungere</returns> private IEnumerable <IAzioneSuRichiesta> GetAzioni(RichiestaConParametri richiesta, ParcoMezzi parcoMezzi) { foreach (var parametriMezzo in richiesta.Parametri.ParametriMezzi) { yield return(new AggiungiPresaInCarico( richiesta.Parametri.DataSegnalazione.AddSeconds(parametriMezzo.SecondiComposizione), richiesta, parametriMezzo, parcoMezzi)); } }
/// <summary> /// Genera le richieste secondo i parametri specificati nel costruttore della classe. /// </summary> /// <returns>Le richieste pseudo-random</returns> public IEnumerable <RichiestaAssistenza> Genera() { //Questi Faker sono messi qui perchè contengono dei dati comuni a più proprietà Faker generaFaker = new Faker("it"); string indirizzo = generaFaker.Address.StreetAddress(); string noteLocalita = generaFaker.Lorem.Sentence(); var zoneEmergenza = new[] { "Sisma Gotham City", "Alluvione Smallville", "Uragano Metropolis" }.ToList(); var fakerRichiesteAssistenza = new Faker <RichiestaAssistenza>("it") .StrictMode(true) //.RuleFor(ra => ra.Id, f => f.UniqueIndex.ToString()) .RuleFor(ra => ra.Codice, f => string.Format("{0}{1}{2:D5}", this.codiceUnitaOperativa.Substring(0, 2), DateTime.Now.Day.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Year.ToString().Substring(2, 2), f.IndexGlobal)) .RuleFor(ra => ra.NotePubbliche, "") .RuleFor(ra => ra.NotePrivate, "") .RuleFor(ra => ra.CodRichiesta, "") .RuleFor(ra => ra.CodSOCompetente, f => this.codiceUnitaOperativa) .RuleFor(ra => ra.CodOperatore, f => "5e53e1345325498641f2fe2b") .RuleFor(ra => ra.CodSOAllertate, f => new HashSet <string> { this.codiceUnitaOperativa }) .RuleFor(ra => ra.Tipologie, f => this.GeneraTipologie()) .RuleFor(ra => ra.IstanteChiusura, f => null) .RuleFor(ra => ra.CodZoneEmergenza, f => f.Random.Float() < 0.001 ? new[] { f.Random.ListItem(zoneEmergenza) } : new string[0]) .RuleFor(ra => ra.Descrizione, f => f.Lorem.Sentence()) .RuleFor(ra => ra.Richiedente, f => new Richiedente(f.Name.FirstName(), f.Phone.Locale)) .RuleFor(ra => ra.CodUOCompetenza, f => new[] { "RM.1000", "RM.1007", "RM.1001" }) .RuleFor(ra => ra.Localita, f => new Localita( this.generatoreCoordinateInterventoPerUO.Genera(codiceUnitaOperativa), indirizzo, noteLocalita)) .RuleFor(ra => ra.Competenze, f => GeneraCompetenze()) .Ignore(ra => ra.Tags) .Ignore(ra => ra.TrnInsChiamata) .Ignore(ra => ra.TipoTerreno) .Ignore(ra => ra.CodEntiIntervenuti) .Ignore(ra => ra.CodEntiPresaInCarico) .Ignore(ra => ra.ObiettivoSensibile) .Ignore(ra => ra.Id) .Ignore(ra => ra.UtInLavorazione) .Ignore(ra => ra.UtPresaInCarico); var fakerTelefonata = new Faker <Telefonata>() .StrictMode(true) .RuleFor(t => t.CodiceSchedaContatto, f => f.Random.Replace("??###")) .RuleFor(t => t.NominativoChiamante, f => f.Name.LastName()) .RuleFor(t => t.Esito, f => "Avente seguito") .RuleFor(t => t.Motivazione, f => f.Lorem.Text()) .RuleFor(t => t.NominativoChiamante, f => f.Name.FirstName()) .RuleFor(t => t.NotePrivate, f => f.Lorem.Sentence(10)) .RuleFor(t => t.NotePubbliche, f => f.Lorem.Sentence(10)) .RuleFor(t => t.NumeroTelefono, f => f.Phone.PhoneNumber()) .Ignore(t => t.TipoEvento); var numeroInterventi = (int)(this.dataMax.Subtract(this.dataMin).TotalDays *this.richiesteMedieAlGiorno); var richiesteConParametri = (from intervento in Enumerable.Range(1, numeroInterventi) let parametri = ParametriRichiesta.GetParametriFake( this.dataMin, this.dataMax, this.pesiNumeroMezziPartecipanti, new Gaussiana(this.mediaSecondiPartenzaDallaSedeSuccessive, this.mediaSecondiPartenzaDallaSedeSuccessive / 3), new Gaussiana(this.mediaSecondiArrivoSulPosto, this.mediaSecondiArrivoSulPosto / 3), new Gaussiana(this.mediaSecondiDurataIntervento, this.mediaSecondiDurataIntervento / 3), new Gaussiana(this.mediaSecondiRientroInSede, this.mediaSecondiRientroInSede / 3)) select new RichiestaConParametri { Richiesta = fakerRichiesteAssistenza.Generate(), Parametri = parametri, MezziAncoraDaInviare = parametri.ParametriMezzi.Length }).ToList(); // Aggiunta eventi telefonata in base ai parametri selezionati per ogni richiesta foreach (var r in richiesteConParametri) { var t = fakerTelefonata .CustomInstantiator(f => new Telefonata(r.Richiesta, f.Random.Replace("??###"), r.Parametri.DataSegnalazione, "FonteTelefonata")) .Generate(); } var parcoMezzi = new ParcoMezzi( this.getMezziInServizioPerUnitaOperativa, this.codiceUnitaOperativa); var azioni = richiesteConParametri .SelectMany(r => this.GetAzioni(r, parcoMezzi)) .Where(a => a.IstantePrevisto <= this.dataMax) .OrderBy(a => a.IstantePrevisto) .ToList(); var dataSimulata = this.dataMin; var simulazioneTerminata = false; while (azioni.Any(a => !a.Eseguita()) && !simulazioneTerminata) { for (int i = 0; i < azioni.Count; i++) { simulazioneTerminata = true; if (!azioni[i].Eseguita()) { var azione = azioni[i]; if (azione.IstantePrevisto > dataSimulata) { dataSimulata = azione.IstantePrevisto; } azioni.AddRange(azione.Esegui(dataSimulata).Where(a => a.IstantePrevisto <= this.dataMax)); if (azione.Eseguita()) { simulazioneTerminata = false; break; } } } azioni = azioni .Where(a => !a.Eseguita()) .OrderBy(a => a.IstantePrevisto) .ToList(); } return(richiesteConParametri.Select(r => r.Richiesta)); }