tasks.md 8.3 KB

Tasks: OMG AIO 创建支付订单重建

Input: spec.md, plan.md, research.md, data-model.md, contracts/api.md, quickstart.md

Tests: 本功能强制 TDD。每个生产任务先写失败测试并实际观察失败,再写最小实现。

Scope: 只完成测试环境创建支付订单;不实现回调、查询、补单、退款、关账或正式环境。

Phase 1: 新持久化基础

  • T001 [US1] 在 ruoyi-system/src/test/java/com/ruoyi/system/omgpay/service/OmgPaymentAttemptServiceTest.java 编写新尝试字段校验、CREATED 插入和生成列不由 Java 写入的失败测试
  • T002 [US2] 在 ruoyi-system/src/test/java/com/ruoyi/system/omgpay/mapper/OmgPaymentAttemptMapperContractTest.java 编写 FOR UPDATE、新表名、唯一键及无旧表 SQL 的失败合约测试
  • T003 [US1] 在 updatesql/sql.md 仅追加 pos_order_omg_attempt DDL,不执行数据库变更
  • T004 [US1] 在 ruoyi-system/src/main/java/com/ruoyi/system/omgpay/domain/ 新建 OmgPaymentAttempt 和 OmgPaymentOrderSnapshot
  • T005 [US1] 在 ruoyi-system/src/main/java/com/ruoyi/system/omgpay/mapper/OmgPaymentAttemptMapper.java 与 ruoyi-system/src/main/resources/mapper/omgpay/OmgPaymentAttemptMapper.xml 实现锁定订单、活跃尝试、交易号查询和显式 INSERT
  • T006 [US1] 在 ruoyi-system/src/main/java/com/ruoyi/system/omgpay/service/ 实现 IOmgPaymentAttemptService 与校验严格的 OmgPaymentAttemptServiceImpl
  • T007 [US1] 运行 OmgPaymentAttemptServiceTest,OmgPaymentAttemptMapperContractTest 并确认通过

Checkpoint: 新表 DDL 已登记,system 模块可锁定订单并只写新尝试表。

Phase 2: 官方检查码与表单

  • T008 [US1] 在 OmgCheckMacSignerTest 写入官方期望值 AA5842FDA7E55ACEB7118D6353E9822CA6D6FF09A0D1FC129A879DD5CAF93266、额外字段、空值字段、输入不可变和非法字段失败测试
  • T009 [US1] 在 com.ruoyi.app.omgpay.OmgCheckMacSigner 实现排序、HashKey/HashIV 包夹、官方 .NET URL encode、小写、SHA-256 和大写输出
  • T010 [US1] 运行 OmgCheckMacSignerTest,确认官方向量和字段完整性全部通过
  • T011 [US1] 在 OmgMerchantTradeNoGeneratorTest 编写 20 位大写英数字与样本唯一性失败测试
  • T012 [US1] 在 OmgPaymentFormFactoryTest 编写 Taipei 时间、stage URL、16 字段、固定字段、全部字段签名及不安全 ReturnURL 失败测试
  • T013 [US1] 实现 OmgPaymentProperties、OmgMerchantTradeNoGenerator、OmgPaymentForm 与 OmgPaymentFormFactory
  • T014 [US1] 在 application.yml 新增独立 omgpay.return-url,新代码不读取旧 omg.* 创建/回调配置
  • T015 [US1] 运行生成器和表单测试并确认通过

Checkpoint: 可从服务端事实生成一份严格 stage-only、全字段签名的表单。

Phase 3: 创建编排与重复防护

  • T016 [US3] 在 OmgPaymentCreateServiceTest 编写订单不存在/越权、非单店、非法状态、已支付、金额、payType、门店和凭证失败矩阵
  • T017 [US2] 在同一测试编写已有活跃尝试时返回 PAYMENT_ATTEMPT_EXISTS 且不调用生成器/表单/凭证的失败测试
  • T018 [US1] 在同一测试编写成功调用顺序、响应白名单和安全内部元数据失败测试
  • T019 [US2] 在同一测试编写 active 唯一键冲突、MerchantTradeNo 冲突三次受控重试和未知重复键失败测试
  • T020 [US1] 实现 OmgPaymentErrorCode、OmgPaymentBusinessException、OmgPaymentCreateOutcome 和响应 DTO
  • T021 [US1] 实现 @Transactional OmgPaymentCreateService#create,保证锁订单和活跃查询发生在 MerchantTradeNo 生成前
  • T022 [US2] 实现重复键分类:发现活跃行立即终止,仅交易号碰撞允许最多三次重新生成
  • T023 [US1] 运行 OmgPaymentCreateServiceTest 并检查新包对旧 OMG 类/Service 零引用

Checkpoint: 首次请求创建,重复请求稳定拒绝;没有任何网关 HTTP 或旧支付表访问。

Phase 4: 公共 API、i18n 与排障日志

  • T024 [US3] 在 OmgPaymentControllerTest 编写 /pay/omg/create、token header、显式 DTO、无 Map 入参和请求字段白名单失败测试
  • T025 [US3] 编写 Controller 业务错误、成功、未知异常的响应契约失败测试
  • T026 [US3] 编写 INFO/WARN/ERROR、成功安全上下文、异常堆栈及敏感值不入日志的失败测试
  • T027 [US3] 在 default、zh_CN、zh_TW、en_US、vi 五个 i18n 文件加入完全一致的 omg.pay.* key 集合
  • T028 [US3] 实现 OmgPaymentTokenUserResolver、请求/错误 DTO 与新 OmgPaymentController
  • T029 [US3] 实现创建开始、成功、业务拒绝和非预期异常日志,不记录 token、凭证、完整检查码或表单
  • T030 [US1] 运行 OmgPaymentControllerTest 和 i18n key 对齐检查

Checkpoint: 新 Controller 独占 /pay/omg/create,响应与日志满足安全契约。

Phase 5: 旧 OMG 运行时退役

  • T031 [US3] 保存当前脏文件定向 diff,确认需要保留的 LINE/订单状态改动
  • T032 [US3] 在 OmgLegacyRetirementTest 编写旧 Controller、旧任务、旧支付实体必须不存在及新 Controller 只有 create 路由的失败测试
  • T033 [US3] 删除旧 OmgPayController、专属 DTO、OmgReconcileTask、OmgQueryThrottle 和旧 Controller 测试
  • T034 [US3] 删除旧支付/退款 Entity、Mapper、XML、Service、ServiceImpl 和对应旧测试;保留 pos_store_omg 全部可信实现
  • T035 [US3] 从 UserOrderController 与 PosOrderShOprateController 取消链路移除旧 OMG 退款调用,不改变其他取消行为
  • T036 [US3] 从 PosOrderController 移除旧 OMG 补单、退款、人工确认端点及注入/辅助方法
  • T037 [US3] 从 OrderLifecycleService 移除旧表依赖和旧 OMG 补单/退款方法,保留 payType="2" 的支付前进门禁
  • T038 [US3] 定点更新 OrderLifecycleServiceTest,移除旧表测试/构造参数并保留已有 LINE 和订单生命周期测试
  • T039 [US3] 运行 OmgLegacyRetirementTest,OrderLifecycleServiceTest,并确认 main Java/XML 对旧支付/退款表及服务零匹配
  • T040 [US3] 将 application.yml 的旧 omg 配置收敛为凭证验证所需 base-url,移除旧回调/查询/补单/退款配置并保留新 omgpay.return-url
  • T041 [US3] 复核三个原脏文件的无关改动仍在,且没有全文件换行或格式化

Checkpoint: 旧表删除后没有可达运行链路访问它们;旧回调、查询、补单和退款接口全部不可达。

Phase 6: 综合验证与手动验收准备

  • T042 运行全部新 OMG 测试以及 OrderLifecycleServiceTest,LinePayCancellationRaceTest
  • T043 使用 JDK 21 运行 mvn -pl ruoyi-admin -am -DskipTests package
  • T044 检查禁止的 production URL、旧 OMG import、旧表 SQL、敏感日志与实际表单字段集合
  • T045 审查新公开类型、检查码、事务行锁和唯一键处理的必要注释,移除显然代码噪声注释
  • T046 运行 git diff --check、git status --short、git diff --stat 并确认无无关文件
  • T047 开发者手动执行 DDL 后,按 quickstart.md 验证首次创建、当前页 POST、重复、真实并发、负例和日志

Dependencies & Execution Order

  • Phase 1 → Phase 2 → Phase 3 → Phase 4 → Phase 5 → Phase 6。
  • T008 与 T011/T012 可独立写测试,但实施时顺序执行以维持清晰 TDD 证据。
  • T031 必须早于任何脏文件修改;T041 必须在旧代码退役完成后执行。
  • 手动 stage 验收依赖开发者执行 DDL,自动测试和构建不依赖数据库变更。

Completion Definition

  • POST /pay/omg/create 首次返回可提交的 stage 表单。
  • 同订单重复/并发创建最多一条 CREATED,后续请求为 PAYMENT_ATTEMPT_EXISTS。
  • 官方检查码向量一致,实际发送字段无遗漏。
  • 新代码全在 omgpay 包,不引用旧 OMG 支付实现。
  • 旧 Controller、回调、查询、补单、退款、任务及旧表运行时引用为零。
  • pos_store_omg 凭证实现未修改。
  • 日志足以定位问题且无敏感信息;非预期异常保留堆栈。
  • JDK 21 定向测试与构建通过,最终 diff 无无关改动。