/// <summary> /// Unmarshaller the response from the service to the response class. /// </summary> /// <param name="context"></param> /// <returns></returns> public override AmazonWebServiceResponse Unmarshall(JsonUnmarshallerContext context) { GetRoutesResponse response = new GetRoutesResponse(); context.Read(); int targetDepth = context.CurrentDepth; while (context.ReadAtDepth(targetDepth)) { if (context.TestExpression("items", targetDepth)) { var unmarshaller = new ListUnmarshaller <Route, RouteUnmarshaller>(RouteUnmarshaller.Instance); response.Items = unmarshaller.Unmarshall(context); continue; } if (context.TestExpression("nextToken", targetDepth)) { var unmarshaller = StringUnmarshaller.Instance; response.NextToken = unmarshaller.Unmarshall(context); continue; } } return(response); }
public async Task <IActionResult> Routes(int origin, int destination, DateTime dateTime, bool isDepart) { try { GetRoutesResponse getRoutesResponse = await _rail.GetRoutes((E_Station)origin, (E_Station)destination, dateTime, isDepart); IEnumerable <TrainAvailableChairsResponse> chairsResponses = await GetChairsResponses(getRoutesResponse); IEnumerable <Models.ViewModels.Route> routes = _railRouteBuilder.BuildRoutes(getRoutesResponse, chairsResponses); if (routes == null || !routes.Any()) { return(PartialView("_NoRoutes")); } Models.ViewModels.Route routeToShow = Tools.SelectRoute(routes, dateTime, isDepart); ViewBag.ToShow = routeToShow != null ? routeToShow.Index : 0; return(PartialView("_Routes", routes)); } catch (Exception ex) { _logger.LogCritical(ex, $"Failed Routes({origin}, {destination}, {dateTime:yyyy-MM-ddTHH:mm}, {isDepart})"); return(PartialView("Error", new ErrorViewModel() { Exception = ex })); } }
public async Task <GetRoutesResponse> GetRoutes(E_Station origin, E_Station destination, DateTime dateTime, bool isGoing) { NameValueCollection parameters = HttpUtility.ParseQueryString(string.Empty); parameters["OId"] = ((int)origin).ToString(); parameters["TId"] = ((int)destination).ToString(); parameters["Date"] = dateTime.ToString("yyyyMMdd"); parameters["Hour"] = dateTime.ToString("HHmm"); parameters["isGoing"] = isGoing.ToString(); parameters["c"] = "1574944324761"; UriBuilder ub = new UriBuilder() { Path = "apiinfo/api/Plan/GetRoutes", Query = HttpUtility.UrlDecode(parameters.ToString()) }; string uri = ub.Uri.PathAndQuery; HttpClient client = _clientFactory.CreateClient("RailApi"); using (HttpResponseMessage response = await client.GetAsync(uri)) { response.EnsureSuccessStatusCode(); GetRoutesResponse result = await response.Content.ReadAsAsync <GetRoutesResponse>(); if (result.Data.Error != null) { throw new Exception(result.Data.Error.Description); } return(result); } }
public async Task <IActionResult> Advanced(int origin, int destination, DateTime dateTime, bool isDepart) { try { DateTime nextWeek = dateTime.AddDays(7); GetRoutesResponse getNextWeekRoutesResponse = await _rail.GetRoutes((E_Station)origin, (E_Station)destination, nextWeek, isDepart); IEnumerable <TrainAvailableChairsResponse> nextWeekChairsResponses = await GetChairsResponses(getNextWeekRoutesResponse); IEnumerable <Models.ViewModels.Route> nextWeekRoutes = _railRouteBuilder.BuildRoutes(getNextWeekRoutesResponse, nextWeekChairsResponses); if (nextWeekRoutes == null || !nextWeekRoutes.Any()) { return(PartialView("_NoRoutes")); } Models.ViewModels.Route selectedRoute = Tools.SelectRoute(nextWeekRoutes, nextWeek, isDepart); DateTime nowNextWeek = _time.NowInLocal().AddDays(7); Models.ViewModels.Train selectedTrain = selectedRoute.Trains.FirstOrDefault(x => x.DestinationStop.StopTime.FirstOrDefault() >= nowNextWeek); Stop selectedStop = selectedTrain.Stops.FirstOrDefault(x => x.StopTime.FirstOrDefault() >= nowNextWeek); E_Station currentOrigin = selectedStop.Station; if (currentOrigin == (E_Station)destination) { int selectedIndex = selectedTrain.Stops.IndexOf(selectedStop); selectedStop = selectedTrain.Stops.ElementAtOrDefault(selectedIndex - 1); currentOrigin = selectedStop.Station; } GetRoutesResponse getRoutesResponse = await _rail.GetRoutes(currentOrigin, (E_Station)destination, dateTime, isDepart); IEnumerable <TrainAvailableChairsResponse> chairsResponses = await GetChairsResponses(getRoutesResponse); IEnumerable <Models.ViewModels.Route> routes = _railRouteBuilder.BuildRoutes(getRoutesResponse, chairsResponses); routes = routes.Where(x => nextWeekRoutes.Contains(x)); if (routes == null || !routes.Any()) { return(PartialView("_NoRoutes")); } foreach (Models.ViewModels.Route route in routes) { Stop ori = route.Trains.FirstOrDefault().Stops.FirstOrDefault(x => x.Station == (E_Station)origin); if (ori != null) { route.Trains.FirstOrDefault().OrigintStop = ori; } } Models.ViewModels.Route routeToShow = Tools.SelectRoute(routes, dateTime, isDepart); ViewBag.ToShow = routeToShow != null ? routeToShow.Index : 0; return(PartialView("_Routes", routes)); } catch (Exception ex) { _logger.LogCritical(ex, $"Failed Advanced({origin}, {destination}, {dateTime:yyyy-MM-ddTHH:mm}, {isDepart})"); return(PartialView("Error", new ErrorViewModel() { Exception = ex })); } }
public async Task <IActionResult> GetRoutes(int origin, int destination, DateTime dateTime, bool isDepart) { try { GetRoutesResponse getRoutesResponse = await _rail.GetRoutes((E_Station)origin, (E_Station)destination, dateTime, isDepart); IEnumerable <TrainAvailableChairsResponse> chairsResponses = await GetChairsResponses(getRoutesResponse); IEnumerable <Models.ViewModels.Route> routes = _railRouteBuilder.BuildRoutes(getRoutesResponse, chairsResponses); return(Json(routes)); } catch (Exception ex) { _logger.LogCritical(ex, $"Failed GetRoutes({origin}, {destination}, {dateTime:yyyy-MM-ddTHH:mm}, {isDepart})"); return(StatusCode(500, ex)); } }
private async Task <IEnumerable <TrainAvailableChairsResponse> > GetChairsResponses(GetRoutesResponse getRoutesResponse) { IEnumerable <TrainAvailableChairsRequest> chairsRequests = _rail.TrainAvailableChairsRequestBuilder(getRoutesResponse); List <Task <TrainAvailableChairsResponse> > tasks = new List <Task <TrainAvailableChairsResponse> >(); foreach (TrainAvailableChairsRequest chairsRequest in chairsRequests) { tasks.Add(_rail.TrainAvailableChairs(chairsRequest)); } IEnumerable <TrainAvailableChairsResponse> chairsResponses = await Task.WhenAll(tasks); return(chairsResponses); }
public IEnumerable <TrainAvailableChairsRequest> TrainAvailableChairsRequestBuilder(GetRoutesResponse routesResponse) { List <TrainAvailableChairsRequestItem> requestItems = new List <TrainAvailableChairsRequestItem>(); foreach (Route route in routesResponse.Data.Routes) { foreach (Train train in route.Train) { if (int.TryParse(train.Trainno, out int trainNumber) && DateTime.TryParseExact(train.DepartureTime, "dd/MM/yyyy HH:mm:ss", null, DateTimeStyles.None, out DateTime departureTime) && int.TryParse(train.OrignStation, out int originStation) && int.TryParse(train.DestinationStation, out int destinationStation)) { TrainAvailableChairsRequestItem requestItem = new TrainAvailableChairsRequestItem() { trainNumber = trainNumber, trainDate = departureTime.Date, fromStation = originStation, destStation = destinationStation }; requestItems.Add(requestItem); } } } List <TrainAvailableChairsRequest> requests = new List <TrainAvailableChairsRequest>(); for (int i = 0; i < requestItems.Count; i += 17) { TrainAvailableChairsRequest request = new TrainAvailableChairsRequest() { lstTrainAvailableChairsQuery = requestItems.GetRange(i, Math.Min(17, requestItems.Count - i)).ToArray() }; requests.Add(request); } return(requests); }
public IEnumerable <Route> BuildRoutes(GetRoutesResponse routesResponse, IEnumerable <TrainAvailableChairsResponse> chairsResponses) { List <Route> routes = new List <Route>(); int index = 0; foreach (ApiModels.Route r in routesResponse.Data.Routes) { TimeSpan.TryParseExact(r.EstTime, "g", null, out TimeSpan estimatedTime); Route route = new Route() { Index = index++, EstimatedTime = estimatedTime, IsExchange = r.IsExchange, Trains = new List <Train>() }; foreach (ApiModels.Train t in r.Train) { int.TryParse(t.Trainno, out int trainNumber); Trainposition pos = routesResponse.Data.TrainPositions.FirstOrDefault(x => x.TrainNumber == trainNumber); Omasim omasim = routesResponse.Data.Omasim.FirstOrDefault(x => x.TrainNumber == trainNumber); E_Station currentStation = pos != null ? (E_Station)pos.CurrentStation : E_Station.None; E_Station nextStation = pos != null ? (E_Station)pos.NextStation : E_Station.None; Delay currentDelay = routesResponse.Data.Delays.FirstOrDefault(x => x.Train == t.Trainno); Train train = new Train() { TrainNumber = trainNumber, LineNumber = t.LineNumber, Midnight = t.Midnight, Accesability = t.Handicap, Direct = t.DirectTrain, ReservedSeats = t.ReservedSeat, Carriages = int.Parse(pos?.TotalKronot ?? "0"), CurrentStation = currentStation, CurrentStationName = _staticStations.GetStation(currentStation), NextStation = nextStation, NextStationName = _staticStations.GetStation(nextStation), Equipment = pos?.SugNayad, StopPoint = pos?.StopPoint, Delay = Tools.StopDelay(pos, currentDelay), Stops = new List <Stop>() }; List <Stop> midwayStops = new List <Stop>(); int.TryParse(t.OrignStation, out int originStation); DateTime.TryParseExact(t.DepartureTime, "dd/MM/yyyy HH:mm:ss", null, DateTimeStyles.None, out DateTime departureTime); Trainposition originPos = routesResponse.Data.TrainPositions.FirstOrDefault(x => x.TrainNumber == trainNumber && x.CurrentStation == originStation); Delay originDelay = routesResponse.Data.Delays.FirstOrDefault(x => x.Train == t.Trainno && x.Station == t.OrignStation); Stop firstStop = new Stop() { Station = (E_Station)originStation, StationName = _staticStations.GetStation((E_Station)originStation), StopTime = new List <DateTime>() { departureTime }, Platform = t.Platform, Congestion = omasim.Stations.FirstOrDefault(x => x.StationNumber == originStation && x.OmesPercent >= 0)?.OmesPercent, Delay = Tools.StopDelay(originPos, originDelay), IsCurrent = (E_Station)originStation == currentStation && nextStation == E_Station.None }; train.OrigintStop = firstStop; midwayStops.Add(firstStop); foreach (Stopstation st in t.StopStations) { int.TryParse(st.StationId, out int stopStation); DateTime.TryParseExact(st.ArrivalTime, "dd/MM/yyyy HH:mm:ss", null, DateTimeStyles.None, out DateTime stopArrivalTime); DateTime.TryParseExact(st.DepartureTime, "dd/MM/yyyy HH:mm:ss", null, DateTimeStyles.None, out DateTime stopDepartureTime); Trainposition stopPos = routesResponse.Data.TrainPositions.FirstOrDefault(x => x.TrainNumber == trainNumber && x.CurrentStation == stopStation); Delay stopDelay = routesResponse.Data.Delays.FirstOrDefault(x => x.Train == t.Trainno && x.Station == st.StationId); Stop stop = new Stop() { Station = (E_Station)stopStation, StationName = _staticStations.GetStation((E_Station)stopStation), StopTime = new List <DateTime>() { stopArrivalTime, stopDepartureTime }, Platform = st.Platform, Congestion = omasim.Stations.FirstOrDefault(x => x.StationNumber == stopStation && x.OmesPercent >= 0)?.OmesPercent, Delay = Tools.StopDelay(stopPos, stopDelay), IsCurrent = (E_Station)stopStation == currentStation && nextStation == E_Station.None }; midwayStops.Add(stop); } int.TryParse(t.DestinationStation, out int destinationStation); DateTime.TryParseExact(t.ArrivalTime, "dd/MM/yyyy HH:mm:ss", null, DateTimeStyles.None, out DateTime arrivalTime); Trainposition destPos = routesResponse.Data.TrainPositions.FirstOrDefault(x => x.TrainNumber == trainNumber && x.CurrentStation == destinationStation); Delay destDelay = routesResponse.Data.Delays.FirstOrDefault(x => x.Train == t.Trainno && x.Station == t.DestinationStation); Stop lastStop = new Stop() { Station = (E_Station)destinationStation, StationName = _staticStations.GetStation((E_Station)destinationStation), StopTime = new List <DateTime>() { arrivalTime }, Platform = t.DestPlatform, Congestion = omasim.Stations.FirstOrDefault(x => x.StationNumber == destinationStation && x.OmesPercent >= 0)?.OmesPercent, Delay = Tools.StopDelay(destPos, destDelay), IsCurrent = (E_Station)destinationStation == currentStation && nextStation == E_Station.None }; train.DestinationStop = lastStop; midwayStops.Add(lastStop); IEnumerable <Station> omasimUntilOrigin = omasim.Stations.TakeWhile(x => x.StationNumber != originStation); List <Stop> stopsUntilOrigin = new List <Stop>(); foreach (Station s in omasimUntilOrigin) { Trainposition stopPos = routesResponse.Data.TrainPositions.FirstOrDefault(x => x.TrainNumber == trainNumber && x.CurrentStation == s.StationNumber); Delay stopDelay = routesResponse.Data.Delays.FirstOrDefault(x => x.Train == t.Trainno && x.Station == s.StationNumber.ToString()); string stopTimeStr = $"{train.OrigintStop.StopTime.FirstOrDefault():dd/MM/yyyy} {s.Time}"; DateTime.TryParseExact(stopTimeStr, "dd/MM/yyyy HH:mm", null, DateTimeStyles.None, out DateTime stopTime); Stop stop = new Stop() { Station = (E_Station)s.StationNumber, StationName = _staticStations.GetStation((E_Station)s.StationNumber), StopTime = new List <DateTime>() { stopTime }, Congestion = s.OmesPercent >= 0 ? s.OmesPercent : (float?)null, Delay = Tools.StopDelay(stopPos, stopDelay), IsCurrent = (E_Station)s.StationNumber == currentStation && nextStation == E_Station.None }; stopsUntilOrigin.Add(stop); } IEnumerable <Station> omasimAfterDestination = omasim.Stations.SkipWhile(x => x.StationNumber != destinationStation).Skip(1); List <Stop> stopsAfterDestination = new List <Stop>(); foreach (Station s in omasimAfterDestination) { Trainposition stopPos = routesResponse.Data.TrainPositions.FirstOrDefault(x => x.TrainNumber == trainNumber && x.CurrentStation == s.StationNumber); Delay stopDelay = routesResponse.Data.Delays.FirstOrDefault(x => x.Train == t.Trainno && x.Station == s.StationNumber.ToString()); string stopTimeStr = $"{train.DestinationStop.StopTime.FirstOrDefault():dd/MM/yyyy} {s.Time}"; DateTime.TryParseExact(stopTimeStr, "dd/MM/yyyy HH:mm", null, DateTimeStyles.None, out DateTime stopTime); Stop stop = new Stop() { Station = (E_Station)s.StationNumber, StationName = _staticStations.GetStation((E_Station)s.StationNumber), StopTime = new List <DateTime>() { stopTime }, Congestion = s.OmesPercent >= 0 ? s.OmesPercent : (float?)null, Delay = Tools.StopDelay(stopPos, stopDelay), IsCurrent = (E_Station)s.StationNumber == currentStation && nextStation == E_Station.None }; stopsAfterDestination.Add(stop); } train.Stops.AddRange(stopsUntilOrigin); train.Stops.AddRange(midwayStops); train.Stops.AddRange(stopsAfterDestination); if (chairsResponses != null && chairsResponses.Any(x => x.ListTrainAvailableChairs != null && x.ListTrainAvailableChairs.Length > 0)) { TrainAvailableChairsResponse chairsResponse = chairsResponses.FirstOrDefault(x => x.ListTrainAvailableChairs.Any(y => y.TrainNumber == trainNumber && y.TrainDate.Date == departureTime.Date)); if (chairsResponse != null) { TrainAvailableChairsResponseItem chairsResponseItem = chairsResponse.ListTrainAvailableChairs.FirstOrDefault(x => x.TrainNumber == trainNumber && x.TrainDate.Date == departureTime.Date); if (chairsResponseItem != null) { train.AvailableSeats = chairsResponseItem.SeatsAvailable; } } } route.Trains.Add(train); } routes.Add(route); } return(routes); }