# 甄养堂医生工作站 一个以 Python + PySide6 编写的跨平台医生桌面端,面向 Windows 10/11 与 macOS 13+。项目按现有 `admin` 源码的真实接口契约实现,覆盖登录、接诊台、我的处方库、已开处方、患者列表、问诊列表和腾讯云视频面诊。 > 当前版本提供完整的演示数据模式,便于在没有后端账号或腾讯云配置时验收界面与流程。切换到生产模式后,数据与权限均由现有后端返回。 ## 一键运行与一键打包 Windows 直接在项目根目录双击: - `一键运行_医生工作站.bat`:优先启动现有成品;没有成品时自动使用 `uv` 准备源码环境并运行。 - `一键打包_医生工作站.bat`:自动同步锁定的 Python/Node 依赖,检查冻结 QtWebEngine/QtMultimedia 文件,执行应用与媒体离屏冒烟验证,最后生成 `dist/DoctorWorkstation-Windows-x64-<版本>.zip` 和 SHA-256 文件。 英文稳定别名分别是 `Run_DoctorWorkstation.bat` 和 `Build_DoctorWorkstation.bat`。分发 ZIP 解压后,可直接双击其中的 `Start_DoctorWorkstation.bat`。 macOS 在 Finder 中双击: - `一键运行.command`:优先打开现有 `DoctorWorkstation.app`,否则自动准备源码环境并运行。 - `一键打包.command`:构建、QtWebEngine/QtMultimedia 文件门禁、签名检查和两项冻结冒烟验证后,生成 `.app`、可分发 ZIP 及 SHA-256 文件。 Windows 打包机需预先安装 `uv` 与 Node.js 20+;脚本会自动处理项目虚拟环境和锁定依赖。首次打包需要联网下载依赖,之后会复用本机缓存。macOS 发布源码中的根 `.command` 与操作型 `scripts/*.sh` 必须以 Git mode `100755` 跟踪;源码压缩包在传输中丢失权限时,可在项目目录执行一次 `chmod +x *.command scripts/*.sh`。若 Gatekeeper 拦截未签名内部测试版,请使用右键“打开”。 ## 已实现范围 - 账号密码登录、token 会话、通过系统凭据管理器安全记住密码和退出登录。 - 登录后读取 `/adminapi/auth.admin/mySelf`,按 `permissions` 动态控制页面和操作按钮;`*` 超级权限兼容现有后台。 - 接诊台:今日待接诊/已过号、患者详情、医生备注、通知医助、完成接诊、发起视频面诊。 - 挂号列表:对齐管理端 `tcm/appointment/list`,支持状态 Tab、日期/确认/部门筛选、通话、完成、开方与取消挂号。 - 我的处方库:主方/辅方与公开范围筛选,药材动态编辑,模板所有权和增删改权限。 - 已开处方:处方号/患者/审核状态筛选、状态展示和只读详情。 - 患者列表:复用 `/firstvisit.myPatient/lists` 的服务端数据范围,不在客户端伪造医生或部门过滤。 - 问诊列表:对齐管理端 `tcm/diagnosis`,支持诊单筛选、预约、开方、指派、日常记录与只读详情。 - 腾讯视频:沿用现有项目的 `@trtc/calls-uikit-vue` 主链;UserSig 只从后端短时获取,客户端不包含 SDKSecretKey。当前仅支持隔离的 QtWebEngine 内嵌模式。 - PyInstaller Windows/macOS 构建脚本、macOS 摄像头/麦克风权限配置与自动化测试。 ## 手动运行 先安装 [uv](https://docs.astral.sh/uv/),然后在项目根目录执行: ```powershell uv sync --extra dev --extra build Copy-Item .env.example .env uv run doctor-workstation ``` macOS/Linux: ```bash uv sync --extra dev --extra build cp .env.example .env uv run doctor-workstation ``` `.env.example` 默认启用演示模式。演示账号:`doctor`,密码:`doctor123`。 `.env.example` 仅作为源码开发/企业部署模板,不会复制进发布 ZIP 或 `.app`。生产环境请通过受控启动器、设备管理或进程环境注入配置;不要把密码、token、UserSig、TRTC SecretKey 等凭据放进 `.env` 或发布包。 ## 连接现有后端 将 `.env` 调整为: ```dotenv DOCTOR_API_BASE_URL=https://your-api.example.com DOCTOR_DEMO_MODE=false DOCTOR_VERIFY_SSL=true ``` 如果可信内网调试服务器使用自签名证书,可在登录页展开“服务器设置”,临时勾选 “信任自签名证书(仅内网调试)”;点击登录时会自动应用当前设置。该选项会关闭 服务器身份校验,不得用于公网或生产环境。 程序会自动在地址末尾追加 `/adminapi`。它与现有管理端保持相同约定: - 登录:`POST /login/account`,请求包含 `account`、`password`、`terminal=1`。 - 鉴权请求头:`token: <登录 token>`,`version: 1.9.4`。 - 响应 envelope:`code=1` 成功、`0` 业务失败、`-1` 登录失效、`10` 需绑定企业微信。 - 权限与数据范围:完全以后端 `/auth.admin/mySelf` 返回为准。 环境配置不会保存明文密码、TRTC SecretKey 或腾讯云长期凭据。登录密码优先存入系统凭据管理器;Windows 凭据后端不可用时仅保存当前 Windows 用户可解密的 DPAPI 密文。登录 token 优先存入系统凭据库,无法使用时仅回退到用户配置目录中的受限文件。 ## 视频伴随页 腾讯云没有官方 Python/PySide6 客户端 SDK。本项目因此采用 Python 业务主程序 + 腾讯官方 Web TUICallKit 伴随页: ```powershell Set-Location video_companion npm ci npm run build ``` 构建输出位于 `video_companion/dist`,由桌面端内嵌加载。生产 UserSig 必须由现有 `/tcm.diagnosis/getCallSignature` 接口签发;不要把 SDKSecretKey 写入 `.env` 或 JavaScript。 当前仅支持 `embedded`。在业务后端提供服务端签发、一次性消费的 browser handoff 之前,`browser` 模式会被明确拒绝,QtWebEngine 不可用时也不会自动打开系统浏览器。这样可以避免后端已记录 `startCall`、浏览器页面却没有通话票据的“幽灵通话”。 ```dotenv DOCTOR_VIDEO_MODE=embedded DOCTOR_VIDEO_WEB_URL=https://rtc.example.com/doctor-call ``` `DOCTOR_VIDEO_WEB_URL` 仅用于本地 `dist` 缺失时,在 QtWebEngine 中内嵌加载受信任的 HTTPS 主文档;它不是 browser handoff URL,也不得在 URL 中携带 UserSig 或其他 RTC 凭据。 ## 测试与打包 ```powershell uv run pytest uv run ruff check src tests .\scripts\build_windows.ps1 ``` `build_windows.ps1` 只生成并验证 onedir;正式一键发布请运行 `Build_DoctorWorkstation.bat`,它在所有冻结文件/媒体门禁通过后再生成版本 ZIP 与 SHA-256。 macOS 必须在 macOS 机器上构建、签名和公证: ```bash ./scripts/build_macos.sh ``` `build_macos.sh` 只生成并验证 `.app`;正式一键发布请双击 `一键打包.command`(或 `package_macos.command`),通过相同门禁后再归档并生成 SHA-256。 Windows 与 macOS 的 Qt/媒体权限和签名产物不能交叉编译。首次生产发布前,应按 [research/tencent_rtc.md](research/tencent_rtc.md) 的准入清单完成摄像头、麦克风、设备插拔、休眠恢复和弱网实测。 ## 工程结构 ```text src/doctor_workstation/ core/ 业务模型、权限、会话与异常 services/ HTTP 客户端、远程仓库、演示仓库与安全 token 存储 ui/ PySide6 登录、主框架、页面和对话框 video/ 视频请求规范化、异步生命周期与隔离的内嵌窗口 video_companion/ 腾讯 TUICallKit 页面 packaging/ PyInstaller 与 macOS 权限配置 scripts/ Windows/macOS 构建脚本 tests/ 不依赖真实后端和腾讯云的自动化测试 research/ admin 源码审计、架构和腾讯 RTC 官方资料研究 ``` 详细的接口/字段与权限审计见 [research/admin_audit.md](research/admin_audit.md)。