tasks.md 28 KB

Tasks:同一用户多店结算与同骑手配送

依据:spec.md、plan.md、data-model.md、contracts/api.md。分支:codex/036-multi-store-checkout(后端与平台 PC)。每个生产行为先写可失败的定向测试;业务代码注释说明批次和旧单兼容边界;SQL 只登记不执行。

Phase 1:基础与计价(US1)

  • T001 在 ruoyi-admin/src/test/java/com/ruoyi/app/order/ 增加配置、首店围栏、阶梯命中、逐店折后运费舍入及非法配置测试,并确认先失败。
  • T002 实现新多店全局配置读取/校验/保存及 PC 配置页、四语言文案;默认围栏 1000 米、最多 5 店、缓冲 5 分钟、2 店九折/3 店八折;普通骑手字典不增加第二套限制。配置改为专表 order_checkout_config,不接 sys_config。
  • T003 对真实店铺、商品/规格/价格、促销/优惠券、地址及现有运费进行服务端预结算;输出圈外店原因、本批参与集合、可选支付方式和报价指纹,不信任客户端金额。
  • T004 在 updatesql/sql.md 登记 036 配置、批次、成员、支付尝试、配送组、通知与退款意图表及索引;不执行迁移。
  • T005 新批次幂等创建:重算报价/成员,逐店校验并固化paymentMethods,原子写父子单与快照及两个截止;不创建圈外店订单、不默认选择到付,不在创建事务内推送履约。全到付按T035进入激活/开放流程;普通/createOrder不走新规则。

Phase 2:逐店收银与统一生效(US2)

  • T006 测试建批逐店支付选择、方式过滤、全到付当场确认、安全改选、未决在线尝试、15分钟与缓冲边界、真实收款和到付确认的差别、取消与回调竞争。
  • T007 接入 LINE/OMG 既有支付入口,只对合法 036 成员放宽旧多店拒绝;记录实际发起证据、原交易、商家凭证与金额,非批次订单保留原校验。
  • T008 建批或合法改选到付与LINE/OMG回调/查询/补单统一记成员事实,全部合法就绪才CAS激活;失败/未知和客户端回跳不能激活。
  • T009 新批次超时/迟到支付处理及重启可恢复扫描;最终截止未就绪整批关闭,迟到实收建退款意图不重开。
  • T010 持久幂等开放与通知/失败重试:最后成员就绪提交后立即尝试开放即时/已到点批次,原分钟任务负责预约到点和失败/重启补偿;独立通知任务在开放后推送。补普通平台配送预约旧时点扫描,夜市自配送/自取及旧单期限不受影响。

Phase 3:取消、退款与券(US3)

  • T011 测试未生效整批取消、已生效未接单店取消、已接用户拒绝、商家已接未取不能出餐取消;线上真实实收全退、到付未收不退款,余单不补差。
  • T012 LINE 原渠道全额退款与新批次意图关联;OMG 正式退款执行/查询/重试/结果未知/人工处理,测试环境硬拒绝正式 URL,测试仅验证意图不宣称到账。
  • T013 新批次取消成员的优惠券条件返还:仅原子单绑定、原有效期、不复活已过期券、重复取消幂等,不影响旧单券流程。

Phase 4:同骑手配送(US4)

  • T014 测试按组计 1 个外卖任务、跨闪送总任务、加急独占、字典非法回退 1;接组/取消/另一个骑手竞争及组内混合进度释放。
  • T015 待抢任务组去重、旧单笔接单拒绝拆组、新接组 API 在同一骑手锁与事务中统一校验并分配全部成员;以创建快照中的首店作骑手接单距离基准,在锁内重验位置时效/原距离字典,组门店上限实时重验。
  • T016 骑手逐子单取餐/送达、商家逐单出餐和到付现金/账单继续沿原有效入口;不增加全组取齐、整组送达/结算。

Phase 5:查询、PC 与交付(US5)

  • T017 测试批次/子单/组归属及越权、用户列表已选方式/部分付款/Apple Pay/缓冲/退款状态,兼容历史未选记录,旧单分类不变。
  • T018 批次详情/进度/继续结算接口、平台退款跟进 PC 页四语言;配置页已在 T002 完成;用户端和骑手端兼容版本/强制更新门禁及原单笔入口防绕过;App 只按已写的 frontend-app-integration.md 接入,不在本仓库修改 App 源码。
  • T019 定向测试、受影响模块构建及回归普通 LINE/OMG/到付/转账、自取、夜市自配送、预约、促销券/发票;核验 SC-034~036 的组合分页/角标、首店接单距离及升级门禁;检查 SQL、编码、换行和差异范围,记录正式 OMG 退款未联调限制。

2026-10-19 两端列表联合契约(文档已收口,实施待办)

已将 frontend-display-plan.md 与 API 契约、App 接入说明 对齐,用户确认首店距离与两端升级门禁;本轮仅完成文档,不代表列表接口或 App 页面已实现。

  • T020 将用户批次卡与骑手组任务卡、单一工作页签和取送双进度(参考闪送多点)、角标/容量、金额分项和通知跳转收口到 contracts 与 App 文档;已确认首店距离和旧 App 升级策略。此项仅文档完成。
  • T021 在 T014–T018 中实现 GET /user/cards、GET /rider/tasks 及对应角标的服务端按批次/组聚合后分页和计数;验证普通单混排、跨页不拆组、骑手 A 已取/B 待取和部分取消时单页签归类、双进度及组计数;不得依赖 App 对分页子单临时合并。
  • T022 用户已确认项目审查四项建议,更新 spec/plan/data-model/contracts 及对应验收;该项只代表规格收口,业务实现见 T023–T026。
  • T023 接入 037 多店无人接单取消:统一生效/首次开放时间持久化及 SQL、按组计时/取消与接组互斥、逐交易退款/返券和原独立单回归;部分取消不重置,预约用最晚基准,见 FR-042/SC-030。
  • T024 激活与恢复扫描检查未生效预约批次已到/超过结束时间,整批取消及真实退款/迟到补偿,不转即时、不取消已生效任务,见 FR-043/SC-031。
  • T025 建批保存同一收货地址与坐标快照,后续不随地址簿改变;新旧入口拒绝改动已建批单个地址,取消重下仍按既定权限,见 FR-044/SC-032。
  • T026 配置下调最大店数时保护超限未接组,含未生效组;与建批/取消/接组并发一致,无冲突才保存且不影响已接组和费用快照,见 FR-045/SC-033。

2026-10-20 平台订单运营展示补充

  • T027 平台普通订单列表保留子单逐行分页,当前页批量关联 036 成员并标注父批次号、批次/组状态;平台子单详情可读全批成员/支付/配送/取消/真实退款进度。后台查询使用 system:order:list,不复用 App 用户 token 权限;普通单原列表与详情不变。
  • T028 平台四语言接入批次关联与只读详情、逐笔退款跟进页面;退款只展示原渠道真实结果,不提供人工置成功。隐藏 036 子单普通“修改”入口,后端普通状态修改直接调用也拒绝;非多店保留原行为。
  • T029 为 T027–T028 补失败先行测试,运行平台定向测试/构建和后端定向测试/模块构建;核对配置仍关闭、036 SQL 仍仅登记,记录真实数据库、渠道和 App 联调未验收项。

2026-10-19 当前编码进度(实现中,未开放入口)

  • T003:多店报价运费已改为门店到收货地址的 Google 道路里程,首店围栏仍为直线距离;定向测试覆盖两种距离不能混用。按用户确认,折后运费作为 008 商家免运基数,报价分别返回骑手毛运费、客户运费、商家补贴和子单应付;定向单测已通过,完整组合回归仍未完成。
  • T005:已新增独立建批服务与幂等/成员集合/地址快照定向测试。服务端重新报价、锁配置行并比对版本后,事务中写待生效父子单、成员和配送组;不默认到付、不开放履约、不发通知。支付、生效、取消和旧入口防绕过完成前不对客户端开放建批接口。
  • T023:批次首次生效时间与组首次开放时间已登记到未执行的 036 DDL 和实体,真正写入时点、扫描及 037 联动仍待实现。
  • T026:配置下调时已在配置行锁内检查超限未接组,建批也锁同一配置行;组取消/承接的竞态测试尚未完成,任务未勾选。
  • T006/T008:已加入 15 分钟发起截止、缓冲内仅核实真实已发起交易、全员就绪和预约未过期的纯规则测试;到付逐店确认服务在批次行锁内记录 COD_CONFIRMED,最后一店确认时原子写 activated_at 与出站事件。LINE/OMG 原交易核实、取消竞争、扫描和出站事件消费者尚待接入,任务未勾选。
  • T014:现有骑手资格服务已在容量计算中把已接配送组的多个进行中外卖子单折算成一个任务,闪送/总容量与加急独占仍用同一任务数;036 表未迁移时保守沿用原子单计数。定向测试已通过;接组原子性、列表与释放竞争仍待完成。
  • 预约格式已对齐旧外卖 delryTime 的 yyyy-MM-dd HH:mm-HH:mm,避免新批次使用 ISO T 分隔而无法进入既有预约解析/开放扫描。
  • 定向测试 MultiStoreCheckoutBatchServiceTest、MultiStoreCheckoutQuoteServiceTest、MultiStoreCheckoutConfigServiceTest、MultiStoreCheckoutRulesTest、MultiStoreCheckoutCodServiceTest 已运行通过。当前多店功能整体仍为实现中,配置保持关闭;普通 /createOrder 未接入 036 专用服务。
  • T007/T008:LINE/OMG 创建入口仅对已选择方式的真实 036 成员放行并记录发起证据;已验签回调先锁批次,OMG 和 LINE 均在子单支付行落库后才允许成员就绪,036 不沿旧单笔路径推送。成员记录首笔被接受的支付尝试 ID,重放同一交易不退款,第二笔真实扣款登记退款意图;相关定向测试已运行通过。网关查询补单与正式退款执行尚待完整回归,任务未勾选。
  • T009/T011:已新增未生效整批用户取消与最终截止超时取消服务,按批次行锁关闭父子单和待接组,并为已确认实收交易登记逐交易退款意图;缓冲期间不提前取消。恢复扫描 Bean 与暂停的 sys_job 登记已写,尚未启用;预约结束提前取消及旧单笔取消防绕过已补,专用取消 API、返券和完整退款结果仍未完成,因此不能开放配置。
  • T012:036 退款意图已通过独立桥接服务按原交易号、网关流水号与金额校验,写入现有 LINE/OMG 幂等退款队列;桥接任务登记为暂停,真实退款仍由原渠道任务执行,OMG 测试环境仍不可验证真实到账。036 的退款展示尚需从原渠道退款表投影实际状态,不能把 BRIDGED 说成“已退款”。
  • T015:整组接单服务已在骑手锁及批次/组行锁内重验资格、容量、首次开放、首店距离、服务端最近 5 分钟位置和全部有效子单,再原子分配给同一骑手;旧单笔接单已拒绝拆组。骑手定位新增服务端接收时间及未执行 SQL,历史空值视为过期。定向测试已运行通过;组接单 Controller 和开放消费者已补,待抢列表/角标及版本门禁仍未完成。
  • T011/T018:旧用户和商家单笔取消入口已用真实 036 成员关联拦截,普通订单不查询多店表;定向测试已运行通过。批次/成员专用取消 API 和已生效取消细则、返券仍未完成,因此配置继续保持关闭。
  • T024:最后一店到付确认或可信线上实收发生在预约结束后时,已在同一批次锁内立即关闭未生效批次,并为全部已实收尝试登记退款意图;不再仅等分钟恢复扫描。定向测试已运行通过。正式退款执行与完整并发回归仍待验收。
  • T010/T015:CHECKOUT_ACTIVATED 持久事件已能按旧预约提前量扫描、在事务内同时写组 opened_at 和各有效子单首次显示/生效时间;定时任务 SQL 登记为暂停,整体联调前不能启用。
  • T015:新 POST /system/multiStoreCheckout/groups/accept 已把 token 骑手身份传入整组服务;同一骑手网络重试只在全部有效子单仍归其持有时幂等返回,不重复占容量。定向测试已运行通过;旧 App 版本门禁、组合列表仍待完成。
  • T010:OPENED 事件现可通过独立消费者 CAS 认领并重试,把单条组任务推送与逐店商家新单接入既有通道;通知载荷带 groupId/eventId。暂停的恢复任务已登记 SQL;SENT 只代表成功提交到项目现有异步通道,不保证设备送达,重试场景由新 App 按 eventId 去重。定向测试已通过,真实推送/取消竞态仍需联调,整体任务不勾选。
  • T023:已补整组无人接单恢复扫描,沿用 037 字典阈值,以批次生效、首次开放和预约开始三者最晚时点计时;批次/组行锁内复核待接状态后取消有效子单、登记已实收交易退款意图,并仅在原有效期内 CAS 返还绑定子单的券,原独立订单扫描不变。定时任务仅登记为暂停,完整并发/回归未完成,T023 不勾选。
  • T021:旧版骑手 orderList/orderCount 已按父单号排除 036 子单,避免一组按多个普通单展示或计数;普通单父单号等于自身、存量空值仍可见。组任务聚合列表/角标及详情还未实现,故 T021 不勾选、多店开关保持关闭。
  • T005/T011:已接出用户专用 POST /batches、POST /batches/cancel 与 POST /batches/members/cancel。未生效只整批取消;已生效单店取消仅在组仍待接时于批次/组锁内执行,递增组版本,余店不补差,最后一店取消则关闭组/父单;仅为已实收子单登记退款意图,不把意图当到账。组合详情、退款状态投影、商家异常取消及客户端版本门禁未完成,任务仍不勾选。

2026-10-20 后端续做记录(实现中,未与 App 联调)

  • T011/T016:新增商家无法供餐专用接口;在批次→组锁内仅取消本店已接未取子单,按原渠道登记真实实收退款,最后一个有效成员取消或其余已送达时原子结清组/父单。子单送达保持普通入口,另登记初始暂停的组终态恢复任务,不在子单事务中反向争用批次锁。
  • T006/T018:新增逐店支付选择接口。到付确认才写就绪,线上选择只返回 ONLINE_PENDING,真实网关创建与回调仍走原 LINE/OMG 入口;上述写入口和旧 LINE/OMG 创建、OMG 重试对 036 子单使用能力头 X-Multi-Store-Capability: batch-cards-v1,旧普通单不要求。
  • T017/T021:新增批次/组详情、用户/骑手组合卡列表和角标;批次/组先聚合再分页,本页批量读成员,普通单附 legacyOrder 快照。待抢组使用服务端最近骑手位置按首店算距离;接组仍在锁内重验,列表不授予接单权。
  • T012/T018:新增 LINE/OMG 真实退款状态只读投影,BRIDGED 不算到账,只有原渠道 REFUNDED 计入已退款金额。检查迁移时发现历史 OMG 重做遗漏当前退款队列表及环境字段的 SQL 登记,已补到 updatesql/sql.md;执行前须按目标库实际结构核对,未在本轮执行。
  • T018:新增平台按退款意图逐笔分页的只读跟进 API,沿用 system:order:list 权限及原渠道状态,不提供手工置已退款写入口;平台 PC 页面接入另需验收。
  • T017/T018:旧 getParentOrderDetail 未用 token 过滤归属;现对真实 036 父单返回 UPGRADE_REQUIRED,强制使用带用户归属校验的新批次详情。普通父单不查 036 表,保持原路径;详情单测与 036 MyBatis XML 解析测试通过。骑手组终态详情补 completed/cancelled 主阶段,与列表一致。
  • T017/T021:旧用户 /system/order/getorderlist 在数据库分页前排除真实 036 成员,避免旧版 App 把一组拆成多张普通子单卡;普通非批次订单仍按旧筛选和分页,定向查询测试通过。新组合卡统一列表独立承担批次展示。
  • 本轮 JDK21 后端模块打包通过;最终全量 Maven 测试 1374 项、失败 0、跳过 0(含 036 与普通订单/支付回归)。真实 MySQL 查询、正式 OMG 退款实收回查及 App 联调仍未验证,不能视为上线验收。036 配置与全部任务保持关闭/暂停,App 代码及联调不在本轮修改范围。

2026-10-20 平台订单运营展示验证记录(T027–T029)

  • T027/T028:平台列表只在当前页存在真实 036 成员时批量补批次/组信息,父批次只读详情展示逐店付款、取餐、送达、取消及原渠道退款进度;四语言页面与退款意图逐笔跟进页已接入。普通订单继续原分页和修改流程,036 子单的普通状态修改在界面与服务端均被拦截。
  • T029 本地验证:JDK21 mvn -pl ruoyi-admin -am test -q 共 1378 项,失败/错误/跳过均为 0;mvn -pl ruoyi-admin -am -DskipTests package -q 通过。平台 node --test tests 33 项全通过,npm run build:stage 完成,保留仓库既有的备份 .vue~ 解析与包体积警告。两仓 git diff --check 通过。
  • T029 上线验证仍待执行:036/OMG SQL 仅登记未执行,未连接真实数据库检查开关或菜单,亦未联调 LINE/OMG 正式退款、真实订单数据与 App。代码/SQL 初始开关为关闭,不等同于已核实测试或生产库当前配置;因此 T029 和整个 036 功能仍不标记完成/上线。

依赖与交付闸门

T001→T002→T003→T005;T004 在 T005 前。T005→T006–T010→T011–T013→T014–T016→T017–T019。未完成持久状态、支付事实、取消/退款和接组防护前不得把配置开关视为可上线;测试数据库迁移由开发者手动执行。最终状态仅按真实验证报告,不把文档或局部代码称作整功能完成。

展示增量依赖:T020 先收口展示与兼容契约,T021 随 T014–T018 实现,结果纳入 T019 验证。新增任务编号不表示可以跳过前面的批次、支付和接组防护。

审查增量依赖:T023 随 T005–T015 的生效/开放/退款和接组边界实施,T024–T025 随 T005/T008–T009,T026 随 T002/T005/T015;四项结果均纳入 T019 统一验收,普通 037 行为保持回归覆盖。

2026-10-20 路线矩阵增量

  • T030 按失败先行测试新增order/route/RouteDistanceMatrixProvider与Google实现,验证N×1方向、一次HTTP、乱序索引归位、protobuf默认0、缺失/重复/越界/非法距离/元素失败/HTTP失败/密钥缺失,保留有限超时与资源关闭;关键代码注释说明计费方向和失败语义。
  • T031 两个报价Service构造注入同一提供器;多店在筛选参与门店后一次请求,单店1×1,自取/堂食不请求。更新现有报价测试,新增金额归属、部分失败不发token与原免运/运价回归;Controller/前端DTO/协议不变,建批继续重报价复核。
  • T032 运行JDK21定向测试、受影响模块测试/构建及差异检查;补齐App文档的服务端计价约定,记录真实Google开通/配额/里程联调未验证。不开数据库、不变SQL、不创建分支、不自动commit/push;原有036实现进度不由本次验证自动勾选。

本轮验证记录

  • 环境:JDK 21(本机graalvm-jdk-21.0.12+7.1),当前分支codex/036-multi-store-checkout;未创建或切换分支,未自动提交推送。
  • 失败先行:新提供器红测因缺少实现类失败;报价适配红测因尚无矩阵依赖失败。提供器定向测试21项通过;报价测试中一个重复桩设置错误已修复,最终以全量verify确认。
  • 实际执行:mvn -pl ruoyi-admin -am test -Dtest=GoogleRouteDistanceMatrixProviderTest -Dsurefire.failIfNoSpecifiedTests=false通过;最终mvn -pl ruoyi-admin -am verify通过,ruoyi-system 166项、ruoyi-admin 1231项,共1397项,失败/错误/跳过均0,模块打包成功。其中矩阵提供器、两个报价服务及建批服务44项全部通过。
  • 差异检查:限定本轮基线差异审查通过,两个运价计算方法、公开API契约未变;原有文件换行保留,git diff --check通过。原有036工作区改动保留,不据此勾选整个036功能或开启配置。
  • 未执行:真实Google项目的Routes API开通、密钥权限、配额、实际道路里程与金额抽样联调;测试使用模拟HTTP,不代表线上地图已验证。未执行任何数据库操作,本轮不新增SQL。App/PC源码未改,无需调整前端入参;接入说明已同步。

2026-10-20 用户要求全部提交推送

  • 本次提交范围扩大为当前全部多店后端功能、支付/取消/查询兼容、矩阵计价、相关测试、规格及SQL登记,沿用codex/036-multi-store-checkout,不创建分支。旧文档修改临时脚本.claude-tmp-docs.py保留本地。
  • 提交前重新执行JDK21 mvn -pl ruoyi-admin -am verify,1397项测试全部通过(失败/错误/跳过均0),模块打包成功;仅文档补记发生在此后。
  • 本次提交不代表完整上线验收:真实Google接口、MySQL查询、正式退款及App联调未验证;数据库迁移不执行,多店开关和暂停任务不因提交而开启。

2026-10-20 联调缺陷修复

  • T033 修正多店报价将审核通过商品误拒绝的问题;对齐单店to_examine=1且stacking_up=0,注释字段语义;补充本次4商品及3规格值请求回归,验证未通过/NULL不得进入促销算价,更新旧测试夹具;运行JDK21报价/建批回归与模块构建,保留既有未提交文档修改,不改SQL或前端参数。

T033验证:测试库只读确认4商品均to_examine=1、stacking_up=0,规格43/15/7均启用且归属正确。红测复现审核通过商品误拒绝及未通过商品进入促销算价;修复后JDK21执行mvn -pl ruoyi-admin -am verify -Dtest=MultiStoreCheckoutQuoteServiceTest,FoodDeliveryPromotionQuoteServiceTest,MultiStoreCheckoutBatchServiceTest -Dsurefire.failIfNoSpecifiedTests=false,28项通过、失败/错误/跳过0,模块打包成功。git diff --check通过;未修改数据库,未部署远端、未使用用户token发起真实HTTP报价,未自动提交推送。

  • T034 按用户要求用99开头的15位纯数字父号和18位子号替换UUID生成;复用Redis原子毫秒序列,修正支付/回调/取消/接单/平台查询及能力头的MS专属判断,始终查真实关联;补数字多店/普通同号段、长度、父子对应及重试回归;保留原接口参数与旧MS读取,统一验证后记录结果,不改SQL、不创建分支。

T034验证与交付(2026-10-20):

  • 父号15位、子号18位,99前缀纯数字;普通用户、商家代客、多店建批在写父子单前共用SET NX占号与持久记录复核,多店遇已占号最多递增重试8次,事务回滚按owner释放。实际批次关联决定支付、取消、接单及列表行为,历史MS仍可读取;新号不再使用UUID。
  • 失败先行测试复现原37位子号超长、数字号漏过原MS判断;新增共享号码双向互斥、持久记录存在、事务回滚清理、用户及商家入口写前检查和占号重试回归。最终JDK21执行mvn -pl ruoyi-admin -am verify通过:ruoyi-system 166项、ruoyi-admin 1248项,共1414项,失败/错误/跳过均0,所有模块构建成功。git diff --check通过。
  • 文档及关键代码注释同步,App仍以string传单号,无新增入参、SQL或字段扩容;沿当前test-202609v2提交推送,不创建分支。部署需先具备036关联表(包括功能关闭时的普通订单识别查询),测试库此前已迁移。
  • 测试库只读核对pos_order.dd_id为30字符、最短关联字段为20字符,报错requestKey无已提交批次。未修改数据库,未调用真实支付/退款/地图或远端建批HTTP;本地无Redis实例,原子Lua与SET NX按mock契约验证,真实Redis集成和部署后建批仍需联调。

2026-10-21 逐店支付方式随建批提交

  • T035 建批请求逐店提交paymentMethods:[{storeId,payType}],校验与参与店和报价一致,固化成员/子单支付方式;全到付创建即激活,幂等摘要包含所选方式。
  • T036 多店专用接口在批次锁下安全改选;任何网关尝试后拒绝改选,不改变普通订单支付切换。
  • T037 同步 App 接入契约,运行 JDK21 定向测试与回归、差异检查;不修改 App 源码或数据库。

T035–T037验证:2026-10-21 10:44 使用 JDK21 执行mvn -pl ruoyi-admin -am verify -q成功(当时1420项、失败/错误/跳过均0),git diff --check通过;未执行真实支付网关联调或部署,也未改 App 源码、普通订单入口和数据库结构。随后同一工作区出现其他并行改动及新的测试,以上全量通过结论不覆盖后续并行改动。

2026-10-21 即时开放与骑手查询归口

  • T038 三种最终就绪路径提交后独立事务尝试开放,复用原预约时点与原子开放逻辑;分钟任务保留补偿,测试提交/回滚、即时/预约/失败重试。
  • T039 将新版骑手列表和角标方法归到原骑手控制器,对外 URL、版本门禁及旧列表保持不变;更新接入文档并完成路由回归。

T038–T039验证:2026-10-21 使用 JDK21 执行 mvn -q -pl ruoyi-admin -am verify 成功,Surefire 报告合计1429项、失败/错误/跳过均0;失败重试及路由等定向31项通过。git diff --check 通过。未连接真实数据库、未启用暂停的 Quartz 任务、未调用真实支付或推送渠道。

2026-10-21 换方式对齐 661 渠道核实口径

  • T040 逐店换渠道/改到付前逐笔核实渠道在途支付(OMG reconcile、LINE 本地状态+捕获查询):确定未付放行改选、已收款提示已支付、结果未知维持专属拒绝;核实发生在批次行锁之前,核实后又有新发起保守拒绝。新增 MultiStoreCheckoutCaptureVerifier、专属文案 multi.store.checkout.payment.dispatched(六语言)并复用 no.pay.switch.already.paid;同步 spec/data-model/api/接入文档。

T040验证:2026-10-21 定向 23 项(核实器/两服务/选择入口)及 MultiStoreCheckout、PayMethodSwitch 全量回归 0 失败;未连接真实数据库与真实支付渠道。

2026-10-21 规格快照修复

  • T041 修复新建版本 2 子单规格快照:服务端按已校验的规格 ID 固化数据库规格名称 ask 和 specValueIds,补有加价及零加价规格测试;历史订单不回写。

2026-10-21 组详情逐店距离

  • T042 报价记录各店道路米数,建批固化为 pos_order.jvli 公里,组详情 members[] 返回 juli/jvli/legacyOrder;补报价、建批及详情红绿测试,更新 App 接入契约。

2026-10-22 多店逐店备注

  • T043 报价请求 stores[].remarks 随快照固化到对应子单 pos_order.remarks(父单不另存),商家/骑手沿现有子单字段展示;补建批备注落库测试,更新 spec/契约/接入文档。

2026-10-22 多店开票意图

  • T044 建批接收与普通订单相同的顶层发票字段,非纸本提交前校验、仅可开票子单捕获意图,默认抬头规则共用,发票字段进入幂等摘要;补混合门店、全不可开票、重试冲突和普通单回归测试,同步 App 契约。无需数据库迁移,不修改 App 源码。

T044验证(2026-10-22):先以无可开票门店的电子发票请求复现旧实现忽略字段、仍建批(定向测试失败);修复后 JDK 21 执行 mvn -q -pl ruoyi-admin -am verify 成功,213 份 Surefire 报告合计 1445 项、失败/错误/跳过均 0;git diff --check 通过。未连接真实数据库、ezPay 服务或 App 真机,未执行 SQL 迁移。