Files
medical-mall/pages/mall/delivery/doc/old/index.md
2026-02-06 15:10:18 +08:00

74 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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_address``pickup_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_tasks``update` 操作变更 `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_drivers``ml_delivery_tasks` 等表。
- 兼容解析:`_transformTask(task)` 将 DB 返回的地址/contact 字段兼容解析为页面所需结构(处理字符串或对象)。
- 操作:接单/开始取货/确认取货/开始配送/确认送达等,会调用 supa 更新 `ml_delivery_tasks` 状态并同步页面状态。
注意:对 supa 操作有大量 try/catch页面对无用户 ID 情况做了保护,适合直接对接真实后端。