# 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>`;`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(维度:反过度设计 + 简洁可读)