diff --git a/changelogs/2026-05/28_feat_early_bird_copy_applicable_traveler_types_on_detail.md b/changelogs/2026-05/28_feat_early_bird_copy_applicable_traveler_types_on_detail.md new file mode 100644 index 0000000..a641429 --- /dev/null +++ b/changelogs/2026-05/28_feat_early_bird_copy_applicable_traveler_types_on_detail.md @@ -0,0 +1,37 @@ +# 早鸟优惠文案: 产品详情阶梯 + 订单详情早鸟行体现「适用人群」 + +> **服务**: hl-order-service-v2 (8084) / hl-product-service-v2 (8083) +> **PR**: #3187 +> **Issue**: #3182(承接 #3166 早鸟每方案可配适用人群) +> **日期**: 2026-05-28 +> **影响范围**: 小程序「产品详情」早鸟阶梯 + 「订单详情」早鸟折扣行文案 +> **测试服验证**: 已过(api.test.1814.love:9443) + +--- + +## ⚠️ 关键变化 + +早鸟优惠每方案可配「适用人群」(#3166)后,C 端两处文案补上适用人群,避免"每人立减100元"但幼童实际不享受的歧义。沿用既有约定:**后端拼好中文文案,前端直接展示**。 + +### 1. 产品详情早鸟阶梯(`MpProductDetailRespVO.earlyBirdLadder` 的每项)新增 2 字段 + +| 字段 | 类型 | 说明 | +|------|------|------| +| applicableTravelerTypes | `string[]` | 适用人群编码(如 `["ADULT","CHILD","YOUNG_CHILD"]`),后端保证非空(默认成人+儿童+小童,排除幼童)| +| applicableTravelerTypesText | `string` | 适用人群中文文案(如 `成人/儿童/小童`),可直接展示 | + +阶梯项现有 `peopleRangeText`("3-5 人")/`discountText`("每人立减 100 元")不变,前端在其旁展示 `applicableTravelerTypesText` 即可。 + +### 2. 订单详情早鸟折扣行 + +早鸟折扣行 `description`(=`order_discount.discount_name`)在创建订单时拼上适用人群后缀:`早鸟优惠:春季早鸟9折(适用人群:成人/儿童/小童)`。**仅新订单生效,老订单不变。** 同一文案也回显在 `earlyBirdPlanName` 字段(该字段原本就等于 discountName、含"早鸟优惠:"前缀,既有行为)。前端订单详情早鸟行直接展示 description,无需改动。 + +--- + +## 前端改动建议(mmg) + +1. **产品详情早鸟阶梯**:每个阶梯项展示 `applicableTravelerTypesText`(如在 discountText 旁加"(适用人群:成人/儿童/小童)"或单独标签)。 +2. **订单详情早鸟行**:description 已自带适用人群后缀,通常无需改;若之前对 discountName 做过裁剪/正则,注意新后缀。 + +## 测试服验证(已过) +建早鸟方案(适用人群=成人/儿童,挂某产品)→ `GET /mp/product/{id}` 的 `earlyBirdLadder` 返 `applicableTravelerTypesText=成人/儿童`、`discountText=每人立减 50 元`。订单详情后缀由后端创建时落库(单测覆盖,新订单生效)。 diff --git a/changelogs/2026-05/28_feat_home_screen2_card_link_type_product_line.md b/changelogs/2026-05/28_feat_home_screen2_card_link_type_product_line.md new file mode 100644 index 0000000..3a44a1a --- /dev/null +++ b/changelogs/2026-05/28_feat_home_screen2_card_link_type_product_line.md @@ -0,0 +1,51 @@ +# 首页第二屏主题卡片: 跳转类型新增「产品主题」(linkTargetId=产品线id) + +> **服务**: hl-user-service (8081) +> **PR**: #3185 +> **Issue**: #3181 +> **日期**: 2026-05-28 +> **影响范围**: admin「小程序配置 → 首页配置 → 首页第二屏」主题卡片编辑 + 小程序首页第二屏卡片跳转 +> **测试服验证**: 已过(api.test.1814.love:9443 + 真 admin token) + +--- + +## ⚠️ 关键变化 + +主题卡片「跳转类型」(字典 `theme_card_link_type`)新增一项 **「产品主题」= `PRODUCT_LINE`**。选它时卡片 `linkTargetId` 保存为**产品线 id(lineId,产品线=主题)**,点卡片跳产品线详情。 + +字典现有全部取值: + +| dictValue | dictLabel | linkTargetId 含义 | +|-----------|-----------|-------------------| +| SEASON | 季节之旅 | 无 | +| CORE_LIST | 核心产品 | 无 | +| MENGMA | 亲子游学 | 无 | +| PRODUCT | 指定产品 | 产品 id(需配 linkTargetType=CORE/GROUP)| +| **PRODUCT_LINE** | **产品主题** | **产品线 id(lineId)** | + +--- + +## 一、admin 端前端改动(mmg) + +1. 主题卡片「跳转类型」下拉新增「产品主题」选项(字典 `theme_card_link_type` 已加 PRODUCT_LINE,前端读字典即有)。 +2. 选「产品主题」后,弹「产品线选择器」:调 **`GET /admin/product/line/simple-list`**(已存在,返回 `[{lineId, name}]`)填充,用户选产品线后把 `lineId` 写入卡片 `linkTargetId`。 +3. **不要传 `linkTargetType`**(产品线无 CORE/GROUP 之分,后端会强制置 null);PRODUCT 类型才需 linkTargetType。 +4. 保存接口不变:`PUT /admin/home-config/brand-story`,卡片体 `{title, subtitle, coverUrl, linkType:"PRODUCT_LINE", linkTargetId:}`。 +5. 校验:linkTargetId 必填且须为存在且 ACTIVE 的产品线,否则后端返错误码 `220810`(目标产品线不存在或已删除)/`220811`(校验失败)。 + +## 二、小程序端前端改动(mmg) + +首页第二屏卡片点击跳转:`linkType=PRODUCT_LINE` 时,后端 `linkUrl` 恒为 null,前端按 `linkTargetId`(=lineId)跳**产品线详情页**(同 PRODUCT 类型由前端按 id 自拼路由的现有约定)。 + +## 三、接口(无破坏,均已上线) + +| 接口 | 方法 | 路径 | 变化 | +|------|------|------|------| +| 保存品牌故事 | PUT | `/admin/home-config/brand-story` | 卡片 linkType 接受 PRODUCT_LINE;PRODUCT_LINE 时 linkTargetId=产品线id,linkTargetType 强制 null | +| 品牌故事详情 | GET | `/admin/home-config/brand-story` | 卡片回显 linkType/linkTargetId(PRODUCT_LINE 时 linkTargetId=lineId)| +| mp 首页第二屏 | GET | `/mp/home-config/screen2` | PRODUCT_LINE 卡片 linkUrl=null,前端按 linkTargetId 拼产品线详情 | +| 产品线下拉 | GET | `/admin/product/line/simple-list` | (已存在)admin 选产品线用 | + +## 四、测试服验证(已过) +- 字典 `theme_card_link_type` 已含 `PRODUCT_LINE「产品主题」`。 +- admin 存草稿:linkType=PRODUCT_LINE + 非法产品线 id → `220810` 拒绝(合法 ACTIVE 产品线才通过,linkTargetType 被规范化为 null)。