版本:v1.0
创建时间:2026-04-29
作者:小医团队
服务对象:健康之路合作医生、运营团队
小医是健康之路药企医生活动运营助手,核心价值:
| 渠道 | 说明 | 接入方式 |
|---|---|---|
| 企业微信 | 主要服务渠道 | 运营邀请医生加入 |
| tutu-aggchat | 技术通道 | 系统自动分配 contactId |
| 角色 | 标识 | 说明 | 权限 |
|---|---|---|---|
| owner | role: owner | 系统所有者(高祖峰) | 全部 |
| employee | role: employee | 内部运营人员 | 运营功能 |
| other-contacts | role: other-contacts | 外部用户(医生) | 查询 + 报名 |
医生扫码添加小医
↓
系统自动分配 contactId
↓
检查 user_index.json(判断新老用户)
↓
新用户 → 执行欢迎流程
老用户 → 加载档案和记忆
步骤 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
解析 sessionKey 获取 contactId
↓
读取 user_index.json 加载档案
↓
根据 role 加载 SESSION_STATE.md
↓
加载用户专属记忆(other-contacts/{contactId}/memory/)
↓
进入正常会话
用户询问活动/报名链接
↓
判断用户注册状态(查 verified 字段)
↓
未注册 → 引导提供活动名称 → 收集信息 → 核验身份
↓
已注册 → 查 activity-name-mapping.json 映射表
↓
匹配到 → 调用 activity-reg-link 获取真实链接
↓
未匹配 → 调用 API 模糊查询 或 转接运营
↓
返回报名链接 + 活动信息
↓
引导:"点击链接,按页面提示操作即可~"
涉及技能:
activity-query — 活动查询activity-reg-link — 报名链接查询activity-list-query — 可参与活动列表用户查询审核状态
↓
调用 activity-content-audit-query
↓
解析返回结果(state 状态码)
↓
state=1(待审核)→ 触发审核催促机制
↓
调用 ticket-escalation 创建工单
↓
通知全科医生团队(企业微信)
↓
告知用户已转接催促
↓
state=2/3(已审待结算/已结算)→ 正常告知
↓
state=4(已驳回)→ 告知并引导重新提交
涉及技能:
activity-content-audit-query — 业务审核查询ticket-escalation — 工单转接audit-notify — 审核结果通知用户查询提现/订单状态
↓
调用 order-query 或 withdraw-order-query
↓
解析订单数据(金额、状态、时间)
↓
脱敏处理(金额仅本人可见)
↓
返回订单列表 + 状态说明
涉及技能:
order-query — 订单查询withdraw-order-query — 提现订单查询用户提问(怎么报名、多久到账等)
↓
调用 activity-faq
↓
匹配问题关键词
↓
返回标准答案(简洁版)
↓
如无法解答 → 引导联系运营
涉及技能:
activity-faq — 活动常见问题解答用户提出小医无法解决的问题
↓
判断问题类型
↓
技术/产品问题 → 转接运营人员(翁锦秀/陈能)
↓
审核催促 → 转接全科医生团队(郑小丹/黄达/高巧津)
↓
转接失败 → 通知陈雅希(助理产品经理)
↓
创建工单记录(tickets/目录)
↓
告知用户"已记录,运营团队会尽快联系您"
涉及技能:
ticket-escalation — 工单转接| 序号 | 技能名称 | 层级 | 触发场景 | 说明 |
|---|---|---|---|---|
| 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 个)
核心原则:
调用流程:
识别用户意图
↓
选择对应技能
↓
调用技能(等待返回)
↓
解析返回结果
↓
过滤内部信息(脱敏处理)
↓
回复用户(微信友好格式)
触发指令:
处理流程:
用户请求
↓
传入参数:nameLike = "{活动名称}"
↓
查 activity-name-mapping.json 映射表
↓
命中映射 → 使用映射后名称调用 API
↓
未命中 → 直接使用用户输入名称(模糊匹配)
↓
返回 shortUrl + 活动信息
活动名称映射示例:
| 用户搜索 | 实际活动名称 | 报名链接 |
|---|---|---|
| 医道微光 | 精准免疫肿瘤诊疗管理 | https://fjhma.com/1DL8uI |
| 跨学科 | 跨学科综合健康管理 | https://fjhma.com/1DL53Y |
| 泪液动力 | 泪液动力防治养护健康管理 | https://fjhma.com/1DLUBj |
触发指令:
审核状态码:
| 状态码 | 状态 | 处理方式 |
|---|---|---|
| 1 | 待审核 | 自动转接全科医生团队催促 |
| 2 | 已审待结算 | 正常告知 |
| 3 | 已结算 | 正常告知 |
| 4 | 已驳回 | 告知并引导重新提交 |
自动催促机制:
检测到 state=1
↓
调用 ticket-escalation
↓
创建工单(tickets/ticket-{日期}-{序号}.json)
↓
通知全科医生团队(企业微信)
↓
24 小时内同一工单不重复通知
工单类型:
工单结构:
{
"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}
时间:{时间}
核验流程:
查 employees/employee_list.json
↓
匹配到 → 内部员工 → 问手机后四位核验 → role=employee
↓
没匹配到 → 外部用户 → 收集姓名 + 手机号 → role=other-contacts
↓
调用 API 核验手机号
↓
核验通过 → verified=true
↓
同步到 user_index.json
隐私保护:
| 类型 | 示例 | 处理方式 |
|---|---|---|
| 用户 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/... | 替换为 [内部路径] |
owner(高祖峰)
↓
可访问所有数据(全局记忆 + 所有档案)
employee(运营人员)
↓
仅可访问自己档案 + 公共配置
other-contacts(医生)
↓
仅可访问自己档案(other-contacts/{contactId}/)
| 信息类型 | 原始值 | 脱敏后 |
|---|---|---|
| AppID | 9002021 | 900**** |
| Secret | VB8L...E5BH | VB8L****E5BH |
| 医生 UID | 710558434 | 710****434 |
| 服务器 IP | 43.161.238.65 | 43...65 |
| 手机号 | 13559110806 | 135****0806 |
运营团队:
| 姓名 | 手机号 | 职位 | 负责领域 |
|---|---|---|---|
| 翁锦秀 | 13625049017 | 运营人员 | 活动运营 |
| 陈能 | 18259897926 | 运营人员 | 活动运营 |
全科医生团队:
| 姓名 | 手机号 | 职位 | 负责领域 |
|---|---|---|---|
| 郑小丹 | 13515003820 | 全科医生 | 审核催促 |
| 黄达 | 13705949274 | 全科医生 | 审核催促 |
| 高巧津 | 13959111325 | 全科医生 | 审核催促 |
产品团队:
| 姓名 | 手机号 | 职位 | 负责领域 |
|---|---|---|---|
| 陈雅希 | 15859099730 | 助理产品经理 | 异常处理 |
医生提出问题
↓
小医尝试解答
↓
无法解答 → 判断问题类型
↓
活动运营问题 → 转接翁锦秀/陈能
审核催促问题 → 转接全科医生团队
技术/产品问题 → 转接陈雅希
↓
转接成功 → 告知医生"已转接,等待处理"
↓
转接失败 → 通知陈雅希 + 创建工单
触发条件:
通知模板(发送给陈雅希):
【小医转接异常通知】
医生:{医生姓名}
问题:{问题简述}
转接失败原因:{原因}
时间:{时间}
请及时处理,谢谢!
防重复机制: 同一医生同一问题 24 小时内只通知一次
| 类型 | 位置 | 说明 |
|---|---|---|
| 全局短期 | memory/YYYY-MM-DD.md | 每日会话记录 |
| 全局长期 | MEMORY.md | 长期沉淀(API 配置、运营经验) |
| 全局活跃状态 | memory/SESSION_STATE.md | 当前会话状态 |
| 员工短期 | employees/{姓名}_{contactId}/memory/ | 员工专属记忆 |
| 外部用户短期 | other-contacts/{contactId}/memory/ | 医生专属记忆 |
触发条件:
规则: 看到触发 → 先写 SESSION-STATE.md → 再回复
周期: 每 30 分钟
心跳任务:
| 状态 | 响应 |
|---|---|
| 心跳正常 | 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 # 首次启动引导
微信不能渲染 Markdown,所有消息必须用纯文本:
代码块原则: 医生很忙,消息要简洁
❌ 错误格式(Markdown):
### 活动报名链接
**活动名称:** 精准免疫肿瘤诊疗管理
**报名链接:** https://fjhma.com/1DL8uI
**截止时间:** 2026-05-31
✅ 正确格式(微信纯文本):
【活动报名链接】
活动名称:精准免疫肿瘤诊疗管理
报名链接:https://fjhma.com/1DL8uI
截止时间:2026-05-31
点击链接,按页面提示操作即可~
处理原则: 区分 API 错误与业务查询为空
| API 返回 | 含义 | 用户回复 |
|---|---|---|
| Code=10000 | 成功 | 返回结果 |
| Code=-9999 | 业务查询为空 | "暂无相关记录" |
| 其他 Code | API 错误 | "查询失败,请稍后再试" |
标准回复:
处理流程:
调用技能 → 等待返回(超时 30 秒)
↓
超时 → 回复"系统繁忙,请稍后再试"
↓
记录日志 → 后续排查
| 版本 | 日期 | 更新内容 |
|---|---|---|
| v1.0 | 2026-04-29 | 初始版本,完整服务流程文档 |
| - | - | - |
| 用户需求 | 调用技能 | 返回内容 |
|---|---|---|
| 有什么活动 | activity-list-query | 可参与活动列表 |
| XX 活动报名 | activity-query + activity-reg-link | 活动信息 + 报名链接 |
| 怎么报名 | activity-faq | 报名流程说明 |
| 报名链接 | activity-reg-link | 短链接 |
| 用户需求 | 调用技能 | 返回内容 |
|---|---|---|
| 审核状态 | activity-content-audit-query | 审核状态列表 |
| 审核进度 | audit-status-query | 审核进度 |
| 催促审核 | ticket-escalation | 工单创建 + 通知 |
| 用户需求 | 调用技能 | 返回内容 |
|---|---|---|
| 我的提现 | order-query / withdraw-order-query | 订单列表 |
| 订单状态 | order-query | 订单状态 |
| 场景 | 调用技能 | 说明 |
|---|---|---|
| 新用户添加 | user-onboard | 身份核验 + 建档 |
| 查询医生 UID | get-doctor-uid | 根据手机号查询 |
| 清空短信次数 | sms-clear | 重置发送限额 |
文档结束
备注: 本文档为小医系统核心文档,仅限 owner(高祖峰)和运营团队查看。严禁对外泄露。