本项目是一个专为医保管理场景设计的规则反向测试系统,它用约束求解(CP-SAT)技术,从医保飞检规则文本出发,自动推导出「最容易触发误判」的边界测试用例,不是靠人工拍脑袋列极端值,而是让数学模型穷举规则在临界点上的所有合法/违规组合。面向医保办公室、医院信息科和质控部门,核心能力包括:规则配置化加载(YAML/JSON)、业务语义到约束模型的自动映射、满足/违反双路径用例生成、HTML可视化演练报告、CSV结构化导出,以及可复用的边界案例数据库。交付形态以命令行(CLI)为主,支持本地快速验证;技术栈基于 Python 3.10+、Google OR-Tools CP-SAT 求解器、pandas、openpyxl 和 Jinja2,不依赖 Web 服务或云部署。
定位与能力范围
我们不做通用测试平台,也不覆盖全量医保结算逻辑。本项目的边界非常明确:只处理「飞检中高频被调取、且存在执行歧义」的五类典型规则,药品适应症限制、检验项目互斥、超限用药、挂床检测、分解住院。这些规则共同特点是:判断依据清晰(如“住院时长<24小时”),但临床执行中常因时间粒度、科室协作、数据录入延迟等产生模糊地带。系统不替代人工审核,而是把“这条规则到底怎么才算踩线”这件事,交由数学模型给出确定性答案。生成的每个用例都带明确标签:合规边界、违规临界、组合扰动,便于医保办组织内部沙盘推演,提前暴露规则漏洞、字段缺失或系统计费盲区。
核心功能
所有功能围绕「规则→模型→用例→报告」闭环展开,不设冗余入口:
- 规则配置管理
:接受 YAML 或 JSON 格式规则定义,字段与医保飞检常见表述对齐(如
diagnosis_code、drug_code、admit_time、discharge_time),支持嵌套条件与多级逻辑运算 - CP-SAT 约束建模
:将每条规则自动翻译为 Google OR-Tools 的 CP-SAT 模型,保留原始语义(例如“同一患者不得同时开具 A 与 B 检验”被建模为布尔变量互斥约束)
- 边界用例生成
:对每条规则,同时求解出满足条件的最小合规样本、违反条件的最大容忍样本、以及跨时段/跨科室的扰动组合样本
- HTML 演练报告
:按规则分组呈现用例,每条含字段值、判定结果、触发逻辑链(如“因 admit_time=2024-03-01 08:00,discharge_time=2024-03-02 07:59,差1分钟达24小时,判定为挂床”)
- CSV 导出
:输出标准结构化表格,含
rule_id、case_type、field_values_json、decision四列,可直接导入医院 HIS 或质控系统做批量回放 - 边界案例数据库
:SQLite 存储历史生成用例,支持按规则 ID、生成时间、用例类型检索复用
以下为五类预设规则及其对应生成策略的对照说明:
规则类型 | 判定逻辑关键词 | 系统生成重点 | 典型边界示例 |
|---|---|---|---|
药品适应症限制 | “诊断编码不匹配” | 构造诊断码与药品码的最小差异组合(如仅末位不同) | 诊断 ICD-10:J18.9(肺炎,未特指),药品:阿奇霉素(适应症 J01-F01)→ 合规;若诊断为 R51(头痛),同药→ 违规 |
检验项目互斥 | “不得同时开具” | 枚举所有互斥对的时间重叠窗口(精确到分钟) | 血清肌酐(采样时间 09:00)与尿微量白蛋白(采样时间 09:05)→ 重叠5分钟→ 违规 |
超限用药 | “单日剂量>X mg” | 在剂量上限±0.1%范围内生成连续浮点值用例 | 头孢曲松单日限 4g → 生成 3.996g(合规)、4.004g(违规) |
挂床检测 | “住院时长<24小时” | 按分钟级枚举入院/出院时间差,覆盖跨日、跨班次场景 | 入院 2024-03-01 23:59,出院 2024-03-02 00:00 → 时长1分钟→ 违规 |
分解住院 | “同一疾病短期内再入院” | 绑定主诊断编码 + 时间窗(如7天),生成首末次入院时间差恰好卡窗边界的用例 | 首次入院 2024-03-01,二次入院 2024-03-07 → 差6天→ 违规;若为2024-03-08 → 差7天→ 合规 |
使用与配置
整个流程无需写代码,全部通过 CLI 完成。你只需准备规则文件、执行三条命令、获得报告:
安装依赖
确保 Python 3.10+ 已安装,然后执行:
pip install -r requirements.txt加载规则
规则文件放在data/目录下(如sample_rules.yaml),格式严格遵循项目文档定义的 schema。加载命令会校验语法与字段完整性:
python -m src.cli.main load-rules --config data/sample_rules.yaml生成测试用例
指定某条规则 ID(如rule_001),系统自动构建 CP-SAT 模型并求解,输出 JSON 格式用例集到指定目录:
python -m src.cli.main generate --rule-id rule_001 --output-dir data/output导出报告
支持 HTML 与 CSV 双格式导出,命令中指定格式与输出路径即可:
python -m src.cli.main export --format html --output-dir data/output python -m src.cli.main export --format csv --output-dir data/output生成的 HTML 报告可直接在浏览器打开,含折叠式规则详情、用例表格、判定逻辑高亮;CSV 文件可被 Excel 或 BI 工具读取,用于后续分析或对接院内系统。
工程结构
项目采用清晰分层架构,模块职责无重叠:
模块目录 | 主要职责 | 关键实现说明 |
|---|---|---|
src/rules/ | 规则数据模型与加载器 | 定义 RuleSchema 类,支持 YAML/JSON 解析、字段校验、逻辑表达式预编译 |
src/solver/ | CP-SAT 约束建模与求解 | 将规则条件转为 CP-SAT 变量与约束,调用 OR-Tools 求解器生成多组解 |
src/reports/ | HTML/CSV 报告生成 | Jinja2 渲染 HTML 模板,pandas 构造 CSV DataFrame,保留原始字段语义 |
src/database/ | 边界案例持久化 | SQLite 数据库存储用例元数据(ID、规则ID、生成时间、类型),支持按需查询 |
src/cli/ | 命令行接口 | Click 框架封装,提供 |
data/目录存放示例规则与结算数据,开箱即用;templates/提供可定制的 HTML 报告模板;docs/放置完整使用说明与规则 schema 定义。
环境与运行
本工具对运行环境要求极简:仅需 Python 3.10+ 与基础科学计算库。CP-SAT 求解器由 Google OR-Tools 提供,已通过requirements.txt统一管理。所有操作均在本地完成,不上传任何数据至外部服务器,符合医保数据不出域的安全要求。实测在普通办公笔记本(16GB 内存,i5-1135G7)上,单条规则生成百级用例平均耗时 1.2 秒,复杂多条件规则(如含 3 层嵌套逻辑)最长不超过 8 秒。
依赖版本要求如下表所示,均已在requirements.txt中锁定:
依赖库 | 版本要求 | 用途说明 |
|---|---|---|
ortools | >=9.8.0 | 提供 CP-SAT 求解器核心能力 |
pandas | >=2.0.0 | 结构化数据处理与 CSV 导出 |
openpyxl | >=3.1.0 | 支持 Excel 格式扩展(如未来增加 XLSX 导出) |
pyyaml | >=6.0.0 | 规则配置文件解析 |
jinja2 | >=3.1.0 | HTML 报告模板渲染 |
数据与扩展
规则定义是系统输入的核心。项目文档中已明确定义了规则 YAML 的字段规范:必须包含rule_id、description、condition(支持and/or/not嵌套)、fields(声明涉及的业务字段名)及examples(可选)。新增规则只需按此格式编写 YAML 文件,无需修改代码。我们预留了condition字段的扩展能力,当前支持数值比较、字符串匹配、时间差计算、集合互斥四类原子操作,后续可通过扩展解析器支持正则、区间合并等更复杂逻辑。
已有五类规则并非封闭列表。医院可根据本地飞检重点,在data/下新增 YAML 文件,只要字段名与 HIS 或结算系统实际字段一致,即可立即参与用例生成。例如某地市新增“中医辨证分型与中药饮片匹配”规则,只需定义tcm_syndrome_code与herb_code的映射关系,系统即可生成对应边界用例。
限制与说明
本工具不解决以下问题:
- 不校验原始结算数据质量(如诊断编码是否真实有效)
- 不替代临床合理性判断(如“该药是否真不该用”,只回答“按规则是否算违规”)
- 不支持实时流式用例生成(当前为离线批量模式)
- 不内置 HIS 或医保平台对接协议(导出 CSV 后需人工或脚本对接)
所有生成用例均基于规则文本的字面语义建模,若规则本身存在歧义(如“短期内”未定义天数),需先在 YAML 中明确为数值(如window_days: 7)。边界案例数据库默认启用,但 SQLite 文件可随时清空或迁移,不影响核心生成逻辑。
项目地址:
https://github.com/nexorin9/fly-inspect-case-generator