# 医生端合并至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 天
