1. FHIR服务端平台工程导论

FHIR(Fast Healthcare Interoperability Resources,快速医疗互操作资源)是HL7组织发布的医疗数据交换标准。它用“资源(Resource)”作为最小数据单元,把患者、就诊、检验、用药、医嘱等医疗对象抽象为可独立寻址的JSON/XML结构,并通过RESTful API暴露增删改查能力。与早期HL7 V2消息、V3/CDA文档相比,FHIR的定位不是“再造一套消息格式”,而是把医疗数据交换从“点对点定制接口”推进到“面向资源的平台化服务”。理解这一点,是理解服务端平台工程价值的起点。

FHIR的定位与价值

FHIR的核心价值可以概括为三点。第一,资源化建模:每个资源有稳定的类型名(如Patient、Observation、Encounter)、唯一标识(id)和标准字段,服务端可以按类型和id定位数据,客户端不必解析整条消息。第二,统一交互语义:FHIR定义了RESTful交互(read、search、create、update、delete)、批量操作(Bundle)、订阅(Subscription)和操作(Operation),使不同厂商的系统遵循同一套调用约定。第三,可扩展与可约束:通过扩展(Extension)承载标准未覆盖的本地字段,通过Profile和Implementation Guide(IG)对资源做约束,兼顾通用性与本地化。

在工程实践中,FHIR服务端不是“把数据库表映射成JSON”这么简单。它需要处理资源版本、引用完整性、搜索参数、术语绑定、权限控制、审计与并发。例如,一个Observation资源引用Patient和Encounter,服务端在写入时必须校验引用目标是否存在;搜索时需支持patient、code、date等参数,并返回Bundle。这些能力决定了平台能否被真实业务系统集成。

服务端平台的核心能力

一个可用的FHIR服务端平台,通常需要具备以下能力层次:

  • 资源存储与版本管理:支持资源CRUD、历史版本(_history)、条件更新与乐观锁(ETag/If-Match)。
  • 搜索与查询:实现标准搜索参数、链式搜索(_include/_revinclude)、分页(_count/_offset)和排序。
  • 术语与校验:对绑定到ValueSet的字段做校验,支持CodeSystem/ValueSet资源的解析与展开。
  • 安全与审计:基于OAuth 2.0/SMART on FHIR的授权、Scope控制、AuditEvent记录。
  • 互操作与集成:支持Bundle批量提交、Subscription通知、以及与HIS/LIS/EMR的适配层。

这些能力并非孤立模块,而是围绕“资源生命周期”协同工作。下图展示了FHIR服务端平台从客户端请求到资源落库、再到订阅通知的核心数据流与能力分层,帮助建立整体架构认知。

FHIR服务端平台核心数据流与能力分层 客户端 / 业务系统 EMR · 移动端 · 第三方App FHIR RESTful API 网关 路由 · 鉴权 · 限流 · 版本协商 安全与审计 OAuth2 · Scope · AuditEvent FHIR 核心服务层 资源CRUD与版本 _history · ETag · 条件更新 搜索与查询引擎 _include · 分页 · 排序 术语与校验 ValueSet · Profile · 约束 订阅与集成 Subscription · Bundle · 适配 持久化与索引层 资源主表(JSON/关系混合) 搜索参数索引表 版本历史与审计日志 订阅通知回推 请求自左向右进入平台,经核心服务处理后落库;订阅事件反向通知客户端 示例架构,用于说明能力分层与数据流向,非特定产品实现

课程目标与实战项目全景

本课程的目标不是停留在“读懂FHIR文档”,而是能够独立设计、实现并验证一个可运行的FHIR服务端平台。围绕这一目标,课程将沿着“标准理解—架构设计—核心实现—集成验证”的路径推进,最终交付一个具备资源CRUD、搜索、版本管理、术语校验和订阅通知能力的服务端原型。

实战项目设定为一个面向区域医疗的FHIR R4服务端平台,核心场景包括:患者注册与查询、检验报告(Observation)写入与检索、就诊(Encounter)关联、以及基于Subscription的检验危急值通知。项目采用分层架构:接入层负责RESTful路由与鉴权,服务层实现资源生命周期与搜索,存储层采用“资源主表+搜索索引表”的混合模型,集成层对接模拟HIS与LIS。

为了让读者对项目边界有清晰预期,下面给出一个简化的能力验收清单,可作为后续章节实现与自测的参照:

能力项 验收要点 示例判断依据
资源CRUD POST创建Patient,GET按id读取,PUT更新并生成新版本 返回201/200,meta.versionId递增
搜索 支持patient、code、date参数,返回searchset Bundle Bundle.total与entry数量一致
版本历史 GET /Patient/{id}/_history返回历史版本列表 至少包含2个版本条目
术语校验 写入Observation时校验code是否在绑定ValueSet内 非法code返回422及OperationOutcome
订阅通知 危急值Observation写入后触发Subscription通知 模拟接收端收到rest-hook回调
学习建议:每章结束后,用curl或Postman对本地服务端发起一次真实请求,观察HTTP状态码、响应Bundle结构和OperationOutcome内容。FHIR的很多细节(如搜索参数、版本控制、错误处理)只有在实际请求中才会暴露,仅阅读规范容易遗漏。