From 884f52e2e1ffbf71a245b0fc3a00dbed3cf53629 Mon Sep 17 00:00:00 2001 From: yaosutu <770858045@qq.com> Date: Sat, 30 May 2026 20:20:55 +0800 Subject: [PATCH] =?UTF-8?q?feat:=202026-05-30=20=E4=BA=8C=E6=9C=9F?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=90=8E=E5=8F=B0=203=20=E4=BB=BD=20changelo?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #3273 (Issue #3272): 资源退费说明 CRUD 模块 - hl-resource-service 新建表 resource_refund_note + 3 admin 接口 - 给运营在景区/活动详情下维护退费说明 - 后续 PR 接入产品快照 + PDF + 核单 Step 5 PR #3284 (Issue #3283): orderStatus/flowStatus 补 label 中文映射 - 订单列表/详情/创单响应新增 orderStatusName + flowStatusName - 非破坏性,前端可选改造删掉自己的映射表 PR #3286 (Issue #3285): 订单接口加 8 步步骤条字段 + 修 2 个文案 - 新增 flowStep/flowStepTotal/flowDisplayText (16→8 步映射 + 中文文案) - 修订 2 个枚举 label: 待提交房型→待提交配房需求, 待提交用车→待配车需求 - 前端请确认有无按老文案做字符串硬比较 3 PR 已全部 squash 合并到 dev-v3, 等部署后生效。 --- .../30_3272_资源退费说明CRUD模块_PR3273.md | 238 ++++++++++++++++++ .../30_3283_订单状态字段补中文名_PR3284.md | 149 +++++++++++ .../30_3285_订单接口加8步步骤条字段_PR3286.md | 204 +++++++++++++++ 3 files changed, 591 insertions(+) create mode 100644 changelogs-v2/2026-05/30_3272_资源退费说明CRUD模块_PR3273.md create mode 100644 changelogs-v2/2026-05/30_3283_订单状态字段补中文名_PR3284.md create mode 100644 changelogs-v2/2026-05/30_3285_订单接口加8步步骤条字段_PR3286.md diff --git a/changelogs-v2/2026-05/30_3272_资源退费说明CRUD模块_PR3273.md b/changelogs-v2/2026-05/30_3272_资源退费说明CRUD模块_PR3273.md new file mode 100644 index 0000000..9e2e61b --- /dev/null +++ b/changelogs-v2/2026-05/30_3272_资源退费说明CRUD模块_PR3273.md @@ -0,0 +1,238 @@ +# 二期 v3:资源退费说明 CRUD 模块(给司机行程单展示用) + +> **服务**: hl-resource-service +> **PR**: #3273 +> **Issue**: #3272 +> **日期**: 2026-05-30 +> **影响**: 🟢 新增能力。给运营在景区/活动详情下"维护退费说明"提供 CRUD 接口;最终用于行程单 PDF 渲染 + 核单 Step 5 录入对账。本期**仅交付资源服务端**,后续 PR 接入产品快照 + PDF + 核单。 + +--- + +## 总览(前端 mmg 必读) + +每个景区(SCENIC)和活动(ACTIVITY)资源都可以挂一份"退费说明",包含资源级备注 + 多条退费明细(标题/金额/单位/备注/生效期)。 + +**界面**:景区 / 活动列表行加一个按钮 → 弹窗里调本期 3 个接口做 CRUD。 + +**接口前缀**:`/admin/refund-note`(**无 `/v3/` 前缀**,因 resource-service 沿用一期路径风格;消费方仍是二期 v3 管理后台)。 + +**本期不做**:行程单 PDF 渲染、产品 ProductDetailVO 注入 refundNote、订单 OrderProductSnapshotContent 反序列化、核单 Step 5 录入对接。这些留后续 PR。 + +--- + +## 接口清单(3 个) + +### 1. 查询单资源的退费说明 + +``` +GET /admin/refund-note?resourceType=SCENIC&resourceId=12345 +``` + +**入参**(query) + +| 字段 | 类型 | 必填 | 枚举 | 说明 | +|---|---|---|---|---| +| `resourceType` | string | ✅ | `SCENIC` / `ACTIVITY` | 资源类型 | +| `resourceId` | long | ✅ | - | 资源 ID(字符串透传雪花)| + +**返回** + +```jsonc +{ + "code": 200, + "data": { // 未配置时直接返 null,前端按 null 隐藏弹窗内容 + "noteId": "20596378108368322580", // 雪花 ID 字符串透传 + "resourceType": "SCENIC", + "resourceId": "12345", + "intro": "苔藓为赠送项目,不退费", + "items": [ + { + "title": "成人未参加", + "amount": 44.00, + "unitLabel": "/人", // 展示文案,给人看 + "settleScope": "PER_PERSON", // 结算粒度枚举,给规则引擎用 + "remark": "", + "effectiveFrom": null, // yyyy-MM-dd + "effectiveTo": null + }, + ... + ], + "createTime": "2026-05-30 10:15:00", + "updateTime": "2026-05-30 10:15:00" + } +} +``` + +**枚举** + +- `settleScope`: + - `PER_PERSON` 按人结算(默认) + - `PER_TEAM` 按团结算(如寻龙诀 100/团 整团一次性) + - `PER_VEHICLE` 按车辆结算(如卡丁车 2 人/辆,按辆数乘单价) + +**注意**:`unitLabel`("/人" / "/团" / "/辆")和 `settleScope` **职责不同**: +- 卡丁车场景:`unitLabel="/人"`(给客户看是 120/人)+ `settleScope=PER_VEHICLE`(引擎按车辆数乘单价) +- 两个字段独立维护,前端展示用 `unitLabel`,未来规则引擎用 `settleScope`。 + +### 2. 保存(upsert 整块) + +``` +PUT /admin/refund-note +``` + +**入参**(body) + +```jsonc +{ + "resourceType": "SCENIC", + "resourceId": 12345, + "intro": "苔藓为赠送项目,不退费", + "items": [ + { + "title": "成人未参加", // 必填 + "amount": 44.00, // 必填,>= 0(赠送项填 0) + "unitLabel": "/人", // 默认 "/人",可省略 + "settleScope": "PER_PERSON", // 默认 "PER_PERSON",可省略 + "remark": "", + "effectiveFrom": null, + "effectiveTo": null + } + ] +} +``` + +**约束** + +- `resourceType`:必须是 `SCENIC` / `ACTIVITY` +- `resourceId`:**必须在 scenic_spot / activity 表存在且未软删**,否则返 390805 "关联资源不存在" +- `items`:至少 1 条,最多 50 条 +- `items[].amount`:>= 0(赠送项目填 0) +- `items[].settleScope`:必须是上述 3 枚举之一(null 时默认 PER_PERSON) +- `items[].effectiveFrom` <= `items[].effectiveTo`(同时存在时) + +**返回** + +```jsonc +{ "code": 200, "data": "20596378108368322580" } // 落库后的 noteId(字符串透传) +``` + +**语义**:upsert——按 (resourceType, resourceId) 找现有记录,有则**整块覆盖**(不做 item 级 diff),无则 insert。 + +### 3. 软删整份 + +``` +DELETE /admin/refund-note?resourceType=SCENIC&resourceId=12345 +``` + +**入参**:同 GET。 +**返回**:`{ "code": 200, "data": true }`(不存在或已软删返 false,不报错)。 + +软删用主键自身写 deleted_at,UNIQUE KEY 永不撞键,支持同资源无限次"删→重建"。 + +--- + +## 错误码(段位 39080x) + +| code | 错误信息 | +|---|---| +| 390801 | 退费明细金额必须 ≥ 0 | +| 390802 | 退费明细生效起日不能晚于止日 | +| 390803 | 退费明细结算粒度非法: {0} | +| 390804 | 退费说明资源类型非法: {0} | +| 390805 | 关联资源不存在: type={0}, id={1} | + +非业务错误(参数校验失败)走通用 400。 + +--- + +## 业务边界 + +- **资源类型**:一期仅 `SCENIC` + `ACTIVITY`,其他资源(餐饮/酒店/物资等)有各自退订/退款政策,不复用本结构。 +- **一份生效**:同资源同时刻只有一份生效的退费说明(DB 唯一键 `(resource_type, resource_id, deleted_at)` 保证)。 +- **关联校验**:保存时校验 resourceId 在主资源表存在,防孤儿数据。 +- **资源软删后**:本退费说明仍存在但孤儿(查不到对应资源),不主动清理;运营侧需手动删除。 + +--- + +## 数据示例(典型) + +### 白桦林(4 条规则) + +```jsonc +{ + "resourceType": "SCENIC", "resourceId": 12345, + "intro": "苔藓为赠送项目, 不退费", + "items": [ + {"title": "儿童/学生/无证件未参加", "amount": 15, "unitLabel": "/人", "settleScope": "PER_PERSON"}, + {"title": "免票座电瓶车", "amount": 30, "unitLabel": "/人", "settleScope": "PER_PERSON"}, + {"title": "白桦林未参加", "amount": 44, "unitLabel": "/人", "settleScope": "PER_PERSON"}, + {"title": "桦树皮画未参加", "amount": 50, "unitLabel": "/人", "settleScope": "PER_PERSON", "remark": "仅儿童"} + ] +} +``` + +### 寻龙诀(按团结算) + +```jsonc +{ + "resourceType": "ACTIVITY", "resourceId": 99999, + "items": [ + {"title": "寻龙诀未参加", "amount": 100, "unitLabel": "/团", "settleScope": "PER_TEAM"} + ] +} +``` + +### 卡丁车(按车结算,文案 /人) + +```jsonc +{ + "resourceType": "ACTIVITY", "resourceId": 88888, + "items": [ + {"title": "卡丁车未骑", "amount": 120, "unitLabel": "/人", "settleScope": "PER_VEHICLE", + "remark": "2 人/辆共享单价"} + ] +} +``` + +### 套娃(时间窗口) + +```jsonc +{ + "resourceType": "SCENIC", "resourceId": 77777, + "items": [ + {"title": "老人只看大马戏", "amount": 65, "settleScope": "PER_PERSON"}, + {"title": "6/25 后没去或免票", "amount": 165, "settleScope": "PER_PERSON", + "effectiveFrom": "2026-06-25", "effectiveTo": null} + ] +} +``` + +--- + +## 影响评估 + +- **后端**:仅 hl-resource-service 新增 1 张表 `resource_refund_note` + 3 个 admin 接口,对其他业务零影响。 +- **DB**:Flyway `V20260529_002__create_resource_refund_note.sql` 自动建表,重启服务后生效。 +- **前端**:新增弹窗 UI(建议在景区 / 活动详情页加按钮 → 弹窗 CRUD),完全独立的新页面,老页面不影响。 + +--- + +## 注意事项 + +1. 雪花 ID 透传为字符串(`noteId` / `resourceId`),前端**不要 `Number()`**。 +2. 资源软删后的退费说明不会自动清理,运营侧需先删退费说明再删资源(否则成孤儿数据)。 +3. 同资源不可有 2 份生效退费说明(DB 唯一键约束)。 +4. 删除是软删,可同资源重建;不支持物理删除。 + +--- + +## 关联 + +- **Issue**: [#3272](https://git.1814.love:8443/wx/HL/issues/3272) +- **PR**: [#3273](https://git.1814.love:8443/wx/HL/pulls/3273) - feat(resource): 新增资源退费说明 CRUD 模块 +- **Commit**: [ffae5ab90](https://git.1814.love:8443/wx/HL/commit/ffae5ab90) +- **后续 PR**(不在本期): + - 产品服务 `ProductDetailVO.NodeItem.refundNote` 注入(参考 #3147 serviceStandard 模式) + - 订单 `OrderProductSnapshotContent` 加 refundNote 反序列化(10 行) + - 行程单 PDF 渲染退费表(订单 v3 + PDF 服务) + - 核单 Step 5 录入半结构化对接(可选) diff --git a/changelogs-v2/2026-05/30_3283_订单状态字段补中文名_PR3284.md b/changelogs-v2/2026-05/30_3283_订单状态字段补中文名_PR3284.md new file mode 100644 index 0000000..e853eff --- /dev/null +++ b/changelogs-v2/2026-05/30_3283_订单状态字段补中文名_PR3284.md @@ -0,0 +1,149 @@ +# 二期 v3:订单 orderStatus / flowStatus 字段补 label 中文映射 + +> **服务**: hl-order-service-v3 +> **PR**: #3284 +> **Issue**: #3283 +> **日期**: 2026-05-30 +> **影响**: 🟢 **非破坏性**新增字段。前端从前自行映射 `AWAITING_PROFILE → "待补全信息"` 等,现在后端直接给。老字段 `orderStatus` / `flowStatus`(英文枚举)保留不动,新增 `orderStatusName` / `flowStatusName` 中文 label 同时返回。 + +--- + +## 总览(前端 mmg 必读) + +订单列表 / 详情 / 创建响应里的 `orderStatus` 和 `flowStatus` 字段历史上**只返英文枚举**(`CUSTOMIZING` / `AWAITING_PROFILE` 等),前端要查表自行翻译。本期后端直接拼好中文 label 返回,前端**直接用 `xxxStatusName` 字段展示**即可。 + +旧字段保留,前端老逻辑零改动。 + +--- + +## 接口清单(3 个响应增字段) + +### 1. 订单列表 + +``` +GET /v3/admin/order +``` + +**响应** `data.records[].xxx` 新增 2 字段: + +```jsonc +{ + "orderStatus": "CUSTOMIZING", + "orderStatusName": "定制中", // 🆕 中文名 + "flowStatus": "AWAITING_PROFILE", + "flowStatusName": "待补全信息" // 🆕 中文名 +} +``` + +### 2. 订单详情 + +``` +GET /v3/admin/order/{id}/detail +``` + +**响应** `data.main` 同样新增 2 字段: + +```jsonc +"main": { + "orderStatus": "TRAVELLING", + "orderStatusName": "出行中", // 🆕 + "flowStatus": "TRAVELLING", + "flowStatusName": "出行中" // 🆕 +} +``` + +### 3. 创建订单响应 + +``` +POST /v3/admin/order +``` + +**响应** `data` 新增 1 字段(`orderStatusName` 早期已有,本期补 `flowStatusName`): + +```jsonc +{ + "orderStatus": "PENDING_PAY", + "orderStatusName": "待支付", + "flowStatus": "AWAITING_PAY", + "flowStatusName": "待支付" // 🆕 +} +``` + +--- + +## 状态枚举完整对照表 + +### `orderStatus`(粗状态 6 个) + +| 枚举值 | 中文名 | +|---|---| +| `PENDING_PAY` | 待支付 | +| `CUSTOMIZING` | 定制中 | +| `PENDING_DEPARTURE` | 待出行 | +| `TRAVELLING` | 出行中 | +| `COMPLETED` | 已完成 | +| `CANCELLED` | 已取消 | + +### `flowStatus`(细状态 16 个) + +| 枚举值 | 中文名 | +|---|---| +| `AWAITING_PAY` | 待支付 | +| `AWAITING_PROFILE` | 待补全信息 | +| `AWAITING_HOTEL_SUBMIT` | 待提交房型 | +| `AWAITING_HOTEL_CLAIM` | 待抢房 | +| `HOTEL_IN_PROGRESS` | 房控处理中 | +| `HOTEL_NEED_ADJUST` | 房控需调整 | +| `AWAITING_VEHICLE_SUBMIT` | 待提交用车 | +| `VEHICLE_IN_PROGRESS` | 车控处理中 | +| `VEHICLE_NEED_ADJUST` | 车控需调整 | +| `PENDING_CONFIRM` | 待确认 | +| `PENDING_DEPARTURE` | 待出行 | +| `TRAVELLING` | 出行中 | +| `PENDING_REVIEW` | 待核单 | +| `REVIEWING` | 核单中 | +| `SETTLED` | 已结算 | +| `COMPLETED` | 已完成 | +| `CANCELLED` | 已取消 | + +> ⚠️ **注意**:本 PR 后紧跟的 PR #3286 改了其中 2 个 label —— `待提交房型 → 待提交配房需求`、`待提交用车 → 待配车需求`。**实际部署后看到的是 PR #3286 的新文案**,前端如果按这俩老文案做字符串硬比较需要更新(详见 PR #3286 changelog)。 + +--- + +## 容错(前端可忽略) + +- 后端拿到 null 或未知枚举(历史脏数据)会回退:返回原值而不是抛 500,前端不会看到"待x"等乱码。 +- 即便后端返回原英文枚举值(如未知 `XXXXX`),前端展示也能落 fallback。 + +--- + +## 业务边界 + +- 老字段 `orderStatus` / `flowStatus` 保留英文枚举(**契约不变**) +- 仅新增 `orderStatusName` / `flowStatusName` 中文 +- 前端**老逻辑零改动**也能跑(旧字段还在) +- 改成展示 `xxxStatusName` 后,前端不需要自己维护英文 → 中文映射表 + +--- + +## 影响评估 + +- **后端**:仅 hl-order-service-v3 改了 5 个文件(3 VO + Converter + OrderService),无 DB 改动,重启服务后生效。 +- **前端**:可选改造——把硬编码映射表删掉,直接用 `xxxStatusName`。改不改都不影响功能。 +- **mp 端**:本 PR 暂未改 `OrderLookupMpService`(仍是 mock 假数据),真业务化时一起补。 + +--- + +## 注意事项 + +1. 如果你的前端代码有硬编码的英文→中文映射表(如 `{ AWAITING_PROFILE: "待补全信息" }`),建议删掉,改用 `flowStatusName` 字段,避免后端枚举改了文案前端跟不上。 +2. 文案的"权威源"是后端枚举(`OrderStatus` / `OrderFlowStatus`),运营如果要求改文案直接改后端,前端无感跟随。 + +--- + +## 关联 + +- **Issue**: [#3283](https://git.1814.love:8443/wx/HL/issues/3283) +- **PR**: [#3284](https://git.1814.love:8443/wx/HL/pulls/3284) - fix(order-v3): orderStatus/flowStatus 补 label 中文映射 +- **Commit**: [cb85f0f76](https://git.1814.love:8443/wx/HL/commit/cb85f0f76) +- **接续 PR**: [#3286](https://git.1814.love:8443/wx/HL/pulls/3286) - feat(order-v3): 8 步步骤条字段 + 修 2 文案(紧接本 PR,建议一起看) diff --git a/changelogs-v2/2026-05/30_3285_订单接口加8步步骤条字段_PR3286.md b/changelogs-v2/2026-05/30_3285_订单接口加8步步骤条字段_PR3286.md new file mode 100644 index 0000000..596797e --- /dev/null +++ b/changelogs-v2/2026-05/30_3285_订单接口加8步步骤条字段_PR3286.md @@ -0,0 +1,204 @@ +# 二期 v3:订单接口加 flowStep / flowStepTotal / flowDisplayText 步骤条字段 + 修 2 个文案 + +> **服务**: hl-order-service-v3 +> **PR**: #3286 +> **Issue**: #3285 +> **日期**: 2026-05-30 +> **影响**: 🟡 **非破坏性**新增字段 + **文案修订**。前端从前自己拼 `"1/8 · 待补全信息"`,现在后端直接给 `flowStep` / `flowStepTotal` / `flowDisplayText` 三字段,前端拿着就显示。同时修了 2 个枚举 label 文案。 + +--- + +## 总览(前端 mmg 必读) + +接续 PR #3284(status label 中文),本期把"订单步骤条"所需数据全部下沉到后端: + +```jsonc +{ + "flowStep": 1, // 🆕 当前步序号 0=待支付前, 1-8=进行中, null=终态/未知 + "flowStepTotal": 8, // 🆕 总步数固定 8 + "flowDisplayText": "待补全信息" // 🆕 中文文案,只中文不带"X/8 · ",前端按需自拼 +} +``` + +前端从前的 `currentStep / totalSteps + 自己映射中文` 逻辑全部可删,直接用本期 3 字段。 + +**同时**:修了 2 个 `OrderFlowStatus` 枚举 label 文案(影响 `flowStatusName` 字段返回): + +| 枚举值 | 旧文案 | 新文案 | +|---|---|---| +| `AWAITING_HOTEL_SUBMIT` | 待提交房型 | **待提交配房需求** | +| `AWAITING_VEHICLE_SUBMIT` | 待提交用车 | **待配车需求** | + +--- + +## 接口清单(3 个响应增字段) + +### 1. 订单列表 + +``` +GET /v3/admin/order +``` + +**响应** `data.records[].xxx` 在 PR #3284 基础上再加 3 字段: + +```jsonc +{ + "orderStatus": "CUSTOMIZING", + "orderStatusName": "定制中", + "flowStatus": "AWAITING_PROFILE", + "flowStatusName": "待补全信息", + "flowStep": 1, // 🆕 + "flowStepTotal": 8, // 🆕 + "flowDisplayText": "待补全信息" // 🆕 +} +``` + +### 2. 订单详情 + +``` +GET /v3/admin/order/{id}/detail +``` + +**响应** `data.main` 同样加 3 字段(位置和列表相同)。 + +### 3. 创建订单响应 + +``` +POST /v3/admin/order +``` + +**响应** 加 3 字段;创单初态固定: + +```jsonc +{ + "flowStep": 0, + "flowStepTotal": 8, + "flowDisplayText": "待支付" +} +``` + +--- + +## 8 步映射表(16 → 8) + +**优先级**:`orderStatus` 终态 > `flowStatus` 步骤映射 + +| 触发条件 | `flowStep` | `flowDisplayText` | +|---|---|---| +| `orderStatus = CANCELLED` | `null` | "已取消" | +| `orderStatus = COMPLETED` | `null` | "已完成" | +| `flowStatus = AWAITING_PAY` | `0` | "待支付" | +| `flowStatus = AWAITING_PROFILE` | `1` | "待补全信息" | +| `flowStatus = AWAITING_HOTEL_SUBMIT` | `2` | **"待提交配房需求"** | +| `flowStatus = AWAITING_HOTEL_CLAIM` | `2` | "待抢房" | +| `flowStatus = HOTEL_IN_PROGRESS` | `2` | "房控处理中" | +| `flowStatus = HOTEL_NEED_ADJUST` | `2` | "房控需调整" | +| `flowStatus = AWAITING_VEHICLE_SUBMIT` | `3` | **"待配车需求"** | +| `flowStatus = VEHICLE_IN_PROGRESS` | `3` | "车控处理中" | +| `flowStatus = VEHICLE_NEED_ADJUST` | `3` | "车控需调整" | +| `flowStatus = PENDING_CONFIRM` | `4` | "待确认" | +| `flowStatus = PENDING_DEPARTURE` | `5` | "待出行" | +| `flowStatus = TRAVELLING` | `6` | "出行中" | +| `flowStatus = PENDING_REVIEW` | `7` | "待核单" | +| `flowStatus = REVIEWING` | `8` | "核单中" | +| `flowStatus = SETTLED` | `8` | "已结算" | + +**说明**: + +- 配房 4 个并行子态(`AWAITING_HOTEL_SUBMIT` / `_CLAIM` / `HOTEL_IN_PROGRESS` / `_NEED_ADJUST`)都归到 step 2 +- 配车 3 个并行子态都归到 step 3 +- `REVIEWING` 和 `SETTLED` 都归到 step 8(结算后整体收尾) +- `CANCELLED` / `COMPLETED` 是终态,不在 8 步串行里,`flowStep` 返 null +- 未知 / 历史脏数据:`flowStep=null`, `flowDisplayText=` 原英文值(fallback 不抛错) + +--- + +## 前端如何用(推荐) + +### 推荐方式 1:只显示 `flowDisplayText`(最简单) + +```html +
{{ order.flowDisplayText }}
+ +``` + +### 推荐方式 2:进度条 + 中文(拼分子分母) + +```html +
+ {{ order.flowStep }}/{{ order.flowStepTotal }} · {{ order.flowDisplayText }} +
+
+ {{ order.flowDisplayText }} +
+ +``` + +### 推荐方式 3:步骤条 UI(按 flowStep 高亮) + +如果有 8 段步骤条 UI 组件,按 `flowStep` 高亮当前段: + +```jsonc +const stepNames = ["待支付", "补全信息", "配房需求", "配车需求", + "确认", "出行准备", "出行", "核单"]; +// 用 flowStep 高亮 stepNames[flowStep - 1] +``` + +--- + +## 文案变更详情(重点关注) + +| 字段 | 旧值 | 新值 | +|---|---|---| +| `flowStatusName`(PR #3284 字段)| "待提交房型" | "待提交配房需求" | +| `flowStatusName` | "待提交用车" | "待配车需求" | +| `flowDisplayText`(本 PR 字段)| - | 同上 | + +**前端需要确认的事**: + +1. 如果有按 **"待提交房型"** / **"待提交用车"** 老文案做字符串硬比较(如 `if (status === "待提交房型")`),需要改成新文案或改用枚举值比较。 +2. 如果只是 **展示**(不做逻辑判断),无需改动——文案直接显示新值即可。 + +我们后端搜了一遍**未发现**前端这个老文案的硬比较,但前端代码后端看不到,**请前端 mmg 自己 grep 确认**。 + +--- + +## 容错(前端可忽略) + +- `flowStatus` 是历史脏数据(枚举里没有)→ `flowStep = null`, `flowDisplayText = 原始值` +- `orderStatus = null` → `flowStep = null`, `flowDisplayText = "未知"` +- 前端按 `flowStep === null` 判断终态/未知,按 `flowDisplayText` 兜底展示,绝不会拿到空字符串。 + +--- + +## 业务边界 + +- 老字段 `flowStatus` / `flowStatusName` 保留(契约不变) +- 仅新增 3 字段 + 修订 2 个枚举 label 文案 +- 8 步是**前端展示概念**,后端的 `OrderFlowStatus` 仍是 16 个细状态(DB 落地不变) +- 步骤条只是**展示视角**的简化,业务逻辑仍按 16 个 `flowStatus` 跑 + +--- + +## 影响评估 + +- **后端**:hl-order-service-v3 改了 7 个文件(枚举 + Converter + 3 VO + Service + 测试),无 DB 改动,重启服务后生效。 +- **前端**:可选改造——把"1/8"拼接逻辑改用后端 3 字段。改不改都不影响功能(老逻辑还能跑)。 +- **mp 端**:本 PR 暂未改 mp(mock service),真业务化时一并补。 + +--- + +## 注意事项 + +1. **文案修订是契约变更**:如果前端按老文案做字符串硬比较,必须改。展示用的话无影响。 +2. **flowStep 可能为 null**:终态(已取消/已完成/历史脏数据)时为 null,前端按 null 处理"不显示分子"或"显示终态文案"。 +3. **创单后立即调列表**:会看到 `flowStep=0` + `flowDisplayText="待支付"`,符合"还没开始走流程"语义。 + +--- + +## 关联 + +- **Issue**: [#3285](https://git.1814.love:8443/wx/HL/issues/3285) +- **PR**: [#3286](https://git.1814.love:8443/wx/HL/pulls/3286) - feat(order-v3): 订单接口加 8 步步骤条字段 + 修 2 个文案 +- **Commit**: [fd533fdaa](https://git.1814.love:8443/wx/HL/commit/fd533fdaa) +- **前置 PR**: [#3284](https://git.1814.love:8443/wx/HL/pulls/3284) - status label 中文(建议一起看)