FHIR 实现详解与代码示例

点 赞
0
热 度
9
评 论
0
  1. 首页
  2. Intersystem IRIS
  3. 基础Cache
  4. FHIR 实现详解与代码示例

InterSystems IRIS 数据库 FHIR 实现详解与代码示例

一、概述

InterSystems IRIS for Health(IRIS医疗版)是原生支持 HL7 FHIR 标准的医疗数据与集成平台,内置完整的 FHIR 服务器、资源存储库、格式转换引擎与互操作编排能力。它既可以作为原生 FHIR 数据仓库使用,也可以作为 FHIR 网关对接传统医疗系统,完全遵循 FHIR RESTful API 规范,同时支持与 HL7 v2、CDA、DICOM 等 legacy 医疗格式的无缝互转。

二、核心架构与组件

2.1 整体架构

IRIS 医疗版以 FHIR 资源库为核心,对外通过标准化 FHIR API 向应用层提供服务,对内通过转换组件对接 CDA 文档库、HL7 v2 历史数据源等异构系统,实现医疗数据的统一接入与标准化输出。

QQ20260806-100944.webp
图1 InterSystems IRIS医疗版FHIR整体架构

2.2 三大核心组件

IRIS 提供三种 FHIR 部署模式,适配不同业务场景:

  • FHIR Repository(FHIR 存储库)
    原生以 FHIR 格式存储所有医疗资源,支持完整的 CRUD、搜索、版本历史与批量操作,具备 ACID 事务特性与高性能索引能力,适合作为中心 FHIR 数据底座使用。
  • FHIR Façade(FHIR 外观)
    部署在非 FHIR 业务系统前端,对外提供统一的 FHIR API,内部将 FHIR 请求转换为对底层数据库的操作,无需改造原有数据结构即可快速对外输出 FHIR 能力,适合存量 HIS、EMR 系统的快速 FHIR 化改造。
  • FHIR Broker(FHIR 代理)
    作为多系统的数据流转中枢,协调多个 FHIR/非 FHIR 系统之间的请求路由、事务管理与安全控制,充当医疗数据交换的“清算所”,适合复杂医疗生态下的跨系统数据互通。

三、IRIS FHIR 核心规则与特性

3.1 规范与版本支持

  • 原生完整支持 FHIR R4(4.0.1),高版本同时兼容 R5 核心特性
  • 实现全部 FHIR RESTful 交互:read、vread、update、delete、search、history、create 等
  • 支持 FHIR Profile、Extension、ValueSet、CodeSystem 等构造型资源,可通过 FHIR 包管理器导入 US Core、IPA 等行业标准 Profile

3.2 资源验证规则

  • 所有写入资源默认执行结构校验,严格匹配对应 Profile 的字段约束、基数与术语绑定
  • IRIS 强制要求 Profile 的规范 URL 必须携带版本号,避免版本歧义导致的数据校验异常
  • 支持通过资源 meta.profile 字段指定校验规则,服务端自动执行合规性检查

3.3 安全与权限

  • 原生支持 SMART on FHIR + OAuth 2.0 认证授权体系
  • 支持基于令牌作用域(scope)的细粒度访问控制,可限制单用户可访问的资源类型与操作权限
  • 内置全量审计日志,记录所有 FHIR API 的请求来源、操作类型与资源变更

3.4 扩展能力

  • 内置 HL7 v2 ↔ FHIR、CDA ↔ FHIR 转换引擎,支持通过 DTL 可视化配置自定义映射规则
  • 提供 Bulk FHIR 批量导入导出能力,适合大数据量迁移与科研分析场景
  • 支持自定义搜索参数与 FHIR 扩展字段,满足业务定制化需求

四、代码示例

4.1 初始化 FHIR 服务实例

IRIS 中所有 FHIR 操作均通过 HS.FHIRServer.Service 调度,首先获取服务实例:

// 替换为实际部署的FHIR端点路径
set fhirEndpoint = "/csp/healthshare/fhirserver/fhir/r4/"
// 获取或初始化FHIR服务实例
set fhirService = ##class(HS.FHIRServer.Service).EnsureInstance(fhirEndpoint)

4.2 资源查询(GET)

根据资源 ID 查询单个 Patient 资源:

// 构造请求对象
set request = ##class(HS.FHIRServer.API.Data.Request).%New()
set request.RequestPath = "/Patient/1001"  // 路径格式:资源类型/资源ID
set request.RequestMethod = "GET"

// 发起调度请求
do fhirService.DispatchRequest(request, .response)

// 处理响应结果
if response.HttpStatus = 200 {
    // response.Json 为 %DynamicObject 类型的标准FHIR资源
    set familyName = response.Json.name.%Get(0).family
    write "患者姓氏:", familyName, !
} else {
    write "查询失败,HTTP状态码:", response.HttpStatus, !
}

示例来源:InterSystems 官方开发文档

4.3 资源创建(POST)

通过动态对象构造 FHIR 资源并提交创建:

// 构造Patient资源动态对象
set patientResource = {
    "resourceType": "Patient",
    "name": [
        {
            "use": "official",
            "family": "Zhang",
            "given": ["San", "Ming"]
        }
    ],
    "gender": "male",
    "birthDate": "1992-08-15",
    "telecom": [
        {
            "system": "phone",
            "value": "13800138000",
            "use": "mobile"
        }
    ]
}

// 构造POST请求
set request = ##class(HS.FHIRServer.API.Data.Request).%New()
set request.RequestPath = "/Patient"
set request.RequestMethod = "POST"
set request.Json = patientResource

// 提交请求
do fhirService.DispatchRequest(request, .response)

if response.HttpStatus = 201 {
    write "患者创建成功,资源ID:", response.Json.id, !
}

4.4 FHIRPath 数据提取

IRIS 内置 FHIRPath 引擎,可通过表达式快速提取资源字段,无需手动遍历 JSON 结构:

// 指定FHIR版本
set fhirVersion = $lb("hl7.fhir.r4.core@4.0.1")
// 获取FHIRPath引擎实例
set fhirPathAPI = ##class(HS.FHIRPath.API).getInstance(fhirVersion)

// 解析表达式:提取所有手机号类型的联系方式
set exprTree = fhirPathAPI.parse("telecom.where(system = 'phone')")
// 执行表达式,结果存入OUTPUT多维数组
do fhirPathAPI.evaluate(patientResource, exprTree, .OUTPUT)

// 遍历输出结果
set total = OUTPUT
for i=1:1:total {
    write "手机号:", OUTPUT(i).value, ",用途:", OUTPUT(i).use, !
}

示例来源:InterSystems 官方 FHIRPath 文档

4.5 Bundle 批量操作

使用 IRIS 内置工具类快速构造 FHIR Bundle,实现批量资源提交:

set bundleUtil = ##class(HS.FHIRServer.Util.Bundle)

// 创建collection类型的Bundle
set bundle = bundleUtil.CreateBundle("collection")

// 向Bundle中添加Patient条目
do bundleUtil.AddBundleEntry(bundle, "", patientResource, "")

// 添加Observation资源条目
set obsResource = {
    "resourceType": "Observation",
    "status": "final",
    "code": {
        "coding": [{"system": "http://loinc.org", "code": "789-8"}]
    },
    "valueQuantity": {"value": 125, "unit": "mmHg", "system": "http://unitsofmeasure.org"}
}
do bundleUtil.AddBundleEntry(bundle, "", obsResource, "")

// 最终化Bundle(自动处理空字段与格式规范)
set finalBundle = bundleUtil.FinalizeBundle(bundle)

// 提交Bundle请求
set request = ##class(HS.FHIRServer.API.Data.Request).%New()
set request.RequestPath = "/"
set request.RequestMethod = "POST"
set request.Json = finalBundle
do fhirService.DispatchRequest(request, .response)

示例来源:InterSystems FHIR Bundle 工具类文档

4.6 嵌入式 Python 操作 FHIR

IRIS 支持嵌入式 Python,可直接调用 Python FHIR 生态工具库:

from fhirpy import SyncFHIRClient

# 连接IRIS FHIR服务器
client = SyncFHIRClient(
    url="http://localhost:52773/fhir/r4",
    extra_headers={"Content-Type": "application/fhir+json"}
)

# 创建患者资源
patient = client.resource(
    "Patient",
    name=[{"family": "Li", "given": ["Hua"]}],
    gender="female",
    birthDate="1995-05-20"
)
patient.save()
print(f"患者创建成功,ID: {patient.id}")

# 按姓氏搜索患者
patients = client.resources("Patient").search(family="Li").fetch_all()
for p in patients:
    print(f"患者: {p['name'][0]['family']}, 生日: {p.birthDate}")

五、快速部署 FHIR 服务器

5.1 Docker 一键部署

使用官方模板快速启动完整 FHIR 服务:

# 克隆模板仓库
git clone https://github.com/intersystems-community/iris-fhir-template.git
cd iris-fhir-template

# 启动IRIS FHIR服务
docker-compose up -d

部署完成后,FHIR R4 端点地址为:http://localhost:52773/fhir/r4

5.2 包管理器安装

在 IRIS 终端中通过 IPM 包管理器一键安装:

USER> zpm "install fhir-server"

六、扩展场景:事件驱动 FHIR 工作流

IRIS 的 FHIR 存储库可与内置互操作引擎联动,当 FHIR 资源发生创建、更新时自动触发业务流程,实现临床决策支持、数据同步、AI 辅助诊断等自动化场景。

QQ20260806-101046.webp

图2 FHIR事件驱动的智能临床工作流架构

该架构下,FHIR 资源写入事件会自动触发互操作编排引擎,调用向量检索、AI 推理等能力,最终将结果以 FHIR DiagnosticReport 等标准格式写回存储库,全程保留可审计的操作链路。


余乃云水散人,栖于数字之墟。性耽幽静,常以青简为田,墨痕为穗。晨起推窗,听松风煮茶;夜阑掩卷,伴竹影扫阶。此间筑小筑三椽,藏闲话若干:或遇史海遗珠,则录以素札;偶得诗瓢碎玉,便缀作清吟。往来皆烟霞客,谈笑有鸿儒踪。诸君若得暇,不妨暂驻云履,共品一盏烟岚,半卷春秋。

具有版权性

请您在转载、复制时注明本文 作者、链接及内容来源信息。 若涉及转载第三方内容,还需一同注明。

具有时效性

文章目录

欢迎来到南鸢宸羲的站点,为您导航全站动态

158 文章数
39 分类数
3 评论数
48标签数
最近评论
xiaowang

xiaowang


求一个解压密码

西北技术支持中心

西北技术支持中心


缺点啥呢,有说明吗

西北技术支持中心

西北技术支持中心


开始建站了😀