This commit is contained in:
Your Name
2026-08-10 17:29:05 +08:00
parent 2199887c07
commit 9add23e019
129 changed files with 34157 additions and 59 deletions
+126
View File
@@ -0,0 +1,126 @@
# 臻阳堂医生工作站
一个以 Python + PySide6 编写的跨平台医生桌面端,面向 Windows 10/11 与 macOS 13+。项目按现有 `admin` 源码的真实接口契约实现,覆盖登录、接诊台、我的处方库、已开处方、患者列表、问诊列表和腾讯云视频面诊。
> 当前版本提供完整的演示数据模式,便于在没有后端账号或腾讯云配置时验收界面与流程。切换到生产模式后,数据与权限均由现有后端返回。
## 一键运行与一键打包
Windows 直接在项目根目录双击:
- `一键运行_医生工作站.bat`:优先启动现有成品;没有成品时自动使用 `uv` 准备源码环境并运行。
- `一键打包_医生工作站.bat`:自动同步锁定的 Python/Node 依赖,构建并冒烟验证,最后生成 `dist/DoctorWorkstation-Windows-x64-<版本>.zip` 和 SHA-256 文件。
英文稳定别名分别是 `Run_DoctorWorkstation.bat``Build_DoctorWorkstation.bat`。分发 ZIP 解压后,可直接双击其中的 `Start_DoctorWorkstation.bat`
macOS 在 Finder 中双击:
- `一键运行.command`:优先打开现有 `DoctorWorkstation.app`,否则自动准备源码环境并运行。
- `一键打包.command`:构建、签名检查和冒烟验证后,生成 `.app`、可分发 ZIP 及 SHA-256 文件。
Windows 打包机需预先安装 `uv` 与 Node.js 20+;脚本会自动处理项目虚拟环境和锁定依赖。首次打包需要联网下载依赖,之后会复用本机缓存。如果 macOS 传输过程丢失了执行权限,可在项目目录执行一次 `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` 调整为:
```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
```
macOS 必须在 macOS 机器上构建、签名和公证:
```bash
./scripts/build_macos.sh
```
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)。