For agentic workers: REQUIRED SUB-SKILL: Use superpowers:executing-plans for inline execution; use superpowers:subagent-driven-development only if the user selects that method. Steps use checkbox syntax for tracking.
Goal: 只在既有用户订单通知中新增 eventScene,供前端控制前台语音,并交付接入文档。
Architecture: 使用现有 OrderPushBodyDto 增加一个可选场景及用户专用 JSON 工厂,实际成功动作明确传入枚举。用户通知入库与外部发送复用同一个 body;旧工厂和商家/骑手通知不增加场景。App、音频、云函数及声音配置均不修改。
Tech Stack: Java 21、Spring Boot、既有 JSON 工具、事务同步、JUnit 5/Mockito、uniPush/FCM/APNs。
Spec: spec.md
Date / Branch / Progress: 2026-10-09 / 当前 test-202609v2 / 已验证(本期后端测试、构建及审查修复通过;全量回归 1 项基线失败另记,未部署)。
push_message.body 已保存完整 JSON,FCM/APNs 已转发完整 payload;无需新表、SQL、顶层字段或云函数改动。.specify/memory/constitution.md 是未填写模板,按 AGENTS.md 和用户最新范围执行,无需例外。
本次实现及本地验证不运行真实支付、数据库操作或生产推送,不读取凭据。已取消此前 UserNotificationPayload 类、事件 ID/语言映射封装和用户推送重载的计划,不改 PayPush 本地化逻辑。
后端根目录 D:/QtwCode/foodie/foodie-server;以下生产路径以 ruoyi-admin/src/main/java/com/ruoyi/app/ 为基准,测试路径以 ruoyi-admin/src/test/java/com/ruoyi/app/ 为基准。
getUserJson(String ddId, String state, int type, int pushType, UserNotificationScene scene): String。sendToUser(InfoUser recipient, FlashDeliveryOrder order, String status, String contentKey, UserNotificationScene scene): void。pushSelfDeliveryStatus(PosOrder order, String contentKey, String stateStr, UserNotificationScene scene): void,按原事务存在与否在成功提交/持久化后调度。Files: 新建 push/UserNotificationScene.java、测试 order/dto/OrderPushBodyDtoTest.java;修改 order/dto/OrderPushBodyDto.java。
Interfaces: 产出上述 getUserJson 和七场景枚举;不再创建额外 payload 封装类。
preservesLegacyFieldsAndAddsOnlyEventScene:旧四字段原值不变,新键集合仅多 eventScene;oldFactoryOmitsEventScene 断言旧 getJson/getMap 无新增 key;覆盖枚举七值及 null 场景。Files: 修改 order/PosOrderQsOprateController.java、order/PosOrderController.java、order/PosOrderShOprateController.java、flashdelivery/service/FlashDeliveryNotificationService.java。扩展测试 order/PosOrderQsOprateControllerTest.java、order/PosOrderAdminStatusControllerTest.java、order/PosOrderShOprateControllerTest.java、flashdelivery/service/FlashDeliveryNotificationServiceTest.java、flashdelivery/service/FlashDeliveryMultiPickupTest.java。
Interfaces: 使用 Task 1 getUserJson,仅用户 body 带场景。现代 deliveryStatus 1/2/3 的成功动作对应 RIDER_ACCEPTED/ORDER_DELIVERING/ORDER_DELIVERED;现有有效旧入口内部 state 3/4/12 分别明确对应这三个动作,不改 state 值。
Files: 修改 pay/LinePayOrderNotificationService.java、omgpay/OmgPaymentNotifyService.java、order/DeliveryOrderNotificationService.java;扩展同目录对应三份现有测试。
Interfaces: 用户专用 getUserJson body 复用于 PublisherEvent/BusinessPushService;商家/骑手用原始独立 body。
Files: 扩展测试 push/BusinessPushServiceTest.java、push/FcmPushSenderTest.java、push/ApnsPushSenderTest.java、utils/event/PushEventListenerTest.java,收口本目录文档。
Interfaces: 验证现有完整 payload 保留 eventScene,不增加顶层字段、不改声音。只有测试确证 uni 用户 GET 编码破坏 JSON 时,才在 utils/PayPush.java 修该路径参数编码,不改云函数。
执行时每 Task 缩小同一 -Dtest 列表,先证明预期失败再通过;既有通道透传只增加回归测试,不改发送实现。控制器公共场景/事务夹具集中在 UserOrderNotificationSceneTest。
$env:JAVA_HOME = 'C:/Users/99029/.jdks/graalvm-jdk-21.0.12+7.1'
$env:PATH = "$env:JAVA_HOME/bin;$env:PATH"
mvn -pl ruoyi-admin -am '-Dtest=OrderPushBodyDtoTest,UserOrderNotificationSceneTest,PosOrderQsOprateControllerTest,PosOrderShOprateControllerTest,PosOrderAdminStatusControllerTest,FlashDeliveryNotificationServiceTest,FlashDeliveryMultiPickupTest,LinePayOrderNotificationServiceTest,OmgPaymentNotifyServiceTest,DeliveryOrderNotificationServiceTest,BusinessPushServiceTest,FcmPushSenderTest,ApnsPushSenderTest,PushEventListenerTest' '-Dsurefire.failIfNoSpecifiedTests=false' test
mvn -pl ruoyi-admin -am -DskipTests package
git diff --check
预期测试零失败/零错误、两次 BUILD SUCCESS、diff 检查退出码 0。Java 环境只对当前进程生效,不改全局配置。实际云端场景透传及 App 真机声音由联调核验,未执行必须单独记录。
Task 1 → Task 2 → Task 3 → Task 4;详单见 tasks.md。用户已确认继续,按本计划顺序实施;不创建分支或 worktree。收口时依执行计划技能安排一次只读整体审查,不分派实现任务。