FHIR 实现详解与代码示例

点 赞
0
热 度
39
评 论
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 等标准格式写回存储库,全程保留可审计的操作链路。


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

具有版权性

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

具有时效性

文章目录

展开侧栏

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

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

xiaowang


求一个解压密码

西北技术支持中心

西北技术支持中心


缺点啥呢,有说明吗

西北技术支持中心

西北技术支持中心


开始建站了😀