Пример #1
0
        public async Task <List <Mezzo> > Get(AreaMappa areaMappa)
        {
            var ListaAnagraficaMezzo   = new List <AnagraficaMezzo>();
            var ListaPosizioneFlotta   = _getPosizioneFlotta.Get(0).Result;
            var ListaMezziInRettangolo = new List <MessaggioPosizione>();

            ListaMezziInRettangolo.AddRange(ListaPosizioneFlotta.Where(mezzo => mezzo.Localizzazione.Lat >= areaMappa.BottomLeft.Latitudine && mezzo.Localizzazione.Lat <= areaMappa.TopRight.Latitudine && mezzo.Localizzazione.Lon >= areaMappa.BottomLeft.Longitudine && mezzo.Localizzazione.Lon <= areaMappa.TopRight.Longitudine));

            List <Mezzo> ListaMezziAreaMappa = GetAnagraficaMezziByTarga(ListaMezziInRettangolo).Result;

            return(GetListaMezziConStatoAggiornat(ListaMezziAreaMappa));
        }
Пример #2
0
        public async Task <List <Mezzo> > Get(List <string> sedi, string genereMezzo = null, string codiceMezzo = null, List <MessaggioPosizione> posizioneFlotta = null)
        {
            var pinNodi            = sedi.Select(s => new PinNodo(s, true));
            var ListaCodiciComandi = new List <string>();
            var ListaCodiciSedi    = new List <string>();
            var listaSediAlberate  = _getAlberaturaUnitaOperative.ListaSediAlberata();

            foreach (var figlio in listaSediAlberate.GetSottoAlbero(pinNodi))
            {
                var    codice  = figlio.Codice;
                string codiceE = "";
                codiceE = ListaCodiciSedi.Find(x => x.Equals(codice));
                if (string.IsNullOrEmpty(codiceE))
                {
                    if (!ListaCodiciComandi.Contains(codice.Split('.')[0]))
                    {
                        ListaCodiciComandi.Add(codice.Split('.')[0]);
                    }
                    ListaCodiciSedi.Add(codice);
                }
            }

            var ListaPosizioneFlotta = new List <MessaggioPosizione>();

            if (posizioneFlotta == null)
            {
                ListaPosizioneFlotta = _getPosizioneFlotta.Get(0).Result;
            }
            else
            {
                ListaPosizioneFlotta = posizioneFlotta;
            }

            var ListaAnagraficaMezzo = GetAnagraficaMezziByCodComando(ListaCodiciComandi).Result;

            var ListaMezzi = new List <Mezzo>();

            #region LEGGO DA API ESTERNA

            GetToken getToken = new GetToken(_client, _configuration, _memoryCache, _writeLog, _httpContext);
            var      token    = getToken.GeneraToken();

            var lstMezziDto = new List <MezzoDTO>();
            try
            {
                Parallel.ForEach(sedi, sede =>
                {
                    var httpManager = new HttpRequestManager <List <MezzoDTO> >(_client, _memoryCache, _writeLog, _httpContext, _configuration);
                    httpManager.Configure("Mezzi_" + sede);

                    var lstSediQueryString = string.Join("&codiciSedi=", ListaCodiciSedi.Where(s => sede.Contains(s.Split(".")[0])).ToArray());
                    var url = new Uri($"{_configuration.GetSection("UrlExternalApi").GetSection("GacApi").Value}{Classi.Costanti.GacGetMezziUtilizzabili}?codiciSedi={lstSediQueryString}");
                    lock (lstMezziDto)
                        lstMezziDto.AddRange(httpManager.GetAsync(url, token).Result);
                });
            }
            catch (Exception e)
            {
                throw new Exception("Elenco dei mezzi non disponibile");
            }

            #endregion LEGGO DA API ESTERNA

            //MAPPING
            ListaMezzi = lstMezziDto.Select(m =>
            {
                //if (!mezzoFake.Equals("CMOB"))
                //{
                var anagraficaMezzo = ListaAnagraficaMezzo.Find(x => x.Targa.Equals(m.Descrizione));
                var mezzo           = MapMezzo(anagraficaMezzo, m);
                if (mezzo != null)
                {
                    //listaMezziBySedeAppo.Add(mezzo);
                    ListaMezzi.Add(mezzo);
                }
                //}
                return(mezzo);
            }).ToList();

            ListaMezzi = ListaMezzi.Select(mezzo =>
            {
                var CoordinateMezzoGeoFleet = ListaPosizioneFlotta.Find(x => x.CodiceMezzo.Equals(mezzo.Codice));

                if (CoordinateMezzoGeoFleet == null)
                {
                    mezzo.Coordinate     = mezzo.Distaccamento.Coordinate;
                    mezzo.CoordinateFake = true;
                }
                else
                {
                    mezzo.Coordinate     = new Coordinate(CoordinateMezzoGeoFleet.Localizzazione.Lat, CoordinateMezzoGeoFleet.Localizzazione.Lon);
                    mezzo.CoordinateFake = false;
                }

                return(mezzo);
            }).ToList();

            return(GetListaMezziConStatoAggiornat(ListaMezzi));
        }
Пример #3
0
        public async Task <List <Mezzo> > Get(List <string> sedi, string genereMezzo = null, string codiceMezzo = null)
        {
            var ListaCodiciSedi    = new List <string>();
            var ListaCodiciComandi = new List <string>();

            var listaSediAlberate = _getAlberaturaUnitaOperative.ListaSediAlberata();
            var pinNodi           = sedi.Select(sede => new PinNodo(sede, true)).ToList();

            foreach (var figlio in listaSediAlberate.GetSottoAlbero(pinNodi))
            {
                var    codice  = figlio.Codice;
                string codiceE = "";
                codiceE = ListaCodiciSedi.Find(x => x.Equals(codice));
                if (string.IsNullOrEmpty(codiceE))
                {
                    if (!ListaCodiciComandi.Contains(codice.Split('.')[0]))
                    {
                        ListaCodiciComandi.Add(codice.Split('.')[0]);
                    }
                    ListaCodiciSedi.Add(codice);
                }
            }

            var ListaAnagraficaMezzo = new List <AnagraficaMezzo>();
            var ListaPosizioneFlotta = _getPosizioneFlotta.Get(0).Result;

            #region LEGGO DA API ESTERNA

            GetToken getToken = new GetToken(_client, _configuration, _memoryCache, _writeLog, _httpContext);
            var      token    = getToken.GeneraToken();

            var lstMezziDto = new List <MezzoDTO>();
            Parallel.ForEach(sedi, sede =>
            {
                var httpManager = new HttpRequestManager <List <MezzoDTO> >(_client, _memoryCache, _writeLog, _httpContext, _configuration);
                httpManager.Configure("Mezzi_" + sede);

                var lstSediQueryString = string.Join("&codiciSedi=", ListaCodiciSedi.Where(s => sede.Contains(s.Split(".")[0])).ToArray());
                var url = new Uri($"{_configuration.GetSection("UrlExternalApi").GetSection("GacApi").Value}{Costanti.GacGetMezziUtilizzabili}?codiciSedi={lstSediQueryString}");
                lock (lstMezziDto)
                    lstMezziDto.AddRange(httpManager.GetAsync(url, token).Result);
            });

            #endregion LEGGO DA API ESTERNA

            var ListaStatiOperativiMezzi = _getStatoMezzi.Get(sedi.ToArray());

            var ListaMezzi = lstMezziDto.Select(m =>
            {
                //if (!mezzoFake.Equals("CMOB"))
                //{
                var mezzo = MapMezzo(m);
                if (mezzo != null)
                {
                    //listaMezziBySedeAppo.Add(mezzo);
                    return(mezzo);
                }
                //}

                if (ListaStatiOperativiMezzi.Count > 0)
                {
                    mezzo.Stato = ListaStatiOperativiMezzi.Find(x => x.CodiceMezzo.Equals(mezzo.Codice)).StatoOperativo;
                }
                else
                {
                    mezzo.Stato = Costanti.MezzoInSede;
                }

                return(mezzo);
            }).ToList();

            return(ListaMezzi);
        }
Пример #4
0
        public ComposizionePartenzaAvanzataResult Handle(ComposizionePartenzaAvanzataQuery query)
        {
            Log.Debug("Inizio elaborazione Composizione partenza avanzata Handler");

            var lstSedi     = query.CodiceSede.ToList();
            var tipologia90 = _getTipologieByCodice.Get(new List <string> {
                "90"
            }).First();

            var turnoCorrente   = _getTurno.Get();
            var turnoPrecedente = _getTurno.Get(turnoCorrente.DataOraInizio.AddMilliseconds(-1));
            var turnoSuccessivo = _getTurno.Get(turnoCorrente.DataOraFine.AddMinutes(1));

            //REPERISCO I DATI, FACCIO IL MAPPING ED APPLICO I FILTRI (MEZZI E SQUADRE)
            var lstSquadre = Task.Factory.StartNew(() => _getListaSquadre.Get(lstSedi)
                                                   .ContinueWith(lstsquadre =>
            {
                var statiOperativi = _getStatoSquadre.Get(lstSedi);

                return(lstsquadre.Result.Select(squadra =>
                {
                    if (statiOperativi.Exists(x => x.IdSquadra.Equals(squadra.Id)))
                    {
                        squadra.Stato = MappaStatoSquadraDaStatoMezzo.MappaStato(statiOperativi.Find(x => x.IdSquadra.Equals(squadra.Id)).StatoSquadra);
                    }
                    else
                    {
                        squadra.Stato = Squadra.StatoSquadra.InSede;
                    }

                    var comp = new Classi.Composizione.ComposizioneSquadre()
                    {
                        Id = squadra.Id,
                        Squadra = squadra
                    };

                    squadra.IndiceOrdinamento = new OrdinamentoSquadre(query.Richiesta).GetIndiceOrdinamento(comp);


                    return comp;
                }));
            })
                                                   .ContinueWith(lstCompSquadre => FiltraSquadre(query, lstCompSquadre.Result, tipologia90, turnoCorrente, turnoPrecedente, turnoSuccessivo)).Result);

            var lstMezzi = Task.Factory.StartNew(() => _getPosizioneFlotta.Get(0)
                                                 .ContinueWith(lstPosizioneFlotta => _getMezziUtilizzabili.Get(lstSedi, posizioneFlotta: lstPosizioneFlotta.Result).Result)
                                                 .ContinueWith(lstmezzi => //Mapping
            {
                var composizioneMezzi = (from mezzo in lstmezzi.Result
                                         let kmGen = new Random().Next(1, 60).ToString()
                                                     let tempoPer = Convert.ToDouble(kmGen.Replace(".", ",")) / 1.75
                                                                    select new Classi.Composizione.ComposizioneMezzi()
                {
                    Id = mezzo.Codice,
                    Mezzo = mezzo,
                    Km = kmGen,
                    TempoPercorrenza = Math.Round(tempoPer, 2).ToString(CultureInfo.InvariantCulture),
                }).ToList();

                var mezziPrenotati = _getMezziPrenotati.Get(query.CodiceSede);

                decimal totaleKM = 0;
                decimal totaleTempoPercorrenza = 0;
                string mediaDistanza;
                string mediaTempoPercorrenza;

                return(composizioneMezzi.Select(c =>
                {
                    if (c.IstanteScadenzaSelezione < DateTime.Now)
                    {
                        c.IstanteScadenzaSelezione = null;
                    }

                    if (mezziPrenotati.Find(x => x.CodiceMezzo.Equals(c.Mezzo.Codice)) != null)
                    {
                        c.Id = c.Mezzo.Codice;
                        c.IstanteScadenzaSelezione = mezziPrenotati.Find(x => x.CodiceMezzo.Equals(c.Mezzo.Codice)).IstanteScadenzaSelezione;

                        if (c.Mezzo.Stato.Equals("In Sede"))
                        {
                            c.Mezzo.Stato = mezziPrenotati.Find(x => x.CodiceMezzo.Equals(c.Mezzo.Codice)).StatoOperativo;
                        }
                    }

                    //Per i mezzi con coordinate Fake nella property  i Km  e la TempoPercorrenza vengono impostati i  valori medi della collection
                    totaleKM += Convert.ToDecimal(c.Km.Replace(".", ","));
                    totaleTempoPercorrenza += Convert.ToDecimal(c.TempoPercorrenza.Replace(".", ","));

                    mediaDistanza = Math.Round(totaleKM / composizioneMezzi.Count(), 2).ToString(CultureInfo.InvariantCulture);
                    mediaTempoPercorrenza = Math.Round(totaleTempoPercorrenza / composizioneMezzi.Count(), 2).ToString(CultureInfo.InvariantCulture);

                    c.Km = mediaDistanza;
                    c.TempoPercorrenza = mediaTempoPercorrenza;
                    c.IndiceOrdinamento = new OrdinamentoMezzi(query.Richiesta, _getTipologieByCodice, _configuration, _memoryCache).GetIndiceOrdinamento(c, c.Mezzo.CoordinateFake);

                    return c;
                }));
            })
                                                 .ContinueWith(lstCompMezzi => FiltraMezzi(query, lstCompMezzi.Result)).Result);

            //PREPARO PAGINAZIONE IN BASE AI FILTRI
            var indexMezzo = query.Filtro.Mezzo != null?lstMezzi.Result.FindIndex(c => c.Mezzo.Codice.Equals(query.Filtro.Mezzo.Codice)) : 0;

            var indexSquadra = query.Filtro.Squadre != null?lstSquadre.Result.FindIndex(c => c.Squadra.Codice.Equals(query.Filtro.Squadre.FirstOrDefault().Codice)) : 0;

            if (indexMezzo != 0)
            {
                query.Filtro.MezziPagination.Page = (indexMezzo + 1) / query.Filtro.MezziPagination.PageSize + 1;
            }

            if (indexSquadra != 0)
            {
                query.Filtro.SquadrePagination.Page = (indexSquadra + 1) / query.Filtro.SquadrePagination.PageSize + 1;
            }

            //COMPONGO IL DTO E FACCIO LA PAGINAZIONE
            var composizioneAvanzata = new Classi.Composizione.ComposizionePartenzaAvanzata()
            {
                ComposizioneMezziDataArray = lstMezzi.Result
                                             .Skip(query.Filtro.MezziPagination.PageSize * (query.Filtro.MezziPagination.Page - 1))
                                             .Take(query.Filtro.MezziPagination.PageSize).ToList(),

                ComposizioneSquadreDataArray = lstSquadre.Result
                                               .Skip(query.Filtro.SquadrePagination.PageSize * (query.Filtro.SquadrePagination.Page - 1))
                                               .Take(query.Filtro.SquadrePagination.PageSize).ToList(),

                MezziPagination = new Paginazione()
                {
                    Page       = query.Filtro.MezziPagination.Page,
                    PageSize   = query.Filtro.MezziPagination.PageSize,
                    TotalItems = lstMezzi.Result.Count
                },
                SquadrePagination = new Paginazione()
                {
                    Page       = query.Filtro.SquadrePagination.Page,
                    PageSize   = query.Filtro.SquadrePagination.PageSize,
                    TotalItems = lstSquadre.Result.Count
                }
            };

            Log.Debug("Fine elaborazione Composizione partenza avanzata Handler");

            return(new ComposizionePartenzaAvanzataResult()
            {
                ComposizionePartenzaAvanzata = composizioneAvanzata
            });
        }