---
schema: "hl-changelog/v2"
ticket: "frontend"
title: "派单弹窗需求信息展示补全：Step1 缺结构化车型语句、Step2 缺特殊诉求与文字备注（后端字段已全部就绪）"
consumer: "admin"
change_type: "前端缺陷"
author: "wx(GIT)"
backend_status: "not_required"
gateway_status: "not_required"
frontend_status: "implemented"
frontend_owner: "mmg"
frontend_ref: "a18e9db9"
target_release: ""
verified_at: "2026-08-11"
status_note: "前端已实现(2026-08-11,mmg,a18e9db9):三块同源当前生效需求原样渲染不自拼。Step1OrderDetail 用车备注块补 requirementFleetText 车型语句行(纳入 hasVehicleNotes 空态,null 不渲染该行);AssignModal Step2 底部当前需求块抽 RequirementFleetSummary.vue(车型语句+specialTags 中文标签直渲+requirementRemark 备注,空数组/falsy 各不渲染)。step1-order-detail.spec +2、新建 requirement-fleet-summary.spec 4 用例,checkpoint 精确文件集全过。"
updated_at: "2026-08-11"
base: "dev-v3"
---

# 派单弹窗需求信息展示补全（原 #5848 → 转前端）

> **页面**：车务管理 → 派单看板 → 订单派车弹窗
> **后端**：**零改动**。三块信息早已在同一份详情响应里返回，只是前端两处各渲染了一半。

---

## 一、现状：两处各缺一半

| 位置 | 现在显示 | 缺什么 |
|------|---------|--------|
| **Step1「订单详情」→ 定制师/用车备注**区块 | 只有文字备注（例：`用车备注 杨子墨6人suv*2`） | **缺结构化车型语句** |
| **Step2「排车」→ 底部「当前需求」**区块 | 只有结构化语句（例：`当前需求：SUV7座×1 + 商务车7座×1`） | **缺通用特殊诉求 + 文字备注** |

wx 的要求：**两处都要同时展示「结构化车型语句 + 通用特殊诉求 + 文字备注」三块完整信息**。车管在 Step2 排车时最需要看到「要儿童座椅」「要中文司机」这类诉求，现在只能看到车型数量。

---

## 二、数据来源：一个接口、一份响应、三个字段

**两处同源**——Step1 和 Step2 用的是**同一个 order 对象**，来自同一次请求：

```
GET /admin/fleet/board/orders/{orderId}
Authorization: Bearer <admin token>
（无请求体）
```

响应 `data` 里三个字段：

| 字段 | 类型 | 是否可空 | 说明 |
|------|------|---------|------|
| `requirementFleetText` | `String` | **可为 null** | 后端拼好的**结构化车型整句**，如 `SUV7座×1 + 商务车7座×1` |
| `specialTags` | `List<String>` | **恒为数组**（无诉求时 `[]`） | 通用特殊诉求，**值本身就是中文标签** |
| `requirementRemark` | `String` | **可为 null** | 文字备注 / 其他诉求 |

> `requirements` 是 `requirementRemark` 的**兼容别名**（同值），新代码请用 `requirementRemark`。

### 测试环境实测（2026-08-11，26-3698）

```json
{
  "code": 200,
  "message": "成功",
  "data": {
    "requirementFleetText": "SUV7座×1 + 商务车7座×1",
    "specialTags": ["含高速油费"],
    "requirementRemark": "和法国飞行速度",
    "requirements": "和法国飞行速度",
    "plannerNote": null
  }
}
```

---

## 三、三个字段的使用口径（重要）

### 1. `requirementFleetText` —— **原样渲染，禁止自行拼装**

整句由后端统一拼好，格式是 #5817 定的「车队组成写法」：**座位内联 + 加号连接**。

```
SUV7座×1 + 商务车7座×1
```

规则（后端已实现，前端不需要复刻）：
- 缺座位时省略座位：`SUV×2 + 商务车7座×1`
- 车型未知时回退原始值
- 需求为空或 `fleet` 为空 → 返回 **`null`**（整块不渲染）

⚠️ **禁止**用 `vehicleSlots[].requiredVehicleTypeLabel` 或 `requiredVehicles` 自己聚合拼这句话——那些是**派单行的历史快照**，需求换版后是**陈旧值**（会显示成换版前的旧车型）。只有 `requirementFleetText` 是当前生效需求的权威值。

### 2. `specialTags` —— **直接渲染，不要查字典翻译**

数组里的值**本身就是中文标签**（后端字典 `vehicle_special_demand` 的 `dict_value` 与 `dict_label` 有意保持一致），直接当 tag 渲染即可：

```
["儿童安全座椅", "大行李空间", "中文司机", "老司机(5年以上)", "含高速油费", "静音车型", "有WiFi"]
```

恒为数组，`length === 0` 时不渲染该块。

### 3. `requirementRemark` —— 自由文本

可能为 `null`，判 falsy 时不渲染。

---

## 四、前端要做的两件事

### 1. Step1「定制师/用车备注」区块 —— 补车型语句

在现有的 `plannerNote` / `requirementRemark` / `specialTags` 之外，增渲染 `order.requirementFleetText`（原样输出）。`null` 时不显示该行。

### 2. Step2 底部「当前需求」区块 —— 补诉求与备注

在现有的 `requirementFleetText` 之后，补上：
- `order.specialTags` → tag 列表（空数组不渲染）
- `order.requirementRemark` → 文本（null 不渲染）

---

## 五、版本一致性（验收项，后端已保证）

「两处展示的三块信息来自同一版当前生效需求，不串版本」这一条**后端天然满足**：

三个字段全部出自**同一个当前生效需求对象**（`is_active=1` 且 version 最大的那一版），一次取数、一起下发。前端只要都从这份响应取值，就不可能串版本。

反之，如果前端从 `vehicleSlots` 或 `requiredVehicles` 自己聚合，就会踩到派单行的陈旧快照——见上文第三节的警告。

---

## 六、空态汇总

| 场景 | 后端返回 |
|------|---------|
| 无生效需求 / 需求不可达 | `requirementFleetText: null`、`specialTags: []`、`requirementRemark: null` |
| `fleet` 为空数组或解析失败 | `requirementFleetText: null` |
| 无特殊诉求 | `specialTags: []`（**不是 null**） |
| 无备注 | `requirementRemark: null`（不转空串） |

整块判空规则：整句 `null` → 不渲染该行；tags `length === 0` → 不渲染；备注 falsy → 不渲染。**不要出现空白区块或字面量 `null`。**

---

## 七、关联

- 原后端工单 #5848（已关单，判定为纯前端渲染缺口）
- 车型语句格式定义：#5817 / `11_5810b_需求车型语句改车队组成写法-修改接口-管理后台.md`
- 陈旧快照坑的成因：#5871（换版后派单行 `required_vehicle_type` 不刷新）
