会议室预定 — 小鱼易联终端 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支持组希望通过小鱼易联终端(安装在会议室的物理大屏设备)实现会议室预定功能。核心诉求:
- 在小鱼易联终端上定制页面,集成企微自定义应用中的会议室预定能力
- 员工可通过H5/企微/终端页面多入口自助预定,预定结果同步到小鱼易联终端显示
- 有小鱼易联API文档+开发者账号,企微侧也有会议室API可对接
架构决策(初步方案)
采用企微会议室API为数据源 + 小鱼易联终端为展示端 + 现有后端为中间层的架构:
关键设计决策:
- 企微会议室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 终端状态页(主页面)
设计要点:
- 深色主题:背景
#1a1a2e,卡片 #16213e,减少大屏眩光
- 状态色:空闲 =
#07C160(企微绿),使用中 = #FF6B6B(红色),即将开始 = #FFA502(橙色)
- 字体:当前状态 96px,会议室名称 36px,时间轴 20px,操作按钮 24px
- 时间轴:横向滚动,每个时段卡片宽度固定,当前时间用竖线标记
- 空闲时段:显示「点击预定」提示,可点击
- 已预定时段:显示会议主题和预定人,不可点击(仅查看)
4.2 快速预定弹窗
4.3 交互流程
4.4 H5端预定页面
4.5 管理后台 — 终端绑定管理
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:00,15:45→16:00)
- 仅可预定无需审批的会议室(
need_approval=0)
get_booking_info不支持跨天查询,后端按日期维度封装
- 当前时间超过预定开始时间15分钟后不允许预定
- 会议室设备类型:1=电视, 2=电话, 3=投影, 4=白板, 5=视频
官方文档:
5.2 小鱼易联终端管理API对接
| 能力 |
接口 |
说明 |
| 鉴权 |
enterpriseId + token |
支持1.0(signature)和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 后端新增文件结构
5.4 前端新增项目
5.5 实时同步方案
| 方案 |
机制 |
延迟 |
适用场景 |
| WebSocket(P1) |
终端建立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按需排期。