# 车务订单聊天(定制师 ↔ 车务团队,基于订单)——新增 open-fleet 接口 + 车管控制台接入

> 模块：管理后台 · 车管控制台 · 订单聊天
> 类型：**后端新增(已合并 dev-v3 + 部署测试服 + API 实测)** + 前端接入
> 日期：2026-07-01 · 关联 PR #4690(聊天本体)+ #4698(看板列表红点+数字 orderId) / 工单 #4689 + #4695
> 说明：车务聊天是**房务订单聊天的团队化镜像**——会话键 `FLEET:{orderId}`,与房务 `HOUSE:{orderId}` 同构,大部分聊天接口**复用**。

## 模型
- 会话键 `FLEET:{orderId}`(一个订单一个车务会话)。
- 两端：该订单**定制师** ↔ **车务团队**(多车务、无抢单、任一车务可参与任一订单);**双向**发起。
- 未读=**团队共享**:定制师发消息→全体车务在该单亮红点;**任一车务读→红点对全体车务清零**;车务之间的回复不计入红点(只数定制师发的)。

## 【前端 · 车管控制台】

### 1. 打开车务订单会话(核心新接口)
`POST /admin/message/chat/open-fleet`
body:`{"orderId": 2071784830965620737}`(必填;可选 `peer`)
返回 `ChatOpenFullRespVO`(与房务 open-house 同结构):`conversationKey`(=`FLEET:{orderId}`)、`isNew`、`peerName`/`peerRole`、`order`(订单卡:orderNo/customerName/productName/…)、`thread`(首屏消息,最新一页)、`unreadCount`/`unreadTotal`;**打开即标记已读**。
- 车务点「联系定制师」→ 用它开会话(peer 自动=该单定制师)。
- 定制师点「联系车务」→ 也用它(peer=车务团队)。

### 2. 复用的通用聊天接口(与房务同,FLEET 会话直接用)
- 发消息:`POST /admin/message/chat/{conversationKey}/messages` body `{"content":"..."}`
- 拉历史(上滑分页):`GET /admin/message/chat/{conversationKey}/messages?pageSize=20&beforeId=...`
- 标记已读:`POST /admin/message/chat/{conversationKey}/read`(open-fleet 已自动标已读,一般无需单独调)
- 会话列表(定制师侧看到 FLEET 会话):`GET /admin/message/chat/conversations`
- `conversationKey` 即 `FLEET:{orderId}`,路径里带冒号原样传(已实测可用)。

### 3. 消息角色徽章
- 车务回复:`senderRole=FLEET`。
- **定制师广播:`senderRole=null`**(团队会话无单一收件人的历史设计)。前端在 FLEET 会话内**按「非 FLEET 即定制师」渲染徽章**(有 `senderName` 可显示姓名)。

## 【订单列表红点——已落地(PR #4698 / 工单 #4695)】
车管控制台订单列表 = **派单看板列表** `GET /admin/fleet/board/orders`(原型「联系定制师+红点」按钮挂在从该列表打开的派车弹窗,按 order.id 取未读)。已照房务 `grab-pool` 既定模式在该端点**服务端注入**,前端直接读每行字段,无需自己调 internal 接口:

### 派单看板列表行 `BoardOrderRecordVO` 新增 2 字段
- **`orderId`**(String·数字雪花):该单数字订单 id。⚠️ 原有 `id` 是**展示号**(如 `HL20260627115248778`),**不能**当会话键;前端开车务会话 `open-fleet`(会话键 `FLEET:{orderId}`)、行内红点都用这个 `orderId`。
- **`unreadMessageCount`**(Integer):本单**车务团队共享**未读数(定制师发未读→全体车务该行亮红点;任一车务读→全体清零;车务之间回复不计)。默认 0;user-service 不可达时软降级为 0,不影响列表。

前端车管控制台订单列表/派车弹窗直接:行 `unreadMessageCount>0` 显红点(`>9` 显 `9+`)、点「联系定制师」用行 `orderId` 调 `open-fleet`。矩阵/其它订单视图如需同款红点,拿到 `orderId` 后走同一 `open-fleet`/未读机制即可(看板列表是主入口,已透出)。

## 已验证
- open-fleet 实测:200 + 订单卡(HL20260630103610215·吕思远·游牧的森林-短途版)+ 会话三行(车务→定制师 / 定制师→团队 / admin_id=0 团队共享水位行)。
- 车务发消息→定制师收到(unread+1);车务读→团队共享水位推进(任一车务读全体清零)。
- 单测 user-service 3099 绿(房务基线零回归)。
- **看板列表红点(PR #4698)实测**:`/admin/fleet/board/orders` 74 单每行含 `orderId`(真数字雪花)+ `unreadMessageCount`;定制师向某单广播一条→重查该行 `unreadMessageCount=1`(团队未读联动看板);user-service 软降级路径不阻断列表。fleet-service 全量 1307 测试绿、ArchTest 11/11。

