133 lines
6.9 KiB
Markdown
133 lines
6.9 KiB
Markdown
# 臻阳堂医生工作站
|
||
|
||
一个以 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` 动态控制页面和操作按钮;`*` 超级权限兼容现有后台。
|
||
- 接诊台:今日待接诊/已过号、患者详情、医生备注、通知医助、完成接诊、发起视频面诊。
|
||
- 我的处方库:主方/辅方与公开范围筛选,药材动态编辑,模板所有权和增删改权限。
|
||
- 已开处方:处方号/患者/审核状态筛选、状态展示和只读详情。
|
||
- 患者列表:复用 `/firstvisit.myPatient/lists` 的服务端数据范围,不在客户端伪造医生或部门过滤。
|
||
- 问诊列表:按日期、状态和患者筛选,支持从有效预约发起视频。
|
||
- 腾讯视频:沿用现有项目的 `@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 或腾讯云长期凭据。登录 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)。
|