[开源] 医院药品效期调拨优化系统:用生存分析+整数规划降低医院药品报废率

[开源] 医院药品效期调拨优化系统:用生存分析+整数规划降低医院药品报废率 本项目是面向医院药剂科、财务科与院级管理者的药品效期治理工具不依赖人工经验排期也不做通用库存系统。它把药品批次看作有“生命曲线”的个体用 Kaplan-Meier 生存分析建模效期衰减规律再以整数规划PuLP求解跨科室调拨的全局最优解最终交付两类可落地输出终端彩色 CLI 报告供值班药师快速响应和带筛选器的交互式 HTML 报告供药剂科主任周度复盘、财务科成本归因、院长办全院效期健康度监测。核心模块全部由 Python 3.10 实现依赖 lifelines 做生存拟合pandas 清洗批次数据Rich 渲染高可读终端界面Chart.js 驱动 Web 可视化所有分析逻辑封装为命令行入口支持模拟数据生成、配置驱动运行、多格式结果导出。定位与能力范围我们不做全链路进销存也不覆盖采购计划或供应商协同。系统边界明确锚定在「已有库存的效期风险识别与调拨干预」这一环节。当药房已完成入库、各科室已形成分散库存、但临近效期的批次尚未被主动调度时本系统介入不是告诉你“这批药还能放多久”而是回答“这批药该优先发给哪个科室、调多少、不调会损失多少钱”。它服务三类典型角色药剂科主任需要知道下周必须优先消耗的 Top 10 批次财务科需将“濒临报废数量”“濒临报废价值”映射到月度成本报表院长办则通过仪表盘中“紧急/预警/正常”三级分布占比判断全院药品流转健康度是否持续劣化。系统不替代人工决策但把原来靠 Excel 筛选微信群协调的流程变成可复现、可回溯、带量化依据的标准化动作。核心功能系统由四大引擎构成彼此解耦、职责清晰模块职责关键技术点输出形态生存分析引擎对同通用名、同规格的不同生产批次拟合其效期生存函数输出各批次剩余安全使用天数的置信区间Kaplan-Meier 非参数估计lifelines 库实现批次级优先级排序、效期分布直方图调拨优化引擎在满足科室最低库存约束、单次调拨量整数约束、总调拨成本最小化前提下求解跨科室调拨方案PuLP 构建整数规划模型目标函数含报废损失权重调拨建议表格源科室→目标科室→数量、报废风险预测汇总CLI 报告引擎将分析结果结构化渲染为终端友好格式用颜色区分风险等级支持快速扫描关键数字Rich 库控制色彩、缩进与分隔线彩色文本流适配 Linux/macOS/Windows 终端HTML 可视化引擎生成离线可打开的交互式报告内置图表联动与字段筛选器Chart.js 渲染动态图表Jinja2 模板注入数据单 HTML 文件含效期分布图、科室热力图、调拨明细表这四个模块共同构成一个闭环从原始库存 JSON 数据出发先判别哪些批次已进入“红色区域”再计算如何用最少的调拨动作延缓报废最后用两种形态把结论送到对应岗位手上。使用与配置所有操作均通过python -m src命令触发无需安装包、不修改系统环境。你只需准备一份符合规范的库存数据JSON 格式或直接生成模拟数据上手验证python -m src generate-data --output data/inventory.json --seed 42运行分析时可指定输入、输出路径与格式python -m src run-analysis --input data/inventory.json --format console python -m src run-analysis --input data/inventory.json --output output/report.html --format html若需长期使用推荐复制配置模板并编辑config.yamlcp config.yaml.example config.yaml配置文件支持以下关键参数参数说明默认值典型调整场景threshold_days效期预警阈值剩余天数 ≤ 此值即标为“预警”30财务科要求提前 45 天预警则设为 45critical_days效期紧急阈值剩余天数 ≤ 此值即标为“紧急”触发强提醒7临床急需药品可设为 3延长响应窗口output_format默认输出格式可选 console / htmlconsole日常巡检用 console周报归档用 htmlrandom_seed控制模拟数据与部分随机过程可重现42调试阶段保持固定确保结果一致配置项不多但每项都对应真实业务规则比如critical_days不是技术参数而是药房 SOP 中明文规定的“必须 7 天内完成处置”的硬性时限。环境与运行本地运行仅需 Python 3.10无 GPU 或特殊硬件依赖。我们坚持轻量部署原则不强制 Docker不依赖云服务不设后台进程。整个流程是单次、离线、可审计的git clone repository-url cd pharmacy-expiry-allocator python -m venv venv source venv/bin/activate # Linux/macOS venv\Scripts\activate # Windows pip install -r requirements.txt依赖列表严格收敛lifelines专注生存建模PuLP保证整数规划求解稳定pandas处理结构化数据Rich和Chart.js分别负责两类终端的呈现质量。没有“全家桶”式框架每个依赖都对应一个不可绕过的业务能力。项目自带bin/下的 shell/bat 脚本一线药师双击即可运行无需记忆命令。数据与扩展输入数据为标准 JSON字段含义与医院 HIS 出库字段对齐包含药品通用名、规格、生产批号、有效期至、当前库存量、所属科室、入库日期等。示例见data/inventory_sample.json。字段设计遵循两个原则一是兼容多数医院基础库存导出格式二是剔除非效期相关冗余字段如供应商、采购价聚焦问题本质。系统预留扩展接口survival_engine.py支持替换为 Cox 比例风险模型需补充协变量optimizer.py的目标函数可加入运输成本、科室调剂频次惩罚项visualizer.py接收任意新增图表类型。所有扩展均不破坏原有 CLI/HTML 双通道输出能力。我们不预设“未来要加 AI 预测”但确保当你真有新模型要集成时只需改一个模块其余部分照常工作。限制与说明本系统有明确的能力边界说明文档中已如实标注- 不处理效期造假、标签脱落等物理异常仅基于录入的有效期至字段运算- 不对接实时库存接口数据需定期手动导入建议每日/每周导出一次- 整数规划求解在超大规模科室100超多批次10,000时可能耗时增加此时建议按药品大类分批运行- 生存分析依赖历史报废数据校准首次使用建议用模拟数据跑通流程再逐步接入真实数据。这些不是缺陷而是设计选择我们优先保障中小规模医院药房在普通笔记本上 5 秒内获得可靠结论而非追求理论上的全场景覆盖。真正的效期治理从来不是比谁的模型更复杂而是比谁的结论更及时、更可执行、更经得起翻查。项目地址https://github.com/nexorin9/pharmacy-expiry-allocator