乐于分享
好东西不私藏

[开源] 我把住院病历质控做成了一次软件发布:质控业务规则管理系统的四类检测与字节级回执

[开源] 我把住院病历质控做成了一次软件发布:质控业务规则管理系统的四类检测与字节级回执

医务科和病案室在病历归档前质控时,往往面临一个具体矛盾:面对 HIS、EMR 等五源数据和不断迭代的核心制度规则,人工核对效率极低,且整改过程难以追溯。规则一旦变更,全量病历的复核成本就会成倍增加。本项目是一个用 Rust 编写的质控业务规则管理系统,交付形态为命令行工具与 HTTP 服务。它把核心制度、单病种、临床路径的质控规则喂给系统,按规则对住院病历事件流批量跑缺陷还原与整改流转。技术栈基于 Rust 1.75+、axum 和 tokio,提供四类缺陷检测与字节级回执留痕,让每一份病历的质控过程都像软件发布一样可复盘、可审计。

多源事件流的统一接入与归并

医疗数据的复杂性在于,一份住院病历的事件散落在多个异构系统中。医嘱在 HIS,病程记录在 EMR,体征单在护理系统,还有不良事件上报和 LIS 检验报告。传统做法是编写复杂的关联查询去各个表里拼凑数据,不仅性能差,而且极难处理时间线上的交叉与乱序。

为了解决这个问题,我们设计了统一的事件流接入机制。系统通过 EventSource trait 抽象,让 HIS、EMR、护理、不良事件、LIS 五类事件流共用同一接入接口。在内存中,扫描引擎使用单迭代器按时间升序对这五源数据进行 k-way merge 归并,并处理时间漂移。这样一来,下游的规则检测模块看到的不再是割裂的数据表,而是一个按时间顺序完美排列的单一事件流。这种设计极大地简化了时间窗口偏差等复杂规则的计算逻辑,也让多源数据的比对变得异常清晰。

规则登记与全生命周期审计

质控规则不是一成不变的,核心制度和单病种指标会随着政策要求频繁调整。如果规则管理混乱,就会导致新旧标准同时生效,质控结果失去公信力。

我们将规则的生命周期划分为草稿、启用、试运行、必检、归档五个阶段。规则登记后,必须严格按照状态机走完整个流程。每次状态切换,系统都会自动写入审计轨迹。例如,当医务科启用单病种急性心梗的新版规则时,系统会自动将上一版本归档,避免新旧规则同时生效造成错乱。后续的事件流扫描会自动按新版本评估,而旧版本的回执依然可读。这种全生命周期的审计设计,确保了任何一条质控规则的下发与废止都有迹可循。

四类缺陷检测与词干归一

在拿到归并后的单一事件流后,系统会启动四类缺陷检测引擎。同一份规则可以被多类评估模型调用,具体包括:必填字段缺失检测、时间窗口偏差检测、词袋命中检测、责任科室漂移检测。

其中,词袋命中检测在处理自然语言文本时面临巨大挑战。主诉和病程记录中,医生对同一症状的描述往往千差万别。为此,我们引入了多语种词干归一机制。系统对主诉和病程文本走中英文分流的轻量归一处理,能够自动识别并合并同义词。例如,系统可以将胸痛、胸疼、胸口痛自动归入同一个词袋。这种细粒度的文本处理能力,大幅降低了因书写习惯不同导致的假阳性缺陷,让质控结果更贴近临床实际。

责任科室确认与整改流转

发现缺陷只是质控的第一步,如何推动临床科室整改才是核心难点。过去,质控员通过微信群或纸质单据下发整改通知,经常面临石沉大海或扯皮推诿的情况。

我们在系统中设计了严格的责任科室逐条确认机制。系统跑批生成的每一份缺陷清单,都会转化为具体的整改单。每条缺陷必须由对应的责任科室联络员在系统内进行确认。如果未确认,该整改单就不会进入后续的流转环节。为了防止网络重试或人为误操作导致的状态错乱,所有写操作都要求提供幂等键。通过这种强约束的确认机制,我们把整改责任真正落实到了具体的人,确保了质控流程的严肃性。

字节级回执留痕与审计重放

在医疗审计和飞检中,任何一份病历的质控结果都必须经得起回溯。如果系统升级或代码重构导致同样的输入产生不同的输出格式,审计就会面临巨大风险。

我们为每份整改单回执设计了字节级布局留痕机制。回执以定长头加校验和的形式写入本地磁盘,并利用 fsync 提高落盘可靠性。这种设计确保了每一份回执在物理存储上的绝对一致性。后续,审计员或院感人员可以随时使用 audit replay 命令,重放同输入得到完全相同的字节流。系统还内置了 verify-golden 钩子,用于在持续集成阶段跑通所有标准字节流断言。字节级回执摘要为内部审计和取证提供了不可辩驳的底层证据。

典型业务场景落地

为了让大家更直观地理解系统的运作方式,我们梳理了两个最典型的业务场景。

第一个场景是月度批量质控。医务科把本月生效的核心制度规则打包为配置文件,通过命令行灌入系统。病案室从各系统导出本月数百份病历的五源事件流文件,分别灌入。质控员执行跑批扫描命令,系统瞬间完成全量病历的缺陷还原,并输出按规则分组的缺陷清单与可核对的字节回执。责任科室通过 API 逐条确认整改单。最后,审计员可以在任何时候重放同输入,得到字节级同回执,用于飞检取证。

第二个场景是新规则切换。当医务科启用新版单病种规则时,系统通过事件驱动自动完成版本切换。旧版本规则被安全归档,新规则立即生效。整个切换过程无需停机,也不影响正在进行的质控任务,真正实现了规则的热更新与平滑过渡。

安全合规与系统边界

在医疗信息化建设中,明确系统的边界与遵守安全合规要求同等重要。我们在一开始就为系统划定了严格的红线。

首先,本工具不写回生产库。整改回执由病案室或责任科室人工确认后,由人工导入 HIS,本工具不替代医务科签字或代签。其次,系统不输出临床诊断或治疗建议,仅做文书层面的缺项、互斥与时间序提示,最终判定由医务人员人工复核。在数据安全方面,导出审计包时会自动去除患者姓名、身份证、手机号等敏感信息,仅保留入院ID哈希与事件字段。接口层面,系统采用恒定时间比对进行 API Key 校验,防止时序攻击,生产环境建议接入统一的身份认证系统。

快速开始与项目结构

系统采用 Rust 编写,依赖管理清晰,启动迅速。以下是快速体验的最小启动流程:

# 1. 安装依赖(需 Rust 1.75+;cargo 自带;macOS/Linux 默认 ~/.cargo/bin)
# 2. 复制配置:cp .env.example .env
# 3. 构建:cargo build --locked
# 4. 跑通最小启动:cargo run --bin qc-rule-manager -- serve --port 8080
#    (启动 axum 监听 0.0.0.0:8080 + AppState 初始化)
# 5. 验证:cargo test --locked
#    端到端验证:bash scripts/verify.sh

项目结构经过精心规划,领域模型、字节布局持久化、规则注册、扫描引擎、事件评估模型、词干归一、审计模块、事件源接入、API 路由与命令行工具各自独立。这种高内聚低耦合的设计,不仅保证了核心逻辑的纯粹性,也为后续扩展新的缺陷检测模型打下了坚实基础。

适用岗位
业务时刻
核心交付
医务科质控员
月度或季度批量质控,切换新规则或新单病种
上传规则后一键跑全量病历,得到按规则分组的缺陷清单与可核对的字节回执
病案室编码员
抽查某批住院病历的某类核心制度
每份病历得到具体规则未过、缺文书或缺时间点的精准清单
责任科室联络员
收到整改单后补齐材料
在系统内确认整改回执,未确认不进入流转,回执字节级留痕
内部审计或院感
复盘某批病历,对比新旧两版规则
同一份事件流可被重放回算,字节级回执摘要用于审计取证
子命令
用途
关键参数
serve
启动 HTTP 服务
--port 监听端口
rule ingest
从配置文件灌入规则
--path 规则文件路径
events ingest
从数据文件灌入事件流
--path 路径,--source 五源之一
scan
按规则与版本跑批扫描
--rule-id,--version,--events-dir
remediation ack
责任科室确认整改单
--id 整改单 ID,--idempotency-key 幂等键
audit replay
字节级重放并比对
--rule-id,--version,--admission,--events-dir
方法
路径
用途
POST
/rules
登记规则,触发状态机与审计轨迹
GET
/rules
列出已登记规则
POST
/events/ingest
灌入事件流,落盘到运行时目录
POST
/scan
跑批扫描,产出缺陷清单与整改单
POST
/remediation/:id/ack
责任科室确认,持久化幂等键
GET
/audit/:admission_id
拉取字节级回执,携带校验和头部

项目地址: https://github.com/nexorin9/qc-rule-manager

往期热门文章

院长们相信AI,不是因为AI

医保,正在接管医生的鼠标

医院最不缺的,就是数据

互联网医院死了三千家,没人写讣告

有多少人工,就有多少智能

医生的一天,都在给系统打工

几百万,买了个SQL

系统瘫痪,信息科祭天

互联网医院,最后变成了一张线上处方单

自主知识产权,终于可以下载了

医疗数据开始值钱以后

医院买了两个AI:一个写病历,一个查病历

医院信息化最稳定的能力叫迎检

医疗AI:95%的准确率,意味着总有人会成为那5%

医院信息化最成熟的系统:丧事喜办

AI进了医院,但责任还停留在HIS时代

HIS维护费,买不到产品的未来

AI还没成熟,认证先成熟了

代码越便宜,HIS厂商越危险

医院第一次拥有了无限加班系统

医院HIS最大的成功,就是活成了物业

院长大会上,HIS厂商没有名字

院长们正在把AI当许愿池

医院信息科AI Coding:上线一时爽,运维修罗场

牛马造嚼子:当医院信息科开始用AI自我驯化

AI正在帮医院证明:信息科不需要预算

当医院开始自己写系统,HIS厂商的黄金时代结束了

医疗AI做出来了,但没人付钱

医院的“功能无限责任制”逼死了HIS和乙方

HIS厂商最赚钱的产品,是恐惧

医疗AI,连幻觉都谈不上

医疗AI正在被医院HIS“降维打击”

医院数据全进中台了,然后呢?

当整个行业默认HIS不会变好

排队两小时,看病三分钟:医院HIS系统正在改变诊疗

HIS厂商的"架构收敛":当所有系统长得一模一样,你凭什么收费?

十万字病历,AI只配读懂噪音

一群鼓吹AI Coding的专家,正在制造医疗信息化的新技术债

当AI开始学习自己编造的病历

不是AI不行,是HIS系统把门焊死了

医院AI培训:台上教你投喂,台下让你背锅

当AI开始操作医院HIS系统,医疗AI的问题就变了

医院信息网络安全大赛:表演给谁看?

CHIMA年年开,问题年年在

CHIMA2026:AI挤满展厅,但医院已经不买单了

医院的数据不属于医院

医院信息科不会消失,但正在被掏空

谁解释数据,谁就定义医院

一线崩了!医院信息科正在拖垮整个医疗信息化

医疗信息化将进入无人实施时代

当医院信息科主任用AI下场写代码,交付链第一次被打穿

当代码不再是“技术”:HIS厂商的“辜鸿铭时刻”

我用一个Agent,把实施链路压缩到一轮循环

AI狂欢背后:HIS厂商正在成为第一批受害者

离职程序员被炼成AI!但我发现真正该慌的是医生

HIS厂商还没倒,但已经不值钱了!

HIS厂商真正的危机:医院不再必须买系统了

代码不再稀缺,医院HIS厂商还怎么定价?

买国产不会被问责,买进口不会被原谅

把HIS系统的Loading改成Thinking,它就是AI了吗?

Seedance2证明了一件事:医疗AI可能只是另一种幻觉

软件已死:医院未来不需要买系统,只需要买“技能包”

我用OpenClaw干了一件HIS厂商最怕的事

Epic的“美国HIS神话”,为何在中国公立医院无法复制?

中国公立医院的内外网隔离,究竟在保护什么?

Oracle的撤退信号:医疗信息化,正在被资本重新定价

别做梦了,绝大多数公立医院,根本玩不转HIS自研

互联网大厂做不好HIS?因为这不是软件业,是保姆业

为什么开源HIS系统在中国几乎绝迹?

这套HIS系统完美运行,所以:医生全责

当HIS系统真正好用时,病人已经出事了

比“大厂救不了”更残酷的真相,当全国医院共用一套HIS系统

中国式 RWD 祛魅:所谓真实世界数据,其实是 AWD?

都在说医疗数据是金矿,但没人敢提那个尴尬的真相

中国医院信息化正在经历一场反向演化:越评级,越难用

为什么互联网大厂的“降维打击”,救不了中国医院的HIS?