public decimal GetIndiceOrdinamento(Classi.Composizione.ComposizioneMezzi composizione, bool CoordinateFake) { int ValoreIntOriginePerSganciamento = 0; decimal ValoreAdeguatezzaMezzo; ValoreAdeguatezzaMezzo = GeneraValoreAdeguatezzaMezzo(_Richiesta.Tipologie, composizione.Mezzo.Genere); if (!CoordinateFake) { composizione = GetDistanceByGoogle(composizione, _Richiesta).Result; } int ValoreCompetenza = 0; switch (_Richiesta.Competenze.Select(c => c.Descrizione).ToList().FindIndex(c => c.Equals(composizione.Mezzo.Distaccamento.Descrizione))) { case 0: ValoreCompetenza = 3000; break; case 1: ValoreCompetenza = 2000; break; case 2: ValoreCompetenza = 1000; break; } return(100 / (1 + Convert.ToDecimal(composizione.TempoPercorrenza.Replace(".", ",")) / 5400) + ValoreIntOriginePerSganciamento + ValoreAdeguatezzaMezzo + ValoreCompetenza); }
private async Task <Classi.Composizione.ComposizioneMezzi> GetDistanceByGoogle(Classi.Composizione.ComposizioneMezzi composizione, RichiestaAssistenza richiesta) { var origine = $"origins={ composizione.Mezzo.Coordinate.Latitudine.ToString().Replace(",", ".")},{ composizione.Mezzo.Coordinate.Longitudine.ToString().Replace(",", ".")}"; var destination = $"destinations={ richiesta.Localita.Coordinate.Latitudine.ToString().Replace(",", ".")},{ richiesta.Localita.Coordinate.Longitudine.ToString().Replace(",", ".")}"; var mode = "mode=Driving"; var sensor = "sensor=false"; var queryString = new StringContent(""); //CACHE DistanceMatrix distanza; var nomeCache = "DistanceMatrix_"; using var _client = new HttpClient(); if (!_memoryCache.TryGetValue(nomeCache, out distanza)) { var response = await _client.PostAsync(_configuration.GetSection("UrlExternalApi").GetSection("DistanceMatrix").Value + $"&{origine}&{destination}&{mode}&{sensor}", queryString).ConfigureAwait(false); response.EnsureSuccessStatusCode(); using HttpContent content = response.Content; string data = await content.ReadAsStringAsync().ConfigureAwait(false); distanza = JsonConvert.DeserializeObject <DistanceMatrix>(data); var cacheEntryOptions = new MemoryCacheEntryOptions().SetSlidingExpiration(TimeSpan.FromHours(8)); _memoryCache.Set(nomeCache, distanza, cacheEntryOptions); } //FINE CACHE if (distanza.Rows[0].Elements[0].Distance != null) { //LE Value sono espresse in SECONDI composizione.Km = distanza.Rows[0].Elements[0].Distance.Text.ToString().Substring(0, distanza.Rows[0].Elements[0].Distance.Text.ToString().Length - 2); composizione.TempoPercorrenza = (distanza.Rows[0].Elements[0].Duration.Value / 60).ToString(); } else { composizione.Km = "100"; composizione.TempoPercorrenza = "50"; } return(composizione); }