Files
medical-mall/pages/mall/delivery/doc/order-detail.md
2026-02-02 18:20:22 +08:00

2.2 KiB
Raw Blame History

order-detail.uvue — 订单详情

概要

展示单笔订单全部信息并提供状态流转(接单、确认取货、确认送达、拒单等)。页面会联合查询 ml_ordersml_order_itemsml_shopsml_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.idoptions.status,调用 loadOrderDetail(id)
  • loadOrderDetail(id)

    • 判断 ID 类型UUID / 数字 / 非数字)以决定查询字段(idcidorder_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_tasksorder_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() 做兼容处理。