Sfoglia il codice sorgente

docs: record OMG creation verification

qmj 2 settimane fa
parent
commit
edd86469a8

+ 1 - 1
specs/020-omg-payment-rebuild/spec.md

@@ -4,7 +4,7 @@
 
 **Created**: 2026-08-13
 
-**Status**: Approved for planning and implementation
+**Status**: Implemented and automated verification passed; pending developer-applied DDL and manual stage acceptance
 
 **Input**: 以 OMG 全方位金流 AIO 官方技术文件 V1.5.3(2026-07)为唯一外部事实来源,从零重建创建支付订单;现有 OMG 支付代码、旧支付流水和 `specs/016-omg-payment` 均不作为需求或设计依据。第一阶段只完成测试环境首次创建并进入 OMG 收银台,其余能力后续逐项重建。
 

+ 46 - 46
specs/020-omg-payment-rebuild/tasks.md

@@ -8,77 +8,77 @@
 
 ## 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` 并确认通过
+- [x] T001 [US1] 在 `ruoyi-system/src/test/java/com/ruoyi/system/omgpay/service/OmgPaymentAttemptServiceTest.java` 编写新尝试字段校验、`CREATED` 插入和生成列不由 Java 写入的失败测试
+- [x] T002 [US2] 在 `ruoyi-system/src/test/java/com/ruoyi/system/omgpay/mapper/OmgPaymentAttemptMapperContractTest.java` 编写 `FOR UPDATE`、新表名、唯一键及无旧表 SQL 的失败合约测试
+- [x] T003 [US1] 在 `updatesql/sql.md` 仅追加 `pos_order_omg_attempt` DDL,不执行数据库变更
+- [x] T004 [US1] 在 `ruoyi-system/src/main/java/com/ruoyi/system/omgpay/domain/` 新建 `OmgPaymentAttempt` 和 `OmgPaymentOrderSnapshot`
+- [x] T005 [US1] 在 `ruoyi-system/src/main/java/com/ruoyi/system/omgpay/mapper/OmgPaymentAttemptMapper.java` 与 `ruoyi-system/src/main/resources/mapper/omgpay/OmgPaymentAttemptMapper.xml` 实现锁定订单、活跃尝试、交易号查询和显式 INSERT
+- [x] T006 [US1] 在 `ruoyi-system/src/main/java/com/ruoyi/system/omgpay/service/` 实现 `IOmgPaymentAttemptService` 与校验严格的 `OmgPaymentAttemptServiceImpl`
+- [x] 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] 运行生成器和表单测试并确认通过
+- [x] T008 [US1] 在 `OmgCheckMacSignerTest` 写入官方期望值 `AA5842FDA7E55ACEB7118D6353E9822CA6D6FF09A0D1FC129A879DD5CAF93266`、额外字段、空值字段、输入不可变和非法字段失败测试
+- [x] T009 [US1] 在 `com.ruoyi.app.omgpay.OmgCheckMacSigner` 实现排序、HashKey/HashIV 包夹、官方 .NET URL encode、小写、SHA-256 和大写输出
+- [x] T010 [US1] 运行 `OmgCheckMacSignerTest`,确认官方向量和字段完整性全部通过
+- [x] T011 [US1] 在 `OmgMerchantTradeNoGeneratorTest` 编写 20 位大写英数字与样本唯一性失败测试
+- [x] T012 [US1] 在 `OmgPaymentFormFactoryTest` 编写 Taipei 时间、stage URL、16 字段、固定字段、全部字段签名及不安全 ReturnURL 失败测试
+- [x] T013 [US1] 实现 `OmgPaymentProperties`、`OmgMerchantTradeNoGenerator`、`OmgPaymentForm` 与 `OmgPaymentFormFactory`
+- [x] T014 [US1] 在 `application.yml` 新增独立 `omgpay.return-url`,新代码不读取旧 `omg.*` 创建/回调配置
+- [x] 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 零引用
+- [x] T016 [US3] 在 `OmgPaymentCreateServiceTest` 编写订单不存在/越权、非单店、非法状态、已支付、金额、payType、门店和凭证失败矩阵
+- [x] T017 [US2] 在同一测试编写已有活跃尝试时返回 `PAYMENT_ATTEMPT_EXISTS` 且不调用生成器/表单/凭证的失败测试
+- [x] T018 [US1] 在同一测试编写成功调用顺序、响应白名单和安全内部元数据失败测试
+- [x] T019 [US2] 在同一测试编写 active 唯一键冲突、MerchantTradeNo 冲突三次受控重试和未知重复键失败测试
+- [x] T020 [US1] 实现 `OmgPaymentErrorCode`、`OmgPaymentBusinessException`、`OmgPaymentCreateOutcome` 和响应 DTO
+- [x] T021 [US1] 实现 `@Transactional OmgPaymentCreateService#create`,保证锁订单和活跃查询发生在 MerchantTradeNo 生成前
+- [x] T022 [US2] 实现重复键分类:发现活跃行立即终止,仅交易号碰撞允许最多三次重新生成
+- [x] 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 对齐检查
+- [x] T024 [US3] 在 `OmgPaymentControllerTest` 编写 `/pay/omg/create`、token header、显式 DTO、无 Map 入参和请求字段白名单失败测试
+- [x] T025 [US3] 编写 Controller 业务错误、成功、未知异常的响应契约失败测试
+- [x] T026 [US3] 编写 INFO/WARN/ERROR、成功安全上下文、异常堆栈及敏感值不入日志的失败测试
+- [x] T027 [US3] 在 default、zh_CN、zh_TW、en_US、vi 五个 i18n 文件加入完全一致的 `omg.pay.*` key 集合
+- [x] T028 [US3] 实现 `OmgPaymentTokenUserResolver`、请求/错误 DTO 与新 `OmgPaymentController`
+- [x] T029 [US3] 实现创建开始、成功、业务拒绝和非预期异常日志,不记录 token、凭证、完整检查码或表单
+- [x] 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] 复核三个原脏文件的无关改动仍在,且没有全文件换行或格式化
+- [x] T031 [US3] 保存当前脏文件定向 diff,确认需要保留的 LINE/订单状态改动
+- [x] T032 [US3] 在 `OmgLegacyRetirementTest` 编写旧 Controller、旧任务、旧支付实体必须不存在及新 Controller 只有 create 路由的失败测试
+- [x] T033 [US3] 删除旧 `OmgPayController`、专属 DTO、`OmgReconcileTask`、`OmgQueryThrottle` 和旧 Controller 测试
+- [x] T034 [US3] 删除旧支付/退款 Entity、Mapper、XML、Service、ServiceImpl 和对应旧测试;保留 `pos_store_omg` 全部可信实现
+- [x] T035 [US3] 从 `UserOrderController` 与 `PosOrderShOprateController` 取消链路移除旧 OMG 退款调用,不改变其他取消行为
+- [x] T036 [US3] 从 `PosOrderController` 移除旧 OMG 补单、退款、人工确认端点及注入/辅助方法
+- [x] T037 [US3] 从 `OrderLifecycleService` 移除旧表依赖和旧 OMG 补单/退款方法,保留 `payType="2"` 的支付前进门禁
+- [x] T038 [US3] 定点更新 `OrderLifecycleServiceTest`,移除旧表测试/构造参数并保留已有 LINE 和订单生命周期测试
+- [x] T039 [US3] 运行 `OmgLegacyRetirementTest,OrderLifecycleServiceTest`,并确认 main Java/XML 对旧支付/退款表及服务零匹配
+- [x] T040 [US3] 将 `application.yml` 的旧 `omg` 配置收敛为凭证验证所需 `base-url`,移除旧回调/查询/补单/退款配置并保留新 `omgpay.return-url`
+- [x] 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` 并确认无无关文件
+- [x] T042 运行全部新 OMG 测试以及 `OrderLifecycleServiceTest,LinePayCancellationRaceTest`
+- [x] T043 使用 JDK 21 运行 `mvn -pl ruoyi-admin -am -DskipTests package`
+- [x] T044 检查禁止的 production URL、旧 OMG import、旧表 SQL、敏感日志与实际表单字段集合
+- [x] T045 审查新公开类型、检查码、事务行锁和唯一键处理的必要注释,移除显然代码噪声注释
+- [x] T046 运行 `git diff --check`、`git status --short`、`git diff --stat` 并确认无无关文件
 - [ ] T047 开发者手动执行 DDL 后,按 `quickstart.md` 验证首次创建、当前页 POST、重复、真实并发、负例和日志
 
 ## Dependencies & Execution Order