diff --git a/changelogs/2026-04/27_refactor_cr-audit_phase1-batch.md b/changelogs/2026-04/27_refactor_cr-audit_phase1-batch.md new file mode 100644 index 0000000..d601d63 --- /dev/null +++ b/changelogs/2026-04/27_refactor_cr-audit_phase1-batch.md @@ -0,0 +1,87 @@ +# 重构:80 PR 代码规范循环审查 Phase 1 批量修复(5 PR) + +**类型**: 内部重构(对前端基本零影响 + 1 处 Feign Fallback 行为变更) +**关联**: 工单 #1510 / PR #1511 #1512 #1513 #1514 #1515 +**日期**: 2026-04-27 +**影响范围**: 6 个后端服务全量(common/user/resource/order-v2/product-v2/mp),全部需重新部署 + +--- + +## 背景 + +派 6 个 /@cr 并行审查 wx 最近 80 个已合并业务 PR (#1345 ~ #1505) 涉及的 437 个 Java 文件,对照 `docs/CODE_RULES.md` 找出违反规范的代码。Round 1 共发现 **384 处违规** (P0=225 / P1=72 / P2=62)。 + +本批 Phase 1 修复 **48 处低成本违规** (剩 336 处分 Phase 2/3 独立任务跟踪)。 + +## 5 个修复 PR + +| PR | 模块 | 修/总 | 主修内容 | 合并 commit | +|----|------|------|----------|-----------| +| #1511 | hl-common | 5/5 | GlobalExceptionHandler 4 处 @Autowired 字段注入改构造器(ObjectProvider 包装可选依赖) + Result.success() 重构(避免传 null) | 9c6d167e | +| #1512 | hl-user-service | 13/19 | 4 个 Mapper @Select/@Update 注解 SQL 改 default+QueryWrapper 聚合方法 + 3 处字段注入构造器化 + 2 处缺失 @Valid 补全 + 4 处 success(null)→success() | 063475a6 | +| #1513 | hl-resource-service | 11/12 | 9 个资源 service 的通知类 monitorFeign 调用从 @Transactional 内移到 afterCommit(register + 非事务兜底 + effectively final) + 1 处 @Valid 补全 | 5a1cb159 | +| #1514 | hl-order-service-v2 | 10/14 | 2 处 @Autowired 字段→构造器 + 3 处 new ObjectMapper→注入 + 2 处 @Valid 补全 + 2 处 BeanUtil 后显式 set 防 enum→String 字段吞 + TierInfoResolver static 工具类改 @Component(4 个 caller 同步) | d5c4df29 | +| #1515 | hl-product-service-v2 + hl-mp-service | 9/9 | 6 处 success(null)→success() + 2 处 ObjectMapper/RestTemplate 改注入(新增 RestTemplateConfig @Bean) + 1 处字段注入构造器化 + **2 个 Feign Fallback 行为变更** | 877f22b5 | + +## ⚠️ 唯一对前端有影响的变更:Feign Fallback 行为 + +PR #1515 调整了 mp 服务的 2 个 Feign Fallback Factory 共 4 处: + +### 改前 +```java +// MpProductFeignFallbackFactory.getEarliestBookingDate +@Override +public Result getEarliestBookingDate(Long productId) { + return Result.success(null); // 静默"伪装成功"返回 null data +} +``` + +### 改后 +```java +@Override +public Result getEarliestBookingDate(Long productId) { + return Result.error("产品服务不可用,请稍后重试"); // 显式失败 +} +``` + +### 受影响的接口(4 处) + +| Fallback Factory | 方法 | 原行为 | 新行为 | +|-----------------|------|------|------| +| MpProductFeignFallbackFactory | getEarliestBookingDate | `code=200, data=null` | `code≠200, message="产品服务不可用,请稍后重试"` | +| MpOrderFeignFallbackFactory | getPreTripChecklist | `code=200, data=null` | `code≠200, message="订单服务不可用,请稍后重试"` | +| MpOrderFeignFallbackFactory | matchEarlyBird | `code=200, data=null` | `code≠200, message="订单服务不可用,请稍后重试"` | +| MpOrderFeignFallbackFactory | validateEarlyBirdPlan | `code=200, data=null` | `code≠200, message="订单服务不可用,请稍后重试"` | + +### 触发条件 +仅当上游服务(product-v2 / order-v2)**完全不可达 + 本地熔断打开**时才触发 Fallback。正常请求/业务异常等都仍按原 code 返回,未受影响。 + +### 前端处理建议 + +1. 这 4 个接口的 mp 端调用方,**必须判 `result.code` 决定走业务分支还是降级 UI**: + - `result.code === 200 && result.data` → 业务正常渲染 + - `result.code !== 200` → 显示降级提示(按 result.message 文案 + toast/弹窗,**不要再当成 success-空数据**展示) +2. **正常业务逻辑不需要改**(本变更只在熔断场景生效,日常 99.9%+ 场景行为完全等价) + +## 其余 4 PR 对前端影响 + +**零影响**。全部是后端内部重构,对外 API 行为完全等价: +- 字段注入改构造器注入 → JVM 内部 bean 装配方式变化,接口调用方无感知 +- @Valid 补全 → 接口校验更严,本来该被前端校验拦住的非法请求,现在后端也兜住,前端无须改 +- success(null) → success() → JSON 返回 `{"code":200,"message":"成功","data":null}`,字节级等价 +- Mapper @Select 改 default+WrapperX → SQL 输出等价,接口数据完全一致 +- afterCommit 改造 → 通知类 Feign 异步执行时机微调(事务提交后才发 monitor 日志),接口响应时间略有缩短,接口数据完全一致 +- BeanUtil 后显式 set → 防 enum→String 字段值丢失(原来是 BUG 修复变更前可能 null),前端拿到的值是真实值,**这是正面修复** + +## 后端编译/部署 + +- ✅ 5 个 PR 各自 `mvn compile -pl -am` 单独编译通过 +- ⏭️ 部署: 因 hl-common 改动,**需全量重新部署 6 个业务服务** (gateway/user/resource/product-v2/order-v2/mp) +- 测试服部署后请优先回归 mp 端 4 个 Fallback 接口熔断场景(可暂停 product-v2/order-v2 触发熔断验证 Fallback 不再返 success-null) + +## 留 Phase 2/3 (后续独立任务) + +- **Phase 2 中等成本** (估 ~120 P0): C2 Service 构造 Wrapper 下沉 / C27 Map 传数据→VO / C29 Service 接收 ReqVO / C1 Controller 业务下沉 +- **Phase 3 架构级重构** (估 ~120 处): C-ONE-MAPPER 拆 Service (40 P0) / C-SIZE 类体积超 300 (58 处, HotelService 952 / ScenicSpotService 937 等) / C17 状态机 if-else / C-DI-LIMIT Service 依赖>7 + +详见 `docs/tasks/20260427_审查_最近80个PR循环审查.md` 与 `test/cr-audit-data/round1/AGGREGATE-report.md`。