hl-api-changelog/changelogs-v2/2026-05/22_2841-2844_review-r1-followup_PR2845-2848.md
API Changelog Bot 0388716634 docs(changelog-v2): Round 1 review followup (PR #2845-2848)
dev-v3 5 天工作流 Round 1 review 4 张 P0/P1 工单(#2841-2844)修复落地测试服:
- HOUSE 砍死代码 -1198 行(3 零订阅 Event + publishHotelSwapped + 4 薄 Service + ErrorCode 段位合并)
- 红线整改反向违规修复 + CRYPTO/MD5 错误码 4 处去重 + BusinessException cause 重载
- product-v2 简化(EntityFieldDiffUtil + restore @Lock4j + meal_option 缓存)
- HOUSE 收尾(DRIVER 撤 + maskPhone 复用 PiiMaskUtil + writeOpLog 统一)

前端关注:
- 产品操作日志 changes 详情格式从展开收敛为聚合 summary
- 大交通 mode Converter 默认值删除,后端 Service 显式补
- HOUSE 换酒店 DRIVER 通知暂撤,等 FLEET 接通后恢复
2026-05-21 20:48:43 +08:00

8.1 KiB

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