diff --git a/changelogs-v2/2026-05/22_2849_round2-followup_PR2850.md b/changelogs-v2/2026-05/22_2849_round2-followup_PR2850.md new file mode 100644 index 0000000..54f1eea --- /dev/null +++ b/changelogs-v2/2026-05/22_2849_round2-followup_PR2850.md @@ -0,0 +1,88 @@ +# Round 2 review 收尾 7 项:Wrapper 漏修 + LockFailure 500 + JavaDoc 旧编号 + 孤儿枚举 + Publisher rename + 脱敏收敛 + Mapper default 单测 + +> **存放目录**: 二期 → `changelogs-v2/2026-05/` +> **服务**: hl-user-service + hl-common-core + hl-starter-protection + hl-order-service-v3 +> **PR**: #2850 +> **Issue**: #2849 +> **日期**: 2026-05-22 +> **影响范围**: 全部内部代码简化 / 无破坏性变更 — 但 **HouseEventPublisher → HouseNotificationPublisher rename + LockFailureException 全局新错误码** + +--- + +## ⚠️ 关键变化(前端可感知) + +### 1. 🟡 @Lock4j 抢锁失败错误码 100503 RESOURCE_LOCKED +之前 `@Lock4j(acquireTimeout=5s)` 抢锁失败抛 `LockFailureException` 上抛 GlobalExceptionHandler 兜底返 500,前端体验差。 + +**现**:全局 `LockFailureExceptionHandler` 拦截返: +```json +{ "code": 100503, "message": "资源被占用,请稍后重试", "success": false } +``` + +**生效范围**:全部 @Lock4j 注解(目前主要 ProductSnapshotService.restoreSnapshot,后续扩展)。前端如有错误码映射需识别 100503 显示"操作冲突,请稍后重试"提示。 + +### 2. 🟢 Bug 修复:漏修的 listCustomers Wrapper(后端内部) +`hl-user-service` listCustomers Service 内 Wrapper 残留下沉到 `UserMapper.selectCustomerPage` default。前端无感知。 + +--- + +## 一、变更接口清单 + +| # | 接口 | 变更类型 | 说明 | +|---|------|----------|------| +| 1 | 所有 @Lock4j 注解接口(目前 `/admin/product/snapshot/restore`) | **错误码新增** | 抢锁失败返 `100503 RESOURCE_LOCKED` 而非 500 | +| 2 | `/admin/customer/page` 等 | **内部重构** | listCustomers Wrapper 下沉到 Mapper default(前端响应不变) | + +--- + +## 二、关键改动(内部) + +1. **`hl-common-core.CommonErrorCode`** 新增 `RESOURCE_LOCKED(100503, "资源被占用,请稍后重试")` +2. **`hl-starter-protection.LockFailureExceptionHandler`** 新增全局 `@RestControllerAdvice` 拦截 `LockFailureException` 返 100503 +3. **`HouseEventEnum.CUSTOMER_CHANGE`** 孤儿常量删除(PR #2846 删了对应状态机规则,枚举常量是孤儿) +4. **`HouseEventPublisher` → `HouseNotificationPublisher`** rename(单职责后类名误导)— 9 处引用 + 3 IT @MockBean 同步 +5. **`ComplaintConverter`** 手工 substring 脱敏 → `PiiMaskUtil.maskPhone()`(删 13 行) +6. **PR #2846 8 处 JavaDoc 旧编号/类名更新**(808990→808900 / 808994→808901 / 808993→808941 / `RESOURCE_SERVICE_UNAVAILABLE`→`RESOURCE_UNAVAILABLE` / `INVENTORY_DEDUCT_FAILED`→`ROOM_STOCK_INSUFFICIENT`) +7. **5 个新 Mapper default 单测**:LoginLogMapperTest / UserMapperTest / AdminUserMapperTest(8 测试) + +--- + +## 三、测试服验证 + +| 服务 | 部署 commit | uptime | 验证 | +|------|------------|--------|------| +| hl-user-service | dev-v3 含 #2850 | 21:34 | ✅ Wrapper 下沉 + 新 Mapper default 单测全绿 | +| hl-order-service-v3 | dev-v3 含 #2850 | 21:36(SSH restart) | ✅ Publisher rename 后启动正常 | + +--- + +## 四、累计 Round 1 + Round 2 收益 + +| 维度 | 数值 | +|------|------| +| PR 数 | 5 张(#2845 / #2846 / #2847 / #2848 / #2850) | +| 工单数 | 5 张(#2841 / #2842 / #2843 / #2844 / #2849) | +| 净行数 | **-1359(R1) + +311(R2 含 5 新测试文件)= 净 -1048 行** | +| HOUSE 模块评分 | C+ → **A-** | +| 整体评分 | Round 1 A- → Round 2 后整体 **A** | +| 单测数 | 2579 + Round 1 各服务 全绿 | + +--- + +## 五、留尾(独立工单 backlog) + +- **product-v2 全模块 294 文件 HTML 标签清零**(P0 铁规 15h 全局)→ 大工程独立工单 +- **MpTripDetailVO Object → List 真实数据回归** → /@qa 工单 +- **AdminUserService 9 处跨聚合 Mapper(红线 5 二期)** → 独立工单 +- **HOUSE FLEET vehicle_plan Feign 接通后补 DRIVER 通知三件套** → 独立工单 +- **MaterialCategory ↔ Permission 双 @Lazy 抽 PermissionGate** → backlog +- **EquipmentTemplateService ↔ ProductLineService 双 @Lazy 抽 ProductEquipmentBindingService** → backlog + +--- + +## 六、关联 + +- 工单: #2849(closed) +- PR: #2850(merged) +- Round 2 review 来源: Claude /@cr 3 agent 并发(A/B/C)2026-05-22 +- **memory P0 铁规 7 升级**:agent 严禁 git stash(同周 3 次违规累计 4+ 次)