# 重构: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`。