破坏性变更:订单详情记录Tab时间线接口LogTimelineVO 6字段重构为13字段(改名/新增/拆分),管理后台前端必须同步迁移(PR #3574)
这个提交包含在:
父节点
d39345076e
当前提交
694c1c2ee6
@ -0,0 +1,330 @@
|
||||
# 订单详情「记录 Tab」时间线接口 13 字段重构 — 修改接口 — 管理后台
|
||||
|
||||
> 变更类型:⚠️ 破坏性变更(字段删除 / 改名 / 新增)
|
||||
> 端类型:管理后台
|
||||
> 日期:2026-06-08
|
||||
> 服务:hl-order-service-v3
|
||||
|
||||
---
|
||||
|
||||
## 1. 接口背景
|
||||
|
||||
订单详情页「记录」Tab 懒加载接口,返回订单状态流转与操作时间线节点列表。
|
||||
|
||||
本次对返回值 `LogTimelineVO` 进行全面重构:旧版 6 字段语义模糊、状态值为英文裸枚举、操作人字段名拼写不一;新版扩展为 13 字段,状态标签全部中文化,引入 `changeType` 区分两类节点样式,新增 `id` 字段满足 list key 需要。
|
||||
|
||||
**前端必须同步迁移**。旧字段(`action`、`operator`、`fromStatus`、`toStatus`)已从响应体移除或改名,直接使用旧字段的代码将取不到值。
|
||||
|
||||
---
|
||||
|
||||
## 2. 变更清单
|
||||
|
||||
| # | 变更类型 | 旧字段 | 新字段 | 说明 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | ⚠️ 删除 | `action` | — | 已拆分为 `title`(事件名)+ `content`(内容描述),原字段不再返回 |
|
||||
| 2 | ⚠️ 改名 | `operator` | `operatorName` | 操作人姓名,仅字段名变更,值语义不变 |
|
||||
| 3 | ⚠️ 改名+中文化 | `fromStatus` | `fromStatusLabel` | 状态来源,英文枚举("PENDING_PAY")→ 中文标签("待支付") |
|
||||
| 4 | ⚠️ 改名+中文化 | `toStatus` | `toStatusLabel` | 状态目标,英文枚举("PROCESSING")→ 中文标签("定制中") |
|
||||
| 5 | 保留 | `occurredAt` | `occurredAt` | 事件发生时间,无变化 |
|
||||
| 6 | 保留 | `amount` | `amount` | 金额,无变化 |
|
||||
| 7 | ✨ 新增 | — | `id` | 节点唯一 ID(String 雪花),list key 用此字段 |
|
||||
| 8 | ✨ 新增 | — | `title` | 中文事件名(原 action 前半段,如支付订金) |
|
||||
| 9 | ✨ 新增 | — | `content` | 事件内容文本("¥500" / "拉萨 瑞吉酒店" / "2 位出行人"),可空 |
|
||||
| 10 | ✨ 新增 | — | `amountKind` | 金额类型枚举(DEPOSIT/FULL/REFUND/RETURN/SETTLEMENT),可空 |
|
||||
| 11 | ✨ 新增 | — | `relatedType` | 关联单类型(PAYMENT/REFUND/SETTLEMENT/CONTRACT),可空 |
|
||||
| 12 | ✨ 新增 | — | `relatedId` | 关联单 ID(String),与 relatedType 配对,可空 |
|
||||
| 13 | ✨ 新增 | — | `eventType` | 英文事件码(机器字段,前端做图标判断,**不直接展示给用户**) |
|
||||
| 14 | ✨ 新增 | — | `changeType` | 节点类型(STATUS / DATA),前端据此区分节点渲染样式 |
|
||||
|
||||
---
|
||||
|
||||
## 3. 接口详情
|
||||
|
||||
| 项目 | 值 |
|
||||
|---|---|
|
||||
| 请求方法 | GET |
|
||||
| 路径 | /v3/admin/order/{id}/status-log |
|
||||
| 接口名 | 订单详情 Tab 时间线 |
|
||||
| 认证 | 需要 Bearer Token(管理后台 JWT) |
|
||||
| 幂等性 | 查询接口,天然幂等 |
|
||||
| 限流 | 无特殊限流,跟随全局网关默认限流 |
|
||||
| 加载时机 | 懒加载(切换到记录 Tab 时触发) |
|
||||
|
||||
---
|
||||
|
||||
## 4. 接口入参
|
||||
|
||||
### 4.1 路径参数
|
||||
|
||||
| 参数名 | 类型 | 必填 | 说明 |
|
||||
|---|---|---|---|
|
||||
| id | Long | 是 | 订单 ID |
|
||||
|
||||
### 4.2 请求体
|
||||
|
||||
无请求体(GET 请求)。
|
||||
|
||||
---
|
||||
|
||||
## 5. 出参字段
|
||||
|
||||
**返回类型**:Result<List<LogTimelineVO>>
|
||||
|
||||
| 字段名 | 类型 | 可空 | 说明 |
|
||||
|---|---|---|---|
|
||||
| id | String | 否 | 节点唯一 ID(雪花 String,防 JS 精度丢失),list key 用此字段 |
|
||||
| occurredAt | String (ISO 8601) | 否 | 事件发生时间,如 2026-06-01T14:30:00 |
|
||||
| title | String | 否 | 中文事件名,如支付订金、配房完成、出行前取消 |
|
||||
| content | String | 是 | 事件内容描述,如 Y500、拉萨瑞吉酒店/林芝工布庄园希尔顿、2位出行人;DATA 节点通常有值,STATUS 节点可空 |
|
||||
| operatorName | String | 否 | 操作人姓名,如李雯;系统自动触发时为系统 |
|
||||
| fromStatusLabel | String | 是 | 状态流转来源(中文),如待支付;仅 changeType=STATUS 节点有值,DATA 节点为 null |
|
||||
| toStatusLabel | String | 是 | 状态流转目标(中文),如定制中;仅 changeType=STATUS 节点有值,DATA 节点为 null |
|
||||
| amount | BigDecimal | 是 | 金额,如 500.00;无金额时为 null |
|
||||
| amountKind | String | 是 | 金额类型枚举值,见枚举节;无金额时为 null |
|
||||
| relatedType | String | 是 | 关联单类型(PAYMENT/REFUND/SETTLEMENT/CONTRACT),可空 |
|
||||
| relatedId | String | 是 | 关联单 ID(String),与 relatedType 配对;可空 |
|
||||
| eventType | String | 否 | 英文事件码,前端做图标/样式判断用,不直接展示给用户 |
|
||||
| changeType | String | 否 | 节点类型(STATUS / DATA),前端据此区分节点渲染样式 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 枚举 / 数据字典
|
||||
|
||||
### changeType — 节点类型
|
||||
|
||||
| 枚举值 | 含义 | 前端渲染说明 |
|
||||
|---|---|---|
|
||||
| STATUS | 状态流转节点 | 展示 fromStatusLabel → toStatusLabel 箭头;amount / amountKind 可能有值 |
|
||||
| DATA | 状态内数据变更节点 | 无状态箭头;fromStatusLabel / toStatusLabel 为 null;展示 title + content |
|
||||
|
||||
### amountKind — 金额类型
|
||||
|
||||
| 枚举值 | 含义 |
|
||||
|---|---|
|
||||
| DEPOSIT | 订金 |
|
||||
| FULL | 全款 |
|
||||
| REFUND | 退款金额 |
|
||||
| RETURN | 退还金额 |
|
||||
| SETTLEMENT | 结算金额 |
|
||||
|
||||
### relatedType — 关联单类型
|
||||
|
||||
| 枚举值 | 含义 |
|
||||
|---|---|
|
||||
| PAYMENT | 关联支付单 |
|
||||
| REFUND | 关联退款单 |
|
||||
| SETTLEMENT | 关联结算单 |
|
||||
| CONTRACT | 关联合同单 |
|
||||
|
||||
### title 取值示例(中文,后端生成,不限于此列表)
|
||||
|
||||
创建订单 / 支付订金 / 支付全款 / 确认订单 / 开始出行 / 返团完成 / 出行前取消 / 出行中终止 / 超时自动取消 / 流程推进 / 补全出行信息 / 新增出行人 / 删除出行人 / 批量导入出行人 / 订单信息调整 / 支付尾款 / 配房完成 / 配导游完成 / 配摄影完成 / 配车完成 / 退款到账 / 核单提交 / 结算确认
|
||||
|
||||
---
|
||||
|
||||
## 7. 错误码
|
||||
|
||||
| 错误码 | HTTP 状态 | 说明 | 前端处理建议 |
|
||||
|---|---|---|---|
|
||||
| 200 | 200 | 成功,data 为节点列表(无记录时为空数组 []) | 正常渲染,空数组时展示空状态占位 |
|
||||
| ORDER_NOT_FOUND(4040xxx) | 200 | 订单不存在 | 提示订单不存在 |
|
||||
| 401 | 401 | Token 无效或过期 | 跳转登录 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 示例
|
||||
|
||||
### 8.1 典型成功 — 状态流转节点(支付订金)
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
GET /v3/admin/order/1798000000000000001/status-log
|
||||
Authorization: Bearer <token>
|
||||
```
|
||||
|
||||
**响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": "1798000000000000099",
|
||||
"occurredAt": "2026-06-01T14:30:00",
|
||||
"title": "支付订金",
|
||||
"content": "¥500",
|
||||
"operatorName": "李雯",
|
||||
"fromStatusLabel": "待支付",
|
||||
"toStatusLabel": "定制中",
|
||||
"amount": 500.00,
|
||||
"amountKind": "DEPOSIT",
|
||||
"relatedType": "PAYMENT",
|
||||
"relatedId": "1798000000000000098",
|
||||
"eventType": "DEPOSIT_PAID",
|
||||
"changeType": "STATUS"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 8.2 边界情况 — 数据变更节点(配房完成,fromStatusLabel / toStatusLabel 为 null)
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"msg": "success",
|
||||
"data": [
|
||||
{
|
||||
"id": "1798000000000000103",
|
||||
"occurredAt": "2026-06-02T09:15:00",
|
||||
"title": "配房完成",
|
||||
"content": "拉萨 瑞吉度假酒店 / 林芝 工布庄园希尔顿",
|
||||
"operatorName": "系统",
|
||||
"fromStatusLabel": null,
|
||||
"toStatusLabel": null,
|
||||
"amount": null,
|
||||
"amountKind": null,
|
||||
"relatedType": null,
|
||||
"relatedId": null,
|
||||
"eventType": "ROOM_ASSIGNED",
|
||||
"changeType": "DATA"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
> changeType=DATA 节点:fromStatusLabel / toStatusLabel 恒为 null,前端不渲染状态箭头。
|
||||
|
||||
### 8.3 业务失败 — 订单不存在
|
||||
|
||||
**请求**
|
||||
|
||||
```
|
||||
GET /v3/admin/order/9999999999999999999/status-log
|
||||
Authorization: Bearer <token>
|
||||
```
|
||||
|
||||
**响应**
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 4040001,
|
||||
"msg": "订单不存在",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 9. 业务边界
|
||||
|
||||
**适用场景**
|
||||
|
||||
- 订单详情页「记录」Tab 懒加载,展示完整时间线。
|
||||
- 支持所有订单状态(待支付 / 定制中 / 已确认 / 出行中 / 已完成 / 已取消)查看记录。
|
||||
|
||||
**不适用场景**
|
||||
|
||||
- 不适用于小程序端(该接口为 /v3/admin/*,仅管理后台消费)。
|
||||
- 不适用于批量查询(接口只支持单订单)。
|
||||
|
||||
**特殊边界**
|
||||
|
||||
- 新创建订单若尚无任何操作记录,返回 data: [](空数组),前端 Tab 需有空状态占位。
|
||||
- eventType 为机器字段,后端随业务迭代可能新增新值;前端图标映射表需留 fallback 分支(未知 eventType 显示默认图标),不能写死枚举列表。
|
||||
- DATA 类型节点的 content 在极少数情况下可能为 null,前端展示时须做空判断。
|
||||
- amount 字段仅在有金额关联时有值;DATA 类节点(如配房完成)的 amount 恒为 null。
|
||||
|
||||
---
|
||||
|
||||
## 10. 修改前后对比
|
||||
|
||||
### 字段级对比
|
||||
|
||||
| 旧字段名 | 旧类型 | 旧值示例 | 新字段名 | 新类型 | 新值示例 | 变更类型 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| action | String | "PAY: 支付成功,¥500" | 已删除(拆分) | — | title=支付订金 content=¥500 | ⚠️ 删除 |
|
||||
| operator | String | "李雯" | operatorName | String | "李雯" | ⚠️ 改名 |
|
||||
| fromStatus | String | "PENDING_PAY" | fromStatusLabel | String | "待支付" | ⚠️ 改名+语义变 |
|
||||
| toStatus | String | "PROCESSING" | toStatusLabel | String | "定制中" | ⚠️ 改名+语义变 |
|
||||
| occurredAt | LocalDateTime | "2026-06-01T14:30:00" | occurredAt | LocalDateTime | 不变 | 保留 |
|
||||
| amount | BigDecimal | 500.00 | amount | BigDecimal | 不变 | 保留 |
|
||||
| — | — | — | id | String | "1798000000000000099" | ✨ 新增 |
|
||||
| — | — | — | title | String | "支付订金" | ✨ 新增 |
|
||||
| — | — | — | content | String | "¥500" | ✨ 新增 |
|
||||
| — | — | — | amountKind | String | "DEPOSIT" | ✨ 新增 |
|
||||
| — | — | — | relatedType | String | "PAYMENT" | ✨ 新增 |
|
||||
| — | — | — | relatedId | String | "1798000000000000098" | ✨ 新增 |
|
||||
| — | — | — | eventType | String | "DEPOSIT_PAID" | ✨ 新增 |
|
||||
| — | — | — | changeType | String | "STATUS" | ✨ 新增 |
|
||||
|
||||
### 行为级对比
|
||||
|
||||
| 行为 | 旧版 | 新版 |
|
||||
|---|---|---|
|
||||
| 状态标签语言 | 英文枚举如 PENDING_PAY,前端需自行映射为中文 | 中文标签如待支付,前端直接展示,无需映射 |
|
||||
| 事件描述 | 单个 action 字段拼接如 PAY: 支付成功,¥500,前端需解析 | title(名称)+ content(详情)分离,直接使用 |
|
||||
| list key | 无唯一标识,只能用数组 index | id 字段(雪花 String),可作稳定 list key |
|
||||
| 节点类型区分 | 无,前端无法区分状态流转节点与数据变更节点 | changeType(STATUS/DATA),前端可差异化渲染 |
|
||||
| 金额关联信息 | 仅 amount | amount + amountKind + relatedType + relatedId |
|
||||
|
||||
---
|
||||
|
||||
## 11. 影响评估 / 迁移
|
||||
|
||||
### 破坏兼容
|
||||
|
||||
此次变更为**破坏性变更**,以下旧字段已从响应体移除或改名:
|
||||
|
||||
| 旧字段 | 状态 | 前端必须修改的地方 |
|
||||
|---|---|---|
|
||||
| action | 已删除 | 展示事件名的地方改用 title;展示内容的地方改用 content(可空) |
|
||||
| operator | 已改名为 operatorName | 所有读取 operator 的地方改为 operatorName |
|
||||
| fromStatus | 已改名为 fromStatusLabel | 所有读取 fromStatus 的地方改为 fromStatusLabel;值已中文化,无需再做枚举映射 |
|
||||
| toStatus | 已改名为 toStatusLabel | 所有读取 toStatus 的地方改为 toStatusLabel;值已中文化,无需再做枚举映射 |
|
||||
|
||||
### 前端同步迁移清单
|
||||
|
||||
1. **list key**:将用 index 作为 list key 的地方改为使用 id 字段。
|
||||
2. **事件名展示**:action → 改用 title(直接字符串,后端已生成中文)。
|
||||
3. **事件内容展示**:原从 action 拼串截取的内容 → 改用 content(可空,展示前做空判断)。
|
||||
4. **操作人**:operator → operatorName(字段名替换,值语义不变)。
|
||||
5. **状态标签**:fromStatus / toStatus → fromStatusLabel / toStatusLabel;新值已为中文,删除前端原有枚举映射表逻辑。
|
||||
6. **节点样式分支**:新增 changeType 读取逻辑:
|
||||
- changeType === STATUS:渲染状态流转箭头(fromStatusLabel → toStatusLabel)
|
||||
- changeType === DATA:仅渲染 title + content,不渲染状态标签
|
||||
7. **图标映射**:新增对 eventType 的图标选取逻辑;未知 eventType 值使用默认图标(前端不要写死枚举,需留 fallback)。
|
||||
8. **金额区块**:可利用 amountKind 细化金额标签(订金/全款/退款等),relatedType + relatedId 可用于跳转关联单详情。
|
||||
|
||||
### 前端同步上线
|
||||
|
||||
接口破坏兼容,后端与前端**需协调同步上线**,避免新后端 + 旧前端代码同时在线导致字段取不到值。
|
||||
|
||||
### 回滚方案
|
||||
|
||||
若需回滚,后端恢复旧版 LogTimelineVO(6 字段),前端同步回滚字段引用。接口签名变化不向下兼容,必须同步部署。
|
||||
|
||||
---
|
||||
|
||||
## 12. 注意事项
|
||||
|
||||
1. **fromStatusLabel / toStatusLabel 在 DATA 节点为 null**:前端读取这两个字段前必须判断 changeType === STATUS,避免渲染 null。
|
||||
2. **id 为 String 类型**:雪花 ID 超出 JS Number 精度范围,后端已序列化为字符串。前端直接用字符串处理,不要转 Number,否则精度丢失导致 key 冲突。
|
||||
3. **eventType 不展示给用户**:该字段为机器码,仅用于图标/样式判断逻辑,不应直接渲染在 UI 上。
|
||||
4. **content 可空**:部分节点无内容描述,展示时必须做空判断,避免显示 null 或 undefined。
|
||||
5. **空列表处理**:新订单无操作记录时返回 data: [],记录 Tab 需有空状态占位(如暂无记录)。
|
||||
6. **eventType 可能扩展**:随业务迭代后端可能新增 eventType 值,前端图标映射表必须留 fallback 分支,不能写死枚举列表。
|
||||
7. **删除原有枚举映射**:旧版前端可能维护了 fromStatus / toStatus 英文到中文映射表,新版状态标签已由后端生成中文,该映射表可以删除,避免冗余维护。
|
||||
|
||||
---
|
||||
|
||||
## 13. 关联 / 联系人
|
||||
|
||||
| 项目 | 信息 |
|
||||
|---|---|
|
||||
| 父 Issue | https://git.1814.love:8443/wx/HL/issues/3561 |
|
||||
| PR | https://git.1814.love:8443/wx/HL/pulls/3574 |
|
||||
| Merge Commit | https://git.1814.love:8443/wx/HL/commit/1f93d534fe2073e56f236d6558ba6165706602b5 |
|
||||
| 后端负责人 | yst |
|
||||
正在加载...
x
在新工单中引用
屏蔽一个用户