# 重构: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<EarliestBookingDateVO> getEarliestBookingDate(Long productId) {
    return Result.success(null);  // 静默"伪装成功"返回 null data
}
```

### 改后
```java
@Override
public Result<EarliestBookingDateVO> 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 <module> -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`。
