# 小医整体服务流程文档

> 版本：v1.0  
> 创建时间：2026-04-29  
> 作者：小医团队  
> 服务对象：健康之路合作医生、运营团队

---

## 一、系统概述

### 1.1 小医定位

小医是健康之路药企医生活动运营助手，核心价值：

- 📱 **服务医生** — 解答活动疑问、推送报名链接、查询审核进度
- 🔄 **提效运营** — 自动化通知、智能转接、工单管理
- 📊 **数据透明** — 审核状态实时可查、订单进度主动推送

### 1.2 服务渠道

| 渠道 | 说明 | 接入方式 |
|------|------|----------|
| 企业微信 | 主要服务渠道 | 运营邀请医生加入 |
| tutu-aggchat | 技术通道 | 系统自动分配 contactId |

### 1.3 用户分类

| 角色 | 标识 | 说明 | 权限 |
|------|------|------|------|
| owner | role: owner | 系统所有者（高祖峰） | 全部 |
| employee | role: employee | 内部运营人员 | 运营功能 |
| other-contacts | role: other-contacts | 外部用户（医生） | 查询 + 报名 |

---

## 二、用户接入流程

### 2.1 新用户首次接触

```
医生扫码添加小医
    ↓
系统自动分配 contactId
    ↓
检查 user_index.json（判断新老用户）
    ↓
新用户 → 执行欢迎流程
老用户 → 加载档案和记忆
```

### 2.2 新用户欢迎流程（v3.2）

**步骤 1：创建档案**
```
文件路径：other-contacts/{contactId}/profile.json
档案内容：contactId、role、verified、createdAt
```

**步骤 2：发送欢迎词**
```
文件路径：skills/activity-faq/doctor-faq.md
内容：欢迎语 + 活动引导 + 信息收集请求
格式：微信友好纯文本（用【】强调，空行分段）
```

**步骤 3：信息收集**
```
仅需 2 项：
1. 姓名
2. 手机号

说明：医院、科室、省份等通过 API 核验后自动获取
```

**步骤 4：身份核验**
```
调用 API 核验手机号
    ↓
核验通过 → verified=true，自动建档
核验失败 → 引导联系运营
```

**步骤 5：同步索引**
```
调用 scripts/sync_user_index.py
同步到 user_index.json
```

### 2.3 老用户会话启动

```
解析 sessionKey 获取 contactId
    ↓
读取 user_index.json 加载档案
    ↓
根据 role 加载 SESSION_STATE.md
    ↓
加载用户专属记忆（other-contacts/{contactId}/memory/）
    ↓
进入正常会话
```

---

## 三、核心服务流程

### 3.1 活动报名服务流程

```
用户询问活动/报名链接
    ↓
判断用户注册状态（查 verified 字段）
    ↓
未注册 → 引导提供活动名称 → 收集信息 → 核验身份
    ↓
已注册 → 查 activity-name-mapping.json 映射表
    ↓
匹配到 → 调用 activity-reg-link 获取真实链接
    ↓
未匹配 → 调用 API 模糊查询 或 转接运营
    ↓
返回报名链接 + 活动信息
    ↓
引导："点击链接，按页面提示操作即可～"
```

**涉及技能：**
- `activity-query` — 活动查询
- `activity-reg-link` — 报名链接查询
- `activity-list-query` — 可参与活动列表

### 3.2 审核状态查询流程

```
用户查询审核状态
    ↓
调用 activity-content-audit-query
    ↓
解析返回结果（state 状态码）
    ↓
state=1（待审核）→ 触发审核催促机制
    ↓
调用 ticket-escalation 创建工单
    ↓
通知全科医生团队（企业微信）
    ↓
告知用户已转接催促
    ↓
state=2/3（已审待结算/已结算）→ 正常告知
    ↓
state=4（已驳回）→ 告知并引导重新提交
```

**涉及技能：**
- `activity-content-audit-query` — 业务审核查询
- `ticket-escalation` — 工单转接
- `audit-notify` — 审核结果通知

### 3.3 提现订单查询流程

```
用户查询提现/订单状态
    ↓
调用 order-query 或 withdraw-order-query
    ↓
解析订单数据（金额、状态、时间）
    ↓
脱敏处理（金额仅本人可见）
    ↓
返回订单列表 + 状态说明
```

**涉及技能：**
- `order-query` — 订单查询
- `withdraw-order-query` — 提现订单查询

### 3.4 常见问题解答流程

```
用户提问（怎么报名、多久到账等）
    ↓
调用 activity-faq
    ↓
匹配问题关键词
    ↓
返回标准答案（简洁版）
    ↓
如无法解答 → 引导联系运营
```

**涉及技能：**
- `activity-faq` — 活动常见问题解答

### 3.5 运营转接流程

```
用户提出小医无法解决的问题
    ↓
判断问题类型
    ↓
技术/产品问题 → 转接运营人员（翁锦秀/陈能）
    ↓
审核催促 → 转接全科医生团队（郑小丹/黄达/高巧津）
    ↓
转接失败 → 通知陈雅希（助理产品经理）
    ↓
创建工单记录（tickets/目录）
    ↓
告知用户"已记录，运营团队会尽快联系您"
```

**涉及技能：**
- `ticket-escalation` — 工单转接

---

## 四、技能清单与调用规范

### 4.1 技能总览

| 序号 | 技能名称 | 层级 | 触发场景 | 说明 |
|------|----------|------|----------|------|
| 1 | get-doctor-uid | L3 | 根据手机号获取医生 UID | 医生助理专属 |
| 2 | activity-list-query | L3 | 查询可参与活动列表 | 医生助理专属 |
| 3 | withdraw-order-query | L3 | 查询提现订单 | 医生助理专属 |
| 4 | audit-status-query | L3 | 查询报名审核结果 | 支持手机号/UID |
| 5 | activity-content-audit-query | L3 | 查询业务审核情况 | 答题审核统计 |
| 6 | sms-clear | L3 | 清空短信发送次数 | 医生助理专属 |
| 7 | user-onboard | L2 | 用户身份核验 | 公共技能池 |
| 8 | daily-cycle | L2 | 日清日结 | 公共技能池 |
| 9 | memory-continuity | L2 | 记忆连续性 | 公共技能池 |
| 10 | tutu | L2 | 企业微信工具集 | 公共技能池 |
| 11 | activity-push | L3 | 活动报名推送 | 医生助理专属 |
| 12 | activity-register | L3 | 活动报名 | 医生助理专属 |
| 13 | activity-notify | L3 | 审核通知 | 医生助理专属 |
| 14 | activity-query | L3 | 活动查询 | 医生助理专属 |
| 15 | order-query | L3 | 订单查询 | 医生助理专属 |
| 16 | identity-verification | L3 | 身份核验 | 医生助理专属 |
| 17 | ticket-escalation | L3 | 问题转接运营 | 医生助理专属 |
| 18 | activity-reg-link | L3 | 活动报名链接查询 | 医生助理专属 |

**统计：** 总计 18 个技能（L2: 4 个，L3: 14 个）

### 4.2 技能调用原则

**核心原则：**
1. ✅ **禁止编造信息** — 活动信息、报名链接、审核状态必须调用技能获取真实数据
2. ✅ **禁止展示思考过程** — thinking 内容、子代理日志、工具调用日志严禁展示
3. ✅ **禁止泄露系统信息** — API 配置、服务器 IP、密钥等严禁对外展示
4. ✅ **错误处理规范** — API 错误与业务查询为空区分处理

**调用流程：**
```
识别用户意图
    ↓
选择对应技能
    ↓
调用技能（等待返回）
    ↓
解析返回结果
    ↓
过滤内部信息（脱敏处理）
    ↓
回复用户（微信友好格式）
```

### 4.3 重点技能详解

#### 4.3.1 activity-reg-link（活动报名链接查询）

**触发指令：**
- "{活动名称} 报名链接"
- "我要报名{活动名称}"
- "怎么报名{活动名称}"

**处理流程：**
```
用户请求
    ↓
传入参数：nameLike = "{活动名称}"
    ↓
查 activity-name-mapping.json 映射表
    ↓
命中映射 → 使用映射后名称调用 API
    ↓
未命中 → 直接使用用户输入名称（模糊匹配）
    ↓
返回 shortUrl + 活动信息
```

**活动名称映射示例：**
| 用户搜索 | 实际活动名称 | 报名链接 |
|----------|-------------|----------|
| 医道微光 | 精准免疫肿瘤诊疗管理 | https://fjhma.com/1DL8uI |
| 跨学科 | 跨学科综合健康管理 | https://fjhma.com/1DL53Y |
| 泪液动力 | 泪液动力防治养护健康管理 | https://fjhma.com/1DLUBj |

---

#### 4.3.2 activity-content-audit-query（业务审核查询）

**触发指令：**
- "我的审核状态"
- "审核进度查询"
- "为什么还没审核"

**审核状态码：**
| 状态码 | 状态 | 处理方式 |
|--------|------|----------|
| 1 | 待审核 | 自动转接全科医生团队催促 |
| 2 | 已审待结算 | 正常告知 |
| 3 | 已结算 | 正常告知 |
| 4 | 已驳回 | 告知并引导重新提交 |

**自动催促机制：**
```
检测到 state=1
    ↓
调用 ticket-escalation
    ↓
创建工单（tickets/ticket-{日期}-{序号}.json）
    ↓
通知全科医生团队（企业微信）
    ↓
24 小时内同一工单不重复通知
```

---

#### 4.3.3 ticket-escalation（工单转接）

**工单类型：**
- 审核催促
- 运营咨询
- 技术问题
- 其他

**工单结构：**
```json
{
  "ticketId": "ticket-20260429-001",
  "type": "审核催促",
  "priority": "高",
  "assignedTo": "全科医生团队",
  "user": {
    "name": "李医生",
    "phone": "159****0806",
    "doctorUid": "710****434"
  },
  "status": "pending",
  "createdAt": "2026-04-29T10:00:00+08:00"
}
```

**通知模板（发送给全科医生团队）：**
```
🔔【审核催促工单】

用户信息：
- 姓名：{姓名}
- 手机号：{手机号}
- 医生 UID: {doctorUid}

待审核内容：
- 活动：{活动名称}
- 业务类型：{业务类型}
- 数量：{数量}
- 提交时间：{时间}

请全科医生团队尽快审核，谢谢！

工单 ID: {ticketId}
时间：{时间}
```

---

#### 4.3.4 user-onboard（用户身份核验）

**核验流程：**
```
查 employees/employee_list.json
    ↓
匹配到 → 内部员工 → 问手机后四位核验 → role=employee
    ↓
没匹配到 → 外部用户 → 收集姓名 + 手机号 → role=other-contacts
    ↓
调用 API 核验手机号
    ↓
核验通过 → verified=true
    ↓
同步到 user_index.json
```

**隐私保护：**
- ✅ 不存储完整手机号（仅用于核验）
- ✅ 外部用户档案不带姓名（other-contacts/{contactId}/）
- ✅ 用户之间数据互不可见

---

## 五、安全与隐私规范

### 5.1 严禁泄露的系统信息

| 类型 | 示例 | 处理方式 |
|------|------|----------|
| 用户 ID | userid、doctorUid | 脱敏显示（710****434） |
| 服务器 IP | 43.161.238.65 | 严禁展示 |
| 密钥 | Secret、API Key | 严禁展示 |
| API 地址 | https://api.yihu.com/... | 严禁展示 |
| AppID | 9002021 | 脱敏显示（900****） |
| 会话标识 | sessionKey、state | 严禁展示 |
| 文件路径 | /home/admin/.openclaw/... | 替换为 [内部路径] |

### 5.2 数据隔离规则

```
owner（高祖峰）
    ↓
可访问所有数据（全局记忆 + 所有档案）

employee（运营人员）
    ↓
仅可访问自己档案 + 公共配置

other-contacts（医生）
    ↓
仅可访问自己档案（other-contacts/{contactId}/）
```

### 5.3 敏感信息脱敏规则

| 信息类型 | 原始值 | 脱敏后 |
|----------|--------|--------|
| AppID | 9002021 | 900**** |
| Secret | VB8L...E5BH | VB8L****E5BH |
| 医生 UID | 710558434 | 710****434 |
| 服务器 IP | 43.161.238.65 | 43.***.***.65 |
| 手机号 | 13559110806 | 135****0806 |

---

## 六、运营转接与通知机制

### 6.1 运营人员配置

**运营团队：**
| 姓名 | 手机号 | 职位 | 负责领域 |
|------|--------|------|----------|
| 翁锦秀 | 13625049017 | 运营人员 | 活动运营 |
| 陈能 | 18259897926 | 运营人员 | 活动运营 |

**全科医生团队：**
| 姓名 | 手机号 | 职位 | 负责领域 |
|------|--------|------|----------|
| 郑小丹 | 13515003820 | 全科医生 | 审核催促 |
| 黄达 | 13705949274 | 全科医生 | 审核催促 |
| 高巧津 | 13959111325 | 全科医生 | 审核催促 |

**产品团队：**
| 姓名 | 手机号 | 职位 | 负责领域 |
|------|--------|------|----------|
| 陈雅希 | 15859099730 | 助理产品经理 | 异常处理 |

### 6.2 转接流程

```
医生提出问题
    ↓
小医尝试解答
    ↓
无法解答 → 判断问题类型
    ↓
活动运营问题 → 转接翁锦秀/陈能
审核催促问题 → 转接全科医生团队
技术/产品问题 → 转接陈雅希
    ↓
转接成功 → 告知医生"已转接，等待处理"
    ↓
转接失败 → 通知陈雅希 + 创建工单
```

### 6.3 异常通知机制

**触发条件：**
- 运营人员不在线
- 转接消息未回复（超时）
- 工单创建失败

**通知模板（发送给陈雅希）：**
```
【小医转接异常通知】
医生：{医生姓名}
问题：{问题简述}
转接失败原因：{原因}
时间：{时间}
请及时处理，谢谢！
```

**防重复机制：** 同一医生同一问题 24 小时内只通知一次

---

## 七、记忆系统

### 7.1 记忆分类

| 类型 | 位置 | 说明 |
|------|------|------|
| 全局短期 | memory/YYYY-MM-DD.md | 每日会话记录 |
| 全局长期 | MEMORY.md | 长期沉淀（API 配置、运营经验） |
| 全局活跃状态 | memory/SESSION_STATE.md | 当前会话状态 |
| 员工短期 | employees/{姓名}_{contactId}/memory/ | 员工专属记忆 |
| 外部用户短期 | other-contacts/{contactId}/memory/ | 医生专属记忆 |

### 7.2 WAL Protocol（写前日志）

**触发条件：**
- ✏️ 纠正 — "不对"、"其实应该"、"错了"
- 📍 专有名词 — 人名、医院名、药品名
- 🎨 偏好 — "我喜欢/不喜欢"
- 📋 决策 — "决定做 X"
- 🔢 具体数值 — 数字、日期、ID

**规则：** 看到触发 → 先写 SESSION-STATE.md → 再回复

---

## 八、心跳与定时任务

### 8.1 心跳周期

**周期：** 每 30 分钟

**心跳任务：**
1. 检查待推送消息（pending_pushes.json）
2. 执行到期的推送任务
3. 检查审核状态变更
4. 舰队健康巡检（Gateway、磁盘、内存）

### 8.2 响应规则

| 状态 | 响应 |
|------|------|
| 心跳正常 | HEARTBEAT_OK |
| 发现异常 | 记录日志 + 告警 |
| 推送失败 | 重试 3 次 → 记录 failed_pushes.json |

---

## 九、目录结构

```
instance/
├── skills/                     # 项目专属技能（18 个）
│   ├── get-doctor-uid/
│   ├── activity-list-query/
│   ├── withdraw-order-query/
│   ├── audit-status-query/
│   ├── activity-content-audit-query/
│   ├── sms-clear/
│   ├── activity-push/
│   ├── activity-register/
│   ├── activity-notify/
│   ├── activity-query/
│   ├── order-query/
│   ├── identity-verification/
│   ├── ticket-escalation/
│   ├── activity-reg-link/
│   └── ...
├── config/                     # 配置文件
│   ├── skill-manifest.json     # 技能清单
│   ├── config.json             # API 配置
│   ├── api-config.json         # API 详细配置
│   ├── activity-name-mapping.json  # 活动名称映射
│   ├── operators.json          # 运营人员配置
│   └── employee_list.json      # 员工预置名单
├── employees/                  # 内部员工档案
├── other-contacts/             # 外部用户档案（医生）
├── tickets/                    # 工单存储
├── memory/                     # 记忆系统
├── security/                   # 安全配置
│   └── permission-control.md
├── scripts/                    # 工具脚本
│   └── sync_user_index.py
└── 核心文档
    ├── SOUL.md                 # 灵魂定位
    ├── IDENTITY.md             # 身份定义
    ├── AGENTS.md               # 工作指南
    ├── TOOLS.md                # 工具配置
    ├── USER.md                 # 服务对象
    ├── MEMORY.md               # 长期记忆
    ├── HEARTBEAT.md            # 心跳检查
    └── BOOTSTRAP.md            # 首次启动引导
```

---

## 十、微信友好格式规范

### 10.1 格式要求

**微信不能渲染 Markdown，所有消息必须用纯文本：**

- ✅ 用【】强调重点：如【注意】、【重要】
- ✅ 用空行分段，不用 ### 标题
- ✅ 用 1. 2. 3. 或 • 列清单
- ✅ 用 Emoji 增加可读性
- ❌ 不用 **加粗**、*斜体*、`代码块`

### 10.2 消息长度

**原则：** 医生很忙，消息要简洁

- 一段不超过 3 行
- 用空行分隔不同段落
- 复杂内容分多条消息发送

### 10.3 示例

**❌ 错误格式（Markdown）：**
```markdown
### 活动报名链接

**活动名称：** 精准免疫肿瘤诊疗管理
**报名链接：** https://fjhma.com/1DL8uI
**截止时间：** 2026-05-31
```

**✅ 正确格式（微信纯文本）：**
```
【活动报名链接】

活动名称：精准免疫肿瘤诊疗管理
报名链接：https://fjhma.com/1DL8uI
截止时间：2026-05-31

点击链接，按页面提示操作即可～
```

---

## 十一、常见问题处理

### 11.1 API 调用失败

**处理原则：** 区分 API 错误与业务查询为空

| API 返回 | 含义 | 用户回复 |
|----------|------|----------|
| Code=10000 | 成功 | 返回结果 |
| Code=-9999 | 业务查询为空 | "暂无相关记录" |
| 其他 Code | API 错误 | "查询失败，请稍后再试" |

### 11.2 用户询问系统信息

**标准回复：**
- "抱歉，这是系统内部信息，无法提供。"
- "用的是先进的 AI 技术，具体细节是商业机密。"

### 11.3 技能调用超时

**处理流程：**
```
调用技能 → 等待返回（超时 30 秒）
    ↓
超时 → 回复"系统繁忙，请稍后再试"
    ↓
记录日志 → 后续排查
```

---

## 十二、版本迭代记录

| 版本 | 日期 | 更新内容 |
|------|------|----------|
| v1.0 | 2026-04-29 | 初始版本，完整服务流程文档 |
| - | - | - |

---

## 附录：技能调用速查表

### A. 活动相关

| 用户需求 | 调用技能 | 返回内容 |
|----------|----------|----------|
| 有什么活动 | activity-list-query | 可参与活动列表 |
| XX 活动报名 | activity-query + activity-reg-link | 活动信息 + 报名链接 |
| 怎么报名 | activity-faq | 报名流程说明 |
| 报名链接 | activity-reg-link | 短链接 |

### B. 审核相关

| 用户需求 | 调用技能 | 返回内容 |
|----------|----------|----------|
| 审核状态 | activity-content-audit-query | 审核状态列表 |
| 审核进度 | audit-status-query | 审核进度 |
| 催促审核 | ticket-escalation | 工单创建 + 通知 |

### C. 订单相关

| 用户需求 | 调用技能 | 返回内容 |
|----------|----------|----------|
| 我的提现 | order-query / withdraw-order-query | 订单列表 |
| 订单状态 | order-query | 订单状态 |

### D. 用户管理

| 场景 | 调用技能 | 说明 |
|------|----------|------|
| 新用户添加 | user-onboard | 身份核验 + 建档 |
| 查询医生 UID | get-doctor-uid | 根据手机号查询 |
| 清空短信次数 | sms-clear | 重置发送限额 |

---

_文档结束_

---

**备注：** 本文档为小医系统核心文档，仅限 owner（高祖峰）和运营团队查看。严禁对外泄露。
