Example #1
0
        /// <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);
        }
Example #2
0
        /// <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));
        }