## 目的 当“附近订单”过多时,在主页面展示前 N 条(当前为 20 条),需要提供“更多”入口,跳转到单独页面展示所有可接取的订单并支持翻页/上拉加载。 ## 路由与文件 - 主入口:在 `pages/mall/delivery/index.uvue` 的“附近订单”区块新增“更多”按钮,导航到新页面。 - 新页面文件:`pages/mall/delivery/all.uvue`(建议路径) - 文档说明文件:`pages/mall/delivery/doc/more-orders.md`(本文件) ## 用户流程 1. 用户在 `index.uvue` 看到“附近订单”列表(最多 20 条)。 2. 当可接取订单数量 >= 20 时,显示“更多”按钮。 3. 点击“更多”跳转到 `all.uvue`,展示可接取订单的完整列表(分页或无限滚动)。 4. 用户可在新页面接受订单或刷新列表。 ## 后端 / 查询设计(示例:Supabase 客户端) - 建议分页参数:`pageSize = 50`(可配置)。 - 前端通过 offset/pagination 请求: 示例(首次加载 page=0, size=50): ```ts const page = 0 const size = 50 const res = await supa.from('ml_delivery_tasks') .select('*') .is('driver_id', 'null') .eq('status', 1) .order('created_at', { ascending: false }) .range(page*size, page*size + size - 1) .execute() ``` - 翻页时将 `page` 增加;上拉加载时继续请求下一段 `range`。 - 后端/数据库建议对 `ml_delivery_tasks` 建立索引(status, driver_id, created_at)以加速查询。 ## 前端实现建议 - `index.uvue`:在 `availableOrders` 列表下方加入: - 条件显示:`availableOrders.length >= 20` 时显示“更多”按钮。 - 点击处理函数:`uni.navigateTo({ url: '/pages/mall/delivery/all' })`。 - `all.uvue` 页面职责: - 使用与 `index.uvue` 相同的 `supa` 客户端和 `_transformTask` 方法复用数据格式化逻辑。 - 支持分页(page + pageSize)或无限滚动(onReachBottom 加载下一页)。 - 显示空状态、加载中状态和错误提示。 示例数据加载片段(伪代码): ```ts data() { return { page: 0, pageSize: 50, items: [], loading: false, finished: false } } async loadPage() { if (this.loading || this.finished) return this.loading = true const res = await supa.from('ml_delivery_tasks') .select('*') .is('driver_id', 'null') .eq('status', 1) .order('created_at', { ascending: false }) .range(this.page * this.pageSize, (this.page+1)*this.pageSize - 1) .execute() const rows = Array.isArray(res.data) ? res.data : [] if (rows.length < this.pageSize) this.finished = true this.items.push(...rows.map(r => this._transformTask(r))) this.page += 1 this.loading = false } ``` ## 并发与安全 - 接单时应在服务器端/数据库层做原子性判断,避免竞态: - 示例(伪 SQL): UPDATE ml_delivery_tasks SET driver_id = :driverId, status = 2 WHERE id = :taskId AND driver_id IS NULL AND status = 1 RETURNING id - 前端在发起“接受订单”请求后,基于返回结果确认是否成功;若失败需提示用户订单已被接取。 ## 接受标准/验收条件 - 在 `index.uvue` 点击“更多”能跳转到 `all.uvue`。 - `all.uvue` 能正确加载 >20 条可接订单并支持继续加载直到无更多数据。 - 接单操作的竞态由后端或事务性查询处理,前端能正确反馈成功/失败。 ## 测试数据与验证 - 使用现有文档 `doc_mall/database/realistic_mock_data.sql` 创建若干测试订单;也可循环插入多条 `ml_delivery_tasks`(status=1, driver_id=NULL)用于分页测试。 示例快速生成(Postgres 伪 SQL): ```sql INSERT INTO public.ml_delivery_tasks (order_id, pickup_address, delivery_address, delivery_fee, status, created_at, updated_at) SELECT uuid_generate_v4(), '{"detail":"店铺"}'::jsonb, '{"detail":"用户地址"}'::jsonb, 5.0, 1, NOW() - (i || ' minutes')::interval, NOW() FROM generate_series(1,200) as s(i); ``` ## 开发任务清单(简要) 1. 在 `pages/mall/delivery/index.uvue` 增加“更多”按钮並导航。 2. 新建 `pages/mall/delivery/all.uvue`,实现分页/上拉加载并复用 `_transformTask`。 3. 后端或 DB 层确保接单操作的原子性。 4. 编写 E2E 或手动测试脚本验证加载与接单行为。 ## 是否需要我实现? 如果你需要,我可以: - 直接在 `index.uvue` 添加“更多”按钮示例(小改动)。 - 新增 `pages/mall/delivery/all.uvue` 的样板实现并提交 PR 样例。 --- 文档已创建:`pages/mall/delivery/doc/more-orders.md`