66 行
2.8 KiB
Markdown
66 行
2.8 KiB
Markdown
# 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 份)
|