Feature: specs/027-offline-transfer-payment | Generated: 2026-09-03
参考: plan.md(改动文件清单)、research.md(D1-D9 决策)、contracts/api.md(接口契约)、quickstart.md(冒烟场景)
通用约束(每个任务遵守):
python << 'PYEOF'),锚点唯一性校验后再写*/ 序列;Controller 规范(@RequestHeader token + 显式 @RequestParam,禁 Map 入参)mvn -q -pl ruoyi-system,ruoyi-admin -am compile -DskipTests(JAVA_HOME=C:\Users\qmj.jdks\graalvm-jdk-21.0.7)验证public static final String PAY_TYPE_TRANSFER = "6";(紧邻 PAY_TYPE_CASH,带 Javadoc:線下轉賬支付,商家线下确认收款后解锁配送),编译验证目标:App 依据接口决定「線下支付」选项显隐与账户展示。独立测试:齐全商家门店返回三字段;缺任一字段返回 data=null;连锁多店返回同一份。
GET /chanting/store/bankInfo(@Anonymous,@RequestParam Integer id):按门店查 pos_store.user_id → info_user 的 bankAccountName/bankName/bankAccountNo;三项均非空返回 {accountName, bankName, accountNo},任一为空返回 success(null);参考 getstore 风格,Javadoc 注明「商家收款账户(線下轉賬收银台展示用),商家级、连锁共享」,编译验证目标:确认收款解锁配送。独立测试:未确认时骑手接单被拒(提示「商家确认收款后骑手才能接单」)、newTask 列表不可见;确认后接单成功、附近骑手收到推送、日志记录;重复确认/已取消被拒;现金单 confirmCashPayment 行为不变。
GET /confirmTransferPayment(@RequestHeader token + @RequestParam Long id),镜像 confirmCashPayment(397行):requireMerchantOrderAccess → 校验 payType==PAY_TYPE_TRANSFER(否则 no.order.paytype.not.transfer)→ state==4 拒绝(no.order.transfer.cancelled)→ payStatus==1 拒绝(no.order.transfer.already.paid)→ payStatus 置 1 + orderLogHelper 记「商家{名}确认转账收款」;外送单(type=0)保存后调用 deliveryOrderNotificationService.notifyOrderAvailable(order)(注入方式照 PosOrderController:130),编译验证PAY_TYPE_TRANSFER.equals(payType) && payStatus != 1 → 抛 ServiceException(no.order.transfer.not.paid),编译验证目标:转账单在商家 Web 正确显示标签。独立测试:到付/线上/转账三类标签互不混淆,四语言正确。
6: 'OfflineTransfer'index 命名空间(找 index:{ 的 CashOnDelivery/OMG/LinePay/cash 同级)加 OfflineTransfer: '线下转账' / '轉賬支付' / 'Transfer Payment' / 'Chuyển khoản'(Python 脚本,锚点取 index 命名空间内 cash 键行)T001 ──> T005(常量)
T002 ──> T003(US1 冒烟) [US1 与 US2/US3 并行]
T004 ──> T005/T006(提示 key)
T005,T006 ──> T007(US2 冒烟)
T008,T009 ──> T010 [US3 与 US2 并行]
T007,T010 ──> T011 ──> T012
US2(T001+T004+T005+T006):确认收款 + 骑手门禁是资金闸门核心;US1 银行信息接口紧随其后(App 展示依赖),US3 标签纯展示可最后。