298 lines
13 KiB
Markdown
298 lines
13 KiB
Markdown
# 健康管家工作台 — 方案 B「工作流驱动」设计规格
|
||
|
||
> 日期: 2026-05-02 | 状态: 设计中(评审后修订 v2)
|
||
> 原型参考: `_temp/workbench-health-manager-B.html`
|
||
> 评审记录: 发现 7 CRITICAL + 5 IMPORTANT,已全部修复
|
||
|
||
## 1. 背景与目标
|
||
|
||
### 1.1 为什么要重新设计
|
||
|
||
现有工作台(方案 A/D/E/F)基于「临床医生管理透析团队」的假设设计。实际用户场景已明确:
|
||
|
||
- 机构已有 HIS + 专用血透系统,HMS 不碰临床透析流程
|
||
- HMS 定位是**患者与机构之间的纽带**:日常健康数据采集、随访干预、积分运营、健康科普
|
||
- 工作台的第一用户是**健康管家/随访护士**,不是做透析的医生
|
||
|
||
### 1.2 目标
|
||
|
||
| 指标 | 当前 | 目标 |
|
||
|------|------|------|
|
||
| 健康管家每日任务处理效率 | 无专门工作台,散落在各页面 | 统一入口,一件一件处理 |
|
||
| 任务遗漏率 | 未知(无追踪) | ≤2%(系统强制排序 + 超时提醒) |
|
||
| AI 建议触达率 | 有 AI 洞察面板但无强制处理流程 | 任务流中自动注入,100% 触达 |
|
||
| 平均任务响应时间 | 无数据 | 危急 ≤30min,紧急 ≤2h,普通 ≤24h |
|
||
|
||
### 1.3 范围
|
||
|
||
**分两期实施:**
|
||
|
||
| 阶段 | 任务类型 | 数据源状态 |
|
||
|------|---------|-----------|
|
||
| **Phase 1(本期)** | 体征告警、AI 建议待审、到期随访 | ✅ 现有 `action_inbox_service.rs` 已聚合 |
|
||
| **Phase 2(后续)** | 患者咨询、积分审批、体征少报提醒、干预评估 | ⏳ 需扩展数据源或新建调度 |
|
||
|
||
- **本期(Phase 1)**:健康管家/随访护士角色,3 种任务类型,三栏工作流布局
|
||
- **不在本期**:医生角色、运营角色、方案 A/C、Phase 2 任务类型
|
||
|
||
## 2. 角色定义 — 健康管家「刘小燕」
|
||
|
||
### 2.1 人物画像
|
||
|
||
| 维度 | 描述 |
|
||
|------|------|
|
||
| 姓名 | 刘小燕 |
|
||
| 职位 | 主管护师 / 健康管家 |
|
||
| 年龄 | 32 岁 |
|
||
| 工作经验 | 8 年护理,3 年健康管理 |
|
||
| 技术水平 | 熟练使用手机 App,PC 端基本操作无障碍 |
|
||
| 日均任务量 | 20-30 项(随访 8-12、体征审核 4-6、AI 建议 3-5、其他 3-5) |
|
||
|
||
### 2.2 典型工作日
|
||
|
||
```
|
||
08:00 打开工作台,按优先级处理紧急体征告警
|
||
08:30 逐个处理血压/血糖异常告警(电话随访 + 记录)
|
||
10:00 处理 AI 建议待审(审核并采纳或转给医生)
|
||
14:00 处理到期随访任务(电话/微信随访 + 记录)
|
||
16:00 回复患者咨询、处理积分兑换等(跳转对应模块)
|
||
17:00 检查今日完成情况,确认无遗漏后下班
|
||
```
|
||
|
||
### 2.3 核心痛点
|
||
|
||
1. **任务分散**:随访、体征、AI 建议散落在不同菜单,频繁切换
|
||
2. **优先级不清**:不知道该先处理哪个,容易遗漏紧急告警
|
||
3. **上下文缺失**:处理一个告警时需要单独打开患者详情查看历史
|
||
4. **AI 建议利用率低**:AI 面板在角落,不强制处理,容易被忽略
|
||
|
||
## 3. 信息架构 — 三栏布局
|
||
|
||
### 3.1 布局结构
|
||
|
||
**注意**:侧边栏由全局布局提供(`apps/web/src/layouts/`),工作台页面内部只有两栏(任务队列 + 详情面板)。
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────┐
|
||
│ 全局侧边栏(已有,不动) │ 工作台页面内部 │
|
||
│ │ │
|
||
│ ... │ ┌────────────┬──────────────┐ │
|
||
│ ⚡ 工作流(高亮) │ │ 任务队列 │ 详情处理面板 │ │
|
||
│ 📋 随访管理 │ │ 340px │ flex:1 │ │
|
||
│ 🩺 体征监测 │ │ │ │ │
|
||
│ 💬 患者咨询 │ │ 头部统计 │ 患者信息栏 │ │
|
||
│ ... │ │ Tab 切换 │ 异常数据 │ │
|
||
│ │ │ 任务列表 │ AI 建议 │ │
|
||
│ │ │ │ 互动记录 │ │
|
||
│ │ │ │ 操作按钮 │ │
|
||
│ │ └────────────┴──────────────┘ │
|
||
└──────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 3.2 两栏职责
|
||
|
||
| 区域 | 职责 | 交互 |
|
||
|------|------|------|
|
||
| **任务队列** | 按优先级排列的待处理任务 + 统计 | 点击选中 → 右侧加载详情 |
|
||
| **详情面板** | 当前任务的完整上下文 + 操作 | 处理完成后自动跳转下一任务 |
|
||
|
||
### 3.3 全局侧边栏菜单调整
|
||
|
||
在现有全局侧边栏中,将「工作台」菜单项更名为「工作流」,点击进入方案 B 的三栏工作台。其他菜单项不变。
|
||
|
||
## 4. 组件清单
|
||
|
||
### 4.1 任务队列组件
|
||
|
||
| 组件 | 说明 | 数据源 |
|
||
|------|------|--------|
|
||
| **QueueHeader** | 队列统计(待处理/已完成) | `GET /health/action-inbox/stats`(现有) |
|
||
| **QueueTabs** | Tab 切换:待处理 / 已完成 | 前端状态 |
|
||
| **TaskItem** | 单个任务卡片:优先级圆点 + 标题 + 元信息 + 标签 + 时间 | 现有 `list_action_inbox` API |
|
||
| **TaskList** | 可滚动的任务列表容器 | Ant Design `List` + `InfiniteScroll` |
|
||
|
||
### 4.2 详情面板组件
|
||
|
||
| 组件 | 适用任务类型 | 说明 | 数据源 |
|
||
|------|-------------|------|--------|
|
||
| **PatientBar** | 全部 | 患者头像 + 姓名 + 年龄 + 科室 + 病史标签 | `GET /health/patients/:id`(现有) |
|
||
| **VitalAlertDetail** | 体征异常 | 异常数值 + 近 7 天趋势图 + 参考范围 | `GET /health/action-inbox/:source_ref/thread`(现有)+ `GET /health/vital-signs/trends`(现有) |
|
||
| **AiSuggestionCard** | AI 建议 | 风险评估 + 建议措施 + 采纳/拒绝操作 | thread API(现有) |
|
||
| **FollowUpForm** | 到期随访 | 随访表单 + 上次随访摘要 | thread API(现有) |
|
||
| **InteractionTimeline** | 全部 | 患者近期互动记录 | `GET /health/action-inbox/:source_ref/thread`(现有) |
|
||
| **ActionBar** | 全部 | 底部操作按钮(因任务类型不同而变化) | — |
|
||
|
||
### 4.3 任务类型与优先级(Phase 1 仅 3 种)
|
||
|
||
| 优先级 | 类型 | 自动生成规则 | 目标响应时间 | 数据源 |
|
||
|--------|------|-------------|-------------|--------|
|
||
| **危急 (P0)** | 体征危急值告警 | 告警系统生成 | ≤30 分钟 | `alerts` 表 |
|
||
| **紧急 (P1)** | AI 建议待审 | AI 分析引擎生成 | ≤2 小时 | `ai_analysis` 表 |
|
||
| **普通 (P2)** | 到期随访 | 随访计划到期 | ≤24 小时 | `follow_up_task` 表 |
|
||
|
||
### 4.4 任务 ID 格式
|
||
|
||
沿用现有 `action_inbox_service.rs` 的复合 ID 格式:`"{action_type}:{uuid}"`
|
||
|
||
- 告警任务:`"alert:550e8400-..."`
|
||
- AI 建议:`"ai_suggestion:660e8400-..."`
|
||
- 随访任务:`"follow_up:770e8400-..."`
|
||
|
||
操作分发逻辑:解析 `action_type` 前缀,路由到对应的底层服务。
|
||
|
||
## 5. 数据流与排序
|
||
|
||
### 5.1 任务生命周期
|
||
|
||
```
|
||
[自动生成] → [进入队列] → [选中处理] → [执行操作] → [完成/转交]
|
||
↑ │
|
||
└── 超时未处理 → 升级优先级 ←──────────────┘
|
||
```
|
||
|
||
### 5.2 现有 API 复用策略
|
||
|
||
不新建 API 路径。**改造现有 `action-inbox` 系列接口**:
|
||
|
||
| 现有 API | 改造内容 |
|
||
|---------|---------|
|
||
| `GET /health/action-inbox` | 增加按优先级排序(改 SQL ORDER BY) |
|
||
| `GET /health/action-inbox/stats` | 增加「已完成」计数 |
|
||
| `GET /health/action-inbox/:source_ref/thread` | 增加 patient 上下文字段 |
|
||
| `POST /health/alerts/:id/acknowledge` | 沿用(完成告警任务) |
|
||
| `POST /health/ai-analysis/:id/review` | 沿用(采纳/拒绝 AI 建议) |
|
||
| `POST /health/follow-up/:id/complete` | 沿用(完成随访任务) |
|
||
|
||
详情面板的患者信息、趋势图通过**前端并行调用**现有 API 获取:
|
||
- `GET /health/patients/:id` → PatientBar
|
||
- `GET /health/vital-signs/trends?patient_id=&days=7` → VitalAlertDetail
|
||
- `GET /health/action-inbox/:source_ref/thread` → InteractionTimeline + 核心任务数据
|
||
|
||
前端用 `Promise.allSettled` 并行请求,加载中显示 Skeleton。
|
||
|
||
### 5.3 排序规则修复
|
||
|
||
现有 SQL 使用 `created_at DESC`(新的在前),需改为 `created_at ASC`(早的在前,FIFO),与设计规格一致。优先级映射从 3 级扩展为 4 级:
|
||
|
||
```sql
|
||
ORDER BY
|
||
CASE priority_raw
|
||
WHEN 'critical' THEN 0 -- P0 新增
|
||
WHEN 'high' THEN 1
|
||
WHEN 'urgent' THEN 1
|
||
WHEN 'medium' THEN 2
|
||
ELSE 3
|
||
END,
|
||
created_at ASC -- 改为 ASC
|
||
```
|
||
|
||
## 6. 交互流程 — 处理一个任务的完整闭环
|
||
|
||
以「张伟 — 血压危急值 188/102」为例:
|
||
|
||
```
|
||
1. 进入工作台
|
||
└→ 任务队列自动加载,张伟的告警排在最前(P0)
|
||
|
||
2. 点击任务
|
||
└→ 右侧详情面板加载(并行请求患者信息 + thread + 趋势):
|
||
- 患者信息栏:张伟 / 男 / 58岁 / 血透中心 / 高血压3级
|
||
- 异常数据:收缩压 188 / 舒张压 102 / 心率 92
|
||
- 近 7 天收缩压趋势图(柱状图)
|
||
- 近期互动记录
|
||
|
||
3. 执行操作
|
||
└→ 点击「立即电话随访」
|
||
└→ 弹出电话随访表单(预设患者电话号码)
|
||
└→ 填写随访记录:确认用药 / 伴随症状 / 处理建议
|
||
└→ 提交 → 调用 POST /health/alerts/:id/acknowledge
|
||
|
||
4. 任务完成
|
||
└→ 任务从「待处理」移至「已完成」
|
||
└→ 队列自动选中下一个任务
|
||
└→ 右侧面板加载新任务的详情
|
||
|
||
5. 可选操作
|
||
└→ 「转给医生」:更改 assigned_to → 对应医生(需 migration 加字段,Phase 2)
|
||
└→ 「稍后处理」:本地状态,置底并标记延迟时间
|
||
```
|
||
|
||
### 6.1 操作按钮矩阵(Phase 1)
|
||
|
||
| 任务类型 | 主操作 | 次要操作 | 底层 API |
|
||
|---------|--------|---------|---------|
|
||
| 体征异常告警 | 记录处理结果 + 确认 | 稍后处理 | `POST /health/alerts/:id/acknowledge` |
|
||
| AI 建议待审 | 采纳 / 拒绝 | 稍后处理 | `POST /health/ai-analysis/:id/review` |
|
||
| 到期随访 | 开始随访(电话/线上/面访) | 稍后处理 | `POST /health/follow-up/:id/complete` |
|
||
|
||
### 6.2 空状态处理
|
||
|
||
- 队列为空时:显示「所有任务已处理完毕」+ 今日完成统计
|
||
- 详情面板未选中任务时:显示空态引导「从左侧选择一个任务开始处理」
|
||
- 加载中:Skeleton 占位
|
||
|
||
### 6.3 前端状态管理
|
||
|
||
使用 Zustand store `useWorkbenchStore`:
|
||
|
||
```typescript
|
||
interface WorkbenchState {
|
||
tasks: ActionItem[]; // 任务列表
|
||
selectedTaskId: string | null; // 当前选中任务
|
||
completedCount: number; // 今日完成数
|
||
tab: 'pending' | 'completed'; // 当前 Tab
|
||
|
||
selectTask: (id: string) => void;
|
||
completeTask: (id: string) => Promise<void>;
|
||
refreshTasks: () => Promise<void>;
|
||
}
|
||
```
|
||
|
||
实时刷新策略:Phase 1 使用 30 秒轮询(`setInterval` + `refreshTasks`),Phase 2 考虑升级为 SSE。
|
||
|
||
## 7. 与现有系统的关系
|
||
|
||
### 7.1 改造策略
|
||
|
||
改造现有的 `Home.tsx` 工作台页面,替换当前仪表盘布局为方案 B 的任务队列 + 详情面板两栏布局。
|
||
|
||
**不新建页面**,在现有路由 `/health` 上直接改造。侧边栏不变。
|
||
|
||
### 7.2 涉及文件
|
||
|
||
| 文件 | 改动类型 | 说明 |
|
||
|------|---------|------|
|
||
| `apps/web/src/pages/health/Home.tsx` | **重写** | 从仪表盘布局改为任务队列 + 详情面板 |
|
||
| `apps/web/src/pages/health/components/TaskQueue.tsx` | **新增** | 任务队列组件 |
|
||
| `apps/web/src/pages/health/components/TaskDetail.tsx` | **新增** | 详情面板组件 |
|
||
| `apps/web/src/pages/health/components/PatientBar.tsx` | **新增** | 患者信息栏 |
|
||
| `apps/web/src/stores/workbenchStore.ts` | **新增** | Zustand store |
|
||
| `crates/erp-health/src/service/action_inbox_service.rs` | **改造** | 修复排序规则 + 扩展优先级 |
|
||
| `crates/erp-health/src/handler/device_reading_handler.rs` | **改造** | alert acknowledge 增加处理记录 |
|
||
|
||
### 7.3 数据库变更
|
||
|
||
Phase 1 **无需新建表**。任务从现有 3 张表聚合:
|
||
- 体征告警 ← `alerts` 表(未确认的告警)
|
||
- AI 建议 ← `ai_analysis` 表(状态=pending_review)
|
||
- 到期随访 ← `follow_up_task` 表(状态=pending + 到期日<=今天)
|
||
|
||
聚合逻辑沿用现有 `action_inbox_service.rs` 的 UNION ALL 方案。
|
||
|
||
### 7.4 权限
|
||
|
||
沿用现有权限码:`health.action-inbox.list` + `health.action-inbox.manage`。
|
||
|
||
### 7.5 验收标准
|
||
|
||
- [ ] 工作台展示 3 种任务类型(告警、AI 建议、随访),按优先级排序
|
||
- [ ] 点击任务,右侧详情面板展示完整上下文(患者信息 + 原始数据 + 趋势 + 互动记录)
|
||
- [ ] 告警任务可确认并记录处理结果
|
||
- [ ] AI 建议可采纳或拒绝
|
||
- [ ] 随访任务可完成并填写随访记录
|
||
- [ ] 任务完成后自动选中下一个
|
||
- [ ] 空状态有合理展示
|
||
- [ ] 30 秒自动刷新任务列表
|
||
- [ ] `cargo check` 通过
|
||
- [ ] 浏览器中实际操作验证通过
|