diff --git a/changelogs-v2/2026-05/23_2935_R6-bugs_PR2937.md b/changelogs-v2/2026-05/23_2935_R6-bugs_PR2937.md new file mode 100644 index 0000000..24cd07f --- /dev/null +++ b/changelogs-v2/2026-05/23_2935_R6-bugs_PR2937.md @@ -0,0 +1,65 @@ +# R6 真测发现 + 修复:insurance 翻页 + refund review PARTIAL 静默错位 + +> **服务**: hl-order-service-v3 +> **PR**: #2937 +> **Issue**: #2935 +> **日期**: 2026-05-23 +> **影响**: 1 P0 + 1 P1 + 1 P2(其中 P2 是更深的静默业务错位 bug) + +--- + +## ⚠️ 关键变化(前端 mmg) + +### 1. 🔴 退款审批 PARTIAL **必传 approvedAmount**(behavior change) + +**之前**:`POST /v3/admin/refund/review {decision: "PARTIAL"}` 不传 `approvedAmount` → Service fallback 到 `calculatedAmount/paidAmount`,**PARTIAL 被静默当 APPROVED 全额处理**(语义错位 bug) +**之后**:必返 `code=530403 REFUND_REVIEW_PARTIAL_AMOUNT_REQUIRED "PARTIAL 审批必须传 approvedAmount"` + +**前端如果有 PARTIAL 审批漏传 approvedAmount 的场景必须补传**,否则会被 530403 拒绝。 + +### 2. 🟢 `/v3/admin/insurance/products` 翻页边界返 400 + +**之前**:`page=0` → 500 IndexOutOfBoundsException / `pageSize=10000` 不拒 +**之后**:`page=0` → 400 / `pageSize > 100` → 400(与其他 7/8 list 接口一致) + +--- + +## 改动 + +### P0+P1 R6L: AdminInsuranceController.listProducts 翻页校验缺失 +- 新建 `InsuranceProductListReqVO` 继承 `PageParam`(`page @Min(1)` + `pageSize @Min(1) @Max(100)`,含 `isOverseas` 字段) +- Controller 改 `@Valid InsuranceProductListReqVO req`,@PageParam 注解直接拦截非法 +- 与其余 7 接口风格一致 + +### P2 R6M: AdminRefundController.review PARTIAL 静默错位修复 +- **R6-M 报告误判为 NPE**,实际是更隐蔽的语义错位 bug: + - Service 层映射后枚举 APPROVE/REJECT 丢失 PARTIAL 信息 + - approvedAmount=null 时 fallback 到 calculatedAmount/paidAmount + - 实际行为:PARTIAL 被静默当 APPROVED 全额退款 — **业务静默 bug** +- 修:Controller 持有原 decision 枚举,前置校验 `decision=PARTIAL && approvedAmount=null` → 抛 `BusinessException(530403)` +- 错误码 530403 `REFUND_REVIEW_PARTIAL_AMOUNT_REQUIRED` 在 `OrderRefundErrorCode:127` 已存在(设计预留实现遗漏),复用 + +## 验证 + +- 50 直接相关测试 0 failure +- 3 新单测: + - `listProducts_pageNum_zero_returns400` + - `listProducts_pageSize_over100_returns400` + - `review_PARTIAL_without_approvedAmount_throws530403`(断言 `refundReviewService.review` `never()` 被调,Service 完全没接到错误数据) + +## R6 累计测试发现(4 agent) + +| Agent | 维度 | 结果 | +|-------|------|------| +| R6-J | 状态机异常 | 22 反例全走业务码 0 BUG + 3 UX 文案改进 | +| R6-K | 并发竞态 | 5 @Lock4j + 4 @Idempotent + 1 死锁实测 0 BUG(R5-G RateLimiter 5 阈值误判 → 实际 10)| +| R6-L | 翻页边界 | 8 接口 × 18 维度 = 144 点 84.7% 通过,1 P0 + 1 P1 | +| R6-M | ErrorCode | 22 类 ~265 总数 50+ 真触发 段位合规 100%,1 P2 | + +5 文件 +87 -8 + 1 新 VO。 + +## 关联 + +- 工单 #2935(closed) +- PR #2937(squash merged) +- R6 报告 `.tmp/qa-r6{j,k,l,m}-*-report.txt`(共 4 份)