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); }
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()); }
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); }
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); }
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); }
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); }
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; }
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; }
private bool TripIsLocal(DispatchTripRequest r) { return(r.clientID == r.partnerID); }
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; } }
public override DispatchTripResponse DispatchTrip(DispatchTripRequest request) { return MakeRejectDispatchResponse(); }
virtual public DispatchTripResponse DispatchTrip(DispatchTripRequest request) { throw new Exception("Not supported"); }
public override DispatchTripResponse DispatchTrip(DispatchTripRequest request) { throw new Exception("not supported"); }
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; }
private void ChangeTheClientIDToTripThru(DispatchTripRequest r) { r.clientID = ID; }
private static bool PartnerHasNotBeenSpecified(DispatchTripRequest r) { return(r.partnerID == null); }
private Gateway SelectedPartner(DispatchTripRequest r) { return(partners[r.partnerID]); }
private bool TripIsNotAlreadyActive(DispatchTripRequest r) { return(!activeTrips.ContainsKey(r.tripID)); }
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()); }
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; }
private Gateway SelectedPartner(DispatchTripRequest r) { return partners[r.partnerID]; }
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; }
private bool TripIsNotAlreadyActive(DispatchTripRequest r) { return !activeTrips.ContainsKey(r.tripID); }
private DispatchTripResponse DispatchToSpecificDriver(DispatchTripRequest r) { throw new Exception("Dispatch to specific driver not yet supported"); }
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; }
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); }
override public DispatchTripResponse DispatchTrip(DispatchTripRequest request) { return(MakeRejectDispatchResponse()); }
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; }
public virtual DispatchTripResponse DispatchTrip(DispatchTripRequest request) { throw new Exception("Not supported"); }
private static bool PartnerHasNotBeenSpecified(DispatchTripRequest r) { return r.partnerID == null; }
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]); }
private bool TripIsLocal(DispatchTripRequest r) { return r.clientID == r.partnerID; }