コード例 #1
0
 private void RecordTripOriginatingAndServicingPartner(DispatchTripRequest r, Gateway partner)
 {
     originatingPartnerByTrip.Add(r.tripID, r.clientID);
     Logger.AddTag("Originating partner", r.clientID);
     servicingPartnerByTrip.Add(r.tripID, partner.ID);
     Logger.AddTag("Servicing partner", partner.name);
 }
コード例 #2
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
        private void MakeTripAndAddItToActive(DispatchTripRequest r, Gateway partner)
        {
            Gateway client = partners[r.clientID];
            var     trip   = new Trip
            {
                Id = r.tripID,
                OriginatingPartnerName = client.name,
                OriginatingPartnerId   = client.ID,
                ServicingPartnerName   = partner.name,
                ServicingPartnerId     = partner.ID,
                Status             = Status.Queued,
                PickupLocation     = r.pickupLocation,
                PickupTime         = r.pickupTime,
                DropoffLocation    = r.dropoffLocation,
                PassengerName      = r.passengerName,
                VehicleType        = r.vehicleType,
                SamplingPercentage = 1
            };

            trip.SetCreation(DateTime.UtcNow);
            activeTrips.Add(r.tripID, trip);
            Logger.AddTag("Passenger", r.passengerName);
            Logger.AddTag("Pickup_time", r.pickupTime.ToString());
            Logger.AddTag("Pickup_location,", r.pickupLocation.ToString());
            Logger.AddTag("Dropoff_location", r.dropoffLocation.ToString());
        }
コード例 #3
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
        private Gateway SelectThePartnerWithBestQuote(DispatchTripRequest r, Gateway partner, QuoteTripResponse response)
        {
            Quote    bestQuote = null;
            DateTime bestETA   = r.pickupTime + missedBookingPeriod;

            // not more than 30 minues late
            foreach (Quote q in response.quotes)
            {
                DateTime eta = (DateTime)q.ETA;
                if (eta == null) // if no ETA is returned then we assum a certain lateness.
                {
                    eta = r.pickupTime + missedBookingPeriod - new TimeSpan(0, 1, 0);
                }
                if (eta.ToUniversalTime() < bestETA.ToUniversalTime())
                {
                    bestETA   = (DateTime)q.ETA;
                    bestQuote = q;
                }
            }
            if (bestQuote != null)
            {
                partner   = partners[bestQuote.PartnerId];
                r.fleetID = bestQuote.FleetId;
                Logger.Log("Best quote " + bestQuote + " from " + partner.name);
            }
            else
            {
                Logger.Log("There are no partners to handle this trip within an acceptable service time");
            }
            return(partner);
        }
コード例 #4
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
        public override DispatchTripResponse DispatchTrip(DispatchTripRequest r)
        {
            requests++;
            DispatchTripResponse response;

            if (TripIsNotAlreadyActive(r))
            {
                // Note: GetTrip populates the foreignTripID
                Gateway partner = null;
                if (PartnerHasNotBeenSpecified(r))
                {
                    response = AutoDispatchTrip(r, ref partner);
                }
                else
                {
                    partner = SelectedPartner(r);
                }

                if (PartnerHasBeenSelected(partner))
                {
                    RecordTripOriginatingAndServicingPartner(r, partner);
                    if (TripIsLocal(r))
                    {
                        response = new DispatchTripResponse(result: Result.OK);
                    }
                    else
                    {
                        var partnerClientId = r.clientID;
                        ChangeTheClientIDToTripThru(r);
                        response   = partner.DispatchTrip(r);
                        r.clientID = partnerClientId;
                    }
                    if (response.result != Result.OK)
                    {
                        Logger.Log("DispatchTrip to " + partner.name + " failed");
                    }
                    else
                    {
                        MakeTripAndAddItToActive(r, partner);
                    }
                }
                else
                {
                    response = MakeRejectDispatchResponse(r, partners[r.clientID], partner);
                    Logger.Log("DispatchTrip failed: No partner found.");
                }
            }
            else
            {
                response = MakeRejectDispatchResponse(r, partners[r.clientID], null);
                Logger.Log("DispatchTrip failed: Trip already active");
            }
            return(response);
        }
コード例 #5
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
        private QuoteTripResponse BroadcastQuoteRequestsToAllPartners(DispatchTripRequest r)
        {
            QuoteTripResponse response = QuoteTrip(new QuoteTripRequest(
                                                       clientID: r.clientID, // TODO: Daniel, fix this when you add authentication
                                                       pickupLocation: r.pickupLocation,
                                                       pickupTime: r.pickupTime,
                                                       passengerID: r.passengerID,
                                                       passengerName: r.passengerName,
                                                       luggage: r.luggage,
                                                       persons: r.persons,
                                                       dropoffLocation: r.dropoffLocation,
                                                       waypoints: r.waypoints,
                                                       paymentMethod: r.paymentMethod,
                                                       vehicleType: r.vehicleType,
                                                       maxPrice: r.maxPrice,
                                                       minRating: r.minRating,
                                                       partnerID: r.partnerID,
                                                       fleetID: r.fleetID,
                                                       driverID: r.driverID));

            return(response);
        }
コード例 #6
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
        private DispatchTripResponse AutoDispatchTrip(DispatchTripRequest r, ref Gateway partner)
        {
            DispatchTripResponse response = new DispatchTripResponse(result: Result.UnknownError);

            Logger.Log("Auto mode, so quote trip through all partners");
            Logger.Tab();
            // Dispatch to partner with shortest ETA
            QuoteTripResponse quoteTripResponse = BroadcastQuoteRequestsToAllPartners(r);

            if (BroadcastQuoteWasRejected(quoteTripResponse))
            {
                response = HandleRejectDispatchResponse(response);
            }
            else if (quoteTripResponse.result != Result.OK)
            {
                response = HandleQuoteBroadcastFailedResponse(response, quoteTripResponse);
            }
            else
            {
                partner = SelectThePartnerWithBestQuote(r, partner, quoteTripResponse);
            }
            Logger.Untab();
            return(response);
        }
コード例 #7
0
 private QuoteTripResponse BroadcastQuoteRequestsToAllPartners(DispatchTripRequest r)
 {
     QuoteTripResponse response = QuoteTrip(new QuoteTripRequest(
         clientID: r.clientID, // TODO: Daniel, fix this when you add authentication
         pickupLocation: r.pickupLocation,
         pickupTime: r.pickupTime,
         passengerID: r.passengerID,
         passengerName: r.passengerName,
         luggage: r.luggage,
         persons: r.persons,
         dropoffLocation: r.dropoffLocation,
         waypoints: r.waypoints,
         paymentMethod: r.paymentMethod,
         vehicleType: r.vehicleType,
         maxPrice: r.maxPrice,
         minRating: r.minRating,
         partnerID: r.partnerID,
         fleetID: r.fleetID,
         driverID: r.driverID));
     return response;
 }
コード例 #8
0
 private DispatchTripResponse AutoDispatchTrip(DispatchTripRequest r, ref Gateway partner)
 {
     DispatchTripResponse response = new DispatchTripResponse(result: Result.UnknownError);
     Logger.Log("Auto mode, so quote trip through all partners");
     Logger.Tab();
     // Dispatch to partner with shortest ETA
     QuoteTripResponse quoteTripResponse = BroadcastQuoteRequestsToAllPartners(r);
     if (BroadcastQuoteWasRejected(quoteTripResponse))
         response = HandleRejectDispatchResponse(response);
     else if (quoteTripResponse.result != Result.OK)
         response = HandleQuoteBroadcastFailedResponse(response, quoteTripResponse);
     else
         partner = SelectThePartnerWithBestQuote(r, partner, quoteTripResponse);
     Logger.Untab();
     return response;
 }
コード例 #9
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
 private bool TripIsLocal(DispatchTripRequest r)
 {
     return(r.clientID == r.partnerID);
 }
コード例 #10
0
 public override DispatchTripResponse DispatchTrip(DispatchTripRequest r)
 {
     requests++;
     if (r.fleetID != null)
     {
         PartnerFleet f = PartnerFleets[r.fleetID];
         if (f.FleetServesLocation(r.pickupLocation))
         {
             PartnerTrip trip = GetTrip(r);
             if (f.QueueTrip(trip))
             {
                 DispatchTripResponse response = new DispatchTripResponse();
                 Logger.Log("DispatchTrip successful on " + name + ", Response: " + response);
                 return response;
             }
         }
         return new DispatchTripResponse(result: Result.Rejected);
     }
     // Note: GetTrip populates the foreignTripID
     foreach (PartnerFleet f in PartnerFleets.Values)
     {
         if (!f.FleetServesLocation(r.pickupLocation))
             continue;
         PartnerTrip trip = GetTrip(r);
         if (f.QueueTrip(trip))
         {
             DispatchTripResponse response = new DispatchTripResponse();
             Logger.Log("DispatchTrip successful on " + name + ", Response: " + response);
             return response;
         }
     }
     {
         DispatchTripResponse response = new DispatchTripResponse(result: Result.Rejected);
         Logger.Log("DispatchTrip rejected on " + name + ", no available drivers -- Response: " + response);
         return response;
     }
 }
コード例 #11
0
 public override DispatchTripResponse DispatchTrip(DispatchTripRequest request)
 {
     return MakeRejectDispatchResponse();
 }
コード例 #12
0
 virtual public DispatchTripResponse DispatchTrip(DispatchTripRequest request)
 {
     throw new Exception("Not supported");
 }
コード例 #13
0
ファイル: Gateway.cs プロジェクト: TripThru/Gateway
 public override DispatchTripResponse DispatchTrip(DispatchTripRequest request)
 {
     throw new Exception("not supported");
 }
コード例 #14
0
 private Gateway SelectThePartnerWithBestQuote(DispatchTripRequest r, Gateway partner, QuoteTripResponse response)
 {
     Quote bestQuote = null;
     DateTime bestETA = r.pickupTime + missedBookingPeriod;
     // not more than 30 minues late
     foreach (Quote q in response.quotes)
     {
         DateTime eta = (DateTime)q.ETA;
         if (eta == null) // if no ETA is returned then we assum a certain lateness.
             eta = r.pickupTime + missedBookingPeriod - new TimeSpan(0, 1, 0);
         if (eta.ToUniversalTime() < bestETA.ToUniversalTime())
         {
             bestETA = (DateTime)q.ETA;
             bestQuote = q;
         }
     }
     if (bestQuote != null)
     {
         partner = partners[bestQuote.PartnerId];
         r.fleetID = bestQuote.FleetId;
         Logger.Log("Best quote " + bestQuote + " from " + partner.name);
     }
     else
         Logger.Log("There are no partners to handle this trip within an exceptable service time");
     return partner;
 }
コード例 #15
0
 private void RecordTripOriginatingAndServicingPartner(DispatchTripRequest r, Gateway partner)
 {
     originatingPartnerByTrip.Add(r.tripID, r.clientID);
     Logger.AddTag("Originating partner", r.clientID);
     servicingPartnerByTrip.Add(r.tripID, partner.ID);
     Logger.AddTag("Servicing partner", partner.name);
 }
コード例 #16
0
 private void ChangeTheClientIDToTripThru(DispatchTripRequest r)
 {
     r.clientID = ID;
 }
コード例 #17
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
 private static bool PartnerHasNotBeenSpecified(DispatchTripRequest r)
 {
     return(r.partnerID == null);
 }
コード例 #18
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
 private Gateway SelectedPartner(DispatchTripRequest r)
 {
     return(partners[r.partnerID]);
 }
コード例 #19
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
 private bool TripIsNotAlreadyActive(DispatchTripRequest r)
 {
     return(!activeTrips.ContainsKey(r.tripID));
 }
コード例 #20
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
 private void ChangeTheClientIDToTripThru(DispatchTripRequest r)
 {
     r.clientID = ID;
 }
コード例 #21
0
 private void MakeTripAndAddItToActive(DispatchTripRequest r, Gateway partner)
 {
     Gateway client = partners[r.clientID];
     var trip = new Trip
     {
         Id = r.tripID,
         OriginatingPartnerName = client.name,
         OriginatingPartnerId = client.ID,
         ServicingPartnerName = partner.name,
         ServicingPartnerId = partner.ID,
         Status = Status.Queued,
         PickupLocation = r.pickupLocation,
         PickupTime = r.pickupTime,
         DropoffLocation = r.dropoffLocation,
         PassengerName = r.passengerName,
         VehicleType = r.vehicleType
     };
     activeTrips.Add(r.tripID, trip);
     Logger.AddTag("Passenger", r.passengerName);
     Logger.AddTag("Pickup_time", r.pickupTime.ToString());
     Logger.AddTag("Pickup_location,", r.pickupLocation.ToString());
     Logger.AddTag("Dropoff_location", r.dropoffLocation.ToString());
 }
コード例 #22
0
ファイル: PartnerGateway.cs プロジェクト: TripThru/Gateway
 public override DispatchTripResponse DispatchTrip(DispatchTripRequest r)
 {
     DispatchTripResponse response;
     {
         requests++;
         if (r.partnerID != null && r.partnerID != ID)
         {
             Logger.Log("Dispatching trip to partner " + r.partnerID);
             PartnerTrip trip = GetTrip(r, autoDispatch: false);
             trip.origination = PartnerTrip.Origination.Local;
             PartnerFleets.FirstOrDefault().Value.QueueTrip(trip);
             if (TryToDispatchToForeignProvider(trip, r.partnerID))
                 response = new DispatchTripResponse(result: Result.OK);
             else
                 response = new DispatchTripResponse(result: Result.Rejected);
         }
         else if (r.driverID != null)
             response = DispatchToSpecificDriver(r);
         else if (r.fleetID != null)
             response = DispatchToSpecificFleet(r);
         else
             response = DispatchToFirstFleetThatServes(r);
     }
     return response;
 }
コード例 #23
0
 private Gateway SelectedPartner(DispatchTripRequest r)
 {
     return partners[r.partnerID];
 }
コード例 #24
0
ファイル: PartnerGateway.cs プロジェクト: TripThru/Gateway
 private DispatchTripResponse DispatchToFirstFleetThatServes(DispatchTripRequest r)
 {
     Logger.Log("Dispatching to first fleet that serves");
     DispatchTripResponse response = new DispatchTripResponse(result: Result.Rejected);
     foreach (PartnerFleet f in PartnerFleets.Values)
     {
         if (!f.FleetServesLocation(r.pickupLocation))
             continue;
         PartnerTrip trip = GetTrip(r);
         if (f.QueueTrip(trip))
         {
             DispatchTripResponse resp = new DispatchTripResponse();
             Logger.Log("DispatchTrip successful on " + name + ", Response: " + resp);
             return resp;
         }
     }
     return response;
 }
コード例 #25
0
 private bool TripIsNotAlreadyActive(DispatchTripRequest r)
 {
     return !activeTrips.ContainsKey(r.tripID);
 }
コード例 #26
0
ファイル: PartnerGateway.cs プロジェクト: TripThru/Gateway
 private DispatchTripResponse DispatchToSpecificDriver(DispatchTripRequest r)
 {
     throw new Exception("Dispatch to specific driver not yet supported");
 }
コード例 #27
0
ファイル: Gateway.cs プロジェクト: TripThru/Gateway
        protected DispatchTripResponse MakeRejectDispatchResponse(DispatchTripRequest r, Gateway client, Gateway partner)
        {
            DispatchTripResponse response;
            rejects++;
            response = new DispatchTripResponse(result: Result.Rejected);

            var trip = new Trip
            {
                Id = r.tripID,
                OriginatingPartnerName = client.name,
                OriginatingPartnerId = client.ID,
                ServicingPartnerName = partner == null ? null : partner.name,
                ServicingPartnerId = partner == null ? null : partner.ID,
                Status = Status.Rejected,
                PickupLocation = r.pickupLocation,
                PickupTime = r.pickupTime,
                DropoffLocation = r.dropoffLocation,
                PassengerName = r.passengerName,
                VehicleType = r.vehicleType,
                Creation = DateTime.UtcNow,
                LatenessMilliseconds = 0,
                SamplingPercentage = 1
            };
            activeTrips.SaveTrip(trip); // Hack: save trip should be moved somewhere else.

            return response;
        }
コード例 #28
0
ファイル: PartnerGateway.cs プロジェクト: TripThru/Gateway
 private DispatchTripResponse DispatchToSpecificFleet(DispatchTripRequest r)
 {
     Logger.Log("Dispatching to fleet " + r.fleetID);
     PartnerFleet f = PartnerFleets[r.fleetID];
     if (f.FleetServesLocation(r.pickupLocation))
     {
         PartnerTrip trip = GetTrip(r);
         if (f.QueueTrip(trip))
         {
             DispatchTripResponse response = new DispatchTripResponse();
             Logger.Log("DispatchTrip successful on " + name + ", Response: " + response);
             Logger.SetServicingId(this.ID);
             return response;
         }
     }
     return new DispatchTripResponse(result: Result.Rejected);
 }
コード例 #29
0
 override public DispatchTripResponse DispatchTrip(DispatchTripRequest request)
 {
     return(MakeRejectDispatchResponse());
 }
コード例 #30
0
        public override DispatchTripResponse DispatchTrip(DispatchTripRequest r)
        {
            requests++;
            DispatchTripResponse response;
            if (TripIsNotAlreadyActive(r))
            {
                // Note: GetTrip populates the foreignTripID
                Gateway partner = null;
                if (PartnerHasNotBeenSpecified(r))
                    response = AutoDispatchTrip(r, ref partner);
                else
                    partner = SelectedPartner(r);

                if (PartnerHasBeenSelected(partner))
                {
                    RecordTripOriginatingAndServicingPartner(r, partner);
                    var partnerClientId = r.clientID;
                    ChangeTheClientIDToTripThru(r);
                    r.clientID = partnerClientId;
                    response = partner.DispatchTrip(r);
                    if (response.result != Result.OK)
                        Logger.Log("DispatchTrip to " + partner.name + " failed");
                    else
                        MakeTripAndAddItToActive(r, partner);
                }
                else
                    response = MakeRejectDispatchResponse();
            }
            else
                response = MakeRejectDispatchResponse();
            return response;
        }
コード例 #31
0
 public virtual DispatchTripResponse DispatchTrip(DispatchTripRequest request)
 {
     throw new Exception("Not supported");
 }
コード例 #32
0
 private static bool PartnerHasNotBeenSpecified(DispatchTripRequest r)
 {
     return r.partnerID == null;
 }
コード例 #33
0
 public PartnerTrip GetTrip(DispatchTripRequest r)
 {
     return new PartnerTrip(
         partner: this,
         ID: r.tripID,
         origination: PartnerTrip.Origination.Foreign,
         pickupLocation: r.pickupLocation,
         pickupTime: r.pickupTime,
         paymentMethod: r.paymentMethod,
         passengerID: r.passengerID,
         passengerName: r.passengerName,
         dropoffLocation: r.dropoffLocation,
         waypoints: r.waypoints,
         vehicleType: r.vehicleType,
         maxPrice: r.maxPrice,
         minRating: r.minRating,
         fleet: r.fleetID == null ? null : this.PartnerFleets[r.fleetID],
         driver: r.driverID == null ? null : this.PartnerFleets[r.fleetID].drivers[r.driverID]);
 }
コード例 #34
0
ファイル: TripThruGateway.cs プロジェクト: TripThru/Gateway
 private bool TripIsLocal(DispatchTripRequest r)
 {
     return r.clientID == r.partnerID;
 }