Example #1
0
        /// <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);
        }
Example #8
0
        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);
        }