Files
wecom_it_smart_desk/docs/04-运维文档/部署运维/会议室预定-部署指南.md
T
Simon facc04aa65 chore: docs 结构整改 + compose 双目录对齐(合并重建提交)
本提交为 .git 对象库损坏后的重建提交,内容等价于原先三个本地提交
(5e2fd4c2 / 57a53c98 / 5d7e1873)的累积结果,未做任何额外改动。

一、docs 结构整改(整改 #14)
根因:重构时新结构为 untracked 文件,执行 git stash(未带 -u)未纳入,
随后 git reset 拉回 HEAD 旧 tracked 树,导致旧树复活、新旧两棵目录
树并存于 docs/,共 791 文件、双分类体系冲突。

修复动作:
- b2 同名异主题文件改名迁移保全 9 个
- C 类 39 个孤立文件按主题正确归类
- A/B1 类 222 个重复文件删除(新结构已有内容副本)
- 9 个旧独有空目录删除
- 270 处内部引用按 verified 映射改写
- 整改记录 #14 登记于 04-运维文档/部署运维

结果:docs 791 → 569 文件,顶层仅规范 8 类 + 治理文件,单树恢复。
残留:约 20 处指向从未存在文件的陈旧死链,归入独立文档卫生任务。

二、compose 双目录对齐(消除踩坑 A)
- docker-compose.yml:nginx 前端挂载全部由根目录 frontend-*/dist
  改为 src/frontend-*/dist(h5 / agent / admin / terminal)
- docker-compose.dev.yml:dev 服务 build context 与卷同步改 src/
- 效果:本地 docker compose up 不再把根目录 stale dist 挂回,
  与线上一致,分叉隐患消除(已 docker compose config 校验通过)

防复发铁律:
- 重构须提交;仓库修复须 git stash -u 或先 commit
- 新结构须 git add 并提交,避免再次 untracked 复活
- H5 改动只动 src/frontend-h5/,禁改根目录遗留 frontend-*/
2026-08-07 22:31:32 +08:00

351 lines
11 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.
# 会议室预定-小鱼易联终端 部署指南
> **日期**: 2026-07-11
> **版本**: v2.0(新增报修+指南+二维码+移动端适配)
> **代码状态**: 待部署
> **预估部署时间**: 45-60 分钟
---
## 一、部署前置条件
### 1.1 企微配置
- [x] 企微会议室 Secret 已申请
- [x] 企微会议室已在管理后台创建
- [ ] 确认会议室 `meetingroom_id` 列表
### 1.2 服务器环境
- [ ] PostgreSQL 可用(需执行 Alembic 迁移 050 + 051
- [ ] Redis 可用(会议室缓存依赖)
- [ ] Nginx 可用(终端前端静态文件 + API 代理)
- [ ] Docker Compose 可用
### 1.3 终端设备
- [ ] 确认小鱼易联终端型号(NE90/NE60 支持 H5 应用,NE2005 需二维码降级)
- [ ] 终端浏览器支持 WebSocket + ES6
- [ ] 小鱼管理后台可访问(配置 H5 应用入口)
---
## 二、部署步骤
### Step 1: 数据库迁移
```bash
# 进入后端容器执行迁移(050 会议室基础表 + 051 报修+指南表)
docker compose exec backend alembic upgrade head
# 验证新表
docker compose exec backend python -c "
from app.database import engine
from sqlalchemy import inspect
insp = inspect(engine)
tables = insp.get_table_names()
print('terminal_room_bindings' in tables) # 应为 True050
print('meetingroom_guide' in tables) # 应为 True051
print('meetingroom_repair' in tables) # 应为 True051
"
```
### Step 2: 环境变量配置
`.env` 中添加:
```bash
# 终端页面基础URL(用于NE2005二维码生成)
TERMINAL_BASE_URL=https://itsupport.servyou.com.cn/itterminal/
```
`docker-compose.yml` 的 backend environment 中已添加:
```yaml
- TERMINAL_BASE_URL=${TERMINAL_BASE_URL:-https://itsupport.servyou.com.cn/itterminal/}
```
重启后端:
```bash
docker compose up -d backend
```
### Step 3: 后端验证
```bash
# 验证会议室 API(已存在)
curl -sk https://localhost/itportal/meetingroom/list
# 验证报修 API(新增)
curl -sk -X POST https://localhost/itportal/meetingroom/repair \
-H "Content-Type: application/json" \
-d '{"terminal_sn":"TEST-SN","meetingroom_id":1,"meetingroom_name":"测试","device_type":"projector","fault_description":"测试报修"}'
# 验证指南 API(新增)
curl -sk https://localhost/itportal/meetingroom/guides
# 验证二维码 API(新增)
curl -sk https://localhost/itportal/meetingroom/terminal/TEST-SN/qrcode -o /tmp/qr.png
file /tmp/qr.png # 应为 PNG image
```
### Step 4: 终端前端构建与部署
```bash
# 1. 本地构建
cd frontend-terminal
npm install # 安装新增的 qrcode 依赖
npm run build
# 2. 打包
tar -czf terminal-dist.tar.gz dist/
# 3. 上传到服务器(通过堡垒机)
python C:\Users\simon\.workbuddy\skills\jumpserver-V2\scripts\v2_ops.py \
upload ./terminal-dist.tar.gz /tmp/terminal-dist.tar.gz
# 4. 服务器解压
cd /opt/wecom-it-desk/frontend-terminal/
rm -rf dist # 删除旧 distbind mount 铁律:rm后重建必须重启容器)
tar -xzf /tmp/terminal-dist.tar.gz
```
### Step 5: Nginx 配置更新
`nginx/nginx.conf` 已更新,新增以下 location(两个 server 块均已添加):
```nginx
# 小鱼终端大屏 — /itterminal/
location /itterminal/ {
alias /usr/share/nginx/html/itterminal/;
index index.html;
try_files $uri /itterminal/index.html;
}
# 会议室 API — /itportal/meetingroom/
# 必须在 /itportal/ 静态文件之前匹配(nginx 最长前缀优先)
location /itportal/meetingroom/ {
proxy_pass http://backend_api;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
```
`docker-compose.yml` nginx volumes 已添加:
```yaml
- ./frontend-terminal/dist:/usr/share/nginx/html/itterminal:ro
```
重启 Nginx
```bash
docker compose restart nginx
```
### Step 6: 终端前端验证
```bash
# 验证终端页面可访问
curl -sk https://localhost/itterminal/ | head -5
# 验证 API 代理(通过 nginx 访问后端)
curl -sk https://localhost/itportal/meetingroom/guides
# 验证静态资源
curl -sk -o /dev/null -w "%{http_code}" https://localhost/itterminal/assets/index-*.js
```
---
## 三、小鱼管理后台 H5 应用配置
### 3.1 支持型号确认
| 型号 | H5 应用支持 | 配置方式 |
|------|------------|---------|
| NE90 | ✅ 支持 | 小鱼管理后台配置 H5 应用入口 |
| NE60 | ✅ 支持 | 同上 |
| NE20 | ✅ 支持 | 同上 |
| AE2060 | ✅ 支持 | 同上 |
| ME55S | ⚠️ 部分固件支持 | 需确认固件版本 |
| NE2005 | ❌ 不支持 | 使用二维码降级方案 |
### 3.2 H5 应用入口配置(NE90/NE60/NE20/AE2060
1. 登录**小鱼易联管理后台**`https://mt.xylink.com`
2. 进入 **应用管理 > 自定义应用**
3. 创建新应用:
- **应用名称**: `IT智能服务台`
- **应用类型**: H5 网页应用
- **访问地址**: `https://itsupport.servyou.com.cn/itterminal/{终端SN}/`
- **展示方式**: 终端主界面快捷入口
4. 推送应用到目标终端
5. 在终端上验证 H5 应用可正常打开
### 3.3 终端 SN 绑定
在管理后台(`/itadmin/`)的终端绑定页面中:
1. 添加终端 SN 与会议室的绑定关系
2. 每个终端 SN 对应一个企微会议室 ID
3. 绑定后终端页面自动加载对应会议室状态
### 3.4 NE2005 二维码降级方案
对于不支持 H5 应用的 NE2005 终端:
1. **生成二维码**
```bash
# 通过 API 生成终端访问二维码
curl -sk https://itsupport.servyou.com.cn/itportal/meetingroom/terminal/{SN}/qrcode -o qr.png
```
或直接在浏览器访问:
`https://itsupport.servyou.com.cn/itportal/meetingroom/terminal/{SN}/qrcode`
2. **打印二维码**:将二维码打印为贴纸(建议尺寸 10×10cm)
3. **张贴二维码**:贴在 NE2005 终端的显眼位置
4. **用户使用流程**
- 用户用企业微信/微信扫描二维码
- 手机浏览器打开终端页面(移动端自适应布局)
- 可查看会议室状态、预定、报修、查看指南
---
## 四、部署后验证
### 4.1 功能验证清单
| # | 验证项 | 验证方法 | 预期结果 |
|---|--------|---------|---------|
| 1 | 会议室列表 | `GET /itportal/meetingroom/list` | 返回会议室列表 |
| 2 | 会议室状态 | `GET /itportal/meetingroom/{id}/status` | 返回当前状态 |
| 3 | 预定会议室 | `POST /itportal/meetingroom/book` | 创建预定成功 |
| 4 | 终端绑定 | `GET /itportal/meetingroom/terminal/{sn}/binding` | 返回绑定信息 |
| 5 | 终端WS | `WS /ws/terminal/{sn}` | 终端状态实时推送 |
| 6 | **设备报修** | `POST /itportal/meetingroom/repair` | 创建工单+通知管理员 |
| 7 | **指南列表** | `GET /itportal/meetingroom/guides` | 返回指南列表(5条种子) |
| 8 | **指南按类型** | `GET /itportal/meetingroom/guides/projector` | 返回投影仪指南 |
| 9 | **终端二维码** | `GET /itportal/meetingroom/terminal/{sn}/qrcode` | 返回PNG图片 |
| 10 | 终端前端 | 浏览器打开 `/itterminal/{sn}/` | 深色主题大屏页面 |
| 11 | **报修页面** | 终端点击"设备报修"按钮 | 显示报修表单 |
| 12 | **指南页面** | 终端点击"操作指南"按钮 | 显示指南列表+二维码 |
| 13 | **移动端适配** | 手机访问 `/itterminal/{sn}/` | 垂直布局自适应 |
| 14 | 扫码登录 | 终端扫码 | 企微扫码登录成功 |
| 15 | 状态同步 | 终端修改状态 → H5 实时更新 | WS 推送正常 |
### 4.2 Redis 缓存验证
```bash
# 会议室 token
redis-cli -a $REDIS_PASSWORD get wecom:meetingroom_access_token
# 会议室列表缓存
redis-cli -a $REDIS_PASSWORD get meetingroom:room_list
# 状态缓存
redis-cli -a $REDIS_PASSWORD get "meetingroom:status:{room_id}"
```
---
## 五、回滚方案
### 5.1 数据库回滚
```bash
# 回退迁移 051(报修+指南表)
docker compose exec backend alembic downgrade -1
# 完全回退(含 050
docker compose exec backend alembic downgrade -2
```
### 5.2 后端回滚
```bash
# 恢复 .py 文件(bind mount 自动生效)
git checkout HEAD~1 -- backend/app/api/meetingroom.py
git checkout HEAD~1 -- backend/app/services/repair_service.py
git checkout HEAD~1 -- backend/app/services/meetingroom_service.py
git checkout HEAD~1 -- backend/app/models/meetingroom_guide.py
git checkout HEAD~1 -- backend/app/models/meetingroom_repair.py
git checkout HEAD~1 -- backend/app/schemas/meetingroom.py
git checkout HEAD~1 -- backend/app/config.py
docker compose restart backend
```
### 5.3 前端回滚
```bash
# 恢复旧 dist
mv /opt/wecom-it-desk/frontend-terminal/dist /opt/wecom-it-desk/frontend-terminal/dist.bak
# 恢复上一版本
docker compose restart nginx
```
### 5.4 Nginx 配置回滚
```bash
# 移除 /itterminal/ 和 /itportal/meetingroom/ location 块
docker compose restart nginx
```
---
## 六、新增功能说明
### 6.1 设备报修流程
```
终端用户点击"设备报修"
→ 选择设备类型(投影仪/视频会议/空调/桌椅/网络/其他)
→ 填写故障描述
→ 提交报修
→ 后端创建:
1. MeetingroomRepair 记录
2. ConversationIT工单会话,状态=排队,紧急度=3)
3. Message(系统消息,含故障描述)
4. 企微消息通知管理员
5. WS广播给在线坐席
→ 终端显示"报修已提交"
→ 3秒后自动返回状态页
```
### 6.2 操作指南双模式
- **终端展示**:指南的 `brief` 字段在终端大屏上直接显示简要操作步骤
- **二维码详情**:指南的 `detail_url` 生成二维码,用户手机扫码查看完整文档
- 管理员可在数据库中添加/修改指南内容
### 6.3 NE2005 降级流程
```
NE2005 终端(不支持H5应用)
→ 管理员生成二维码贴纸(API: /itportal/meetingroom/terminal/{sn}/qrcode
→ 用户手机扫码
→ 手机浏览器打开终端页面(移动端自适应)
→ 功能与终端大屏一致(状态/预定/报修/指南)
```
---
## 七、配置参数速查
| 参数 | 默认值 | 环境变量 |
|------|--------|---------|
| 会议室Token TTL | 6900s | - |
| 会议室列表缓存 | 600s | `MEETINGROOM_CACHE_TTL_ROOMS` |
| 预定缓存 | 30s | `MEETINGROOM_CACHE_TTL_BOOKING` |
| 状态缓存 | 10s | `MEETINGROOM_CACHE_TTL_STATUS` |
| WS重连次数 | 5 | - |
| WS降级轮询间隔 | 10s | - |
| **终端页面URL** | `https://itsupport.servyou.com.cn/itterminal/` | `TERMINAL_BASE_URL` |
| **二维码尺寸** | 300px | API 参数 `size` |
| **二维码缓存** | 1小时 | HTTP `Cache-Control` |
---
## 八、已知限制
1. **企微API时间限制**: 会议室预定查询范围限制 31 天
2. **终端身份**: 管理操作需扫码登录,报修支持匿名提交
3. **WS重连**: 终端断线后自动重连(指数退避),超过 5 次降级为轮询(10s间隔)
4. **NE2005**: 不支持 H5 应用,仅能通过二维码扫码方式使用
5. **指南管理**: 当前通过数据库直接管理,后续可增加管理后台 UI