Files
wecom_it_smart_desk/docs/02-产品需求/会议室预定-小鱼易联终端-PRD.md
T
Simon bea288e414 feat: 2026-07-11 全量更新 - 代办集成+会议室预定+知识迭代修复+UI统一+Bug修复
== 已部署上线 (9项) ==
- 代办事项真实数据源集成 (企微审批API 8bug修复链)
- H5/坐席端 Logo样式统一+绿色背景
- 视频引导页修复 (localStorage key v2)
- 坐席端 v9 Vue版本修复 (ElMessage._context)
- 截图按钮 v10 修复 (getDisplayMedia user gesture)
- 扫码样式恢复+H5扫码登录跳转修复
- H5截图快捷键提示

== 代码完成待部署 (3项) ==
- 知识迭代3Bug修复 (#8 POST端点/#7 MERGE幂等/#6 过期检查)
- 会议室预定-小鱼易联终端 (40文件, 40/40测试通过)
- IT资产升级审批推送 (asset_service.py)

== 需求文档 (2项) ==
- 坐席端AI辅助消息框-PRD (4项新功能确认)
- 坐席端布局优化建议 v2.0 (7天计划)

== 新增文档 ==
- 日报-2026-07-11.md
- 知识迭代Bug修复报告-20260711.md
- 会议室预定-部署指南.md
- CHANGELOG.md 更新

== 测试 ==
- test_todo_integration.py: 40/40
- test_meetingroom.py: 40/40
- test_bugfix_ki_suggestions.py: 21/21
2026-07-11 23:13:10 +08:00

577 lines
36 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 会议室预定 — 小鱼易联终端 PRD
> **版本**: v1.0
> **日期**: 2026-07-15
> **作者**: 许清楚 (Xu) · 产品经理
> **状态**: 待评审
> **所属项目**: `wecom_it_smart_desk` — IT智能服务台
---
## 1. 项目信息
| 字段 | 值 |
|------|-----|
| **项目名称** | `meetingroom_booking` |
| **技术栈** | 终端页面: Vue3 + Tailwind CSS(横屏大屏适配)/ 后端: FastAPI + SQLAlchemy + PostgreSQL + Redis / 企微API: 会议室预定管理 + 会议室管理 / 小鱼易联: 终端管理API + Web SDK |
| **语言** | 中文 |
| **集成范围** | 小鱼易联终端定制页面 + 企微会议室预定API + 小鱼易联终端管理API |
| **UI风格** | 深色主题(适配会议室大屏),大字号触控交互,accent = #07C160(企微绿) |
### 原始需求复述
税友集团IT支持组希望通过小鱼易联终端(安装在会议室的物理大屏设备)实现会议室预定功能。核心诉求:
1. 在小鱼易联终端上定制页面,集成企微自定义应用中的会议室预定能力
2. 员工可通过H5/企微/终端页面多入口自助预定,预定结果同步到小鱼易联终端显示
3. 有小鱼易联API文档+开发者账号,企微侧也有会议室API可对接
### 架构决策(初步方案)
采用**企微会议室API为数据源 + 小鱼易联终端为展示端 + 现有后端为中间层**的架构:
```
┌─────────────────────────────────────────────────────────────────────┐
│ 系统架构概览 │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ 企微H5端 │ │ 企微客户端App │ │ 小鱼易联终端(大屏) │ │
│ │ (Vant4) │ │ (会议室入口) │ │ (Vue3+Tailwind) │ │
│ └─────┬────┘ └──────┬───────┘ └──────────┬───────────┘ │
│ │ │ │ │
│ └────────┬────────┘ │ │
│ │ │ │
│ ┌──────▼───────────────────────────────▼──────┐ │
│ │ 现有后端 (FastAPI + Redis) │ │
│ │ │ │
│ │ ┌─────────────┐ ┌──────────────────┐ │ │
│ │ │ 会议室API │ │ 终端管理API │ │ │
│ │ │ (企微对接) │ │ (小鱼易联对接) │ │ │
│ │ └──────┬──────┘ └────────┬─────────┘ │ │
│ └─────────┼─────────────────┼─────────────┘ │
│ │ │ │
│ ┌─────────▼─────┐ ┌────────▼──────────┐ │
│ │ 企微会议室API │ │ 小鱼易联开放平台 │ │
│ │ (get_booking │ │ (终端管理/SDK) │ │
│ │ book/cancel) │ │ │ │
│ └───────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
```
**关键设计决策**
- 企微会议室API为**唯一数据源**single source of truth),不在本地维护独立的预定数据
- 后端作为中间层:代理企微API调用(处理鉴权/限流/缓存),同时对接小鱼易联终端管理
- 终端页面通过浏览器/WebView运行,与后端通过REST API + WebSocket通信
---
## 2. 产品定义
### 2.1 产品目标
| # | 目标 | 衡量标准 |
|---|------|---------|
| G1 | **终端可视化会议室状态**:在会议室物理大屏上实时显示当前会议室的预定状态、即将到来的会议、空闲时段,让路过的人一眼看到是否可用 | 终端页面打开后3秒内显示完整状态;状态更新延迟不超过30秒 |
| G2 | **多入口自助预定闭环**:员工可通过企微H5、企微客户端、终端大屏三个入口完成「查看空闲→预定→取消」全流程,预定结果三端同步 | 任意入口预定后,其他入口在30秒内显示更新;预定操作完成时间不超过15秒 |
| G3 | **与现有IT智能服务台无缝集成**:会议室预定作为IT智能服务台的新功能模块复用现有后端基础设施(鉴权/Redis/企微对接),不引入新的独立服务 | 复用现有Settings配置体系和数据库连接;新增代码以模块化方式集成到`backend/app/`,不破坏现有功能 |
### 2.2 用户故事
| # | 角色 | 用户故事 |
|---|------|---------|
| US-1 | 普通员工 | **As a** 员工, **I want** 在会议室门口的大屏上看到当前会议室是否空闲、下一个会议什么时候开始, **so that** 我不用打开手机就能判断能否临时使用这个会议室 |
| US-2 | 普通员工 | **As a** 员工, **I want** 在终端大屏上直接点击空闲时段完成预定, **so that** 临时开会时不用掏手机操作,30秒内就能预定成功 |
| US-3 | 普通员工 | **As a** 员工, **I want** 在企微H5端或企微客户端查看所有会议室的空闲状态并预定, **so that** 在回到会议室之前就提前预定好,到场直接使用 |
| US-4 | 普通员工 | **As a** 员工, **I want** 预定后能随时取消(通过终端或企微), **so that** 会议取消后及时释放会议室资源 |
| US-5 | IT管理员 | **As a** IT管理员, **I want** 在管理后台查看所有会议室的预定情况和使用率统计, **so that** 能识别热门/冷门会议室,优化资源配置 |
| US-6 | IT管理员 | **As a** IT管理员, **I want** 将会议室与小鱼易联终端设备绑定(SN映射), **so that** 终端自动显示对应会议室的状态 |
| US-7 | 访客 | **As a** 访客, **I want** 在终端大屏上看到会议室名称和当前状态(无需登录即可查看), **so that** 找会议室时能快速确认位置 |
---
## 3. 需求池(P0/P1/P2
### P0 — 必须实现(Must Have
#### P0-1 企微会议室API对接 — access_token管理
| 项 | 说明 |
|------|------|
| **需求** | 在现有`WecomService`中新增会议室专用access_token管理。企微会议室API需要独立的"会议室"secret获取access_token(不同于普通应用secret和通讯录secret |
| **实现** | 在`config.py`中新增`wecom_meetingroom_secret`配置项;在`WecomService`中新增`get_meetingroom_access_token()`方法,复用Redis缓存模式(key: `wecom:meetingroom_access_token`TTL: 6900秒) |
| **验收** | 能成功获取会议室access_token;token缓存命中时不重复请求企微接口;token过期前自动刷新 |
#### P0-2 会议室列表查询接口
| 项 | 说明 |
|------|------|
| **需求** | 后端新增API`GET /api/meetingroom/list`,代理调用企微会议室列表接口`POST /cgi-bin/oa/meetingroom/list`,返回会议室列表(ID、名称、容量、位置、设备、是否需要审批) |
| **缓存** | 会议室列表变化频率低,Redis缓存10分钟 |
| **验收** | 返回完整的会议室信息;支持按城市/楼宇/楼层过滤;缓存失效后自动刷新 |
#### P0-3 会议室预定状态查询接口
| 项 | 说明 |
|------|------|
| **需求** | 后端新增API`GET /api/meetingroom/{meetingroom_id}/booking?date=YYYY-MM-DD`,代理调用企微`POST /cgi-bin/oa/meetingroom/get_booking_info`,返回指定会议室在指定日期的预定情况列表 |
| **限制** | 企微API不支持跨天查询,后端按日期维度封装 |
| **缓存** | 缓存30秒(保证实时性同时减少API调用) |
| **验收** | 返回预定列表(booking_id、start_time、end_time、booker、status);时间戳转为可读时间格式 |
#### P0-4 预定会议室接口
| 项 | 说明 |
|------|------|
| **需求** | 后端新增API`POST /api/meetingroom/book`,代理调用企微`POST /cgi-bin/oa/meetingroom/book` |
| **参数** | meetingroom_id、subject(会议主题)、start_time、end_time、booker(预定人userid)、attendees(参与人列表,可选) |
| **限制** | 时间自动按30分钟取整;仅可预定无需审批的会议室 |
| **验收** | 预定成功返回booking_id;时间冲突时返回明确错误信息;预定成功后立即清除该会议室的状态缓存 |
#### P0-5 取消预定接口
| 项 | 说明 |
|------|------|
| **需求** | 后端新增API`DELETE /api/meetingroom/booking/{booking_id}`,代理调用企微`POST /cgi-bin/oa/meetingroom/cancel_book` |
| **参数** | booking_id、meetingroom_id(企微取消接口需要booking_id即可,但查询需要meetingroom_id+booking_id |
| **验收** | 取消成功返回确认;取消后立即清除缓存;非预定人取消时返回权限错误 |
#### P0-6 终端页面 — 会议室状态展示
| 项 | 说明 |
|------|------|
| **需求** | 新建前端项目(或模块)`frontend-terminal`,使用Vue3 + Tailwind CSS,为小鱼易联终端大屏定制横屏页面 |
| **页面** | 终端状态页:全屏显示当前绑定的会议室名称、当前状态(空闲/使用中)、当前进行中的会议信息、时间轴展示当日预定情况 |
| **适配** | 1920×1080横屏适配;大字号(标题48px+,正文24px+);深色主题减少大屏眩光 |
| **验收** | 页面在终端浏览器/WebView中正常渲染;3秒内加载完毕;空闲/使用中状态视觉区分明显 |
#### P0-7 终端页面 — 快速预定
| 项 | 说明 |
|------|------|
| **需求** | 终端页面支持点击时间轴上的空闲时段进行快速预定 |
| **交互** | 点击空闲时段→弹出预定面板(输入会议主题、选择时长)→确认预定→显示预定结果→3秒后返回状态页 |
| **鉴权** | 终端预定时需要身份识别:扫码登录(企微扫码)或输入工号+姓名(访客模式仅查看,不可预定) |
| **验收** | 30分钟以内的空闲时段可一键预定;预定结果实时显示在终端页面上 |
#### P0-8 终端-会议室绑定关系管理
| 项 | 说明 |
|------|------|
| **需求** | 后端新增`terminal_room_binding`表,存储小鱼易联终端SN与企微会议室ID的映射关系 |
| **字段** | terminal_sn(终端序列号)、meetingroom_id(企微会议室ID)、terminal_name(终端名称)、location(位置描述)、created_at、updated_at |
| **管理** | 管理后台CRUD接口:`GET/POST/PUT/DELETE /api/admin/terminal-bindings` |
| **验收** | 支持一个终端绑定一个会议室;绑定后终端页面自动加载对应会议室的状态 |
### P1 — 应该实现(Should Have
#### P1-1 实时状态同步 — WebSocket推送
| 项 | 说明 |
|------|------|
| **需求** | 当会议室预定状态发生变化时(预定/取消),通过WebSocket实时推送到绑定的终端页面 |
| **方案** | 复用现有WebSocket基础设施(`ws.py`),新增终端WS端点`/ws/terminal/{terminal_sn}`。状态变更触发时:①清除Redis缓存 ②向已连接的终端推送状态更新消息 |
| **降级** | WebSocket不可用时,终端页面降级为30秒轮询 |
| **验收** | 一个入口预定后,其他入口的终端在5秒内显示更新;WS断线后自动降级为轮询 |
#### P1-2 企微回调 — 预定变更通知
| 项 | 说明 |
|------|------|
| **需求** | 配置企微事件回调,当会议室预定状态发生变化(企微客户端预定/取消/审批通过)时接收通知,主动刷新缓存并推送WS消息 |
| **回调** | 企微回调URL配置在管理后台,接收事件后调用`get_booking_info`刷新缓存 |
| **验收** | 企微客户端预定后,终端在10秒内收到更新(含回调延迟) |
#### P1-3 多会议室切换
| 项 | 说明 |
|------|------|
| **需求** | 终端页面支持查看其他会议室的状态(点击侧边栏/下拉选择) |
| **交互** | 顶部会议室名称可点击→弹出会议室选择列表(显示名称+位置+实时状态)→选择后切换显示 |
| **验收** | 切换后3秒内加载目标会议室状态;支持按楼宇/楼层筛选 |
#### P1-4 终端页面 — 会议详情展示
| 项 | 说明 |
|------|------|
| **需求** | 点击时间轴上的已预定时段,展示会议详情(主题、预定人、参与人、时间) |
| **限制** | 终端仅展示预定人姓名(不展示userid),参与人列表最多显示5人 |
| **验收** | 点击后弹出详情面板;信息来源为企微`bookinfo/get`接口 |
#### P1-5 H5端会议室预定页面
| 项 | 说明 |
|------|------|
| **需求** | 在现有H5端(Vue3 + Vant4)新增会议室预定页面,员工可在手机上查看所有会议室状态并预定 |
| **入口** | H5端首页新增「会议室」入口卡片 |
| **功能** | 会议室列表→选择会议室→查看时间轴→选择空闲时段→预定/取消 |
| **验收** | 移动端交互流畅;预定结果同步到终端和企微客户端 |
#### P1-6 小鱼易联终端管理API集成
| 项 | 说明 |
|------|------|
| **需求** | 通过小鱼易联开放平台API实现终端设备管理:根据终端SN查询设备状态、推送自定义页面URL到终端 |
| **接口** | 小鱼易联API基础URL`https://sdk.xylink.com/api/rest/external/v1/`,使用enterpriseId + token鉴权(支持签名1.0/2.0 |
| **功能** | ① 终端注册时自动上报SN ② 管理后台可远程推送页面URL到指定终端 ③ 查询终端在线状态 |
| **验收** | 能通过API查询终端在线状态;能远程推送页面URL |
### P2 — 可以实现(Nice to Have
#### P2-1 会议室使用统计报表
| 项 | 说明 |
|------|------|
| **需求** | 管理后台提供会议室使用率统计:按会议室/日期/时段统计预定时长、实际使用时长、空闲率 |
| **数据来源** | 每日定时拉取预定记录存入本地数据库(作为统计快照,非实时数据源) |
| **验收** | 支持按周/月查看统计图表;支持导出Excel |
#### P2-2 会议室维护模式
| 项 | 说明 |
|------|------|
| **需求** | 管理员可将会议室设为"维护中"状态,终端页面显示维护提示,禁止预定 |
| **实现** | 本地维护状态表,终端查询时叠加本地状态判断 |
| **验收** | 维护模式下终端显示维护提示;恢复后自动恢复预定功能 |
#### P2-3 终端页面 — 会议提醒
| 项 | 说明 |
|------|------|
| **需求** | 会议开始前5分钟,终端页面弹出提醒(如有下一个会议即将开始) |
| **验收** | 提醒动画醒目但不影响当前操作;5分钟后自动消失 |
#### P2-4 终端页面 — 二维码预定
| 项 | 说明 |
|------|------|
| **需求** | 终端页面显示企微预定二维码,员工可扫码后在手机上完成预定 |
| **验收** | 二维码指向H5端预定页面(带会议室ID参数);扫码后自动选中当前会议室 |
#### P2-5 小鱼易联Web SDK — 视频会议集成
| 项 | 说明 |
|------|------|
| **需求** | 预定会议后,可在终端上一键发起小鱼易联视频会议,将会议链接关联到企微预定记录 |
| **SDK** | `@xylink/xy-rtc-sdk`,初始化需要clientId + clientSecret + extId(企业ID |
| **验收** | 终端可发起视频会议;会议信息关联到企微日程 |
---
## 4. UI设计稿(文字描述)
### 4.1 终端状态页(主页面)
```
┌─────────────────────────────────────────────────────────────────────────────┐
│ 📍 18F-会议室A 2026-07-15 周三 14:32 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ ┌──────────────┐ │
│ │ │ │
│ │ 空闲中 │ ← 当前状态(大字 96px) │
│ │ │ │
│ └──────────────┘ │
│ │
│ 距下一个会议:28分钟 │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ 今日日程 14:32 ▮ │ │
│ │ ┌─────────┐ ┌──────────────┐ ┌──────────────────┐ ┌──────────┐ │ │
│ │ │ 09:00 │ │ 10:00 │ │ 14:00 │ │ 15:00 │ │ │
│ │ │ ~ 10:00 │ │ ~ 11:30 │ │ ~ 15:00 ← 进行中 │ │ ~ 16:00 │ │ │
│ │ │ 周度例会 │ │ 产品评审 │ │ 技术方案讨论 │ │ 空闲可预定│ │ │
│ │ │ 张三 │ │ 李四 │ │ 王五 │ │ 点击预定 │ │ │
│ │ └─────────┘ └──────────────┘ └──────────────────┘ └──────────┘ │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ [ 📱 扫码预定 ] [ 🔄 切换会议室 ] [ ❓ 使用帮助 ] │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
```
**设计要点**
- **深色主题**:背景 `#1a1a2e`,卡片 `#16213e`,减少大屏眩光
- **状态色**:空闲 = `#07C160`(企微绿),使用中 = `#FF6B6B`(红色),即将开始 = `#FFA502`(橙色)
- **字体**:当前状态 96px,会议室名称 36px,时间轴 20px,操作按钮 24px
- **时间轴**:横向滚动,每个时段卡片宽度固定,当前时间用竖线标记
- **空闲时段**:显示「点击预定」提示,可点击
- **已预定时段**:显示会议主题和预定人,不可点击(仅查看)
### 4.2 快速预定弹窗
```
┌───────────────────────────────────┐
│ 📅 预定会议室 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ 会议室:18F-会议室A │
│ 时段:15:00 ~ 15:30 │
│ │
│ 会议主题: │
│ ┌─────────────────────────────┐ │
│ │ 请输入会议主题 │ │
│ └─────────────────────────────┘ │
│ │
│ 时长: │
│ [ 30分钟 ] [ 60分钟 ] [ 90分钟 ] │
│ [ 自定义 ] │
│ │
│ 预定人:张三(扫码登录) │
│ │
│ ┌─────────────┐ ┌──────────────┐ │
│ │ 取消 │ │ 确认预定 │ │
│ └─────────────┘ └──────────────┘ │
└───────────────────────────────────┘
```
### 4.3 交互流程
```
终端页面加载
├── 读取终端SN → 查询绑定关系 → 获取meetingroom_id
│ └── 无绑定 → 显示「请联系IT管理员绑定会议室」提示页
├── 获取会议室信息 + 当日预定状态
│ └── 加载失败 → 显示错误页面 + 重试按钮
├── 渲染状态页
│ ├── 空闲 → 显示「空闲中」+ 时间轴空闲时段可点击
│ └── 使用中 → 显示「使用中」+ 当前会议信息
├── 用户点击空闲时段
│ ├── 未登录 → 弹出企微扫码登录二维码
│ │ └── 扫码成功 → 获取userid → 进入预定弹窗
│ └── 已登录 → 直接进入预定弹窗
├── 确认预定
│ ├── 调用后端API → 企微book接口
│ ├── 成功 → 显示「预定成功」动画 → 3秒后返回状态页(状态已更新)
│ └── 失败 → 显示错误原因(冲突/权限/网络) → 返回预定弹窗
└── 实时更新
├── WebSocket连接 → 收到状态变更 → 刷新页面
└── WebSocket断线 → 降级为30秒轮询
```
### 4.4 H5端预定页面
```
┌─────────────────────────┐
│ ← 会议室预定 │
│ ━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ 📍 选择会议室 │
│ ┌───────────────────┐ │
│ │ 18F-会议室A 10人 │ │
│ │ ● 空闲 │ │
│ └───────────────────┘ │
│ ┌───────────────────┐ │
│ │ 18F-会议室B 20人 │ │
│ │ ● 使用中 │ │
│ └───────────────────┘ │
│ │
│ 📅 2026-07-15 │
│ ┌───────────────────┐ │
│ │ 时间轴(纵向) │ │
│ │ 09:00 ████████ │ │
│ │ 10:00 ████████ │ │
│ │ 11:00 ░░░░░░░░ │ │
│ │ 14:00 ████████ │ │
│ │ 15:00 ░░░░░░░░ │ │
│ │ 16:00 ░░░░░░░░ │ │
│ └───────────────────┘ │
│ │
│ [ + 预定空闲时段 ] │
└─────────────────────────┘
```
### 4.5 管理后台 — 终端绑定管理
```
┌─────────────────────────────────────────────────────────────┐
│ 会议室管理 > 终端绑定 │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ │
│ [+ 新增绑定] [搜索: ___________] │
│ │
│ ┌────────┬──────────┬──────────┬──────────┬────────────┐ │
│ │ 终端SN │ 终端名称 │ 会议室 │ 位置 │ 操作 │ │
│ ├────────┼──────────┼──────────┼──────────┼────────────┤ │
│ │ XY001 │ 大屏A │ 18F-会议室A│ 18F东区 │ 编辑 删除 │ │
│ │ XY002 │ 大屏B │ 18F-会议室B│ 18F西区 │ 编辑 删除 │ │
│ │ XY003 │ 大屏C │ 19F-会议室C│ 19F东区 │ 编辑 删除 │ │
│ └────────┴──────────┴──────────┴──────────┴────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
---
## 5. 技术规范
### 5.1 企微会议室API对接
| API | 企微接口 | 方法 | 说明 |
|-----|---------|------|------|
| 会议室列表 | `POST /cgi-bin/oa/meetingroom/list` | `WecomService.get_meetingroom_list()` | 缓存10分钟 |
| 预定状态查询 | `POST /cgi-bin/oa/meetingroom/get_booking_info` | `WecomService.get_booking_info()` | 缓存30秒 |
| 预定会议室 | `POST /cgi-bin/oa/meetingroom/book` | `WecomService.book_meetingroom()` | 成功后清缓存 |
| 取消预定 | `POST /cgi-bin/oa/meetingroom/cancel_book` | `WecomService.cancel_booking()` | 成功后清缓存 |
| 预定详情 | `POST /cgi-bin/oa/meetingroom/bookinfo/get` | `WecomService.get_booking_detail()` | 缓存5分钟 |
**access_token管理**
- 企微会议室API需要独立的"会议室"secret获取access_token
-`config.py`新增`wecom_meetingroom_secret`配置项
-`WecomService`中新增`get_meetingroom_access_token()`方法
- Redis缓存key: `wecom:meetingroom_access_token`TTL: 6900秒(提前300秒刷新)
- 参考现有`get_access_token()``_contact_token_cache`的实现模式
**企微API限制**
- 预定时间自动按30分钟取整(15:15→15:0015:45→16:00
- 仅可预定无需审批的会议室(`need_approval=0`
- `get_booking_info`不支持跨天查询,后端按日期维度封装
- 当前时间超过预定开始时间15分钟后不允许预定
- 会议室设备类型:1=电视, 2=电话, 3=投影, 4=白板, 5=视频
**官方文档**
- 会议室管理:https://developer.work.weixin.qq.com/document/path/93619
- 会议室预定管理:https://developer.work.weixin.qq.com/document/path/93620
### 5.2 小鱼易联终端管理API对接
| 能力 | 接口 | 说明 |
|------|------|------|
| 鉴权 | enterpriseId + token | 支持1.0signature)和2.0两种签名方式 |
| 终端管理 | `https://sdk.xylink.com/api/rest/external/v1/` | 根据SN或终端号管理设备配置 |
| 终端状态查询 | 终端管理API | 查询终端在线状态 |
| Web SDK | `@xylink/xy-rtc-sdk` | 初始化需要clientId + clientSecret + extId(企业ID |
**配置项**(新增到`config.py`):
- `xylink_enterprise_id`:小鱼易联企业ID
- `xylink_client_id`SDK客户端ID
- `xylink_client_secret`SDK客户端密钥
- `xylink_api_base`API基础URL(默认`https://sdk.xylink.com/api/rest/external/v1/`
**官方文档**https://openapi.xylink.com/
### 5.3 后端新增文件结构
```
backend/app/
├── api/
│ ├── meetingroom.py # 会议室预定API路由
│ └── admin/
│ └── terminal_binding.py # 终端绑定管理(管理后台)
├── services/
│ ├── meetingroom_service.py # 会议室预定业务逻辑
│ └── xylink_service.py # 小鱼易联终端管理服务
├── models/
│ └── terminal_room_binding.py # 终端-会议室绑定模型
└── config.py # 新增配置项
```
### 5.4 前端新增项目
```
frontend-terminal/ # 小鱼易联终端页面(新建)
├── src/
│ ├── views/
│ │ ├── StatusView.vue # 终端状态页(主页面)
│ │ └── BookingView.vue # 快速预定弹窗
│ ├── components/
│ │ ├── Timeline.vue # 时间轴组件
│ │ ├── StatusBadge.vue # 状态标识
│ │ └── QrLogin.vue # 扫码登录组件
│ ├── api/
│ │ └── meetingroom.ts # API调用
│ └── App.vue
├── tailwind.config.js # 横屏大屏适配配置
└── vite.config.ts
```
### 5.5 实时同步方案
| 方案 | 机制 | 延迟 | 适用场景 |
|------|------|------|---------|
| WebSocketP1) | 终端建立WS连接,后端状态变更时推送 | <5秒 | 终端在线时的实时同步 |
| 轮询(P0降级) | 终端每30秒请求一次状态 | <30秒 | WS不可用时的降级方案 |
| 企微回调(P1) | 企微预定变更时回调后端,触发缓存刷新+WS推送 | <10秒 | 企微客户端预定的同步 |
**P0阶段**:终端页面使用30秒轮询保证基本实时性。
**P1阶段**:升级为WebSocket + 企微回调,实现5秒内同步。
### 5.6 终端页面部署方案
| 方案 | 说明 | 优劣 |
|------|------|------|
| **方案A(推荐)** | 终端通过浏览器/WebView访问后端提供的URL | 灵活度高,更新无需触达终端;但依赖网络稳定 |
| 方案B | 通过小鱼易联终端管理API推送自定义页面URL | 更深度集成;但需要小鱼易联API支持自定义页面推送 |
| 方案C | 使用小鱼易联Web SDK在终端原生渲染 | 最深度集成;但开发成本高,P2阶段考虑 |
**P0推荐方案A**:终端浏览器全屏访问 `https://itsupport.servyou.com.cn/terminal/{sn}`,后端根据SN返回对应会议室的状态页面。
---
## 6. 数据模型
### 6.1 终端-会议室绑定表 `terminal_room_binding`
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Integer (PK) | 自增主键 |
| terminal_sn | String(64) | 小鱼易联终端序列号(唯一) |
| terminal_name | String(100) | 终端名称(如"18F东区大屏" |
| meetingroom_id | Integer | 企微会议室ID |
| meetingroom_name | String(100) | 会议室名称(冗余字段,便于展示) |
| location | String(200) | 位置描述(如"18F东区" |
| is_active | Boolean | 是否启用(默认True |
| created_at | DateTime | 创建时间 |
| updated_at | DateTime | 更新时间 |
### 6.2 会议室预定快照表 `meetingroom_booking_snapshot`P2
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Integer (PK) | 自增主键 |
| meetingroom_id | Integer | 企微会议室ID |
| booking_id | String(64) | 企微预定ID |
| subject | String(200) | 会议主题 |
| booker | String(64) | 预定人userid |
| start_time | DateTime | 开始时间 |
| end_time | DateTime | 结束时间 |
| status | Integer | 预定状态(0=已预定, 1=已取消) |
| snapshot_date | Date | 快照日期 |
| created_at | DateTime | 记录创建时间 |
---
## 7. 待确认问题
| # | 问题 | 影响范围 | 建议 |
|---|------|---------|------|
| Q1 | **企微"会议室"secret是否已申请?** 会议室API需要独立的secret获取access_token,不同于现有应用secret和通讯录secret。需要在企微管理后台「应用管理 > 会议室 > 可调用接口的应用」中配置。 | P0核心前置条件 | 请IT支持组确认是否已有会议室secret,或协助申请 |
| Q2 | **企微会议室是否已在管理后台创建?** 需要先在企微管理后台创建会议室(设置名称、容量、位置、设备等),API只能查询和预定已创建的会议室。 | P0核心前置条件 | 请确认企微后台已创建公司所有会议室 |
| Q3 | **小鱼易联终端的具体型号和运行环境?** 需要确认终端是通过内置浏览器/WebView运行页面,还是有其他自定义页面机制。不同型号可能支持的页面渲染能力不同。 | 影响前端技术选型 | 请提供终端型号,或确认是否支持浏览器全屏访问 |
| Q4 | **小鱼易联开发者账号的具体权限?** 需要确认开发者账号是否有终端管理API的调用权限,以及Web SDK的使用授权。 | P1小鱼易联API集成 | 请确认开发者账号的API权限范围 |
| Q5 | **终端身份识别方案?** 终端是公共设备,员工预定时需要身份识别。方案一:企微扫码登录(推荐,与现有系统一致);方案二:输入工号+短信验证码;方案三:企微NFC碰一碰。 | P0预定功能 | 建议方案一(企微扫码),与现有H5端登录方式一致 |
| Q6 | **是否需要支持访客预定?** 访客通常没有企微账号,无法通过企微API预定。如需支持,需要额外的访客登记流程。 | P0-P1 | 建议P0阶段仅支持企微员工预定,访客仅查看状态 |
| Q7 | **会议室是否需要与小鱼易联视频会议联动?** 即预定会议室后,是否需要自动在终端上发起小鱼易联视频会议? | P2功能 | 建议P0阶段仅做预定,P2阶段考虑视频会议联动 |
| Q8 | **终端页面部署在哪个域名下?** 是复用现有`itsupport.servyou.com.cn`域名(新增`/terminal/`路径),还是使用独立域名? | 影响部署和Nginx配置 | 建议复用现有域名,新增`/terminal/`路由 |
| Q9 | **与现有IT智能服务台的关系?** 会议室预定是作为独立功能模块(仅在终端和H5端提供入口),还是也需要集成到坐席端(如坐席帮员工预定)? | 影响功能范围 | 建议P0阶段聚焦终端+H5端,坐席端集成放到P1 |
| Q10 | **企微回调URL是否已配置?** 企微会议室预定状态变更回调需要配置回调URL,且需要企微后台配置可信域名。 | P1企微回调 | 请确认企微后台是否支持会议室事件回调配置 |
---
## 8. 里程碑建议
| 阶段 | 内容 | 预估工期 | 依赖 |
|------|------|---------|------|
| **M1** | 企微会议室API对接(token管理+CRUD接口)+ 终端状态页 | 1周 | Q1/Q2确认 |
| **M2** | 终端快速预定功能 + 终端-会议室绑定管理 | 1周 | M1完成 |
| **M3** | WebSocket实时同步 + 企微回调 + H5端预定页面 | 1.5周 | M2完成 |
| **M4** | 小鱼易联终端管理API集成 + 多会议室切换 | 1周 | Q3/Q4确认 |
| **M5** | 统计报表 + 维护模式 + P2功能 | 按需 | M4完成 |
**总预估**:4-5周(P0+P1),P2按需排期。