# order-detail.uvue — 订单详情 ## 概要 展示单笔订单全部信息并提供状态流转(接单、确认取货、确认送达、拒单等)。页面会联合查询 `ml_orders`、`ml_order_items`、`ml_shops` 与 `ml_delivery_tasks`。 ## 数据结构(常用字段) - `Order` - `id: string | number` - `order_no: string` - `cid?: number` (兼容旧字段) - `shipping_address | pickup_address`: object/string - `shipping_fee`, `total_amount`, `status` - `OrderItem` - `id`, `order_id`, `product_name`, `qty`, `price` - `DeliveryTask` - `id`, `order_id`, `driver_id`, `status`, `accepted_at`, `picked_at`, `delivered_at` ## 关键方法 - `onLoad(options)` - 解析 `options.id` 与 `options.status`,调用 `loadOrderDetail(id)`。 - `loadOrderDetail(id)` - 判断 ID 类型(UUID / 数字 / 非数字)以决定查询字段(`id`、`cid`、`order_no`)。 - 并行查询 `ml_orders`, `ml_order_items`, `ml_shops`, `ml_delivery_tasks` 并合并到页面状态。 - `acceptOrder()` / `rejectOrder(reason)` - accept: 尝试对 `ml_delivery_tasks` 执行 `update driver_id` 操作并设置 `status=2`(处理中),需要后端并发保护。 - reject: 增加拒单原因到 `ml_delivery_tasks` 或 `order_notes` 并回滚本地 UI 状态。 - `confirmPickup()` / `confirmDelivery()` - 根据 `task.id` 更新相应时间戳字段(`picked_at`/`delivered_at`)并设置状态(例如 `status=3/4`)。 ## 示例:按 id 类型查询(伪代码) ``` let q = supa.from('ml_orders').select('*') if (isUUID(id)) q = q.eq('id', id) else if (isNumeric(id)) q = q.eq('cid', id) else q = q.eq('order_no', id) const { data: order } = await q.limit(1).execute() ``` ## 事务与并发注意 - 接单场景应使用后端原子性检查(数据库事务或行级乐观锁)以避免多司机同时接单。 - 前端接单流程:先尝试 update(带 where driver_id IS NULL),若返回 0 row affected 则提示已被接单。 ## 错误处理与回退 - 捕获所有 supa 调用错误并将友好错误展示给用户(例如:'网络错误,请稍后重试')。 - 对可能缺失的字段(地址为字符串或对象)使用 `_transformAddress()` 做兼容处理。