hl-api-changelog/changelogs/2026-04/2026-04-20_bug-batch-fixes.md
API Changelog Bot 812fd5d787 feat(2026-04-20): 第一期 BUG 修复 + 3 大新功能上线(早鸟多方案/备品组合/高德地图)
本批变更(测试环境已部署验证):
1. 后端修复 9 个 BUG(#956/957/958/959/960 + hotfix #965/966/967)
2. BUG 10 产品地图支持高德自动生成(#962)
3. BUG 15 备品组合功能(#963)
4. BUG 20 早鸟优惠改造为 1:N 多方案(#964)

前端待跟进 BUG:1/2/5/6/8/12/19
2026-04-20 12:26:50 +08:00

132 行
7.3 KiB
Markdown

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

# 第一期 BUG 批量修复4-20 部署)
**日期**2026-04-20
**PR**#956#957#958#959#960 + gateway #966、ddl hotfix #965/#967
本批次共修复 9 个后端 BUG 并部署测试环境,同时列出 6 个纯前端 BUG 需前端同学跟进。
---
## ✅ 后端已修(前端大多无需改动)
### BUG 11 — 价格日历报 "month: 月份格式错误"(前端无感)
`@Pattern` 正则从 `\d{4}-\d{2}` 放宽为 `\d{4}-(0?[1-9]|1[0-2])`,后端 `YearMonth.parse(month, "yyyy-M")` 容错。
**前端**:传 `month=2026-5``2026-05` 都可,**自动兼容**。
### BUG 16 — "数据操作违反约束"不给字段信息
`GlobalExceptionHandler``DataIntegrityViolationException` 5 种模式关键字匹配:
- `Column 'xxx' cannot be null``字段 【xxx】 不能为空`
- `Data too long for column 'xxx'``字段 【xxx】 长度超限`
- `Duplicate entry ... for key 'xxx'``数据重复,索引: xxx`
- `Unknown column 'xxx'``数据库字段 【xxx】 不存在schema drift`
- 外键失败 → `外键约束失败:关联数据不存在`
**前端**:错误 message 字段更友好,可直接透传给用户。
### BUG 17 — 小蒙马上架报 "至少需要1个未来有效价格"
`ProductValidationService.validatePublish``productType` 分流:
- CORE/CUSTOM → 走 `product_price_calendar` 校验(原逻辑)
- GROUP → 走 `group_tour_batch.adult_price` 校验(匹配"班期表价格"语义)
**前端**:无改动。小蒙马产品上架流程可正常走通。
### BUG 3 — 小蒙马小程序详情 startPrice=null 导致预订按钮灰
`MpProductDetailAssembler` 同步分流。GROUP 产品走 `groupTourBatchService.findMinAdultPriceFuture`
**前端**:无改动。小蒙马产品详情 `startPrice` 现在会正确返回班期最低成人价。
### BUG 7 — 里程自动计算偏短
根因:
1. 白名单只认 SCENIC/ACTIVITY/HOTEL,自定义节点被静默过滤
2. 集合地/解散地坐标从未参与
修复:
- `AmapDrivingService.COORD_NODE_TYPES` 重构:新增 `BYO_COORD_NODE_TYPES={CUSTOM,NOTE,TRANSPORT,PHOTOGRAPHY,FREE}`,自带 lng/lat 才参与
- `ItineraryAutoCalculator.autoCalculateDailyMileage` 入参加 `List<DayItem>`,按 dayNumber 抽 gather/dismissal 透传
**前端**`DailyMileageCalcReqVO` 新增可选字段:
- `NodeRef.lng/lat`BigDecimal 可空,BYO 节点带坐标才参与计算)
- `DayNodes.gatherPlace/dismissalPlace`Object 可空,同高德行政区 JSON `{name,adcode,center,level}`
**前端 TODO**:行程编排页保存"计算里程"接口时,把每天的 `gatherPlace`/`dismissalPlace` 和各节点的 `lng/lat` 一并传,里程会更准确。不传也向下兼容。
### BUG 9 — 添加/编辑景区保存报 500
schema driftEntity 有 `photographyGuide` 字段,DB 无 `photography_guide` 列。
修复DDL 加列(独立迁移脚本 `sql/alter_scenic_spot_add_photography_guide.sql`,测试环境已执行)。
**前端**:无改动。景区创建/编辑接口正常。
### BUG 13 — 定制师看不见自己建的主题
`ProductLineService.saveLine` 创建分支加 `setCreatedBy` 兜底:若请求头缺 `X-Admin-Id` → 抛 `BusinessException("未识别到管理员身份")`,避免 `createdBy` 落 NULL。
**前端**:管理端创建产品线时**务必确保** HTTP 请求头带 `X-Admin-Id`(或 `Authorization: Bearer <token>` 让后端从中提取)。
### BUG 14 — 新建产品版本后小程序端看不到(缓存)
`ProductHelperService.registerAfterCommitInternal` 的 afterCommit 回调改调 `evictAllMpCache`,除产品详情缓存外,额外清:
- `mp:product-line:detail:*`(产品线详情)
- `mp:products-by-line:*`(产品线下产品列表)
**前端**:无改动。新建/上架/下架产品后小程序端立即可见,不再需要等 10 分钟缓存过期。
### BUG 18 — 产品线封面改了小程序端不更新
`ProductLineService.saveLine/deleteLine` 加 afterCommit 清缓存(同 BUG 14 的 evictAllMpCache 无参版)。
**前端**:无改动。产品线封面/描述改动立即在小程序端可见。
---
## 🔵 需前端跟进的 BUG
### BUG 1 — 主题页产品名错(前端取字段错误)
现状:主题页显示"6 天 5 晚 · 亲子游",应为后台配置的 `name="带孩子,看一次真正的草原。"`
**后端确认**`MpProductService:387-399``name` 字段取自 `product.name`,值正确。**前端取错了字段**(可能把 `subtitle` 或拼接字符串当标题)。
**前端 TODO**:确认主题页产品标题读的是 `product.name` 而非 `subtitle` 或其他拼接逻辑。
### BUG 2 — 产品详情页第一屏没有标签
后端 `MpProductDetailRespVO.tags` 字段存在,DB 实际数据都有(如 `["亲子", "研学", "摄影"]`。测试环境已查明DB 数据完整,后端正确返回。**前端未渲染**。
**前端 TODO**:检查产品详情首屏的 tags 渲染逻辑。
### BUG 5 — 用户端第二页面卡片缺 icon
`BrandCard` DTO 只有 `title/subtitle/coverUrl`,**无 `iconUrl` 字段**。
**前端 TODO + 确认**:前端是否**必需**独立的 icon 字段(而非复用 coverUrl 缩略图)?
- 如确需:后端需改 common-core DTO影响全服务重部署,成本高,请明确反馈
- 如可不加:复用 coverUrl 即可
### BUG 6 — 发布产品弹窗仍报"未配置实际用车车型"
测试 jar 反编译已验证 PR #932 的新文案已生效。**浏览器缓存问题**。
**前端 TODO / 用户**Ctrl+Shift+R 硬刷后重试。
### BUG 8 — 资源库添加酒店区域分类无法使用
后端 `HotelQueryRequest``district` 筛选字段,无"按 city 列 district"字典接口。
**前端 TODO**:在 F12 Network 看这个下拉实际调的是哪个接口(带什么参数),反馈后再判断是否需要后端补接口。
### BUG 12 — 每日集合地/解散地不用必填
后端 `ProductItinerarySaveReqVO.DayItem.gatherPlace/dismissalPlace``Object` 且无任何校验注解,**后端不强制必填**。前端 `*` 号只是 UI 装饰。
**前端 TODO**:去掉这两个字段 UI 上的 `*` 号。副作用:空集合地时后端不生成首尾路线点和线路概览(已 null-safe 不报错)。
### BUG 19 — 产品选定金比例后小程序没返回定金金额
后端 `product_basic` 表有 `deposit_ratio``deposit_amount` 列,`MpProductDetailRespVO.depositRatio`/`depositAmount` 字段存在,`MpProductService.calculateQuote` 完整计算定金。**测试环境验证后端字段完整**。
**前端 TODO**:小程序端检查是否正确解析/展示 `depositRatio``depositAmount` 两个字段。
---
## DDL 执行清单(生产部署前运维参考)
| 脚本 | 库 | 必要性 |
|---|---|---|
| `sql/alter_scenic_spot_add_photography_guide.sql` | hl_resource_service | BUG 9 必须 |
| `sql/alter_product_route_info_add_map_mode.sql` | hl_product_service | BUG 10 必须 |
| `sql/alter_product_supplies_add_from_combo_id.sql` | hl_product_service | BUG 15 可选(审计用) |
| `sql/supplies_schema.sql`(新增 supplies_combo+item 两张表) | hl_resource_service | BUG 15 必须 |
| `hl-order-service-v2/sql/migrations/20260420_bug20_early_bird_multi_plan.sql` | hl_order_service_v2 | BUG 20 必须 |
**部署顺序**:先 DDL → 再重启相关服务。