public IActionResult GetPassengersByHoursByRoutes(DateTime selectedDate, [FromQuery] int[] selectedRoutesId) { log.Info(nameof(MetricsController.GetPassengersByHoursByRoutes)); try { ChartTableDto chartDtoTicketsByTicketTypes = metricsService.PassengersByHoursByRoutes(selectedDate, selectedRoutesId); return(Json(chartDtoTicketsByTicketTypes)); } catch (Exception e) { log.Error(e); return(BadRequest()); } }
public ChartTableDto PassengersByHoursByRoutes(DateTime selectedDay, int[] selectedRoutesId) { var chartData = uow.TicketVerifications.GetAll() .Include(t => t.Transport) .ThenInclude(r => r.Route) .Where(t => t.IsVerified && t.VerificationUTCDate.Date == selectedDay.Date && (selectedRoutesId.Length == 0 || selectedRoutesId.Contains(t.Transport.RouteId))) .GroupBy(x => new { x.Transport.Route.Number, x.VerificationUTCDate.Hour }) .Select(g => new { g.Key.Number, g.Key.Hour, PassengersCount = g.Count() }) .OrderBy(t => t.Number) .ToList(); var maxPassengers = chartData.Max(m => m.PassengersCount); var routesCount = chartData.GroupBy(t => t.Number).Count(); ChartTableDto chartTableDto = new ChartTableDto { MaxPassengersByRoute = maxPassengers, Data = new string[HoursInDay, routesCount] }; var labels = chartData.Select(t => t.Number).Distinct(); chartTableDto.Labels = labels.ToList(); for (int i = 0; i < HoursInDay; i++) { var temp = chartData.Where(t => t.Hour == i); foreach (var item in temp) { var j = chartTableDto.Labels.IndexOf(item.Number); chartTableDto.Data[i, j] = item.PassengersCount.ToString(); } } return(chartTableDto); }