本项目是一个专为临床护理场景设计的自动化排班工具它把交班时间点作为刚性边界、把长期医嘱的执行间隔作为优化核心用 Google OR-Tools 的 CP-SAT 求解器生成合法且贴近实际工作习惯的时间表。我们不做经验式拖拽排班也不依赖人工试错而是把护士交接班规则、医嘱类型约束如 Q4H、BID、班次时长分布、单班任务上限、时间偏差容忍度等全部写成可验证的逻辑条件交由求解器在数秒内给出满足全部硬约束、逼近软目标的排班方案。交付形态是命令行CLI主入口支持 YAML 配置、JSON/CSV/HTML 多格式导出含冲突检测、负载统计、可视化热力图与时间轴。技术栈以 Python 3.10 为基础关键依赖包括 or-tools约束建模与求解、rich终端交互、pyyaml配置解析和 jinja2HTML 渲染所有模块按职责分层结构清晰可扩展。定位与能力范围我们明确不覆盖护士人力排班谁上哪天哪班、不处理临时医嘱或口头医嘱、不对接 HIS 或电子病历系统实时接口。本项目的边界非常聚焦只解决「已确定班次、已分配护士、已有长期医嘱」前提下的「具体执行时刻」生成问题。也就是说当护士站已经知道今天白班有 3 人、夜班有 2 人每位患者有哪些 Q4H、TID、Q12H 类型的医嘱系统就负责算出这些医嘱该在什么时间点由哪位护士执行才能既不跨交班、不超负荷、不违反间隔要求又让工作量尽量均衡、执行时间尽量靠近护士习惯时段。这个定位决定了它天然适配两类使用者一是护理信息系统的开发者可将本项目作为排程引擎嵌入自有平台二是科室护士长或信息科人员可直接用 CLI 快速生成试点排班、验证规则合理性、输出 HTML 报告供晨会讨论。核心功能所有功能都围绕“生成—验证—呈现—调整”闭环展开不是一次性脚本而是可反复迭代的排程工作流功能类别具体能力说明排程生成generate子命令支持指定患者数、医嘱数、天数、班次配置可干运行--dry-run跳过求解快速检查输入合法性结果查看show-schedule子命令表格化展示完整排班支持按护士 ID、按班次、按日期筛选默认带颜色标识任务类型与时间偏差合规验证validate子命令对已有 JSON 排班文件做全量硬约束校验如是否跨班次、是否超任务上限、间隔是否达标输出通过/失败详情冲突分析conflict-report子命令单独列出时间间隔冲突、班次边界冲突、护士负载超限等异常项加--show-intervals可标出每条医嘱的实际执行窗口与理论窗口偏差统计洞察schedule-inspector子命令统计每位护士日均任务数、各班次总任务量、医嘱类型分布、时间集中度热力图基础数据等支持--show-abnormal突出异常值配置管理config-init子命令一键生成标准 8 小时三班倒或 12 小时两班倒 YAML 模板支持自定义输出路径避免手写配置出错这些能力不是孤立按钮而是同一套约束模型的不同切面输出。比如validate和conflict-report共享同一组校验逻辑schedule-inspector的统计维度直接来自show-schedule的底层数据结构。使用与配置上手只需三步安装、生成、查看。不需要 Web 服务、不需要数据库、不修改系统环境。pip install -r requirements.txt生成一个 7 天、20 名患者、每位患者平均 5 条医嘱的排班python -m cli.main generate --patients 20 --orders-per-patient 5 --days 7结果默认存为output/schedule.json。立刻用表格查看python -m cli.main show-schedule --schedule output/schedule.json若要定制班次先初始化配置python -m cli.main config-init --type 8h-shift --output my-shifts.yaml再传入该配置运行python -m cli.main generate --patients 20 --shift-config my-shifts.yamlYAML 配置完全开放班次起止时间、交接点、医嘱类型定义如Q4H对应 4 小时间隔、±30 分钟窗口、护士最大单班任务数默认 8等全部可调。说明文档里有字段级解释不需猜含义。约束规则与求解逻辑我们把规则分为两类对应真实护理管理中的“不可妥协”与“尽量做到”硬约束必须 100% 满足执行时间严格落在班次起止之间不能在交接时刻如 16:00前后 1 分钟内安排任务同一护士同一班次最多执行 8 个任务Q4H 医嘱两次执行时间差必须在 [3h45m, 4h15m] 内即允许 ±15 分钟偏差。软约束求解器尽力优化所有护士的日均任务数方差最小化每位护士的执行时间尽量靠近其历史偏好时段配置中可设preferred_start_hour: 9避免同一患者在 15 分钟内被安排多个任务。CP-SAT 求解器不是暴力穷举而是基于约束传播剪枝搜索空间。对 20 患者 × 7 天 × 平均 5 医嘱的典型场景通常在 38 秒内返回首个可行解支持设置超时阈值--timeout-seconds主动中断。数据与输出形态排班结果以结构化 JSON 为事实源包含完整上下文患者 ID、医嘱类型、执行护士、班次类型、计划时间、实际排定时间、偏差分钟数、是否在优先窗口内等字段。所有导出功能均基于此 JSON输出格式用途特点JSON系统集成、二次开发字段完整含原始约束参数与求解元数据如耗时、状态CSVExcel 查看、台账归档UTF-8 BOM 编码首行为中文表头兼容国内办公软件HTML晨会汇报、科室公示自动渲染时间轴横轴时间、纵轴护士、热力图颜色深浅代表任务密度、冲突高亮图例如 HTML 时间轴中某护士某天 10:15 执行一条 Q4H 医嘱若理论应为 10:00则单元格显示10:15 (15)并标黄若偏差超 ±15 分钟则标红并附提示。这不是示意是真实字段计算结果。工程结构与可维护性代码按关注点分层每个目录职责单一便于团队协作与后续扩展目录职责关键内容constraint_engine/约束建模与求解封装model_builder.py定义变量与约束solver_runner.py调用 or-toolsconstraint_rules.py映射业务规则到数学表达式cli/命令行界面main.py为入口各子命令generate,validate等独立模块参数校验与错误提示统一处理visual/可视化渲染html_generator.py用 Jinja2 模板生成响应式 HTMLheatmap.py计算密度矩阵不依赖前端框架config/配置加载与校验config_loader.py解析 YAML 并做业务级校验如班次时间是否重叠、医嘱间隔是否为正整数utils/通用工具时间解析、日期计算、JSON 序列化增强、日志配置等无业务逻辑测试覆盖率达 94%所有 CLI 子命令、约束校验逻辑、配置解析均有单元测试性能基准放在benchmarks/下方便对比不同规模输入的求解耗时。限制与说明本项目当前不支持以下场景未来版本可能演进但不在 v1 范围内- 不支持动态增减护士或患者输入规模固定- 不支持多科室联合排班如 ICU 与普通病房共享护士- 不支持医嘱优先级叠加如危重患者医嘱自动提级- 不提供 Web UI 或 REST APICLI 是唯一交付界面所有约束规则、配置字段含义、输出字段定义均在项目文档中逐条说明。遇到问题优先查阅docs/constraint-rules.md硬/软约束明细、docs/config-format.mdYAML 字段字典、docs/cli-reference.md所有命令参数详解。没有黑盒每一步推导都可追溯。项目地址https://github.com/nexorin9/nursing-schedule-generator