updates on the api endpoints on the customer page and more
This commit is contained in:
@@ -17,6 +17,7 @@ import (
|
||||
|
||||
"doormile/constants"
|
||||
"doormile/db"
|
||||
"doormile/internal/legs"
|
||||
"doormile/models"
|
||||
"doormile/utils"
|
||||
)
|
||||
@@ -183,13 +184,31 @@ func loadActiveStops(milerUserID int) ([]stop, error) {
|
||||
Pickuplongitude float64
|
||||
Deliverylatitude float64
|
||||
Deliverylongitude float64
|
||||
Pickuppincode string
|
||||
Deliverypincode string
|
||||
// The base this rider would hand a hub-routed parcel to: the one the
|
||||
// booking was routed to if anything set it, otherwise the rider's own.
|
||||
// Same order of preference as controllers.resolveHandoverHub.
|
||||
Baselatitude float64
|
||||
Baselongitude float64
|
||||
}
|
||||
|
||||
// A rider's leg does NOT always end at the address on the booking. For an
|
||||
// intercity parcel the rider carries it to a base and hands it over there;
|
||||
// the receiver is somebody else's problem, on another vehicle, days later.
|
||||
// The base coordinates are joined in here so the sequencer can use them as
|
||||
// the real end of the leg — see the substitution below.
|
||||
if err := db.DB.Table("bookingassignments AS ba").
|
||||
Select(`ba.bookingassignmentid, ba.bookingid, b.bookingno,
|
||||
b.pickuplatitude, b.pickuplongitude,
|
||||
b.deliverylatitude, b.deliverylongitude`).
|
||||
b.deliverylatitude, b.deliverylongitude,
|
||||
b.pickuppincode, b.deliverypincode,
|
||||
COALESCE(bh.latitude, rh.latitude, 0) AS baselatitude,
|
||||
COALESCE(bh.longitude, rh.longitude, 0) AS baselongitude`).
|
||||
Joins("JOIN pickupbookings AS b ON b.bookingid = ba.bookingid").
|
||||
Joins("LEFT JOIN hubs AS bh ON bh.hubid = b.nearesthubid AND bh.deletedat IS NULL").
|
||||
Joins("LEFT JOIN milerprofiles AS mp ON mp.userid = ba.mileruserid").
|
||||
Joins("LEFT JOIN hubs AS rh ON rh.hubid = mp.hubid AND rh.deletedat IS NULL").
|
||||
Where("ba.mileruserid = ? AND ba.assignmentstatus IN ?",
|
||||
milerUserID,
|
||||
[]string{constants.AssignmentAssigned, constants.AssignmentAccepted}).
|
||||
@@ -209,19 +228,60 @@ func loadActiveStops(milerUserID int) ([]stop, error) {
|
||||
"assignment_id", r.Bookingassignmentid, "booking_id", r.Bookingid)
|
||||
continue
|
||||
}
|
||||
dropLat, dropLng, ok := dropForLeg(
|
||||
r.Pickuppincode, r.Deliverypincode,
|
||||
r.Pickuplatitude, r.Pickuplongitude,
|
||||
r.Deliverylatitude, r.Deliverylongitude,
|
||||
r.Baselatitude, r.Baselongitude)
|
||||
if !ok {
|
||||
// Routed to a base, but no base has usable coordinates. Ordering it
|
||||
// against the far-away receiver would distort every other stop, so it
|
||||
// is left out of the route rather than allowed to skew it.
|
||||
utils.Warn("routing: hub-routed stop has no base coordinates, leaving it unsequenced",
|
||||
"assignment_id", r.Bookingassignmentid, "booking_id", r.Bookingid)
|
||||
continue
|
||||
}
|
||||
|
||||
stops = append(stops, stop{
|
||||
AssignmentID: r.Bookingassignmentid,
|
||||
BookingID: r.Bookingid,
|
||||
BookingNo: r.Bookingno,
|
||||
PickupLat: r.Pickuplatitude,
|
||||
PickupLng: r.Pickuplongitude,
|
||||
DeliveryLat: r.Deliverylatitude,
|
||||
DeliveryLng: r.Deliverylongitude,
|
||||
DeliveryLat: dropLat,
|
||||
DeliveryLng: dropLng,
|
||||
})
|
||||
}
|
||||
return stops, nil
|
||||
}
|
||||
|
||||
// dropForLeg is where THIS rider's leg ends — which is not always the address
|
||||
// on the booking.
|
||||
//
|
||||
// A hyperlocal parcel ends at the receiver. A hub-routed one ends at a base: the
|
||||
// rider hands it over there and the receiver is somebody else's leg, on another
|
||||
// vehicle, possibly days later. Sequencing a hub-routed parcel against the
|
||||
// receiver's coordinates asks the optimizer to plan a ride to another state —
|
||||
// wrong on its own terms, since a 430km "stop" is not a stop a rider makes, and
|
||||
// worse in company: one intercity destination in the set drags the ordering of
|
||||
// every genuine local stop beside it, because the solver is optimising a journey
|
||||
// nobody is going to make.
|
||||
//
|
||||
// The final destination is not lost. It is simply not this leg.
|
||||
//
|
||||
// ok is false when the parcel is hub-routed and no base has usable coordinates.
|
||||
// The caller drops the stop rather than falling back to the receiver, because a
|
||||
// stop in the wrong country is more damaging to the route than a missing one.
|
||||
func dropForLeg(pickupPincode, deliveryPincode string, pLat, pLng, dLat, dLng, baseLat, baseLng float64) (lat, lng float64, ok bool) {
|
||||
if legs.IsHyperlocal(pickupPincode, deliveryPincode, pLat, pLng, dLat, dLng) {
|
||||
return dLat, dLng, true
|
||||
}
|
||||
if baseLat != 0 || baseLng != 0 {
|
||||
return baseLat, baseLng, true
|
||||
}
|
||||
return 0, 0, false
|
||||
}
|
||||
|
||||
// optimize calls the Route Optimization API and maps its answer back onto our
|
||||
// assignment ids.
|
||||
func optimize(stops []stop) ([]Result, error) {
|
||||
|
||||
Reference in New Issue
Block a user