Files
medical-mall/pages/mall/delivery/doc/old(弃用)/index.md
2026-03-17 11:06:26 +08:00

4.5 KiB
Raw Blame History

index.uvue — 配送端首页

概要

配送员主界面,包含司机信息、在线/离线切换、今日统计、当前配送任务、附近可接订单与快捷入口。

数据结构

  • DeliveryDriverType (来自 ml_delivery_drivers)

    • id, user_id, real_name, avatar_url, work_status, vehicle_type, vehicle_number, rating, service_areas, ...
  • CurrentTaskType / AvailableOrderType

    • id, order_no, status, pickup_address, delivery_address, pickup_contact, delivery_contact, delivery_fee, distance, estimated_time, created_at

关键方法

  • onLoad()

    • 调用 getCurrentUser() 确保用户上下文可用
    • 执行:loadDriverInfo(), loadTodayStats(), loadCurrentTask(), loadAvailableOrders()
  • loadDriverInfo()

    • ml_delivery_drivers 表按 user_id 查询并更新 driverInfo
  • loadTodayStats()

    • 查询 ml_delivery_tasks 在当天范围内的记录,计算完成订单数、总收入、配送里程等。
  • loadCurrentTask()

    • 查询 ml_delivery_tasks 中 driver_id 的未完成任务status < 5并取最新一条作为当前任务。
  • loadAvailableOrders()

    • isOnline 且无 currentTask,从 ml_delivery_tasks 查询 driver_id IS NULL 且 status=1 的订单列表(可按地理位置筛选)。
  • _transformTask(task)

    • 兼容处理 pickup_address / delivery_addresspickup_contact 的多种格式(对象或 JSON 字符串),输出页面期望结构。

关键 DB 查询 示例

await supa.from('ml_delivery_drivers').select('*').eq('user_id', userId).limit(1).execute()

await supa.from('ml_delivery_tasks')
  .select('id,delivery_fee,distance,created_at,status')
  .eq('driver_id', driverId)
  .gte('created_at', start)
  .lte('created_at', end)
  .execute()

交互与状态流

  • toggleWorkStatus():切换 isOnline 并调用 startWork() / stopWork()。上线时会刷新可接订单列表。
  • 接单/开始取货/确认取货/开始配送/确认送达等均通过对 ml_delivery_tasksupdate 操作变更 status,并在成功后更新本地 currentTask

UI 行为变动(已生效)

  • 当页面检测到存在 currentTask(来自 ml_delivery_tasks)时,页面不会再弹出“附近可接订单”列表。即:配送端以 ml_delivery_tasks 为状态真源,主页面的订单展示不再依赖或回退展示 ml_orders.order_status,以避免两表不同步导致的显示冲突。
  • 为了减少页面闪烁与重复刷新,enableAutoRefresh 在默认实现中已可被关闭(false),且 loadAvailableOrders() 在检测到 currentTask 时会跳过可接订单的渲染。

会话与加载保护

  • supaReady 的会话恢复在某些环境中会较慢,页面中已对其使用 Promise.race(..., 1500) 超时包装:超时后页面会打警告并继续渲染以避免长时间阻塞用户界面。依赖用户 id 的查询在超时情况下可能为空,请参照 order-history.md 的“已实现的防护”部分进行排查。

前端同步尝试(临时)

  • 在接单/确认送达流程中前端会尝试向 ml_orders 发送更新(将 order_status 同步到任务的状态)并记录返回结果用于诊断。但该同步并不保证在所有权限或网络错误下成功,因此更稳妥的方案仍是后端触发器同步或可信服务端接口。

注意事项

  • 高并发接单场景需后端保证原子性(乐观锁或 DB 事务)以防止竞单冲突。
  • loadAvailableOrders() 最好按司机服务区域与距离筛选,并使用分页/实时推送代替频繁轮询。
  • 日志console.log语句便于调试但生产环境建议使用集中化日志系统。

index.uvue — 配送端首页

页面目的:配送员主界面,展示司机资料、工作状态、今日统计、当前任务与可接订单。

关键点:

  • 数据加载:onLoad() 调用 getCurrentUser() 后依次调用 loadDriverInfo(), loadTodayStats(), loadCurrentTask(), loadAvailableOrders()
  • Supabase 交互:通过 supa.from(...).select(...).eq(...).execute() 查询 ml_delivery_driversml_delivery_tasks 等表。
  • 兼容解析:_transformTask(task) 将 DB 返回的地址/contact 字段兼容解析为页面所需结构(处理字符串或对象)。
  • 操作:接单/开始取货/确认取货/开始配送/确认送达等,会调用 supa 更新 ml_delivery_tasks 状态并同步页面状态。

注意:对 supa 操作有大量 try/catch页面对无用户 ID 情况做了保护,适合直接对接真实后端。