- BLE: 修复Omron设备Indication模式连接(先订阅后配CCCD + forceIndications) + 直连重连
- BLE: 设备断连实时检测(connectionState流→Provider→UI)
- 修复: 血压数据上报后端枚举不匹配(Device→DeviceSync)导致500
- 新增: DELETE /api/health-records/{id} 后端接口
- 设备管理页: 白色主题重设计 + 直连重连 + 实时状态 + Toast通知
- 设备扫描页: 白色主题 + 扫描动画居中 + 已连接等待页面
- 健康记录: 左滑删除(Dismissible) + 同时清理_allRecords和_filtered
- 导航: 修复自定义路由栈下Navigator.pop黑屏bug
- 文档: 医生端合并App完整设计文档(已确认版)
314 lines
9.4 KiB
Markdown
314 lines
9.4 KiB
Markdown
# 医生端合并至App — 详细设计文档(已确认版)
|
||
|
||
> 目标:将 `doctor_web` (React SPA) 的功能完整迁移到 `health_app` (Flutter),通过注册时选择"用户/医生"身份实现双端合一。
|
||
>
|
||
> 本文档所有决策均已经过逐一讨论和确认。
|
||
|
||
---
|
||
|
||
## 一、已确认设计决策总表
|
||
|
||
| # | 决策项 | 结论 |
|
||
|---|--------|------|
|
||
| 1 | 角色体系 | **方案A** — User表加Role字段 + 新建DoctorProfile子表,废弃旧Doctor表 |
|
||
| 2 | 手机号角色 | **一个手机号只能一个角色** |
|
||
| 3 | 种子医生 | **全部删除**(王建国/李芳/张明),重新注册测试 |
|
||
| 4 | 审核码 | 硬编码 `6666`,注册医生时校验 |
|
||
| 5 | 代码位置 | 放在 `health_app` 同一项目,同一安装包 |
|
||
| 6 | 开发节奏 | **一次性全量做完**,不分期 |
|
||
| 7 | 患者端 | 开发期间保持可用,患者问诊聊天保留 |
|
||
| 8 | 医生主色调 | **医疗蓝 `#0891B2`** + 白色 |
|
||
| 9 | 深色模式 | 不做,仅浅色 |
|
||
| 10 | 导航结构 | **侧边抽屉**,与患者端一致 |
|
||
| 11 | 报告文件预览 | 图片直接内嵌查看,PDF调用系统查看器 |
|
||
| 12 | 医生头像 | 支持从相册上传 |
|
||
| 13 | 所有医生端点 | 加JWT鉴权 |
|
||
|
||
---
|
||
|
||
## 二、注册流程
|
||
|
||
```
|
||
注册页
|
||
├─ ① 选择身份:[用户] [医生] ← 第一步,先选
|
||
├─ ② 输入手机号 → 获取短信验证码 ← 通用
|
||
├─ ③ 输入验证码 ← 通用
|
||
├─ ④ (仅医生) 输入审核码 [6666] ← 选医生才弹出
|
||
├─ ⑤ 勾选同意《隐私政策》《用户协议》 ← 可点击查看详情页
|
||
└─ ⑥ 点击注册
|
||
```
|
||
|
||
- 文案统一用"用户"而非"患者"
|
||
- 医生注册时不填姓名/职称/科室/医院,登录后在设置里补全
|
||
- 登录时不需要选身份,自动进入注册时选择的身份端
|
||
|
||
---
|
||
|
||
## 三、多端登录体系(新增)
|
||
|
||
### 3.1 账号核心原则
|
||
|
||
- **手机号 = 主标识**,微信/Apple 都是绑定到手机号上
|
||
- **注册时定身份,永久不可改**(除非删除账号重来)
|
||
- 一个手机号只能绑定一个微信 + 一个 Apple ID
|
||
- 登录方式可选(手机号/微信/Apple),但身份由注册时的选择决定
|
||
|
||
### 3.2 注册流程(手机号注册 + 立刻绑定)
|
||
|
||
```
|
||
注册页
|
||
├─ ① 选择身份:[用户] [医生]
|
||
├─ ② 输入手机号 → 短信验证码
|
||
├─ ③ (仅医生) 审核码 6666
|
||
├─ ④ 勾选同意《隐私政策》《用户协议》
|
||
├─ ⑤ 点击注册
|
||
└─ ⑥ 注册成功后弹绑定页:
|
||
├─ [绑定微信]
|
||
├─ [绑定Apple]
|
||
└─ [跳过,以后再绑]
|
||
```
|
||
|
||
### 3.3 后续登录方式
|
||
|
||
注册后,登录页直接显示三个按钮:
|
||
|
||
```
|
||
登录页
|
||
├─ [微信登录] → 查手机号 → 自动进入对应身份端
|
||
├─ [Apple登录] → 查手机号 → 自动进入对应身份端
|
||
└─ [手机号登录] → 短信验证 → 自动进入对应身份端
|
||
```
|
||
|
||
### 3.4 删除账号(≠ 退出登录)
|
||
|
||
- 在设置页独立入口,不与退出登录混淆
|
||
- 确认后彻底删除:用户数据、健康记录、问诊记录、绑定关系
|
||
- Apple 用户额外调用 Apple revocation API
|
||
- 删除后手机号释放,可重新注册(可换身份)
|
||
|
||
### 3.5 微信/Apple 平台准备
|
||
|
||
| 微信开放平台 | 需要新的 AppID,绑定 `com.datalumina.YYA` |
|
||
|-------------|------------------------------------------|
|
||
| Apple Sign In | Apple Developer 账号开启 Capability |
|
||
| Flutter包 | 微信用 `fluwx`,Apple 用 `sign_in_with_apple` |
|
||
|
||
> AppID 暂时空着,等申请下来再填。
|
||
|
||
---
|
||
|
||
## 四、登录后路由(不变)
|
||
|
||
```
|
||
登录成功
|
||
├─ Role = 'User' → 现有患者端(AI对话首页 + 侧边抽屉)
|
||
└─ Role = 'Doctor' → 医生端(工作台Dashboard + 侧边抽屉)
|
||
```
|
||
|
||
---
|
||
|
||
## 五、医生职责与功能
|
||
|
||
### 4.1 患者范围(初期)
|
||
|
||
所有注册用户都是所有医生的患者。后期VIP体系再做患者分配。
|
||
|
||
### 4.2 工作台 Dashboard
|
||
|
||
- 统计卡片:患者总数 / 进行中问诊 / 待审核报告 / 今日随访
|
||
- 待办事项列表(全部可点击快捷进入):
|
||
- 未回复问诊消息数
|
||
- 待审核报告数
|
||
- 今日随访对象
|
||
- 每个待办项都是快捷入口,点击直接进入对应工作页
|
||
|
||
### 4.3 患者管理
|
||
|
||
- 搜索框(姓名/手机号)+ 分页加载(上拉更多)
|
||
- 点击患者进入详情页
|
||
- **详情页结构**:
|
||
- 默认展示:基本信息(姓名/性别/年龄/电话)、健康档案(病史/手术史/过敏/慢病/家族史)、当前用药
|
||
- 按钮"更多信息" → 展开:趋势图/饮食记录/运动计划/报告列表/随访记录
|
||
|
||
### 4.4 问诊聊天
|
||
|
||
- 保持现有流程:患者发起 → AI先接待 → 医生后续介入
|
||
- AI行为暂不改动(后续优化)
|
||
- 电话功能:留UI入口,功能暂不做
|
||
- 问诊列表显示:患者头像+姓名、最后消息预览、状态、时间
|
||
- 聊天页面复用现有 `DoctorChatPage`,但需要新建医生端Provider(使用 `/api/doctor/consultations/*` 端点,senderType='Doctor')
|
||
- SignalR 实时通信保留(已有实现)
|
||
|
||
### 4.5 报告审核
|
||
|
||
- 全功能迁移,包含:
|
||
1. AI预分析摘要
|
||
2. 指标表格(正常/异常颜色标记)
|
||
3. 严重程度4级评定(正常/异常/严重/危急)
|
||
4. 建议模板多选(药量调整/复诊建议/生活建议/其他)
|
||
5. 自定义评语(可选)
|
||
6. 原始报告查看(图片内嵌/PDF系统查看器)
|
||
7. 提交审核
|
||
- 所有医生都能看到所有患者的报告
|
||
|
||
### 4.6 复查随访
|
||
|
||
- 医生创建随访计划(标题+时间+备注)
|
||
- 到期只提醒医生 → 医生手动联系患者
|
||
- 随访列表 + 新建/编辑/标记完成/删除
|
||
|
||
---
|
||
|
||
## 六、导航与页面结构
|
||
|
||
### 5.1 医生端侧边抽屉
|
||
|
||
```
|
||
┌─────────────────────┐
|
||
│ [头像] 在线/离线 🔵 │ ← 点击头像→个人信息编辑页
|
||
│ 姓名 职称 科室 │ ← 在线状态可切换
|
||
│ │
|
||
│ ━━━━━━━━━━━━━━━━━━━ │
|
||
│ 📊 工作台 │ ← 默认首页
|
||
│ 👥 患者管理 │
|
||
│ 💬 问诊列表 │
|
||
│ 📋 报告审核 │
|
||
│ 📅 复查随访 │
|
||
│ ⚙️ 设置 │
|
||
│ ━━━━━━━━━━━━━━━━━━━ │
|
||
│ 🚪 退出登录 │
|
||
└─────────────────────┘
|
||
```
|
||
|
||
- 点击抽屉项 → 主页面切换到对应页面
|
||
- 在线/离线状态在抽屉顶部头像区快速切换
|
||
|
||
### 5.2 "设置"页面内容
|
||
|
||
- 推送通知开关
|
||
- 隐私政策查看
|
||
- 用户协议查看
|
||
- 退出登录
|
||
|
||
### 5.3 "个人信息"页面(点击头像进入)
|
||
|
||
- 姓名 / 职称 / 科室 / 医院
|
||
- 头像上传(相册选图)
|
||
|
||
### 5.4 医生首次登录
|
||
|
||
直接进工作台,但顶部显示提示条"请完善个人信息",点击跳转到个人信息编辑页。
|
||
|
||
---
|
||
|
||
## 七、路由表
|
||
|
||
| 路由名 | 页面 | 用户端 | 医生端 |
|
||
|--------|------|--------|--------|
|
||
| `login` | 登录/注册 | ✅ | ✅ |
|
||
| `home` | 首页(AI对话/工作台) | ✅ | ✅ (根据Role) |
|
||
| `doctorPatients` | 患者列表 | — | ✅ |
|
||
| `doctorPatientDetail` | 患者详情 | — | ✅ |
|
||
| `doctorChat` | 问诊聊天 | ✅(复用) | ✅(新Provider) |
|
||
| `doctorConsultations` | 问诊列表 | — | ✅ |
|
||
| `doctorReports` | 报告列表 | — | ✅ |
|
||
| `doctorReportDetail` | 报告审核 | — | ✅ |
|
||
| `doctorFollowUps` | 随访列表 | — | ✅ |
|
||
| `doctorFollowUpEdit` | 随访编辑 | — | ✅ |
|
||
| `doctorSettings` | 医生设置 | — | ✅ |
|
||
| `doctorProfile` | 个人信息编辑 | — | ✅ |
|
||
|
||
---
|
||
|
||
## 八、数据库变更
|
||
|
||
### 7.1 Users 表加字段
|
||
|
||
```sql
|
||
ALTER TABLE "Users" ADD COLUMN "Role" TEXT NOT NULL DEFAULT 'User'; -- 'User' | 'Doctor'
|
||
```
|
||
|
||
### 7.2 新建 DoctorProfiles 表
|
||
|
||
```sql
|
||
CREATE TABLE "DoctorProfiles" (
|
||
"Id" UUID PRIMARY KEY,
|
||
"UserId" UUID NOT NULL REFERENCES "Users"("Id"),
|
||
"Name" TEXT,
|
||
"Title" TEXT,
|
||
"Department" TEXT,
|
||
"Hospital" TEXT,
|
||
"AvatarUrl" TEXT,
|
||
"IsOnline" BOOLEAN DEFAULT false,
|
||
"IsActive" BOOLEAN DEFAULT true,
|
||
"CreatedAt" TIMESTAMP DEFAULT now(),
|
||
"UpdatedAt" TIMESTAMP DEFAULT now()
|
||
);
|
||
```
|
||
|
||
### 7.3 清理
|
||
|
||
- 删除旧 `Doctors` 表种子数据
|
||
- 迁移 Consultation 表的 DoctorId 外键关联
|
||
|
||
---
|
||
|
||
## 九、后端变更
|
||
|
||
### 8.1 JWT 增加 Role Claim
|
||
|
||
```csharp
|
||
new Claim("Role", user.Role)
|
||
```
|
||
|
||
### 8.2 所有 `/api/doctor/*` 端点
|
||
|
||
- 添加 `.RequireAuthorization()`
|
||
- 添加 Role 校验(Role = "Doctor")
|
||
- 从 JWT 获取医生信息替代硬编码"王建国"
|
||
|
||
### 8.3 注册接口改造
|
||
|
||
- 支持 Role 参数
|
||
- 医生注册时校验审核码 6666
|
||
- 医生注册创建 DoctorProfile 空记录
|
||
|
||
### 8.4 审核码配置
|
||
|
||
```csharp
|
||
// appsettings.json 或环境变量
|
||
const string DoctorInviteCode = "6666";
|
||
```
|
||
|
||
---
|
||
|
||
## 十、UI设计规范
|
||
|
||
### 9.1 颜色
|
||
|
||
| 用途 | 颜色 |
|
||
|------|------|
|
||
| 主色 | `#0891B2` (医疗蓝) |
|
||
| 背景 | `#FFFFFF` / `#F5F5F5` |
|
||
| 卡片 | 白色 + 浅阴影 |
|
||
| 成功/已连接 | `#10B981` |
|
||
| 状态标签 | 待处理(橙) / 已处理(绿) / 异常(红) |
|
||
| 文字 | `#1A1A1A` / `#999999` |
|
||
|
||
### 9.2 与患者端的视觉区分
|
||
|
||
- 患者端:紫色渐变 `#5B8DEF`
|
||
- 医生端:医疗蓝 `#0891B2`
|
||
- 抽屉结构和布局保持一致
|
||
|
||
---
|
||
|
||
## 十一、实施参考
|
||
|
||
- 新增约 12 条路由
|
||
- 新增约 10 个页面组件
|
||
- 新增约 4 个 Provider
|
||
- 修改约 15 个后端端点
|
||
- 修改注册/登录流程
|
||
- 总计预估 6-8 天
|