# Quickstart: 闪送订单状态变更消息推送 **Date**: 2026-09-17 | **Spec**: [spec.md](spec.md) ## 前置条件 - JDK 21 构建(本机用 `C:\Users\qmj\.jdks\graalvm-jdk-21.0.7`,仅命令内临时设置 `JAVA_HOME`/`PATH`,不改全局)。 - 先由开发者手动执行 `updatesql/sql.md` 中 2026-09-18 段,新增 `is_display`、索引和 `flashDeliveryAvailabilityTask.openScheduledOrders()` 每秒调度;不要由应用自动执行迁移。 - 6 份后端 i18n 资源已包含外卖/闪送专属新单 key。 ## 自动验证(单测) ```bash # 仓库根目录,Git Bash export JAVA_HOME="C:/Users/qmj/.jdks/graalvm-jdk-21.0.7" export PATH="$JAVA_HOME/bin:$PATH" mvn -pl ruoyi-admin -am test -Dtest='FlashDeliveryNotificationServiceTest,FlashDeliveryApplicationServiceTest' ``` 预期:全部通过。覆盖点: - 三类履约事件(抢单/取件/送达)成功时调用对应用户推送;操作失败(条件更新 0 行)不推送。 - 用户/平台取消且 `riderId` 非空时调用骑手推送;`riderId` 为空跳过。 - 排除事件(complete、cancelExpiredScheduledOrder、加小费)零推送调用。 - 立即单创建后可见并触发闪送新单通知;预约单创建时隐藏且不推送,时间窗内原子开放后只通知一次。 - 新单候选骑手按 FLASH 资质、在线状态、车型、距离与接单互斥规则筛选。 ## 手动端到端验证(联调环境) 1. 用户 App(寄件人)与骑手 App 各登录一个测试账号;骑手账号具备闪送(FLASH)配送资质。 2. 寄件人创建立即单(货到付款或沙箱支付),记下 `orderNo`;符合条件的骑手应立即看到订单并收到“有新的闪送订单”。 3. 骑手在任务列表抢单 → 寄件人应收到「骑手已接单,NO:{orderNo}」推送,消息中心出现对应记录。 4. 骑手提交取件凭证 → 寄件人收到「骑手配送中,NO:{orderNo}」。 5. 骑手提交送达凭证(含 PIN 时输入 PIN)→ 寄件人收到「骑手已送达,NO:{orderNo}」。 6. 另起一单:骑手接单后由寄件人取消 → 骑手收到「订单已取消,NO:{orderNo}」;寄件人不收到取消推送。 7. 再起一单:骑手接单后由平台后台取消 → 骑手收到取消推送。 8. 反例:待接单状态直接平台取消(无人接单)→ 无任何骑手推送。 9. 反例:等待超过自动完成时限(或平台手动完成)→ 用户无「已完成」推送(FR-010)。 10. 切换寄件人 App 语言(vi/en/tw/zh)重复第 3 步 → 推送文案语言随之变化。 11. 创建未来时间的预约单 → 创建后骑手列表不可见、无新单推送;到达 `scheduledPickupStartAt` 后约 1 秒内订单变为可见并收到一次“有新的闪送订单”,持续观察不得重复推送。 12. 发布一笔外卖单 → 骑手推送应为“有新的外卖订单”,与第 2/11 步的闪送文案可区分。 ## 判定 - 第 2~7、11~12 步全部按期收到且展示同步,第 8~9 步确实无推送、第 10 步语言正确 → 特性验证通过(对应 spec SC-001~SC-005)。 - 推送期间人为停掉推送云函数 → 订单操作仍全部成功(SC-004 零传导)。