예제 #1
0
 /// <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));
     }
 }
예제 #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));
        }