# 医生 & 运营 & 管理员工作台设计规格
> 日期: 2026-05-02 | 状态: 设计中
> 原型参考: `_temp/workbench-doctor-A.html`(医生)、`_temp/workbench-operator-C.html`(运营)、`_temp/workbench-admin.html`(管理员)
> 关联文档: `2026-05-02-health-manager-workbench-design.md`(健康管家方案 B)
## 1. 背景与目标
### 1.1 与健康管家工作台的关系
本规格定义健康管家之外的三个角色工作台。四者共享同一平台、同一全局侧边栏、同一路由入口 `/`(`Home.tsx`),通过 `useDashboardRole()` 按 `doctor` / `health_manager` / `operator` / `admin` 角色分发不同的工作台视图。
| 角色 | 方案 | 核心交互模式 | 本期优先级 |
|------|------|-------------|-----------|
| 健康管家 | B 工作流驱动 | 任务队列一件一件处理 | Phase 1(已设计) |
| 医生 | A 今日全景 | 仪表盘总览 + AI 建议一键审核 | Phase 1(本文档) |
| 运营 | C AI 指挥中心 | AI 洞察驱动运营决策 | Phase 1(本文档) |
| 管理员 | 系统管理中心 | 平台运维全局视角 | Phase 1(本文档) |
### 1.2 医生角色目标
| 指标 | 当前 | 目标 |
|------|------|------|
| AI 建议审核响应时间 | 无专门入口,散落在 AI 分析列表 | 工作台直接展示,一键采纳/拒绝 |
| 患者咨询回复时间 | 需进入咨询列表才能看到未读 | 工作台右侧实时显示未回复咨询 |
| 关注患者认知负担 | 需逐个翻患者详情 | 聚合告警+AI分析的关注列表 |
### 1.3 运营角色目标
| 指标 | 当前 | 目标 |
|------|------|------|
| 内容运营效率 | 各功能模块独立操作 | AI 推荐热点内容,一键关联发布 |
| 积分异常发现 | 被动审核订单 | AI 主动发现异常兑换模式 |
| 运营决策数据支撑 | 需单独查看统计报表 | 工作台实时展示核心指标 + 趋势 |
### 1.4 范围
**本期(Phase 1):**
- 医生:4 统计卡片 + AI 建议待审 + 重点关注患者 + 日程 + 咨询摘要
- 运营:AI 洞察卡片 + 4 数据指标 + 热门内容排行 + 待办列表 + 积分动态 + 内容矩阵
**不在本期:**
- 医生角色的方案 B/C 工作流模式
- 运营角色的方案 A/B 仪表盘模式
- 管理员的实时系统指标监控(CPU/内存/磁盘)
- 角色间的任务转交/协作流程(Phase 2)
- AI 洞察的 SSE 实时推送(Phase 2 使用 30 秒轮询)
## 2. 角色定义
### 2.1 医生 — 李明辉
| 维度 | 描述 |
|------|------|
| 姓名 | 李明辉 |
| 职位 | 主治医师 · 肾内科 |
| 年龄 | 42 岁 |
| 工作经验 | 15 年临床,8 年肾内科 |
| 技术水平 | 基本操作无障碍,不追求花哨功能 |
| 日均任务量 | AI 建议审核 3-5 项、咨询回复 2-3 条、查看危急值 1-2 次 |
#### 典型工作日
```
07:30 晨间查房,查看住院患者
08:00 门诊开始,打开工作台扫一眼今日概览
08:30 门诊间隙审核 AI 建议(采纳/拒绝)
10:00 回复患者咨询消息
10:30 多学科会诊
14:00 下午门诊
16:00 查看告警中心,确认危急值已处理
17:00 下班
```
#### 核心痛点
1. **AI 建议易遗忘**:AI 分析结果在独立列表中,不强制提醒,容易积压
2. **咨询回复不及时**:不知道有新咨询,需要主动刷新咨询列表
3. **患者上下文分散**:看 AI 建议时需要单独翻患者详情了解病史
### 2.2 运营 — 王美玲
| 维度 | 描述 |
|------|------|
| 姓名 | 王美玲 |
| 职位 | 健康运营专员 |
| 年龄 | 28 岁 |
| 工作经验 | 3 年互联网运营,1 年健康领域 |
| 技术水平 | 熟练使用各种运营工具,对数据敏感 |
| 日均任务量 | 文章管理 2-3 篇、积分审核 5-10 笔、活动跟进 1-2 个 |
#### 典型工作日
```
08:30 打开工作台,查看 AI 洞察和昨日数据
09:00 审核积分兑换订单(AI 标记异常的优先)
10:00 发布新科普文章,关联热门话题
11:00 跟进线下活动报名情况
14:00 查看内容阅读数据,优化推送策略
15:00 整理运营周报
16:30 跟进沉默用户,发送关怀消息
17:30 下班
```
#### 核心痛点
1. **数据分散**:积分、内容、活动数据在不同页面,需来回切换
2. **缺乏数据驱动**:发什么内容凭经验,不知道什么受欢迎
3. **异常发现慢**:积分兑换异常靠人工发现,等到发现时已造成损失
### 2.3 管理员 — 陈建国
| 维度 | 描述 |
|------|------|
| 姓名 | 陈建国 |
| 职位 | 系统管理员 / 平台运维 |
| 年龄 | 35 岁 |
| 工作经验 | 8 年 IT 运维,3 年医疗信息化 |
| 技术水平 | 熟悉 Linux/Docker/数据库,能看懂 Rust 错误日志 |
| 日均任务量 | 用户管理 5-10 次、权限配置 1-2 次、系统巡检 3-4 次 |
#### 核心痛点
1. **系统健康不可见**:不知道各模块是否正常运行,出了问题被动发现
2. **操作追溯分散**:用户做了什么操作需要翻审计日志表,没有聚合视图
3. **配置入口分散**:用户管理/角色权限/菜单/字典/插件分布在不同页面,来回切换
## 3. 信息架构
### 3.1 医生:方案 A「今日全景」布局
```
┌──────────────────────────────────────────────────────────────┐
│ 全局侧边栏(已有) │ 医生工作台页面内部 │
│ │ │
│ 🏠 今日全景(高亮) │ ┌──────────────────────────────────────┐ │
│ 🩺 患者管理 │ │ 欢迎栏:上午好,李医生 │ │
│ 💬 患者咨询 │ ├──────────────────────────────────────┤ │
│ 📅 预约排班 │ │ 4 统计卡片(危急值/待审/咨询/预约) │ │
│ 🤖 AI 分析 │ ├──────────────────┬───────────────────┤ │
│ ⚠️ 告警中心 │ │ 左主内容(flex) │ 右窄栏(340px) │ │
│ 📊 统计报表 │ │ │ │ │
│ │ │ AI 建议待审列表 │ 今日日程 │ │
│ │ │ (采纳/拒绝按钮) │ 未回复咨询 │ │
│ │ │ │ 快捷操作 │ │
│ │ │ 重点关注患者列表 │ │ │
│ │ │ │ │ │
│ │ └──────────────────┴───────────────────┘ │
└──────────────────────────────────────────────────────────────┘
```
**布局参数**:
- 左主内容:`flex: 1`,包含 AI 建议和关注患者两个 Card
- 右窄栏:固定 340px,包含日程、咨询、快捷操作
### 3.2 运营:方案 C「AI 指挥中心」布局
```
┌──────────────────────────────────────────────────────────────┐
│ 全局侧边栏(已有) │ 运营工作台页面内部 │
│ │ │
│ 🤖 AI 工作台(高亮) │ ┌──────────────────────────────────────┐ │
│ 📝 内容管理 │ │ AI 洞察卡片(暖橙色渐变 Hero) │ │
│ 🎁 积分商城 │ │ 3 条洞察 + 操作按钮 │ │
│ 🎪 线下活动 │ ├──────────────────────────────────────┤ │
│ 👥 患者管理 │ │ 4 数据指标卡片(活跃/阅读/积分/订单) │ │
│ 📊 统计报表 │ ├──────────────────┬───────────────────┤ │
│ ⚙️ 系统设置 │ │ 热门科普排行 │ 今日待办 │ │
│ │ ├──────────────────┼───────────────────┤ │
│ │ │ 积分动态 │ 内容矩阵 │ │
│ │ └──────────────────┴───────────────────┘ │
└──────────────────────────────────────────────────────────────┘
```
**布局参数**:
- 顶部:AI Hero 卡片(全宽)
- 第二行:4 数据指标(grid 4 列)
- 第三行起:双栏卡片(grid 2 列等宽)
- 最大内容宽度 960px(`max-width`)
### 3.3 管理员:系统管理中心布局
```
┌──────────────────────────────────────────────────────────────┐
│ 全局侧边栏(已有) │ 管理员工作台页面内部 │
│ │ │
│ 🔧 系统管理(高亮) │ ┌──────────────────────────────────────┐ │
│ 👤 用户管理 │ │ 系统健康条(6 项状态指示灯) │ │
│ 🔑 角色权限 │ ├──────────────────────────────────────┤ │
│ 📖 菜单管理 │ │ 4 统计卡片(用户/模块/操作/工单) │ │
│ 📋 审计日志 │ ├──────────────────┬───────────────────┤ │
│ ⚙️ 系统配置 │ │ 审计日志 │ 模块状态 │ │
│ 🧩 插件管理 │ ├──────────────────┼───────────────────┤ │
│ 📊 统计报表 │ │ 用户活跃度 │ 系统管理快捷入口 │ │
│ │ └──────────────────┴───────────────────┘ │
└──────────────────────────────────────────────────────────────┘
```
**布局参数**:
- 顶部:系统健康条(全宽,flex 横向排列 6 项状态)
- 第二行:4 统计卡片(grid 4 列)
- 第三行起:双栏卡片(grid 2 列等宽)
- 最大内容宽度 1080px
## 4. 组件清单
### 4.1 医生组件
| 组件 | 说明 | 数据源 |
|------|------|--------|
| **DoctorStatsRow** | 4 统计卡片:危急值/待审/咨询/预约 | `GET /health/action-inbox/stats` + `GET /health/doctor/dashboard` |
| **AiSuggestionList** | AI 建议待审列表,内嵌采纳/拒绝按钮 | `GET /health/action-inbox`(过滤 `type=ai_suggestion`) |
| **FocusedPatientList** | 重点关注患者(聚合告警+AI 分析) | `GET /health/action-inbox`(按患者聚合) |
| **TodaySchedule** | 今日日程(查房/门诊/会诊) | `GET /health/doctor-schedules`(过滤今日) |
| **ConsultSummary** | 未回复咨询摘要(侧栏紧凑版) | `GET /health/consultation-sessions`(过滤未回复) |
| **QuickActions** | 快捷入口(AI 分析/告警/患者查询) | 前端静态配置 |
### 4.2 运营组件
| 组件 | 说明 | 数据源 |
|------|------|--------|
| **AiInsightHero** | AI 洞察 Hero 卡片(暖橙色渐变) | Phase 1 前端静态展示,Phase 2 接 AI 生成 |
| **OperatorStatsRow** | 4 数据指标(活跃/阅读/积分/订单) | `GET /health/admin/statistics/dashboard` + `GET /health/admin/points/statistics` |
| **HotContentRank** | 热门科普排行(阅读量排名) | `GET /health/articles`(按 view_count 排序) |
| **OperatorTodoList** | 今日待办(积分审核/发布文章/活动跟进等) | 前端状态管理(Phase 2 扩展为任务系统) |
| **PointsFeed** | 积分动态流(近期获得/兑换) | `GET /health/admin/points/patients/{id}/transactions`(聚合) |
| **ContentMatrix** | 内容矩阵(分类分布条形图) | `GET /health/articles`(按分类聚合统计) |
### 4.3 共享组件
以下组件在两个角色中复用,与健康管家工作台共享:
| 组件 | 复用场景 |
|------|---------|
| **StatCard** | 统计卡片基础样式(顶部色条 + 数值 + 副文本) |
| **Card** | 通用卡片容器(圆角 + 边框 + header + body) |
### 4.4 管理员组件
| 组件 | 说明 | 数据源 |
|------|------|--------|
| **SystemHealthBar** | 6 项系统状态指示灯(API/DB/Redis/邮件/存储/定时任务) | Phase 1 前端静态(Phase 2 接 `/api/v1/system/health`) |
| **AdminStatsRow** | 4 统计卡片(注册用户/业务模块/今日操作/待处理工单) | `GET /api/v1/users`(总数)+ 前端计算 |
| **AuditLogList** | 最近操作记录(操作人+动作+时间) | `GET /api/v1/audit-logs`(最新 6 条) |
| **ModuleStatusList** | 模块状态列表(已启用/未启用) | 前端静态配置(模块列表固定) |
| **UserActivityChart** | 用户活跃度分布(今日/本周/本月/总注册 + 角色分布) | `GET /api/v1/users`(聚合统计) |
| **AdminQuickActions** | 系统管理快捷入口(8 个管理功能) | 前端静态配置 |
### 4.5 数据优先级说明
**医生**:核心数据来自 `action-inbox` 系统(与健康管家共享),额外需要 `doctor/dashboard` API 提供预约和日程数据。
**运营**:核心数据来自 `statistics/dashboard` + `articles` + `points` API,数据维度完全不同,独立于 action-inbox 系统。
## 5. 数据流
### 5.1 医生数据源映射
| 组件 | API | 参数 | 返回 |
|------|-----|------|------|
| DoctorStatsRow | `GET /health/action-inbox/stats` | — | `WorkbenchStats`(pending_count 等) |
| DoctorStatsRow | `GET /health/doctor/dashboard` | — | 预约数、日程数 |
| AiSuggestionList | `GET /health/action-inbox` | `type=ai_suggestion, status=pending` | `ActionItem[]` |
| FocusedPatientList | `GET /health/action-inbox` | `status=pending`(前端按 patient_id 聚合) | `ActionItem[]` |
| TodaySchedule | `GET /health/doctor-schedules` | `date=today` | `ScheduleItem[]` |
| ConsultSummary | `GET /health/consultation-sessions` | `status=active, unread=true` | `Consultation[]` |
**并行请求策略**:页面加载时使用 `Promise.allSettled` 并行请求 stats + list + schedule + consultations。
### 5.2 运营数据源映射
| 组件 | API | 参数 | 返回 |
|------|-----|------|------|
| OperatorStatsRow | `GET /health/admin/statistics/dashboard` | — | 综合统计数据 |
| OperatorStatsRow | `GET /health/admin/points/statistics` | — | 积分统计 |
| HotContentRank | `GET /health/articles` | `sort=-view_count, page_size=5` | `Article[]` |
| ContentMatrix | `GET /health/articles` | `page_size=1`(仅需 total) | 按分类聚合(前端或后端) |
| PointsFeed | `GET /health/admin/points/patients` | 最近交易(需后端扩展) | 积分流水 |
**AI Hero 洞察**:Phase 1 使用前端静态文案(硬编码洞察示例)。Phase 2 接入 AI 生成接口。
### 5.3 管理员数据源映射
| 组件 | API | 参数 | 返回 |
|------|-----|------|------|
| AdminStatsRow | `GET /api/v1/users` | `page=1, page_size=1` | 用户总数(从 pagination.total) |
| AuditLogList | `GET /api/v1/audit-logs` | `page=1, page_size=6` | `AuditLogItem[]` |
| UserActivityChart | `GET /api/v1/users` | 聚合查询 | 角色分布统计 |
| SystemHealthBar | Phase 1 静态 | — | 前端硬编码状态 |
| ModuleStatusList | Phase 1 静态 | — | 前端硬编码模块列表 |
| AdminQuickActions | 前端静态 | — | 路由配置 |
**管理员数据特点**:不依赖 `erp-health` 的任何 API,数据来自 ERP 基础模块(用户、审计、配置)。
### 5.4 与 action-inbox 的关系
| 角色 | 使用方式 |
|------|---------|
| 健康管家 | 完全基于 action-inbox,任务队列 + 详情处理 |
| 护士 | 复用健康管家工作台(同一任务队列),不做区分 |
| 医生 | 部分使用 action-inbox(仅读取 AI 建议和告警),**不做任务处理流程** |
| 运营 | 不使用 action-inbox,数据来源独立 |
| 管理员 | 不使用 action-inbox,数据来自 ERP 基础模块(用户/审计/配置) |
医生角色的 action-inbox 使用是**只读展示**:在 AI 建议列表中直接嵌入「采纳/拒绝」按钮,调用 `/health/ai-analysis/:id/review`,不走 action-inbox 的 complete 流程。
## 6. 交互流程
### 6.1 医生:AI 建议审核
以「张伟 — 血压持续升高建议调整用药」为例:
```
1. 进入工作台
└→ 4 统计卡片显示:待审 5 条、未回复 3 条
2. 浏览 AI 建议列表
└→ 列表按风险等级排序(高→中→低)
└→ 每条建议显示:风险徽章 + 标题 + 摘要 + 采纳/拒绝按钮
3. 审核建议
└→ 点击「采纳」→ 调用 POST /health/ai-analysis/:id/review?action=approve
└→ 或点击「拒绝」→ 弹出拒绝原因输入 → 提交
└→ 操作完成后,该建议从列表移除
4. 查看关注患者
└→ 下方列表聚合了有告警/AI 建议的患者
└→ 点击患者名称 → 跳转患者详情页
5. 查看右侧信息
└→ 日程卡片:了解今日安排
└→ 咨询摘要:点击未回复咨询 → 跳转咨询详情页
```
### 6.2 运营:AI 洞察驱动操作
以「透析饮食管理文章爆发」洞察为例:
```
1. 进入工作台
└→ AI Hero 卡片展示 3 条洞察,每条附带操作按钮
2. 响应洞察
└→ 点击「发布关联文章」→ 跳转文章编辑器(预填关联标签)
└→ 或点击「审核积分订单」→ 跳转积分订单列表(标记异常)
3. 查看热门排行
└→ 了解哪些内容受欢迎,指导后续内容策略
4. 处理今日待办
└→ 待办列表展示优先级事项
└→ 点击操作按钮 → 跳转对应管理页面
5. 监控积分动态
└→ 实时查看积分发放/兑换流水
```
### 6.3 管理员:系统巡检
```
1. 进入工作台
└→ 系统健康条显示 6 项服务状态(绿灯/黄灯/红灯)
2. 确认系统正常
└→ 所有绿灯 → 放心继续
└→ 发现黄灯(如邮件队列积压)→ 点击进入邮件服务配置
3. 查看统计卡片
└→ 注册用户/业务模块/今日操作/待处理工单
4. 翻看审计日志
└→ 最近 6 条操作记录(谁做了什么)
└→ 发现异常操作 → 点击进入完整审计日志
5. 检查模块状态
└→ 确认各模块运行中
└→ 发现未启用模块 → 考虑是否启用
6. 用户活跃度
└→ 查看今日/本周/本月活跃数
└→ 角色分布确认人员配置合理
7. 快捷管理入口
└→ 点击用户管理/角色权限/系统配置等 → 跳转对应管理页面
```
### 6.4 空状态处理
| 角色 | 区域 | 空状态展示 |
|------|------|-----------|
| 医生 | AI 建议列表 | 「暂无待审 AI 建议」 |
| 医生 | 关注患者 | 「暂无重点关注患者」 |
| 医生 | 咨询摘要 | 「暂无未回复咨询」 |
| 医生 | 日程 | 「今日暂无安排」 |
| 运营 | AI Hero | 静态内容,不会为空 |
| 运营 | 热门排行 | 「暂无发布内容」 |
| 运营 | 待办列表 | 「今日暂无待办」 |
| 管理员 | 审计日志 | 「暂无操作记录」 |
| 管理员 | 系统健康 | 全绿灯,静态展示 |
### 6.5 前端状态管理
三个角色各自独立数据获取,30 秒轮询刷新:
```typescript
// 医生工作台 — 使用现有 workbenchStore + 额外请求
const DoctorDashboard: React.FC = () => {
const { refreshTasks, refreshStats } = useWorkbenchStore();
// 额外请求:日程、咨询
const [schedules, setSchedules] = useState([]);
const [consults, setConsults] = useState([]);
useEffect(() => {
refreshTasks();
refreshStats();
Promise.allSettled([
doctorApi.getDashboard(),
consultationApi.list({ status: 'active', unread: true }),
]).then(...);
}, []);
};
// 运营工作台 — 独立数据获取,不使用 workbenchStore
const OperatorDashboard: React.FC = () => {
const [stats, setStats] = useState(null);
const [articles, setArticles] = useState([]);
useEffect(() => {
Promise.allSettled([
statsApi.getDashboard(),
articlesApi.list({ sort: '-view_count', page_size: 5 }),
pointsApi.getStatistics(),
]).then(...);
}, []);
};
// 管理员工作台 — 独立数据获取,不使用 workbenchStore
const AdminDashboard: React.FC = () => {
const [auditLogs, setAuditLogs] = useState([]);
const [userCount, setUserCount] = useState(0);
useEffect(() => {
Promise.allSettled([
auditLogApi.list({ page: 1, page_size: 6 }),
userApi.list({ page: 1, page_size: 1 }), // 只取 total
]).then(...);
}, []);
};
```
## 7. 与现有系统的关系
### 7.1 角色路由分发
在 `Home.tsx` 中通过 `useDashboardRole()` 分发不同工作台组件:
```typescript
const HomePage = () => {
const role = useDashboardRole();
switch (role) {
case 'doctor':
return ;
case 'health_manager':
case 'nurse':
return ; // 方案 B TaskQueue + TaskDetail
case 'operator':
return ;
case 'admin':
return ; // 系统管理中心
default:
return ;
}
};
```
### 7.2 涉及文件
| 文件 | 改动类型 | 说明 |
|------|---------|------|
| `apps/web/src/pages/Home.tsx` | **改造** | 角色路由分发 + 导入各角色组件 |
| `apps/web/src/pages/health/components/workbench/DoctorDashboard.tsx` | **新增** | 医生方案 A 仪表盘 |
| `apps/web/src/pages/health/components/workbench/OperatorDashboard.tsx` | **新增** | 运营方案 C AI 指挥中心 |
| `apps/web/src/pages/health/components/workbench/AdminDashboard.tsx` | **新增** | 管理员系统管理中心 |
| `apps/web/src/pages/health/components/workbench/TaskQueue.tsx` | **已有** | 健康管家方案 B(Phase 1 已实现) |
| `apps/web/src/pages/health/components/workbench/TaskDetail.tsx` | **已有** | 健康管家方案 B(Phase 1 已实现) |
### 7.3 数据库变更
Phase 1 **无需新建表**。所有数据来自现有 API:
- 医生:action-inbox + doctor/dashboard + consultation-sessions + doctor-schedules
- 运营:statistics/dashboard + articles + points/statistics
- 管理员:users + audit-logs + 前端静态配置
### 7.4 权限
沿用现有权限码,无需新增:
| 角色 | 所需权限码 |
|------|-----------|
| 医生 | `health.action-inbox.list` + `health.ai-analysis.review` + `health.consultation.manage` + `health.doctor-schedule.list` |
| 运营 | `health.statistics.dashboard` + `health.articles.list` + `health.points.manage` |
| 管理员 | `system.users.list` + `system.audit-logs.list` + `system.settings.read` |
### 7.5 验收标准
**医生工作台:**
- [ ] 工作台显示 4 项统计数据(危急值/待审/咨询/预约)
- [ ] AI 建议列表按风险排序,每条有采纳/拒绝按钮
- [ ] 采纳/拒绝操作调用对应 API 并刷新列表
- [ ] 重点关注患者列表聚合展示(告警+AI 建议)
- [ ] 右侧日程卡片显示今日排班
- [ ] 右侧咨询摘要显示未回复消息
- [ ] 空状态有合理展示
**运营工作台:**
- [ ] AI Hero 卡片展示 3 条洞察 + 操作按钮(Phase 1 静态内容)
- [ ] 4 项数据指标展示(活跃用户/阅读量/积分发放/待审订单)
- [ ] 热门科普排行按阅读量排序(前 5 名)
- [ ] 今日待办列表展示优先事项
- [ ] 积分动态流展示近期交易
- [ ] 内容矩阵展示分类分布
- [ ] 空状态有合理展示
**管理员工作台:**
- [ ] 系统健康条展示 6 项服务状态(Phase 1 静态)
- [ ] 4 项统计卡片展示(注册用户/业务模块/今日操作/待处理工单)
- [ ] 审计日志展示最近 6 条操作记录
- [ ] 模块状态列表展示已启用/未启用模块
- [ ] 用户活跃度分布展示
- [ ] 8 个系统管理快捷入口可点击跳转
- [ ] 空状态有合理展示
**全局:**
- [ ] `useDashboardRole()` 正确分发五个角色的工作台视图
- [ ] 30 秒自动刷新数据
- [ ] `cargo check` 通过
- [ ] `pnpm build` 通过
- [ ] 浏览器中实际操作验证通过