/// <summary> /// Metodo per la generazione di parametri di una richiesta fake /// </summary> /// <param name="dataMin"> /// L'estremo inferiore dell'intervallo in cui le richieste possono essere generate /// </param> /// <param name="dataMax"> /// L'estremo superiore dell'intervallo in cui le richieste possono essere generate /// </param> /// <param name="pesiNumeroMezziPartecipanti"> /// Pesi del numero di mezzi partecipanti ad un intervento (per es. se i pesi sono[0.75, /// 0.20, 0.05] significa che al 75% un intervento ha un solo mezzo, al 20% ne ha due, al /// 5% ne ha tre). /// </param> /// <param name="secondiPartenzeSuccessive"> /// Gaussiana per la generazione del tempo dopo il quale vengono inviate le partenza /// successive alla prima /// </param> /// <param name="secondiArrivoSulPosto"> /// Gaussiana per la generazione del tempo di viaggio verso il luogo del sinistro /// </param> /// <param name="secondiPermanenzaSulPosto"> /// Gaussiana per la generazione del tempo di permanenza del mezzo sul posto /// </param> /// <param name="secondiInRientro"> /// Gaussiana per la generazione del tempo di viaggio dal luogo del sinistro verso la sede /// (sempre che il mezzo non venga rediretto su altra richiesta) /// </param> /// <returns>L'istanza fake creata</returns> public static ParametriRichiesta GetParametriFake( DateTime dataMin, DateTime dataMax, float[] pesiNumeroMezziPartecipanti, Gaussiana secondiPartenzeSuccessive, Gaussiana secondiArrivoSulPosto, Gaussiana secondiPermanenzaSulPosto, Gaussiana secondiInRientro) { var numeroMezzi = FAKER.Random.WeightedRandom(Enumerable.Range(1, pesiNumeroMezziPartecipanti.Length).ToArray(), pesiNumeroMezziPartecipanti); var dataSegnalazione = FAKER.Date.Between(dataMin, dataMax); var parametriRichiesta = new ParametriRichiesta() { DataSegnalazione = dataSegnalazione, ParametriMezzi = Enumerable.Range(1, numeroMezzi) .Select(i => ParametriMezzo.GenerateFake( i == 1, // la prima partenza è sempre immediata secondiPartenzeSuccessive, secondiArrivoSulPosto, secondiPermanenzaSulPosto, secondiInRientro)) .OrderBy(p => p.SecondiComposizione) .ToArray() }; return(parametriRichiesta); }
/// <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)); }