# 房务待办列表：按订单聚合（一单一行、行内多类型标签）+ 类型字典化（前端必改）

> 模块：房务管家 · 待处理（管理后台）
> 类型：返回结构调整（PR #4587 已合 dev-v3 + 测试服实测）
> 关联工单：#4575
> 日期：2026-06-28

## 背景
房务反馈「同一订单出现多行（『刚抢单待配房』一行 + 『定制师消息未读』一行）」，要求**一个订单只占一行**，把该订单的多个待办分类标签都显示在这一行。

## 返回结构变更（`GET /v3/admin/order/todos`）

`list[]` 粒度由「(订单 × 待办类型) 一行」改为 **「一个订单一行」**，每行新增类型标签数组：

| 字段 | 类型 | 说明 |
|------|------|------|
| `todoTypes` | Array | **本单当前 scope 下全部待办分类标签**（行内渲染多个标签） |
| `todoTypes[].typeCode` | String | 类型码（SWAP_HOTEL / REFUND / HOTEL_REPLY_TIMEOUT / REQUIREMENT_ADJUSTED / INVENTORY_CHECK_OVERDUE / PENDING_ARRANGE / UNREAD_CHAT …） |
| `todoTypes[].typeLabel` | String | **类型中文名（取数据字典 `house_todo_type`）**，前端直接展示 |
| `todoTypes[].urgency` | String | 该标签紧急度 |
| `todoTypes[].derived` | Boolean | true=派生项(刚抢单待配房/定制师消息未读，无 todoId 不可单独 RESOLVE)；false=持久化项 |
| `todoTypes[].todoId` | Long | 持久化待办 ID（derived=false 时有，供 RESOLVE/查看） |
| `todoTypes[].unreadCount` | Integer | UNREAD_CHAT 标签的未读数 |

- 保留 `orderTodoCount` = `todoTypes.size()`（前端原「本单共 N 个待办」可继续用，或直接用 `todoTypes.length`）。
- 行级 `urgency` = 该订单内各标签的最高紧急度（排序仍按此 + 时间）。
- **分页/total 口径改为 distinct 订单数**（不再是待办行数）。前端分页器按此对齐。
- 「核房超期」(INVENTORY_CHECK_OVERDUE，酒店维度无 orderId) 仍独立成行。

## 前端必改
1. 每行渲染 `todoTypes[]` 多个分类标签（中文 `typeLabel`），不再一订单多行。
2. 操作入口按 `todoTypes[].derived`/`todoId` 区分：派生标签（刚抢单待配房/消息未读）走对应跳转、不可 RESOLVE；持久化标签带 todoId 可 RESOLVE/查看。
3. 分页 total 改读新的 distinct 订单口径。

## 顺带（前端自查）
顶部说明文案「共 N 件待办 · 换酒店/核房超期/退订/询房 · 完成订单前置工作后自动解除」是前端硬编码旧文案，且「共 N 件」此前按旧枚举子集求和导致显示 0。请按新流程更新文案，「共 N 件」改为对聚合后 list/stats 全量统计。

## 测试服实测
- 同订单「酒店超时未回复 + 刚抢单待配房」聚合为一行、todoTypes 2 个中文标签、orderTodoCount=2、total=distinct 订单数。
