2.8 KiB
2.8 KiB
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_returns400listProducts_pageSize_over100_returns400review_PARTIAL_without_approvedAmount_throws530403(断言refundReviewService.reviewnever()被调,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 份)