# 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 份)
