医疗系统的接口设计:HL7/FHIR 协议的数据交换规范
医疗系统的接口设计HL7/FHIR 协议的数据交换规范一、深度引言与场景痛点为什么两个医院的系统不能直接传输病历在国内从一个医院转诊到另一个医院时最常发生的场景是病人拿着一叠纸质报告和 CT 胶片从一个楼走到另一个楼。为什么不能直接把数据传过去因为两个医院的 HIS医院信息系统来自不同的厂商使用的数据格式、编码方式和传输协议可能完全不同。这就是医疗信息互操作性问题。HL7Health Level 7和它的现代版本 FHIRFast Healthcare Interoperability Resources就是为了解决这个问题而设计的标准协议。理解这套协议对于开发医疗系统的后端工程师来说是必备知识。二、底层机制与原理深度剖析FHIR 的资源模型FHIR 的核心思想是把医疗数据建模为一系列标准化的资源Resource。所有资源都可以通过 RESTful API 访问。三、生产级代码实现与最佳实践# FHIR 资源模型 —— Patient 资源示例 from dataclasses import dataclass from typing import Optional import json dataclass class FHIRPatient: FHIR Patient 资源 遵循 FHIR R4 规范 https://www.hl7.org/fhir/patient.html resourceType: str Patient # 标识符可多个身份证号、病历号等 identifiers: list[dict] None # 姓名 family_name: str given_name: str # 性别: male | female | other | unknown gender: str unknown # 出生日期: YYYY-MM-DD birth_date: Optional[str] None # 联系电话 phone: Optional[str] None # 地址 address: Optional[str] None def to_fhir_json(self) - dict: 转换为 FHIR JSON 格式 FHIR 对 JSON 格式有严格的字段命名规范 必须遵循 PascalCase 和小驼峰混合命名。 resource { resourceType: Patient, id: self._generate_id(), identifier: self._format_identifiers(), name: [{ use: official, family: self.family_name, given: [self.given_name], }], gender: self.gender, } if self.birth_date: resource[birthDate] self.birth_date if self.phone: resource[telecom] [{ system: phone, value: self.phone, use: mobile, }] if self.address: resource[address] [{ text: self.address, }] return resource classmethod def from_fhir_json(cls, data: dict) - FHIRPatient: 从 FHIR JSON 解析为 Python 对象 name data.get(name, [{}])[0] telecom data.get(telecom, [{}]) address data.get(address, [{}]) return cls( family_namename.get(family, ), given_namename.get(given, [])[0] if name.get(given) else , genderdata.get(gender, unknown), birth_datedata.get(birthDate), phonetelecom[0].get(value) if telecom else None, addressaddress[0].get(text) if address else None, ) def _format_identifiers(self) - list[dict]: 格式化标识符列表 if not self.identifiers: return [] return [ { system: ident.get(system, ), value: ident.get(value, ), } for ident in self.identifiers ] def _generate_id(self) - str: 生成资源 ID import uuid return str(uuid.uuid4()) # Observation 资源 —— 实验室检查结果 class FHIRObservation: FHIR Observation 资源 —— 检查/检验结果 resourceType: str Observation def __init__(self, patient_id: str, code: str, value: float, unit: str, reference_range: str ): self.patient_id patient_id self.code code # LOINC 编码 self.value value # 测量值 self.unit unit # 单位 self.reference_range reference_range # 参考范围 def to_fhir_json(self) - dict: 转换为 FHIR Observation JSON 示例血糖 6.2 mmol/L return { resourceType: Observation, status: final, subject: { reference: fPatient/{self.patient_id} }, code: { coding: [{ system: http://loinc.org, code: self.code, display: self._get_loinc_display(self.code), }] }, valueQuantity: { value: self.value, unit: self.unit, system: http://unitsofmeasure.org, code: self.unit, }, referenceRange: [{ text: self.reference_range }] if self.reference_range else [], effectiveDateTime: datetime.now().isoformat(), } def _get_loinc_display(self, code: str) - str: LOINC 编码 → 中文名称 loinc_map { 2345-7: 血清葡萄糖, 26453-1: 红细胞计数, 26464-8: 白细胞计数, 777-3: 血小板计数, } return loinc_map.get(code, code)四、边界分析与架构权衡FHIR 的互操作性优势FHIR 相比旧版 HL7 v2/v3 的优势基于 RESTful 架构任何 Web 开发者都能快速上手使用 JSON/XML非医疗领域的工具链友好资源粒度合理如 Patient、Observation不会太粗也不会太细本地化的挑战FHIR 以欧美医疗体系为基础设计在国内落地的挑战ICD-10疾病编码与国内的 ICD-10-CM 有差异药品编码体系不同国内用 YPID中医诊断在 FHIR 中缺乏标准化支持国内实践中通常采用FHIR 框架 国内扩展的模式保持核心资源不变在扩展字段中增加本地化内容。五、总结HL7/FHIR 的价值在于它为医疗数据的交换提供了一套共同语言。就像 HTTP 让所有网站可以互通一样FHIR 让不同厂商的医疗系统能够互通。对于后端工程师来说即便不从事医疗行业FHIR 的设计理念也值得学习资源化建模把业务对象拆解为独立的、可组合的资源RESTful 风格用统一的 HTTP 动词操作资源可扩展性核心字段标准化扩展字段灵活化这种标准化核心 灵活扩展的设计模式适用于任何需要多系统互操作的场景。

相关新闻

Rust 引用计数实战:Arc 在真实并发场景下的性能边界的测试分析

Rust 引用计数实战:Arc 在真实并发场景下的性能边界的测试分析

Rust 引用计数实战:Arc 在真实并发场景下的性能边界的测试分析 一、当共享状态成为瓶颈 我们 AI CLI 工具的后端有一个"模型路由表"——它会根据用户请求的复杂度、token 预算和当前的速率限制,动态选择用哪个模型提供商。这个路由表被几十个并…

2026/11/2 12:52:04 阅读更多 →
Rust 程序员的工具清单:AI 时代的高效学习装备推荐

Rust 程序员的工具清单:AI 时代的高效学习装备推荐

Rust 程序员的工具清单:AI 时代的高效学习装备推荐 一、自学编程的独特视角 我学 Rust 的起点很野。 没有操作系统课,不知道什么是"虚拟内存";没上过编译原理,第一次看到 "LLVM IR" 以为是个打字错误&#xf…

2026/11/2 12:21:28 阅读更多 →
AI CLI 工具的持续演进:版本迭代中保持向后兼容的 Rust 技巧与实践

AI CLI 工具的持续演进:版本迭代中保持向后兼容的 Rust 技巧与实践

AI CLI 工具的持续演进:版本迭代中保持向后兼容的 Rust 技巧与实践 一、从一次半夜的报警说起 那天凌晨两点,我的 pager 响了。 核心日志只有一行:error: unexpected argument --model found。我们两个月前发布的 AI CLI 工具 v0.3.0 里把 --…

2026/11/2 9:14:30 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/2 0:25:10 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/2 10:46:11 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/2 10:47:40 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/2 1:16:51 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/2 10:46:31 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/2 10:46:26 阅读更多 →

日新闻

周新闻

月新闻