# Round 1 review 跟进:HOUSE 砍 1198 行 + 红线整改反向修复 + product-v2 简化 + 出行人/大交通清理

> **存放目录**: 二期(`order-v3` 标签)→ `changelogs-v2/2026-05/`
> **服务**: hl-user-service + hl-product-service-v2 + hl-resource-service + hl-mp-service + hl-gateway + hl-order-service-v3
> **PR**: #2845 / #2846 / #2847 / #2848
> **Issue**: #2841 / #2842 / #2843 / #2844
> **日期**: 2026-05-22
> **影响范围**: 多服务接口契约**无破坏性变更**,内部代码简化为主,但**操作日志 changes 详情格式从展开改为聚合**

---

## ⚠️ 关键变化(前端需关注)

### 1. 🔴 产品操作日志 `changes` 详情格式收敛(影响:运营后台展示)
PR #2847 把 `EntityFieldDiffUtil.diffCollectionDetailed`(86 行 8 参展开)简化回 `diffCollection` 聚合:

**前**:每个节点 ADD/DELETE/MODIFY 单独一条 changes(改一天 5 节点 5 条),超 30 条裁断"其他 N 项变更未展开"
**后**:聚合为 `共 N → 共 M (新增 X / 删除 Y)` 单条 summary

前端 `/admin/product/operation-log/search` 接口返回的 `changes` JSON 字段格式简化,**展示"动了哪个节点"如有需求需后端补 detail 端点或前端拿原 nodeList diff 渲染**。

### 2. 🟡 大交通 `TransportPlan.mode` 不再有 Converter 默认值
PR #2848 删 `TransportPlanConverter.fromAdminReq` 中硬编码的 `mode="TOGETHER"`。前端如果之前 add/edit 不传 mode 依赖后端默认 TOGETHER 仍能工作(addTransportPlan Service 显式补);**batchReplace 后端显式 SEPARATE**,与文档 §2.6.2 一致。

### 3. 🟡 换酒店 DRIVER 通知暂时撤回(等 FLEET 接通再补)
PR #2848 撤回 `HOUSE_HOTEL_SWAPPED_DRIVER` event 发布 + Dispatcher 删 DRIVER case + V20260522_001 SQL 删 notification_event_config 行。**司机暂不再收到换酒店通知**,等 FLEET vehicle_plan 反查 Feign 工单接通后一次性补 publisher + V*.sql + dispatcher 三件套(独立工单)。

---

## 一、背景

dev-v3 5 天工作流 Round 1 review(2026-05-22),6 agent 并发对 05-16~05-21 wx 提交 50+ PR 复审,维度加 "**反过度设计 + 简洁可读**" 专项,产出 10 P0 + 30+ P1,打包 4 张工单 #2841-#2844 → 4 个 dev agent 并行修 → 4 张 PR squash 合 dev-v3 → 测试服全部署生效。

**总收益**:HOUSE 模块净 -1198 行,product-v2 净 -198 行,user/resource/mp 错误码段位收敛,4 处 Service 内 Wrapper 下沉 Mapper default。**零功能损失,代码可读性显著提升**。

---

## 二、关键改动汇总

### #2845 (Closes #2841) — 红线整改反向违规 + 错误码去重 + Object 字段
- **PR #2439 红线 5 整改反向引入红线 1+4 修复**:LoginLogService / UserService / AdminUserService 4 处 Service 内构造 Wrapper 下沉到 Mapper default
- **CRYPTO/MD5 错误码 4 处去重**:全部复用 `SystemErrorCode.CRYPTO_ALGORITHM_UNAVAILABLE (900102)`
- **BusinessException 加 cause 重载**:JwtAuthFilter/VariFlight/Amap/WxCrypt 异常带 cause 透传堆栈
- **PR #2467 DASHBOARD 4 错误码合并** → 复用 `CommonErrorCode.FEIGN_CALL_FAILED`
- **PR #2430 7 枚举错误码合并** → 复用 `CommonErrorCode.INVALID_PARAM`
- **MpTripDetailVO.suppliesList/contracts/insurances**:`Object` → `List<Map<String, Object>>`;`dailyNodes` 加 `@Deprecated`
- **删纯透传 facade**:AdminUserService.countAll/listByAdminIds + UserService.countAll
- **决策**:不新增 ErrorCode 常量(用户铁规"不引入新错误码");User 未启用 @TableLogic 保留 `isNull(deletedAt)`

### #2846 (Closes #2842) — HOUSE 砍死代码 -1198 行
- 删 **3 个零订阅 Event POJO**:EnrollChangedEvent / OrderCancelledHouseEvent / RoomChangedEvent
- 删 **publishHotelSwapped MQ 链路**(零订阅 topic + HotelSwappedEvent POJO + TOPIC_HOTEL_SWAPPED + RocketMQTemplate 注入)
- 合并 **4 个薄 Service**:HouseStateChangeService → HouseStateMachineHelper / HouseInquiryTimeoutService → HouseInquiryService / HouseAssignmentInternalQueryService → HouseAssignmentService / HouseHotelSwapAdapter → HouseHotelSwapServiceImpl
- **HouseFeignErrorCode 整段并入 HouseInternalErrorCode**(段位重叠 + 语义重复)
- **HouseInquiryErrorCode 595xxx → 808xxx 段位**
- HouseE2EWalkthroughIT 8 个 @Test 改 `Assertions.fail("待 QA 工单 Hxx")`
- 删死状态机:CUSTOMER_CHANGE 5 from(main 零 fire)+ SWAP_HOTEL_COMMIT CLAIMING→CLAIMING 自循环
- 删 HouseInventoryCheckedEvent + publish 调用(零消费方)
- swap 触发收紧:fireSwapStateChange 只在 OPEN SWAP_HOTEL/REFUND 待办存在时触发

### #2847 (Closes #2844) — product-v2 简化 + 餐饮 facade 缓存
- **EntityFieldDiffUtil.diffCollectionDetailed 简化**(86 行 → 删,回 diffCollection 聚合)
- **ProductItineraryService.buildItineraryChanges 同步简化**(-63 行)
- **ProductSnapshotService.restoreSnapshot 加 @Lock4j(keys="#productId")**
- **FieldLabelDict 抽 dict(String...) helper**(-28 行)
- **product-v2 改动文件 javadoc HTML 标签清零**(铁规 15h)
- **ProductDetailAggregator.toOperationLogVO 删,改调 ProductOperationLogService.toRespVO**(消除双份实现)
- **ProductItineraryAggregateFacade meal_option 缓存**(7 天产品 Feign 21 次 → 0 次,类成员 volatile Map + @PostConstruct + @Scheduled 5min)

### #2848 (Closes #2843) — HOUSE 收尾 + 出行人/大交通清理
- **DRIVER 通知占位 noop 撤回**(publisher + dispatcher + V20260522_001 SQL DELETE config 三件套)
- HouseAssignmentService.maskPhone 改调 **复用现有 PiiMaskUtil**(KISS)
- **resolveSwapFromState 合并双查为单 IN 查询**(HouseTodoMapper.selectOpenByOrderAndTypes)
- **HouseAssignmentService.submit hotelName 接通 HouseHotelCacheService 真实拉**(空时落 null 不再写中文占位"待拉取酒店主数据")
- **HouseInquiryService.writeOpLog 签名加 operatorName 参数**,5 调用方显式传(MQ/@Async 场景拿到真实姓名)
- **TravelerConverter 删 2 个 0 调用 toInternalVOList 重载**(单参 + 双参)
- **TravelerErrorCode 删 4 个 0 调用错误码**(581117/581124/581126/581133)+ 581121 @Deprecated 指向 581144
- **TransportPlanConverter.fromAdminReq 不硬编码 mode**(Service 显式传)
- ProductSnapshotService javadoc 措辞修正

---

## 三、变更接口清单(仅前端可感知)

| # | 接口 | 方法 | 路径 | 变更类型 | 说明 |
|---|------|------|------|----------|------|
| 1 | 产品操作日志 search | GET | `/admin/product/operation-log/search` | **响应字段格式收敛** | `changes` 数组中 collection-diff 由"展开 N 条节点级"改为"1 条聚合 summary" |
| 2 | 大交通 add/edit | POST/PUT | `/v3/admin/order/{id}/transport-plan/*` | **不变** | mode 字段后端 Service 显式设默认值,前端可继续不传 |
| 3 | HOUSE 换酒店通知 | (后端事件) | - | **DRIVER 暂撤** | 司机收不到换酒店通知,等 FLEET Feign 接通后恢复 |

---

## 四、测试服验证状态

| 服务 | 部署 commit | uptime | 验证 |
|------|------------|--------|------|
| hl-user-service | dev-v3 含 #2845/#2848 | 20:40 | ✅ V20260522_001 success=1 + DRIVER config 已删 |
| hl-product-service-v2 | dev-v3 含 #2845/#2847/#2848 | 20:41 | ✅ Spring 启动正常 |
| hl-resource-service | dev-v3 含 #2845 | 20:42 | ✅ |
| hl-mp-service | dev-v3 含 #2845 | 20:43 | ✅ |
| hl-gateway | dev-v3 含 #2845 | 20:44 | ✅ |
| hl-order-service-v3 | dev-v3 含 #2846/#2848 | 20:46(SSH restart 兜底) | ✅ HOUSE 接口活着(grab-pool/inquiry 返 200/400 合规) |

---

## 五、留尾(独立工单后续)

- **HOUSE-SWAP DRIVER 通知 wework 真值切换** → FLEET `vehicle_plan` 反查 Feign 接通后补 publisher + V*.sql + dispatcher 三件套
- **HOUSE-FIX-A `loadProductPool` 真实化** → H04 接通 `ProductV2FeignClient.getOrderProductId`
- **#2515 MaterialCategory ↔ Permission 双 @Lazy 循环依赖** → 抽 `PermissionGate` 接口重构(大改动 backlog)
- **EquipmentTemplateService ↔ ProductLineService 双 @Lazy** → 抽 `ProductEquipmentBindingService`(backlog)

---

## 六、关联

- 工单: #2841 / #2842 / #2843 / #2844(全部 closed)
- PR: #2845 / #2846 / #2847 / #2848(全部 merged into dev-v3)
- Review 来源: Claude /@cr Round 1 6 agent 并发 2026-05-22(维度:反过度设计 + 简洁可读)
