医疗健康后端【免费下载链接】openemrThe most popular open source electronic health records and medical practice management solution.项目地址https://gitcode.com/GitHub_Trending/op/openemr点击查看免费下载OpenEMR 作为开源的电子健康记录EHR与医疗实践管理解决方案内置了一套完整的FHIR R44.0.1REST API同时兼容US Core 8.0实施指南与SMART on FHIR v2.2.0规范。本文以仓库根目录的 FHIR_README.md 为主线系统讲解 FHIR API 的启用、Base URL 规范、OAuth 2.0 认证与细粒度 Scope 授权、30 资源支持、FHIR 搜索语法、Bulk Data 批量导出、DocumentReference$docrefCCD 生成以及 SMART 应用集成全流程同时结合 src/FHIR 与 apis/routes 等源码目录剖析其底层路由、患者上下文绑定与导出作业的实现机制。读完本文你将能够独立完成从启用 API、注册客户端、获取令牌到读取患者数据、发起批量导出、生成临床摘要文档的完整对接。说明FHIR_README.md 明确指出完整的 FHIR 文档体系已迁移至 Documentation/api/FHIR_API.md并配套 SMART_ON_FHIR.md、AUTHENTICATION.md、AUTHORIZATION.md 等分册。本文是这套文档体系的集成导读与实战手册建议按需查阅分册获取完整细节。一、FHIR R4 能力总览与标准合规OpenEMR 的 FHIR 实现覆盖30 个 FHIR R4 资源并横跨patient、user、system三种访问上下文。核心能力包括FHIR R44.0.1基线支持覆盖读、写、搜索、操作Operation等 RESTful 交互US Core 8.0合规同时兼容 3.1 与 7.0 版本配置见后文向后兼容一节SMART on FHIR v2.2.0认证与应用启动支持 EHR Launch 与 Standalone LaunchBulk Data批量导出v1.0/v2.0.0用于人群健康分析与数据仓库集成USCDI数据要素支持CCD-A 临床摘要生成通过DocumentReference/$docref操作按需产出 Continuity of Care DocumentProvenance溯源追踪支持_revincludeProvenance:target反查数据来源Granular Scopes细粒度授权可按资源类别category过滤访问范围。其合规矩阵可概括为标准版本状态FHIRR4 (4.0.1)基线支持US Core8.0合规可配置上限 3.1 / 7.0 / 8.0SMART on FHIRv2.2.0完整支持SMART App Launch1.1.0合规OAuth 2.0RFC 6749已实现OpenID Connect1.0已支持PKCERFC 7636公共应用必选Bulk Datav1.0 / v2.0.0已实现从源码结构看src/FHIR 目录将 FHIR 实现拆分为Config服务端配置、R4FHIR 资源数据模型含FHIRResource.php、PHPFHIRResponseParser.php等解析器、SMARTSMART 能力声明、启动令牌、资源约束过滤、Export批量导出作业与DomainModels等子模块与文档描述的能力一一对应。二、快速开始启用 API 并完成首次请求1. 启用 FHIR API在 OpenEMR 管理界面执行Administration → Config → Connectors勾选Enable OpenEMR Standard FHIR REST API。2. 配置 HTTPS/TLS 站点地址所有 FHIR 端点强制要求 HTTPS/TLS。需在Administration → Config → Connectors → Site Address中设置站点基地址例如https://localhost:9300本地测试或https://your-openemr.example.com/openemr子目录安装需包含子路径。该地址同时是 OAuth2 与 FHIR 的基地址。若使用自签名证书测试时 curl 需附加-k参数关闭证书校验。3. FHIR Base URL 规范FHIR 端点的 Base URL 模式为https://{your-openemr-host}/apis/{site}/fhir默认站点https://localhost:9300/apis/default/fhir多站点租户将default替换为租户名如https://localhost:9300/apis/alternate/fhir多站点说明见 DEVELOPER_GUIDE.md 多站点支持端点结构遵循 FHIR RESTful 惯例{base}/[resource-type]/[id] # 按 ID 读取单个资源 {base}/[resource-type]?[search] # 资源搜索 {base}/[resource-type]/[operation] # 资源级操作例如GET https://localhost:9300/apis/default/fhir/Patient/123、GET .../Observation?patient123、POST .../Patient/$docref。在路由实现上apis/routes/_rest_routes_fhir_r4_us_core_3_1_0.inc.php 集中注册了全部 FHIR 路由每个路由处理器会先判断$request-isPatientRequest()——若为患者角色Portal 场景则强制绑定到该患者的 UUIDgetPatientUUIDString()确保患者角色只能读取自身数据否则调用RestConfig::request_authorization_check()执行传统 ACL 校验。4. 获取 Capability Statement免认证Capability Statement 用于描述服务器的全部能力支持资源、交互、搜索参数、OAuth2 端点、SMART 能力不需要认证curl -X GET https://localhost:9300/apis/default/fhir/metadata \ -H Accept: application/fhirjson响应示例节选会声明fhirVersion: 4.0.1、instantiates指向us-core-server与bulk-data两份 CapabilityStatement、SMART 能力扩展launch-ehr、context-standalone-patient、client-confidential-symmetric、permission-patient等以及每个资源的交互矩阵read、create、update、search-type与搜索参数列表。完整示例见 FHIR_API.md。5. 认证并访问数据除 Capability Statement 外所有 FHIR 请求都要求携带 Bearer 访问令牌# 先按认证指南获取 access token再发起 FHIR 请求 curl -X GET https://localhost:9300/apis/default/fhir/Patient \ -H Authorization: Bearer YOUR_ACCESS_TOKEN \ -H Accept: application/fhirjson内容协商支持三种格式推荐使用 FHIR 专用 JSON格式Content-TypeAcceptJSON默认application/fhirjsonapplication/fhirjsonJSONapplication/jsonapplication/jsonXMLapplication/fhirxmlapplication/fhirxml三、认证与授权OAuth 2.0 与 FHIR Scope 体系1. 获取访问令牌OpenEMR 采用 OAuth 2.0 / OpenID Connect 认证AUTHENTICATION.md 完整覆盖三种授权流Authorization Code Grant前端应用 用户交互公共应用需配合 PKCEcode_challenge/code_challenge_methodS256Client Credentials Grant后端服务使用非对称密钥JWT Bearer Assertion认证是 Bulk Export 的必经流程EHR Launch Flow从 OpenEMR 内启动的 SMART 应用。注册客户端时至少需要openidapi:fhir 资源级 Scope例如openid api:fhir patient/Patient.rs patient/Observation.rs2. Scope 语法与权限标志SMART v2.2.0 的 Scope 格式为context/Resource.permissions[?query]contextpatient/user/systemResourceFHIR 资源类型如Patient、Observationpermissions.cruds权限标志组合必须按 c→r→u→d→s 顺序排列query可选查询串用于细粒度过滤权限标志含义标志权限对应 REST 操作cCreate创建POSTrRead读取GETuUpdate更新POST / PUT / PATCHdDelete删除DELETEsSearch搜索GET常见组合示例patient/Patient.r # 仅按 ID 读取 patient/Patient.rs # 读取 搜索 patient/Patient.cruds # 全部权限 user/Observation.cruds # 用户上下文全量访问 user/Condition.rus # 读取、更新、搜索注意patient/Patient.sr、patient/Patient.rsc这类乱序写法是无效的。3. 三种上下文类型上下文数据范围适用场景patient/仅单个患者数据令牌响应中携带 patient ID患者门户、个人健康应用、单患者电子处方user/登录用户按其角色权限可见的多患者数据EHR 内嵌应用、临床决策支持、面向医生工具system/无限制全量访问批量导出、分析平台、人群健康、后端服务4. Granular Scopes细粒度授权SMART v2.2.0 新增通过?追加的查询参数可把资源访问收窄到特定类别。注意细粒度 Scope 是限制而非放宽请求某个类别后就只能访问该类别需要多类别时必须分别注册多个 Scope。资源示例 Scope效果Observationpatient/Observation.rs?categoryhttp://terminology.hl7.org/CodeSystem/observation-category\|vital-signs仅生命体征Observationpatient/Observation.rs?categoryhttp://terminology.hl7.org/CodeSystem/observation-category\|laboratory仅检验结果Conditionpatient/Condition.rs?categoryhttp://hl7.org/fhir/us/core/CodeSystem/condition-category\|health-concern仅健康问题DocumentReferencepatient/DocumentReference.rs?categoryhttp://hl7.org/fhir/us/core/CodeSystem/us-core-documentreference-category\|clinical-note仅临床笔记在实现层src/FHIR/SMART/ResourceConstraintFilterer.php 负责把这类粒度约束解析并应用到查询过滤中完整粒度 Scope 表见 AUTHORIZATION.md 粒度授权章节。5. SMART v1 Scope 向后兼容为兼容旧客户端v1 的.read/.write写法仍被接受并自动映射v1 Scopev2 等价授予权限patient/Patient.readpatient/Patient.rs读取 搜索patient/Patient.writepatient/Patient.cud创建 更新 删除user/Observation.readuser/Observation.rs读取 搜索system/Patient.readsystem/Patient.rs读取 搜索四、支持的 FHIR 资源一览OpenEMR 支持 30 个 FHIR R4 资源完整清单与 Swagger 文档见 FHIR_API.md 资源章节可通过安装目录/swagger/在线浏览与测试。患者级资源30AllergyIntolerance、Appointment、Binary、CarePlan、CareTeam、Condition、Coverage、Device、DiagnosticReport、DocumentReference、Encounter、Goal、Immunization、Location、Medication、MedicationRequest、MedicationDispense、Observation、Organization、Patient、Person、Practitioner、PractitionerRole、Procedure、Provenance、RelatedPerson、ServiceRequest、Specimen等。系统级资源上述全部患者资源另加 Group 与 Bulk Export 操作。SMART v2.2.0 新增资源ServiceRequest—— 检验医嘱、影像申请、转诊单Specimen—— 检验标本追踪MedicationDispense—— 药房发药记录RelatedPerson—— 患者关联人如紧急联系人。从路由源码看apis/routes/_rest_routes_fhir_r4_us_core_3_1_0.inc.php 中注册了对应的FhirServiceRequestRestController、FhirSpecimenRestController、FhirMedicationDispenseRestController、FhirDocumentReferenceRestController、FhirOperationExportRestController等每个资源均实现GET /fhir/{Resource}、GET /fhir/{Resource}/:uuid等标准交互。五、FHIR 搜索实战按患者搜索# 某患者的全部用药 GET /fhir/MedicationRequest?patient123 # 活动期问题列表 GET /fhir/Condition?patient123clinical-statusactive # 近期就诊 GET /fhir/Encounter?patient123datege2024-01-01按类别搜索# 仅生命体征 GET /fhir/Observation?patient123categoryvital-signs # 仅检验结果 GET /fhir/Observation?patient123categorylaboratory # 问题列表条目 GET /fhir/Condition?patient123categoryproblem-list-item按日期范围搜索# 2024 年 1 月以来的观测 GET /fhir/Observation?patient123datege2024-01-01 # 2024 年第一季度就诊前缀 ge/le 可叠加 GET /fhir/Encounter?patient123datege2024-01-01datele2024-03-31带 Provenance 反查与分页# 检验结果 溯源记录 curl -X GET https://localhost:9300/apis/default/fhir/Observation?patient123categorylaboratory_revincludeProvenance:target \ -H Authorization: Bearer eyJ0eXAiOiJKV1Qi... # 最近 10 条生命体征 curl -X GET https://localhost:9300/apis/default/fhir/Observation?patient123categoryvital-signsdatege2024-01-01_count10 \ -H Authorization: Bearer eyJ0eXAiOiJKV1Qi...搜索参数完整列表_id、identifier、name、birthdate、gender、address-city、family、given、phone、_lastUpdated等可在 Capability Statement 中直接发现详见 FHIR_API.md 搜索参数章节。六、Bulk FHIR 批量导出数据分析与人群健康OpenEMR 实现了 FHIR Bulk Data Export 规范支持把大规模数据以NDJSONNewline Delimited JSON每行一个完整 FHIR 资源格式导出用于人群健康分析、研究数据抽取、数据仓库集成与质量指标上报满足 21 世纪治愈法案 ONC 合规要求。三类导出导出类型端点数据范围系统导出GET /fhir/$export全部数据患者导出GET /fhir/Patient/$export全部患者 compartment 数据组导出GET /fhir/Group/[id]/$export指定患者组数据患者导出覆盖 FHIR Patient Compartment 定义的所有资源Patient、Observation、Condition、MedicationRequest、Procedure、Encounter、AllergyIntolerance 等。组导出中OpenEMR 会为每位医生自动创建一个 Group以patient_data.providerID主诊医生字段划分患者例如 Group 5 包含以 Practitioner 5 为主诊医生的全部患者。必需 Scopesystem/*.$export # 系统导出 system/Patient.$export # 患者导出 system/Group.$export # 组导出 system/*.$bulkdata-status # 查询导出状态 system/Binary.read # 下载导出文件认证要求Bulk 导出必须使用 Client Credentials Grant客户端凭据 非对称 JWKS 签名断言。三步工作流Step 1 —— 发起导出Prefer: respond-async声明异步curl -X GET https://localhost:9300/apis/default/fhir/Patient/$export \ -H Authorization: Bearer TOKEN \ -H Accept: application/fhirjson \ -H Prefer: respond-async返回202 Accepted响应头携带状态轮询 URLHTTP/1.1 202 Accepted Content-Location: https://localhost:9300/apis/default/fhir/$bulkdata-status?job92a94c00-77d6-4dfc-ae3bStep 2 —— 轮询状态curl -X GET https://localhost:9300/apis/default/fhir/$bulkdata-status?job92a94c00-77d6-4dfc-ae3b \ -H Authorization: Bearer TOKEN进行中返回202 Accepted完成返回200与导出清单manifest包含transactionTime完成时间、request原始请求、requiresAccessToken下载是否需令牌、output按资源类型分组的 Binary 下载 URL 数组、error。Step 3 —— 下载 NDJSON 文件curl -X GET https://localhost:9300/apis/default/fhir/Binary/97552 \ -H Authorization: Bearer TOKEN \ -o patients.ndjson文件内容为逐行 JSON{resourceType:Patient,id:1,...} {resourceType:Patient,id:2,...} {resourceType:Patient,id:3,...}完整导出脚本# Step 1: 客户端凭据换令牌 TOKEN$(curl -X POST https://localhost:9300/oauth2/default/token \ -H Content-Type: application/x-www-form-urlencoded \ --data-urlencode grant_typeclient_credentials \ --data-urlencode client_assertion_typeurn:ietf:params:oauth:client-assertion-type:jwt-bearer \ --data-urlencode client_assertion$JWT \ --data-urlencode scopesystem/Patient.$export system/*.$bulkdata-status system/Binary.read \ | jq -r .access_token) # Step 2: 发起导出并提取 Content-Location CONTENT_LOCATION$(curl -X GET \ -H Authorization: Bearer $TOKEN \ -H Accept: application/fhirjson \ -H Prefer: respond-async \ -i https://localhost:9300/apis/default/fhir/Patient/\$export \ | grep -i Content-Location: | cut -d -f2 | tr -d \r) # Step 3: 轮询直至完成 while true; do STATUS$(curl -s -o /dev/null -w %{http_code} \ -H Authorization: Bearer $TOKEN $CONTENT_LOCATION) if [ $STATUS 200 ]; then echo Export complete!; break else echo Export in progress... (Status: $STATUS); sleep 30 fi done # Step 4: 读取清单并下载 EXPORT_MANIFEST$(curl -s -H Authorization: Bearer $TOKEN $CONTENT_LOCATION) echo $EXPORT_MANIFEST | jq -r .output[] | \(.type): \(.url) echo $EXPORT_MANIFEST | jq -r .output[].url | while read URL; do FILENAME$(echo $URL | sed s/.*Binary\/// | sed s/$/.ndjson/) curl -H Authorization: Bearer $TOKEN $URL -o $FILENAME echo Downloaded: $FILENAME done导出过滤参数# 仅导出指定资源类型 GET /fhir/$export?_typePatient,Observation,Condition # 仅导出指定时间之后的数据 GET /fhir/$export?_since2024-01-01T00:00:00Z # 组合使用 GET /fhir/Patient/$export?_typeObservation,Condition_since2024-01-01T00:00:00Z在实现层面src/FHIR/Export/ExportJob.php 管理导出作业生命周期ExportStreamWriter.php/ExportMemoryStreamWriter.php负责 NDJSON 流式写入并配套ExportException.php、ExportCannotEncodeException.php等异常类型处理编码与流中断场景。七、DocumentReference $docref按需生成 CCD 临床摘要$docref操作可按需生成C-CDA 临床摘要文档CCD适用于转诊交接、患者请求、外部系统集成等场景。必需 Scopepatient/DocumentReference.$docref patient/DocumentReference.read patient/Binary.read或使用user/、system/上下文等价 Scope请求与参数curl -X POST https://localhost:9300/apis/default/fhir/DocumentReference/$docref \ -H Authorization: Bearer TOKEN \ -H Content-Type: application/fhirjson \ --data { resourceType: Parameters, parameter: [ {name: patient, valueId: 123}, {name: start, valueDate: 2024-01-01}, {name: end, valueDate: 2024-12-31} ] }参数类型必填说明patientid是患者 IDstartdate否就诊过滤起始日期enddate否就诊过滤结束日期typecode否文档类型编码日期过滤行为不传日期 全部病史仅传start 从起始日至今仅传end 到结束日为止的全部历史两个都传 精确区间两者相同 单日。日期精度支持YYYY全年、YYYY-MM整月、YYYY-MM-DD具体日。响应与 CCD 下载响应为 searchset Bundle内含 DocumentReference34133-9 Summarization of Episode NoteUS Coreclinical-note类别content.attachment.url指向 CCD XML 的 Binary 下载地址{ resourceType: Bundle, type: searchset, total: 1, entry: [{ resource: { resourceType: DocumentReference, id: ccd-123-20240115, status: current, type: { coding: [{ system: http://loinc.org, code: 34133-9, display: Summarization of Episode Note }] }, subject: { reference: Patient/123 }, content: [{ attachment: { contentType: application/xml, url: https://localhost:9300/apis/default/fhir/Binary/98765 } }] } }] }下载 CCD XMLcurl -X GET https://localhost:9300/apis/default/fhir/Binary/98765 \ -H Authorization: Bearer TOKEN \ -o patient-ccd.xmlCCD 包含的章节按日期过滤基于就诊手术史、相关检验数据、功能状态、病程记录、操作记录、实验室报告叙述、就诊记录、评估、治疗计划、目标、健康问题文档、转诊原因、精神状态全量历史人口学信息、过敏/不良反应/警报、用药史、问题列表、免疫接种、社会史、医疗设备、最近生命体征。查看 CCD 的两种方式XSL 转换下载 XSL 样式表GET /interface/modules/zend_modules/public/xsl/cda.xsl放入 CCD XML 同目录后用浏览器打开即可渲染上传 OpenEMR将 XML 以 CCDA 类别上传至患者文档获得人可读视图。操作级路由由 FhirOperationDocRefRestController 中的实现承载见 apis/routes/_rest_routes_fhir_r4_us_core_3_1_0.inc.php。八、SMART on FHIR 应用集成SMART on FHIR 允许第三方应用以标准化方式接入 OpenEMR支持跨 EHR 系统的互操作应用、基于 OAuth 2.0 的安全数据访问、上下文感知启动与细粒度授权。1. 两种启动方式EHR LaunchEHR 内启动医生在患者图表中点击 SMART Enabled AppsOpenEMR 携带iss与launch参数重定向到应用启动 URL应用随后携带 launch 令牌请求授权最终获得患者 就诊上下文。Standalone Launch独立启动用户直接打开应用应用主动请求授权用户登录并同意后获得访问令牌与上下文。Standalone 不使用launchScope可选launch/patient。2. 启动上下文Launch ContextsSMART v2.2.0 提供三类上下文令牌响应中以 JSON 返回// 患者上下文 { patient: 123 } // 就诊上下文v2.2.0 新增 { patient: 123, encounter: 456 } // 用户上下文 { fhirUser: Practitioner/789 }对应实现位于 src/FHIR/SMART/SmartLaunchController.php处理启动令牌签发与 src/FHIR/SMART/SMARTLaunchToken.php能力声明由 src/FHIR/SMART/Capability.php 维护。3. 应用注册两种方式Web 注册推荐访问https://your-openemr.example.com/interface/smart/register-app.php填写应用名称、Launch URL、Redirect URI、应用类型Confidential 可安全保存密钥 / Public 不能、Scope 复选框、JWKS URI、Logo 与联系邮箱提交后获得 Client ID 与 Client Secret。API 注册curl -X POST https://localhost:9300/oauth2/default/registration \ -H Content-Type: application/json \ --data { application_type: private, client_name: My SMART App, redirect_uris: [https://app.example.com/callback], launch_uris: [https://app.example.com/launch], token_endpoint_auth_method: client_secret_post, scope: openid fhirUser launch launch/patient patient/Patient.rs patient/Observation.rs, contacts: [adminexample.com] }4. 应用审批策略在Administration → Config → Connectors → OAuth2 → App Manual Approval配置自动审批默认仅使用patient/*Scope 的患者独立应用自动通过满足 ONC 治愈法案 48 小时审批要求请求user/*、system/*Scope 或使用客户端凭据的后端服务仍需人工审批手动审批所有应用均需管理员审批最安全但需人工监控以满足患者应用 48 小时审批的合规时限。SMART 客户端管理相关控制器位于 src/FHIR/SMART/ClientAdminController.php注册/审批/令牌端点在 oauth2 与src/RestControllers中实现。5. Standalone Launch 前端示例const authUrl new URL(https://localhost:9300/oauth2/default/authorize); authUrl.searchParams.set(response_type, code); authUrl.searchParams.set(client_id, YOUR_CLIENT_ID); authUrl.searchParams.set(redirect_uri, https://app.example.com/callback); authUrl.searchParams.set(scope, openid offline_access patient/Patient.rs patient/Observation.rs); authUrl.searchParams.set(state, generateRandomState()); authUrl.searchParams.set(aud, https://localhost:9300/apis/default/fhir); // 公共应用必须附加 PKCE authUrl.searchParams.set(code_challenge, codeChallenge); authUrl.searchParams.set(code_challenge_method, S256); window.location.href authUrl.toString();用户批准后 OpenEMR 回调redirect_uri?code...state...应用兑换令牌后即可携带Authorization: Bearer访问 FHIR 资源。九、测试你的 FHIR 集成Swagger UIOpenEMR 安装目录自带交互式 API 文档与测试台https://your-openemr-install/swagger/FHIR 部分位于 fhir 分区对应的 OpenAPI 定义见 swagger/openemr-api.yamlCapability Statementcurl https://localhost:9300/apis/default/fhir/metadata免认证查看服务器能力SMART 配置发现端点curl https://localhost:9300/apis/default/fhir/.well-known/smart-configuration该端点返回 SMART v2.2.0 能力授权/令牌/注册端点、代码挑战方法、能力列表等对应控制器为SMARTConfigurationController见 apis/routes 路由注册。十、错误处理与 HTTP 状态码状态码含义常见原因200OK请求成功201Created资源创建成功202Accepted批量导出已受理400Bad Request请求格式非法401Unauthorized令牌缺失或无效403ForbiddenScope 权限不足404Not Found资源不存在422Unprocessable Entity校验失败如日期格式错误500Internal Server Error服务器内部错误错误响应统一使用 FHIROperationOutcome格式{ resourceType: OperationOutcome, issue: [{ severity: error, code: security, diagnostics: Insufficient scope: patient/Observation.rs required }] }典型故障排查401 invalid_tokenAuthorization: Bearer TOKEN头缺失或令牌过期403授权阶段请求的 Scope 不含目标资源需携带更全的 Scope 重新授权404核对资源 ID 是否真实存在如Patient/99999422核对日期等字段格式期望YYYY-MM-DD。十一、向后兼容与 US Core 版本控制FHIR API 设计上保持向后兼容新资源、新操作以不破坏既有集成的方式增量加入。一个值得注意的兼容点US Core 3.1、7.0 与 8.0 的 Profile 在部分资源上相互冲突。若你的实施需要严格遵循某个 US Core 版本可在Admin → Config → Connectors → Maximum supported version for US Core FHIR Implementation Guide中将上限设为 3.1、7.0 或 8.0使 FHIR API 仅对外宣告并支持该版本及以下的 Profile。Capability Statement 中supportedProfile数组会随该设置动态收窄默认同时声明us-core-patient|3.1.1、us-core-patient|8.0.0等。十二、底层实现导览源码级参考若需深入源码可按以下路径继续探索路由注册与患者绑定apis/routes/_rest_routes_fhir_r4_us_core_3_1_0.inc.phpFHIR 全部 REST 路由、isPatientRequest()患者上下文强制绑定、ACL 授权检查FHIR 资源数据模型与解析src/FHIR/R4FHIRResource.php、PHPFHIRResponseParser.php、FHIRElement.php等FHIR 服务层src/Services/FHIRFhirPatientService、FhirObservationService、FhirConditionService等 40 个资源服务负责 OpenEMR 数据与 FHIR 资源模型的双向映射REST 控制器层src/RestControllers/FHIR每个资源对应一个 RestController含操作控制器Operations/FhirOperationExportRestController、Operations/FhirOperationDocRefRestControllerSMART 子模块src/FHIR/SMARTCapability.php、ActionUrlBuilder.php、ResourceConstraintFilterer.php、SmartLaunchController.php、ClientAdminController.php、SMARTLaunchToken.php批量导出作业src/FHIR/ExportExportJob.php、ExportStreamWriter.php、ExportMemoryStreamWriter.php及异常类测试用例tests/Tests/FHIR 下的 FHIR 单元与集成测试可验证各资源交互行为。总结OpenEMR 的 FHIR R4 实现是一条完整可用的互操作通道从 Connectors 一键启用、基于 SMART on FHIR v2.2.0 的 OAuth 2.0 认证与细粒度 Scope 授权到 30 资源的 CRUD 与搜索、Bulk Data 异步导出、$docrefCCD 按需生成再到 EHR/Standalone 双启动的第三方应用接入全部环节都有文档与源码双重支撑。本文作为 FHIR_README.md 的展开与导读建议在实际对接时配合 Documentation/api/FHIR_API.md完整资源与搜索参数、AUTHENTICATION.md三种 OAuth2 授权流细节、AUTHORIZATION.md全部 Scope 清单与 SMART_ON_FHIR.md应用注册、启动流程与故障排查按需查阅。赞分享医疗健康后端【免费下载链接】openemrThe most popular open source electronic health records and medical practice management solution.项目地址https://gitcode.com/GitHub_Trending/op/openemr点击查看免费下载相关推荐OpenEMR API 全景指南Standard REST、FHIR R4 与 SMART on FHIR 集成实战OpenEMR API 全景指南Standard REST、FHIR R4 与 SMART on FHIR 集成实战 OpenEMR 是开源的电子健康档案E医疗健康后端OpenEMR REST API 集成指南OAuth 2.0 认证、FHIR R4 资源与 SMART on FHIR v2.2.0 开发实战OpenEMR REST API 集成指南OAuth 2.0 认证、FHIR R4 资源与 SMART on FHIR v2.2.0 开发实战 本篇技术指南系医疗健康后端OpenEMR FHIR R4 API 完整实战指南资源、认证、Bulk 导出与 CCD 生成OpenEMR FHIR R4 API 完整实战指南资源、认证、Bulk 导出与 CCD 生成 导读 OpenEMR 提供了完整的 HL7 FHIR R44医疗健康后端上一篇如何用gspread打造游戏玩家数据存储系统从入门到实战指南下一篇gh_mirrors/paip-lisp中的生成对抗网络GAN基础实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?