浙江省人民医院在线服务
下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/herenit--srm-phs-cli.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @herenit/srm-phs-cli。浙江省人民医院互联网医院 CLI 工具,用于完成短信登录、就诊人管理、预约挂号和检查检验报告查询全流程。触发条件包括 phscli、挂号、预约挂号、phs 登录、添加就诊人、绑定就诊人、查询报告等场景。Agent 执行此 skill 时使用 scripts/phscli.py 脚本调用 API。
阅读全文 (展开查看完整说明)
概述
phscli — 互联网医院 CLI 工具
⚠️ 核心约束(必须遵守)
严禁自行组装 HTTP 请求
所有操作必须通过 phscli.py CLI 工具执行。严禁执行以下行为:
- ❌ 直接使用
curl或requests调用 API 端点 - ❌ 自行拼接 URL、构造 JSON 请求体或猜测参数
- ❌ 参考「请求格式」章节自行构建 HTTP 请求
- ❌ 调用
phscli.py未实现的任何接口
✅ 正确做法: 仅使用本文档中"典型工作流程"和"可用命令一览"两节列出的 phscli.py 子命令。传递的参数和顺序必须与 phscli.py --help 或本文档示例完全一致。
原因:API 请求涉及加密签名、Token 注入、多级封装等细节,自行组装极易出错。CLI 工具已经封装了所有这些逻辑。
安全规则
1. 发送短信前必须显式确认
auth send-sms和patient send-sms执行前必须向用户显式确认。- 登录失败或验证码错误时,必须再次确认后才能重发,禁止自动重试。
- 这是防止短信滥发或误触发的合规要求。
2. 挂号前院区选择(支持默认值 + 合并确认)
- 院区允许使用默认值(朝晖院区 434)或用户明确指定的院区,不必单独用一轮让用户从列表挑选。
- 但院区必须在开场 intake 或下单前的最终确认摘要中明示,让用户知情;用户未提出异议即视为确认。禁止在用户完全不知情的情况下静默选定院区。
- 确定院区后,必须静默执行
register set-hospital --hos-id <ID>切换 sysCode,再进行科室列表 → 排班 → 号源 → 下单。 - 禁止跳过 sysCode 切换。 不同院区 sysCode 不同,切换错误会导致号源/下单失败。
- 若用户明确要求"看看有哪些院区",再执行
register hospital-list展示完整列表。
3. 查报告前必须选择院区
- 报告查询必须先执行
register hospital-list并让用户选择。 - 不同医院数据独立存储。
- 选择后必须执行
register set-hospital --hos-id <ID>再查询报告。 - 禁止跳过院区选择。
院区 / sysCode 对照
| hosId | 院区名称 | sysCode |
|---|---|---|
| 434 | 浙江省人民医院朝晖院区 | 1001017 |
| 435 | 浙江省人民医院望江山院区 | 1001017 |
| 129163 | 浙江省人民医院越城院区 | 1001061 |
| 129168 | 浙江省人民医院富阳院区 | 1001079 |
| 130022 | 江北院区 | 1001079 |
注意:API 可能返回不准确的院区名称;代码中
_HOSPITAL_NAME_OVERRIDE会修正。
挂号交互协议(挂号必读)
目标:把中途来回压到 2 轮以内(1 轮开场集中收集 + 1 轮最终确认;验证码因合规单独占 1 轮)。不要走一步问一步。
A. 开场集中收集(收到挂号意图的第一步)
收到"挂号 / 挂个号 / 约某科"意图后,先不要逐项追问,也不要先问手机号。用一次多选提问(AskUserQuestion,可同屏 ≤4 题)一把收齐以下要素,缺什么补什么:
- 科室 + 号别(如"心内科专家号")——若用户没说或不确定,进入下方【B. 自动导诊】。
- 日期 + 上下午(如"明天下午")——"明天/后天/周X"由 agent 自行换算成 YYYY-MM-DD,不要反问日期。
- 院区——默认朝晖院区(434),仅当用户明确提到别的院区才改;不单独追问,在最终确认摘要里明示即可。
- 就诊人——先执行
patient list,按以下策略处理:- 就诊人在列表中 → 直接用其
patienId,不问多余问题 - 就诊人不在列表中 → 按以下流程自动添加,不需要先问用户"是否要添加就诊人":
- 就诊人在列表中 → 直接用其
① 收集手机号 → 问用户该就诊人的手机号② 发验证码(需确认)→ patient send-sms --phone <手机号> ③ 尝试绑定 → patient add --name <姓名> --phone <手机号> --verify-code <验证码> ④ 结果处理:
[OK] patienId=xxx→ ✅ 添加成功,直接用[NEED_COMPLETE] checkValue=xxx→ 一次问齐身份证号、地址(省市区)、详细地址、民族,然后执行patient complete(无需再发验证码)- 民族选项(code→label):
“01-汉族 02-蒙古族 03-回族 04-藏族 05-维吾尔族06-苗族 07-彝族 08-壮族 09-布依族 10-朝鲜族11-满族 12-侗族 13-瑶族 14-白族 15-土家族16-哈尼族 17-哈萨克族 18-傣族 19-黎族 20-傈僳族21-佤族 22-畲族 23-高山族 24-拉祜族 25-水族26-东乡族 27-纳西族 28-景颇族 29-柯尔克孜族 30-土族31-达斡尔族 32-仫佬族 33-羌族 34-布朗族 35-撒拉族36-毛南族 37-仡佬族 38-锡伯族 39-阿昌族 40-普米族41-塔吉克族 42-怒族 43-乌孜别克族 44-俄罗斯族 45-鄂温克族46-德昂族 47-保安族 48-裕固族 49-京族 50-塔塔尔族51-独龙族 52-鄂伦春族 53-赫哲族 54-门巴族 55-珞巴族56-基诺族 57-其他` → 收集时让用户选择,取 code 填 –nation,label 填 –nation-name`
- 其他失败 → 提示用户
流程总结:
patient list→ 不在列表 → 手机号 → 发验证码 →patient add→ (若有checkValue) 收集补充信息 →patient complete
已知信息(用户已在对话中给出的、或 session/patient list 能查到的)一律不要重复问。
B. 自动导诊(用户不知道挂什么科时)
当用户表达"不知道挂什么科 / 头晕挂哪个科 / 有这些症状"时,先启动导诊环节,不要直接甩科室列表让用户猜:
- 询问主要症状、部位、持续时间、伴随表现(一次问清,避免多轮)。
- 基于症状给出 1–3 个推荐科室,说明推荐理由,并标注首选。
- 用户确认科室后,再进入正常挂号流程(拉排班 → 选号源 → 下单)。
- 涉及急重症信号(胸痛、呼吸困难、意识改变、剧烈头痛、大出血等)时,明确提示尽快线下急诊/120,不要仅靠线上挂号。
导诊只做科室指引,不做诊断结论;措辞为"建议就诊 XX 科",而非"你得了 XX 病"。
C. 默认值与推断规则
| 要素 | 默认 / 推断 |
|---|---|
| 院区 | 朝晖院区 hosId=434(sysCode 1001017) |
| 就诊人 | 账号本人(patient list 中与登录人匹配者) |
| 日期 | "明天/周X"自行换算为 YYYY-MM-DD,不反问 |
| "专家号" | categor=5(主任) 或 3(副主任);"普通号"=categor=2 |
| 上午/下午 | 上午 ampm=1,下午 ampm=2 |
| 医生"任意/都可以" | 不再反问,自动选可约号中余号最多或最早的专家号 |
D. 唯一确认点
信息齐全后,只在下单前给一次确认摘要(院区/科室/医生/日期时段/就诊人/费用),用户确认或说"直接挂"即下单。中间步骤(切院区、拉排班、查号源)静默执行,不逐步征询。
E. 安全红线(不可省,独立于以上优化)
- 发送短信验证码前仍必须显式确认(合规要求)。但手机号从 session / 用户已给信息读取,不再单独追问手机号。
- 验证码错误或登录失败时,再次确认后才可重发,禁止自动重试。
- 取消挂号(cancel)无需短信确认,但需向用户复述将取消的订单信息。
6. checkValue 补充建档(patient add 返回 checkValue 时触发)
完整流程见上方 A.4 就诊人,本节仅说明
patient complete执行细节。
收集缺失信息: 向用户一次问齐(不要分多轮):
- 身份证号(必填)
- 常住地址省市区(推荐填)
- 详细地址XX路XX号(推荐填)
- 民族(必填,从上方民族列表中选择 code + label)
如果这些信息用户已经在上文提供过,直接复用,不要重复问。
执行 complete(无需再发短信验证码):
patient complete
--check-value <输出的checkValue>
--name <姓名> --id-card <身份证号> --phone <手机号>
--address "省市区" --location "详细地址"第四步:结果通知
- 成功 → 告诉用户建档成功并返回 patienId
- 失败 → 把失败信息展示给用户
规则:整个流程由 AI 驱动自动完成,不要打印命令让用户手动执行。打印
[NEED_COMPLETE]是给 AI 看的信号,不是给用户的提示。
概述
本地 Python CLI 工具,通过 HTTP 调用互联网医院 API,处理短信认证、就诊人管理和预约挂号。当前环境为明文传输,无加密。
| 项目 | 值 |
|---|---|
| Base URL | https://netphs.eheren.com |
| Gateway URL | https://netphs.eheren.com/gateway |
| 默认系统编码 | 1001017 |
| PHS_ID | 81681688 |
| skey | H33010300046 |
| 加密方式 | 无(明文请求/响应) |
| 请求头签名 | 无(仅 phsId + skey) |
| Python 运行环境 | python (managed venv) |
| 脚本路径 | scripts/phscli.py |
| 会话文件 | scripts/session.json(与脚本同目录) |
重要:运行时清除 PYTHONPATH
系统 PYTHONPATH 指向旧的 Python 目录,必须清除:
PYTHONPATH="" python_exec scripts/phscli.py <command>完整命令模板:
PYTHONPATH="" "path/to/python" "scripts/phscli.py" <subcommand>⚠️ 请求格式(仅供代码审查对照,不可直接调用)
严禁 参考此节自行构造 HTTP 请求。以下内容仅用于代码审查和问题排查。
所有操作必须使用
phscli.pyCLI 命令。
认证 API(通过 skAllinoneAuthApi)
- 网关路径:
/phs-user/authUser/skAllinoneAuthApi(走 gateway,无=H33010300046后缀) - 请求头:
phsId: 81681688,skey: H33010300046
业务 API(直连)
- 所有业务 API 路径末尾追加
=H33010300046后缀 - 请求头:
phsId: 81681688,skey: H33010300046 - 认证 API(
skAllinoneAuthApi)不使用后缀
响应
直接返回明文 JSON(无需解密)。
关键参数
参数硬编码在
scripts/phscli.py中,参见源码常量:PHS_ID、SKEY。
可用命令一览(权威来源)
以下为
phscli.py支持的所有 CLI 子命令。任何不在以下列表中的接口均不存在,严禁尝试调用。命令行参数名称和类型以
--help输出为准。
认证:
auth send-sms --phone <手机号> 发送登录短信验证码
auth login --sms-code <验证码> 验证码登录
就诊人管理:
patient list 就诊人列表
patient send-sms --phone <手机号> 发送就诊人绑定验证码
patient add --name <姓名> --phone <手机号> --verify-code <验证码> 绑定已有就诊人
patient complete --check-value <值> --name <姓名> --id-card <身份证>
--phone <手机号>
[--address <地址>] [--location <详细地址>]
[--nation <代码>] [--nation-name <名称>] 补充建档(AI自动,无需验证码)
挂号:
register hospital-list 医院列表
register set-hospital --hos-id <ID> 切换院区/医院
register dept-list --hos-id <ID> 科室列表
register schedule --dept-id <ID> 排班列表
register number-source --sch-id <ID> --sch-date <日期> --ampm <1|2>
--categor <分类> --hos-id <ID> 号源查询
register book --patient-id <ID> --sch-id <ID> --num-id <ID>
--dis-no <编号> --appointment-number <编号>
--dept-name <科室名> --hos-id <ID> --hos-name <医院名>
--fee <金额> --res-date <日期> --ampm <1|2>
--categor <分类> --categor-name <分类名>
--name <就诊人姓名> [--source 3] 预约挂号
register my-list 我的挂号列表
register cancel --order-id <订单ID> 取消预约挂号
报告查询:
report list --type 检验|检查|体检 --patient-id <ID> [--name <姓名>] 报告列表
report detail --type 检验|检查|体检 --rep-id <报告ID> --hos-id <ID> 报告详情
会话:
session 查看当前会话
logout 退出登录后端 API 参考对照
所有业务 API 路径末尾追加 =H33010300046 后缀。认证 API(skAllinoneAuthApi)不使用后缀。
以下表格仅用于代码审查和问题排查。严禁 直接调用这些 HTTP 端点,必须通过
phscli.pyCLI 命令执行。
| CLI 命令 | 对应的后端 API 路径 |
|---|---|
auth send-sms / auth login | /phs-user/authUser/skAllinoneAuthApi(走 gateway,无后缀) |
patient send-sms | /phs-base/sendMessage/skSendSmsCode=H33010300046 |
patient add | /phs-base/relevantPatient/skAddPatientByNameAndPhone=H33010300046 |
patient complete | /phs-base/relevantPatient/skAddPat=H33010300046 |
patient list | /phs-base/relevantPatient/getSKPatCardList=H33010300046 |
register hospital-list | /phs-base/getSKHospital=H33010300046 |
register dept-list | /phs-reg/reg/getSkDeptList=H33010300046 |
register schedule | /phs-reg/reg/getSDS=H33010300046 |
register number-source | /phs-reg/reg/getSNS=H33010300046 |
register book | /phs-reg/reg/sAr=H33010300046 |
register cancel | /phs-reg/reg/skCancelReg=H33010300046 |
register my-list | /phs-reg/reg/getSKByPsnId=H33010300046 |
report list --type 检查 | /phs-query/examine/getSKExamineReportList=H33010300046 |
report detail --type 检查 | /phs-query/examine/getSKExamineReportDetails=H33010300046 |
report list --type 检验 | /phs-query/checkout/getSKCheckoutReportList=H33010300046 |
report detail --type 检验 | /phs-query/checkout/getSKCheckoutReportDetails=H33010300046 |
report list --type 体检 | /phs-query/examine/getSKMedicalReportList=H33010300046 |
report detail --type 体检 | /phs-query/examine/getSKMedicalReportDetails=H33010300046 |
典型工作流程
1. 认证
# 发送短信验证码
phscli.py auth send-sms --phone 138xxxx
# 验证码登录(自动获取 herenId + token)
phscli.py auth login --sms-code 1234562. 就诊人管理
# 就诊人列表
phscli.py patient list
# 发送就诊人绑定验证码
phscli.py patient send-sms --phone 138xxxx
# 绑定已有就诊人(已在本院建档,通过姓名+手机号+验证码尝试绑定)
phscli.py patient add --name 张三 --phone 138xxxx --verify-code 123456
# ↑ 如果输出 [OK] → 完事; 如果输出 [NEED_COMPLETE] checkValue=xxx
# → AI 收集身份证/地址等信息 → 直接 patient complete (无需验证码)
# 补充建档(当 patient add 输出 [NEED_COMPLETE] 时,由 AI 自动调用,不给用户手动执行)
# 成功返回: patienId=xxxxx, respCode=9990023. 挂号流程(合并确认模式)
① 开场集中收集 → ② 静默执行(set-hospital → dept-list → schedule → number-source)
→ ③ 最终确认摘要 → ④ 下单中间步骤静默执行,不上报给用户,只在最后给一次确认摘要。
# 3.1 院区切换(静默执行,用户不可见)
# set-hospital --hos-id <ID>
# 3.2 科室列表(静默执行)
# dept-list --hos-id <ID>
# 3.3 排班查询(静默执行)
# schedule --dept-id <ID>
# 3.4 号源查询(静默执行)
# number-source --sch-id <ID> --sch-date YYYY-MM-DD --ampm 1 --categor X --hos-id <ID>
# 3.5 最终确认摘要后下单
# book --patient-id X --sch-id X --num-id X --dis-no X --appointment-number X
# --dept-id "XXX|XXX" --dept-name "消化内科"
# --doc-name "某医生"
# --hos-id 434 --hos-name "浙江省人民医院朝晖院区"
# --fee 25.30 --res-date 2026-07-18 --ampm 2
# --categor 3 --categor-name "副主任" --name "某患者" --source 3
# 注意: --doc-name 必传 (从 schedule 输出获取),否则 API 存入库时 docName 为空4. 查看/取消
phscli.py register my-list # 我的挂号
phscli.py register cancel --order-id <orderId> # 取消挂号(需向用户复述订单信息)
phscli.py session # 查看会话
phscli.py logout # 退出登录5. 报告查询
流程: 选择院区 -> 切换 sysCode -> 查询报告(不能跳过院区选择)
# 5.1 医院列表(必须先执行)
phscli.py register hospital-list
# 5.2 切换医院
phscli.py register set-hospital --hos-id <用户选择的ID>
# 5.3 检验/检查/体检报告列表
phscli.py report list --type 检验 --patient-id XXXXXXXX --name 某患者
phscli.py report list --type 检查 --patient-id XXXXXXXX --name 某患者
phscli.py report list --type 体检 --patient-id XXXXXXXX
# 5.4 报告详情(参数从列表结果获取)
phscli.py report detail --type 检验 --rep-id <报告ID> --hos-id 434
phscli.py report detail --type 检查 --rep-id <报告ID> --hos-id 434
phscli.py report detail --type 体检 --rep-id <报告ID> --hos-id 434报告列表参数:
| 参数 | 说明 | 检验 | 检查 | 体检 |
|---|---|---|---|---|
--type | 报告类型 | 必填 | 必填 | 必填 |
--patient-id | 就诊人ID (patienId) | 必填 | 必填 | 必填 |
--name | 就诊人姓名 | 必填 | 必填 | |
--card-number | 就诊卡号 | 可选 | 可选 | |
--card-type | 卡类型 | 可选 | 可选 | |
--hos-id | 医院ID | 可选 | 可选 | |
--start-date | 开始日期(默认5年前) | 可选 | 可选 | 可选 |
--end-date | 结束日期(默认今天) | 可选 | 可选 | 可选 |
--page | 页码(默认1) | 可选 | 可选 | 可选 |
--page-size | 每页条数(默认10) | 可选 | 可选 | 可选 |
参数对齐说明
- patient add:对齐
addOldMedical.vuesave();verifyCode 使用双重 MD5 大写:MD5(code).toUpperCase() -> MD5(result).toUpperCase() - patient complete:当
patient add返回checkValue时调用,通过skAddPat补充建档。必填字段:checkValue、name、idCard、phone;可选字段:address、location、nation、nationName、idType。无需验证码 - reg book:发送全部 33 个字段匹配
RegConfirm.vue;未用字段传空字符串;号源参数来自number-source输出 - number-source:前端发送 8 个参数(sysCode、ampm、categor、docId、deptId、hosId、schDate、schId);CLI 默认传核心 3 个,其余可选
注意事项
- Token 保存在
scripts/session.json中,过期前可复用无需重新登录 - Token 过期时:重新执行
auth login source默认=3numId为挂号必填,从number-source输出获取- 所有业务 API 通过
biz_request()(自动注入 sysCode) - 认证 API 通过
auth_request()(包装 skAllinoneAuthApi 格式) - 无 SM4 加密/解密——明文请求和响应
- 认证 API(
skAllinoneAuthApi)不带=H33010300046后缀;所有业务 API 路径末尾追加=H33010300046 - 请求头包含
skey: H33010300046 patient add返回字段名为patienId(与前端拼写一致,非 patientId)- 若
patient add返回 respCode=753:缺少证件信息,可再次执行patient add并补充--id-card参数 - 就诊人不在列表中的处理流程: 见上方 A.4 就诊人 规则,AI 自动完成添加流程,不需问用户"是否要添加"
- 就诊人绑定验证码 不等于 登录验证码:登录走认证网关,就诊人走直连 API
- 建议使用
register子命令(reg的别名),避免与 Windows 注册表工具 reg.exe 冲突 - 下单前必须执行
set-hospital --hos-id <ID>;不同院区 sysCode 不同 --appointment-number为book的必填参数,值来自number-source输出的 disNo 字段book命令必填参数:--patient-id,--sch-id,--num-id,--dis-no,--appointment-number,--dept-name,--hos-id,--hos-name,--fee,--res-date,--ampm,--categor,--categor-name,--name。缺一不可,否则 API 会报"XX不能为空"。book的--doc-name虽然 CLI 标记为可选,但强烈建议传,否则接口存入库时该字段为空,my-list 查不到医生名。值从schedule输出的doc字段获取。userInfoByToken接口入参格式特殊:token 要放在authParam.token和顶层token两处,authParam.args放{sysCode, source},url 不带 query string。当前版本已修复。