public IActionResult MultiRoutesPassengersByTime(DateTime startPeriod, DateTime endPeriod, ChartScale scale, int[] selectedRoutesId) { log.Info(nameof(MetricsController.PassengersByTime)); try { MultiLineChartDto chartDto = metricsService.PassengersByTime(startPeriod, endPeriod, selectedRoutesId, scale); return(Json(chartDto)); } catch (Exception e) { log.Error(e); return(BadRequest()); } }
public MultiLineChartDto PassengersByTime(DateTime startPeriod, DateTime endPeriod, int[] selectedRoutesId, ChartScale chartScale = ChartScale.ByDays) { MultiLineChartDto passengerTrafficChartData = new MultiLineChartDto(); if (startPeriod.CompareTo(endPeriod) == 1) { passengerTrafficChartData.ErrorMessage = EndLessStartError; } var timeLabels = GetTimeLabels(startPeriod, endPeriod, chartScale); if (passengerTrafficChartData.ErrorMessage == null) { passengerTrafficChartData = GetMultiRoutePassengerTraffic(timeLabels, startPeriod, endPeriod, chartScale, selectedRoutesId); } return(passengerTrafficChartData); }
public MultiLineChartDto PassengersByDaysOfWeek(DateTime startPeriod, DateTime endPeriod, int[] selectedRoutesId) { //This array is needed to establish the order of days on the chart. //And to fill in the gaps, if there were no passengers for a certain day var daysOfWeek = new DayOfWeek[] { DayOfWeek.Monday , DayOfWeek.Tuesday , DayOfWeek.Wednesday , DayOfWeek.Thursday , DayOfWeek.Friday , DayOfWeek.Saturday , DayOfWeek.Sunday }; StringBuilder errorMessageBuilder = new StringBuilder(); if (startPeriod.CompareTo(endPeriod) == 1) { errorMessageBuilder.AppendLine(EndLessStartError); } if ((endPeriod - startPeriod).Days < 7) { errorMessageBuilder.AppendLine("One week - minimum time period;"); } var multiLineChartDto = new MultiLineChartDto(); if (errorMessageBuilder.Length == 0) { DateTime nearestStartSunday = startPeriod; while (nearestStartSunday.DayOfWeek != DayOfWeek.Sunday) { nearestStartSunday = nearestStartSunday.AddDays(-1); } var passengerTraffic = uow.TicketVerifications.GetAll() .Where(d => d.VerificationUTCDate.Date >= startPeriod.Date && d.VerificationUTCDate.Date <= endPeriod.Date && d.IsVerified && (selectedRoutesId.Length == 0 || selectedRoutesId.Contains(d.Transport.RouteId))) .GroupBy(p => new { p.Transport.Route.Number, DayOfWeek = (((int)EF.Functions.DateDiffDay((DateTime?)nearestStartSunday, (DateTime?)p.VerificationUTCDate)) % 7) }) .Select(g => new { g.Key.Number, g.Key.DayOfWeek, PassengersCount = g.Count() }) .OrderBy(t => t.Number) .ToList(); var transportNumbers = passengerTraffic.Select(t => t.Number).Distinct().ToList(); var chartData = new string[transportNumbers.Count, daysOfWeek.Length]; for (int i = 0; i < transportNumbers.Count; i++) { for (int j = 0; j < daysOfWeek.Length; j++) { chartData[i, j] = (passengerTraffic.Where(t => t.Number == transportNumbers[i] && t.DayOfWeek == (int)daysOfWeek[j]).Count() != 0 ? passengerTraffic.Where(t => t.Number == transportNumbers[i] && t.DayOfWeek == (int)daysOfWeek[j]).First().PassengersCount : 0).ToString(); } } multiLineChartDto.Labels = daysOfWeek.Select(t => t.ToString()).ToList(); multiLineChartDto.Data = chartData; multiLineChartDto.LineLable = transportNumbers; } multiLineChartDto.ErrorMessage = errorMessageBuilder.ToString(); return(multiLineChartDto); }