WELIFE Docs Swagger Admin Web

Audit giao hàng / đặt hàng · 2026-08-19

Domain: D-DELIVERY · D-FNB · D-GROCERY · WP: WP-DELIVERY-AUDIT-01 (audit, không implement) Surfaces: CON (mobile/) · DRV (driver/) · API (api/src/modules/delivery + orders) · PAR (FNB kitchen only) · ADM (capability tài xế)

0. Verdict

Hai luồng tách entity đúng (không nhét đồ ăn vào Ride):

Ý định Entity Home CON Matching GPS live Thanh toán Push notif
Bưu kiện A→B («Đặt hàng») DeliveryOrder Ô Đặt hàng → DeliveryHome Auto 8 km + DRV nhận Có WS /delivery Chưa (DELIVERY_PAY chết) Không
Đồ ăn / siêu thị Order + Merchant Ăn uống / Siêu thị Auto 8 km lúc PAR nhận Không (poll 12s) Ví/ORDER_CHECKOUT order.*

Bưu kiện = IMP vận hành được (đặt → ghép → map → lấy/giao → ảnh). Chưa ngang gọi xe: giá chim bay, không thu tiền, không push, ETA sai, WS không emit khi ghép tài xế.

Nhà thuốc filter «Giao hàng» không dùng DeliveryOrder.

1. Bưu kiện — contract hiện tại

Swagger tag delivery · 11/11 IMP · 0 STUB.

Method Path Ai Việc
POST /delivery/quote public Phí haversine · min 15.000đ · 5.000đ/km
POST /delivery/orders USER Tạo NEW + auto-match
GET /delivery/orders/me USER 50 đơn gần nhất
GET /delivery/orders/:id USER hoặc driver Chi tiết + driverBrief
GET /delivery/orders/:id/tracking USER hoặc driver Timeline 4 bước + GPS lastLat
PATCH /delivery/orders/:id/status USER Chỉ CANCELLED
GET /delivery/driver/available DRIVER + cap DELIVERY Đơn chưa ghép ≤8 km
GET /delivery/driver/active DRIVER Đơn đang chạy
POST /delivery/driver/:id/accept DRIVER Nhận tay
POST /delivery/driver/:id/picked DRIVER + imageUrl?
POST /delivery/driver/:id/delivered DRIVER + imageUrl?

WS (không nằm OpenAPI): namespace /delivery · delivery:join · delivery:location (driver) · delivery:status.

Prisma delivery_orders: pickup/dropoff + fee + 3 URL ảnh + driverId + paymentIntentId (luôn null).

Trạng thái: NEW → PICKED → DELIVERED · hủy từ NEW/QUOTED/PICKED. QUOTED không bao giờ được ghi.

2. CON — Đặt hàng / theo dõi

Màn File Việc
Home tile serviceCatalog id=delivery · BirdParcelIcon «Đặt hàng»
Đặt DeliveryHomeScreen GPS lấy · autocomplete/ghim giao · ảnh hàng · quote · tạo đơn
List DeliveryOrdersScreen GET /orders/me
Track DeliveryDetailScreen Mapbox + polyline phase · timeline · gọi tài xế · hủy · WS GPS

Luồng đặt: GPS pickup → tìm/ghim dropoff → POST /quote → POST /orders → DeliveryDetail. Guard FE: hai điểm ≥80 m.

Lệch giá / map: map vẽ tuyến Mapbox/OSRM; phí BE vẫn haversine (đã ghi trong WP-FE-DELIVERY-MAPBOX-01). Cùng tuyến Bến Thành→Landmark: road ~4.7 km vs chim bay ~3.1 km → phí thấp hơn đường thật.

Kill app: BE giữ đơn. CON không có banner «đơn giao đang chạy» trên Home (Ride có liveRide). Phải vào list/clipboard.

3. DRV — bưu kiện

4. FNB / grocery shipper (WP-FNB-COURIER-01)

5. Lỗi / gap (ưu tiên)

P0 — vận hành tiền / định giá

  1. PaymentPurpose.DELIVERY_PAY tồn tại, không ai gọi. paymentIntentId luôn null. Đặt hàng = miễn phí trên hệ thống (COD miệng).
  2. Quote chim bay trong khi map/routing đã có road. Ride đã sửa (smoke:ride check 3). Delivery chưa.

P1 — realtime / UX trip

  1. tryAutoAssign và driverAccept không emitStatus. CON chỉ biết tài xế khi refresh / poll 30s. Ride emit ngay khi match.
  2. GET tracking không đọc cache WS — chỉ driverProfile.lastLat (ping có persist, nhưng chậm hơn WS).
  3. ETA luôn ~3 phút. Math.round(distanceMeters / 500 / 60) rồi max(3, …). Đúng thì / 500 (m/phút) không chia thêm 60.
  4. CON Home không banner đơn giao live.
  5. DRV nhận đơn không mở in-trip tự động.

P2 — product / ops

  1. Không push delivery.* (khác order.* / ride.*).
  2. Không SĐT/tên người nhận (chỉ địa chỉ + note).
  3. Hủy được lúc PICKED (hàng đã trên xe).
  4. Không chat đơn giao · không ADM list DeliveryOrder · PAR không đụng bưu kiện (đúng P2P).
  5. Không smoke:delivery (Ride có npm run smoke:ride).
  6. Race tryAutoAssign: update không where: { driverId: null } → hai driver có thể ghi đè.
  7. Figma SCR-DELIVERY-* = VISUAL_PARTIAL (không JPG dedicated).

6. Docs lệch code

Nguồn Ghi Thực tế 2026-08-19
MOBILITY-MATRIX §5 Delivery «Chưa GPS WS live» WS /delivery IMP
STATUS dòng MATCH-01 «chưa GPS WS» Cùng file dòng GPS-LIVE-01 đã IMP
Matrix #36 11 ops · Mapbox Đúng REST; WS không đếm
WP-FE-DELIVERY-ORDER-01 Next WP-DELIVERY-GPS-LIVE-01 Đã làm

7. Test hiện có

Suite Phạm vi
delivery-match.spec.ts Rank 8 km
delivery-tracking.spec.ts Timeline thuần
deliveryOrder.test.ts (mobile) Guard điểm + body
mapboxTiles.test.ts URL raster
order-courier.spec.ts FNB snapshot dropoff
Không HTTP smoke quote→create→match→pick→deliver

8. Next (không invent trong audit)

OWNER Pay/SMS/MoMo vẫn là gate P7. Nếu làm delivery tiếp (cần approvedWp):

WP đề xuất Việc
WP-DELIVERY-QUOTE-ROAD-01 Quote + distanceMeters theo Mapbox/OSRM như Ride
WP-DELIVERY-PAY-01 Wire DELIVERY_PAY / ví / CASH
WP-DELIVERY-WS-ASSIGN-01 emit khi match/accept + tracking đọc cache GPS
WP-DELIVERY-ETA-FIX-01 Sửa / 500 / 60
WP-FNB-COURIER-GPS-01 WS + map track đồ ăn (còn gap STATUS)
WP-SMOKE-DELIVERY-01 Clone smoke:ride
Domain: D-DELIVERY · D-FNB
WP: WP-DELIVERY-AUDIT-01
Surfaces: CON|DRV|API (PAR FNB kitchen · ADM capability)
Status: IMP (bưu kiện vận hành) · PARTIAL (pay/quote/notif/FNB-GPS)
Local: N/A (audit tĩnh)
Next: OWNER Pay/SMS/MoMo · hoặc approvedWp quote-road / pay