2.2 KiB
2.2 KiB
order-detail.uvue — 订单详情
概要
展示单笔订单全部信息并提供状态流转(接单、确认取货、确认送达、拒单等)。页面会联合查询 ml_orders、ml_order_items、ml_shops 与 ml_delivery_tasks。
数据结构(常用字段)
-
Orderid: string | numberorder_no: stringcid?: number(兼容旧字段)shipping_address | pickup_address: object/stringshipping_fee,total_amount,status
-
OrderItemid,order_id,product_name,qty,price
-
DeliveryTaskid,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并合并到页面状态。
- 判断 ID 类型(UUID / 数字 / 非数字)以决定查询字段(
-
acceptOrder()/rejectOrder(reason)- accept: 尝试对
ml_delivery_tasks执行update driver_id操作并设置status=2(处理中),需要后端并发保护。 - reject: 增加拒单原因到
ml_delivery_tasks或order_notes并回滚本地 UI 状态。
- accept: 尝试对
-
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()做兼容处理。