图片

本项目是一个专为医院门诊场景设计的动态候诊队列调度系统,核心解决危重症患者因传统挂号顺序滞留而延误处置的问题。我们严格依据国际通行的急诊严重指数(ESI)五级分诊标准和改良早期预警评分(Mews)体系,构建可配置的优先级评分引擎,并通过实时优先队列动态重排患者候诊顺序。系统交付形态覆盖命令行终端(CLI)、Web可视化看板、RESTful API三大接口,支持临床分诊员快速决策、信息科部署集成、管理者监控队列健康度。技术栈以Python为调度中枢,负责模型计算与队列逻辑;TypeScript/Node.js实现交互层与前端渲染;Express提供轻量Web服务。全部能力均围绕真实分诊流程展开:从患者主诉录入、多源评分融合、等待时间预测,到分级着色展示、策略切换、数据导出与API对接,不叠加非医疗语境的功能。

定位与能力范围

我们不做通用任务调度器,也不做泛化预约平台。本项目的边界非常明确:只处理「已挂号但未就诊」状态下的患者队列重排序问题。它不介入挂号环节,不替代HIS挂号号池,不生成新号源,而是作为HIS的增强插件,在分诊台或护士站侧对现有候诊列表实施动态干预。所有调度动作都基于两个权威临床标尺,ESI用于判断病情紧急程度(L1-L5五级),Mews用于量化生理指标异常风险(呼吸、心率、血压、意识等)。两者不是简单相加,而是通过四种预设策略进行权重调配:ESI标准策略(默认)、Mews主导策略(侧重生命体征恶化)、自评主导策略(强化患者主诉权重)、均衡策略(三者线性加权)。这种设计让系统既能守住临床安全底线,又能适配不同科室的分诊偏好。

核心功能

系统五大能力全部服务于一个目标:让真正需要立即处置的人排到最前面。

  • 双源优先级评分引擎

    :同时调用ESI规则库与Mews评分模块,对每位患者生成结构化分诊结论(如“L2 紧急”)与浮点制优先级得分(如30.8)。评分过程可追溯,支持--explain P001命令展开每项指标扣分依据。

  • 实时动态队列管理

    :底层采用Python heapq实现的优先队列,插入、删除、重排序均为O(log n)复杂度。队列状态每秒自检,确保高优先级患者在新增或病情变化时即时上浮。

  • 等待时间估算

    :基于data/history_wait_times.json中历史同级别患者平均耗时,结合当前队列长度与医生接诊速率,预测每位患者的预计等待分钟数(如9.5min),而非简单按序推算。

  • CLI彩色报告

    :使用Rich库在终端输出带语义色块的表格,L1危重(红)、L2紧急(橙)、L3亚急(黄)、L4非急(绿)、L5轻微(蓝)一目了然,无需打开浏览器即可完成分诊台快速巡检。

  • HTML可视化看板

    :通过ts-cli/web/提供响应式Web界面,含实时候诊表(5秒自动刷新)、等待时间柱状图、分诊级别饼图、患者自助查询入口及中英文切换按钮,满足分诊区大屏展示与医护移动设备查看双重需求。

使用与配置

所有操作均从Python主程序入口启动,CLI参数设计直指实际工作流:

参数

说明

典型场景

--simulate

运行模拟模式,加载data/patients.json生成测试患者并入队

新部署验证基础功能

--demo

演示模式,每5秒自动注入新模拟患者,持续刷新终端显示

培训分诊员理解动态调度逻辑

--strategy NAME

切换调度策略:esi_standard(默认)、mews_heavyself_heavybalanced

科室试运行时对比不同策略效果

--explain PATIENT_ID

展示指定患者完整评分路径,含ESI判定依据与Mews各子项得分

向医生解释某患者为何被提至高位

--export FORMAT

导出当前队列数据为csv/json格式,存入exports/目录

对接院内BI系统或生成日报

配置完全集中于python/config.yaml,可调整ESI各级别阈值、Mews各项指标权重、等待时间衰减系数、报警触发线(如L1患者等待超2分钟即告警)。所有配置变更无需重启服务,Python引擎在下次调度周期自动加载。

工程结构

项目采用清晰的三层分离架构,各司其职:

目录

职责

关键文件说明

python/

核心业务逻辑层

priority_scorer.py

实现ESI/Mews双评分;queue_manager.py封装优先队列操作;wait_time_estimator.py基于历史数据建模;cli_reporter.py控制Rich终端渲染

ts-cli/

交互与呈现层

src/index.ts

为CLI主入口;web/含Express后端与Chart.js前端;templates/存放HTML模板与i18n资源

data/

数据契约层

patients.json

定义患者结构(id/name/age/complaint/vitals);history_wait_times.json提供时间预测基准;triage-rules.json固化ESI判定树

这种划分保证了Python引擎可独立作为库被其他系统集成(如嵌入HIS插件),而TypeScript部分可单独升级UI而不影响调度逻辑。

环境与运行

部署只需两步,无外部数据库依赖:

cd python
pip install -r requirements.txt
cd ts-cli
npm install

启动方式分三种:

  • 纯CLI模式

    python main.py --simulate --count 20 直接在终端查看动态队列

  • Web看板模式

    cd ts-cli && npm run build && npm start,访问http://localhost:3000

  • API服务模式

    :同上启动后,可通过curl调用/api/queue获取JSON队列数据,需携带X-API-Token头(Token在config.yaml中配置)

认证机制默认启用,亦可设auth.enabled: false关闭。健康检查端点/health返回服务状态、内存占用、队列实时统计(如critical_count: 2),供运维监控大盘接入。

数据与扩展

所有输入数据均采用JSON明文格式,便于医院信息科按需替换:

  • data/patients.json

    :字段包含idnameagecomplaint(主诉文本)、vitals(血压/心率/呼吸/意识等Mews所需值)

  • data/triage-rules.json

    :以JSON Schema描述ESI五级判定逻辑,如L1需满足“气道梗阻/心跳骤停/无反应”任一条件

  • data/history_wait_times.json

    :数组形式记录历史患者{level: "L2", wait_minutes: 8.2},用于训练等待时间模型

如需扩展新评分维度(如疼痛评分NRS),只需在priority_scorer.py中添加对应函数,并在策略权重配置中开放调节开关,无需重构队列核心。

限制与说明

本系统明确不承担以下职责:
- 不替代医生最终分诊决策,仅提供算法辅助建议
- 不对接挂号号源系统,需由人工或HIS中间件将患者ID同步至本系统队列
- 不存储患者隐私数据,所有模拟数据仅用于演示,生产环境需对接院内脱敏数据管道
- CLI终端色彩依赖ANSI支持,Windows PowerShell需启用虚拟终端(默认Win10+已开启)

API返回的错误提示直接映射真实问题:401 Unauthorized表示Token无效或缺失;404 Not Found仅当请求路径错误时出现;所有成功响应均为200 OK并含结构化JSON。说明文档中所有截图、命令、配置项均来自当前版本实测,无任何虚构界面或未实现功能。

项目地址:
https://github.com/nexorin9/triage-queue-scheduler

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐