医疗系统的接口设计: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/10/7 2:28:31 阅读更多 →
Rust 程序员的工具清单:AI 时代的高效学习装备推荐

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

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

2026/10/8 22:24:08 阅读更多 →
AI CLI 工具的持续演进:版本迭代中保持向后兼容的 Rust 技巧与实践

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

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

2026/9/26 23:54:54 阅读更多 →

最新新闻

Discovery软件安装部署全指南:模块选型、License配置与避坑实战

Discovery软件安装部署全指南:模块选型、License配置与避坑实战

简介:这份PPT围绕石油行业Discovery油藏描述平台的软件介绍与安装展开,面向地质学家、测井工程师和地震解释人员,帮助他们快速建立对数据管理、地震解释、测井研究及地质分析一体化工作流的整体认知。包内仅含1个pptx演示文档,压缩…

2026/10/9 15:16:51 阅读更多 →
VS2005与Access老项目实战:连接配置、数据访问与避坑指南

VS2005与Access老项目实战:连接配置、数据访问与避坑指南

简介:针对C#初学者和希望快速上手Access数据库开发的读者,配套光盘中收录了VS2005环境下使用C#操作Access数据库的经典案例。内容围绕连接配置、数据增删改查、列表绑定与统计查询等典型场景展开,可帮助学习者从零搭建一个完整可运行的示例&a…

2026/10/9 15:16:51 阅读更多 →
SonarQube 7.9代码质量平台部署与CI集成实践

SonarQube 7.9代码质量平台部署与CI集成实践

简介:SonarQube 7.9是开源代码质量管理平台,面向开发团队、质量工程师与DevOps实践者,用于持续检测源码中的漏洞、代码异味及编码规范偏差,尤其适合集成到CI/CD流水线和本地化部署场景。这份zip压缩包约196.67MB,内部目…

2026/10/9 15:16:51 阅读更多 →
Extractor2.5 解包封包实战:逆向工程资源替换与固件定制

Extractor2.5 解包封包实战:逆向工程资源替换与固件定制

简介:Extractor2.5 是一款面向游戏资源提取与二次开发爱好者的解包/封包工具,适合需要从各类游戏文件包中提取素材、替换资源或进行模组制作的中高级用户。它支持 007、ADAT、APAK、MHW、MIX、MW4、NPAK、PACK、PAK、PBO、PFF、PKR、POD、RES、U 等数十种…

2026/10/9 15:16:51 阅读更多 →
那个被三个临时同事救场的周五:麦芽AI、workbuddy、Codex 一日接需求实录|TaoToken 统一 Key 通道

那个被三个临时同事救场的周五:麦芽AI、workbuddy、Codex 一日接需求实录|TaoToken 统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 15:16:51 阅读更多 →
第 36 章 · 综合项目一:最小二乘拟合

第 36 章 · 综合项目一:最小二乘拟合

把全书知识串起来的第一个实战项目:用 Eigen 做最小二乘直线拟合。这是数据科学、机器学习的入门基础,也是 Eigen 的典型应用。36.1 问题:拟合一条直线 假设你有一批实验数据点 (x, y): (0, 1.1), (1, 3.0), (2, 5.2), (3, 6.9), …

2026/10/9 15:15:50 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →