# 状态 1–5 行为与代码位置说明 本文档针对 `ml_delivery_tasks.status` 中 1–5 的状态,逐项列出在 delivery 页面中涉及的展示、查询、更新位置、按钮/动作与已发现的不一致点与建议。 ## 状态 1 — 待接取 - 映射文本/样式 - `index.uvue`: `getTaskStatusClass` -> `task-pending`(见 index.uvue getTaskStatusClass) - `index.uvue`: `getTaskStatusText` case 1 -> '待接取'(index.uvue#L571) - `order-history.uvue`: 同样映射(order-history.uvue#L230, #L242) - 查询/展示 - `loadAvailableOrders` 查询:`supa.from('ml_delivery_tasks').is('driver_id','null').eq('status', 1)`(index.uvue loadAvailableOrders) - 在可接订单列表与当前任务区显示“接受任务/接受订单”按钮(index.uvue#L81、order card accept button) - 更新/操作 - 接单时更新为 `status = 2`:`supa.from('ml_delivery_tasks').update({ driver_id: driverId, status: 2 }).eq('id', ...)`(index.uvue acceptTask / acceptOrder,index.uvue#L602,#L756) - 建议/注意 - 接单使用条件更新或后端 RPC 避免抢单竞态(目前无 WHERE driver_id IS NULL 条件)。 ## 状态 2 — 已接取 - 映射文本/样式 - `index.uvue` 文本 '已接取'(index.uvue#L572),样式 `task-accepted`(index.uvue#L560) - `order-history.uvue` 相应映射(order-history.uvue#L243) - 查询/展示 - 当前任务区显示“开始取货”按钮(index.uvue#L82) - `order-detail.uvue` 若 `order.status === 2` 显示“前往取货/正在取货”(order-detail.uvue#L169-L170) - 更新/操作 - `startPickup()` 会将 task 状态更新为 3(index.uvue startPickup) - 接单后代码尝试同步 `ml_orders.order_status = 2`(index.uvue#L766) - 建议/注意 - 同步 ml_orders 的操作应做失败回退处理或在服务端做原子事务。 ## 状态 3 — 取货中 - 映射文本/样式 - `index.uvue` 文本 '取货中'(index.uvue#L573),样式 `task-picking`(index.uvue#L561) - `order-history.uvue` 同步映射(order-history.uvue#L244) - 查询/展示 - 当前任务区显示“确认取货”按钮(index.uvue#L83) - `order-detail.uvue` 在 route 区显示“确认取货”按钮(order-detail.uvue#L55,#L173) - 更新/操作 - `confirmPickup()` 将 status -> 4 并写入 `pickup_time`,同时尝试把 `ml_orders.order_status = 4`(index.uvue & order-detail) - 建议/注意 - 确认取货应当原子更新任务与订单状态,或由后端封装接口完成。 ## 状态 4 — 已取货 - 映射文本/样式 - `index.uvue` 文本 '已取货'(index.uvue#L574),样式 `task-picked`(index.uvue#L562) - `order-history.uvue` 文本 '已取货'(order-history.uvue#L245) - 查询/展示 - 当前任务区显示“开始配送”按钮(index.uvue#L84) - `order-detail.uvue` 显示“确认送达”按钮(order-detail.uvue#L68,#L176) - 更新/操作 - `startDelivery()` 将 status -> 5(index.uvue startDelivery) - 建议/注意 - 明确 4 与 5 的边界并在统计/历史中统一口径(是否将 5 视作已完成)。 ## 状态 5 — 配送中 - 映射文本/样式 - `index.uvue` 文本 '配送中'(index.uvue#L575),样式 `task-delivering`(index.uvue#L563) - `order-history.uvue` 在样式处标为 `status-delivered`(order-history.uvue#L234)且文本处 `case 5: return '已完成'`(order-history.uvue#L246)——存在不一致。 - 查询/展示 - 当前任务区显示“确认送达”入口(index.uvue#L85 -> showConfirmDeliveryDialog) - `order-detail.uvue` 在状态 >=5 时进度条显示为已送达(getStatusDesc) - 更新/操作 - `confirmDelivery()` 将 task.status -> 6 并写入 `delivered_time`,再尝试同步 `ml_orders.order_status = 5`(index.uvue#L679-691) - 建议/注意 - 目前统计(如 todayStats)将 `status >= 5` 视作“已完成”计数,而 UI 有时把 5 显示为“配送中”,建议统一规则(推荐:把 6 视作真正完成,5 为配送中)。 ## 跨页不一致与改进建议(摘要) - 不一致点:`status = 5` 在不同页面既被视作“配送中”,又被视作“已完成”;`confirmDelivery` 设置 task=6,但统计使用 `>=5` 判断完成,导致计数或展示差异。 - 建议: 1. 明确“完成”阈值(推荐:status === 6 为已完成,status === 5 为配送中),并在所有统计、过滤、UI 映射处统一实现。 2. 将状态映射抽到共享工具文件 `utils/deliveryStatus.uts` 并替换硬编码。 3. 接单、确认取货、确认送达等关键操作应使用后端事务或条件更新避免竞态与不一致。 --- 文档已生成于 `pages/mall/delivery/STATE_1-5_LOGIC.md`。要我现在: - A) 将 `getTaskStatusText` / `getOrderStatusText` 抽到 `utils/deliveryStatus.uts` 并替换页面中的映射,或 - B) 实现接单的条件更新补丁(修改 `acceptTask` / `acceptOrder`),或 - C) 仅把“5 是否计作完成”的规范改写回 `DELIVERY_LOGIC.md` 并提交。 请选择一项继续。