1. 简介
在此 Codelab 中,我们将学习如何使用 OHS (Open Health Stack) 和 Google Cloud Healthcare API 来创建安全、可扩缩且合规的创新型医疗保健解决方案。这些强大的工具相结合,可帮助医护人员和开发者创建数据驱动型解决方案,从而显著改善患者护理和治疗效果。
我们打算在移动应用中利用 Open Health Stack 和 Google Cloud Healthcare API 的强大功能,该应用使用 Android-FHIR SDK 来让用户管理 Google Cloud 中的 FHIR 患者记录。
下面我们来深入了解一下实现步骤。
构建内容
在此实现中,
- 我们将使用 Structured Data Capture Library 来呈现问卷,并使用 FHIR Engine 库来存储回答的 FHIR 内容
- 然后,系统会使用 Cloud Healthcare API 将数据上传到 Cloud FHIR 存储区
- 在上传之前,我们首先使用 Firebase 进行身份验证

上图显示了该流程。如需详细了解每个组件,请参阅此博客。
2. 要求
- 一个浏览器,例如 Chrome 或 Firefox
- 启用了结算功能的 Google Cloud 项目
- 最新版本的 Android Studio
- 已设置 Android 模拟器(您也可以使用实体 Android 设备)
创建项目
- 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。
- 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
- 启用必要的 API(BigQuery、Healthcare API)
激活 Cloud Shell
- 您将使用 Cloud Shell,这是一个在 Google Cloud 中运行的命令行环境,它预加载了 bq:
在 Cloud 控制台中,点击右上角的“激活 Cloud Shell”:

- 连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID。如果您的项目未设置,请使用以下命令进行设置:
gcloud config set project <YOUR_PROJECT_ID>
如需了解 gcloud 命令和用法,请参阅文档。
3. Healthcare API 设置
- 确保已启用 Healthcare API:前往 Google Cloud 控制台 API 库,搜索 Healthcare API,然后点击“启用”,系统将启用该 API 并将 Healthcare 服务账号添加到项目中
- 向服务账号授予 BigQuery 管理员权限在 Cloud Shell 终端中执行以下 gcloud 命令以授予权限:
gcloud projects add-iam-policy-binding <<YOUR_PROJECT_ID>> \
--member=serviceAccount:service-<<PROJECT_NUMBER>>@gcp-sa-healthcare.iam.gserviceaccount.com --role=roles/bigquery.admin
注意:您可以在控制台中找到 PROJECT_ID 和 PROJECT_NUMBER,请参阅文档以了解如何识别。
创建 Healthcare 数据集
在 Cloud Shell 中,运行以下命令以创建 Healthcare 数据集:
gcloud beta healthcare datasets create <<DATASET_ID>> --location=us-central1
将位置设置为某个区域。
创建 FHIR Datastore
在 Cloud Shell 中,运行以下命令以创建 FHIR 数据存储区:
gcloud beta healthcare fhir-stores create <<FHIR_STORE>> \
--dataset=<<DATASET_ID>> --location=us-central1 --version=r4
将位置设置为某个区域。
4. BigQuery 设置和流式传输
本部分介绍如何将 FHIR 存储区数据保存到 BigQuery 数据集中,以便利用 BigQuery 和 BQML 的强大功能来查询、编程和分析数据。
创建 BigQuery 数据集
BigQuery 数据集是表的集合。数据集中的所有表都存储在同一数据位置。您还可以附加自定义访问权限控制,以限制对数据集及其表的访问权限。
在 Cloud Shell 中,运行以下命令:
bq mk --location=us-central1 --dataset <<PROJECT_ID>>:<<BQ_DATASET>>
将位置设置为某个区域。
创建 BigQuery 流处理
如需在每次于 FHIR 存储区中创建、更新、修补或删除 FHIR 资源时将资源更改导出到 BigQuery,必须启用流式传输。每个存储区最多只能具有 10 项流处理配置。
- 前往 Google Cloud Healthcare 控制台的浏览器页面
- 点击新创建的数据集
- 点击新创建的数据存储区

- 点击“添加新的流式传输配置”

- 从列表中选择新创建的 BigQuery 数据集,从列表中选择“Analytics V2”作为架构类型和“Patient”作为资源类型(您可以选择任意数量的资源类型),然后点击“完成”

大功告成。您已准备就绪,可以保存 FHIR 存储区数据并将其流式传输到 BigQuery。
5. Cloud Functions(使用 Healthcare API 将 R4 数据写入 FHIR 数据存储区)
借助 Cloud Functions,您可以方便地编写代码并以无服务器方式部署到云端。在技术和语言支持方面,它具有可伸缩性、随用随付、事件驱动和开放的特点。如需了解更多功能,请参阅文档。
我们将编写的函数旨在对以 FHIR R4 格式传入的数据进行身份验证,并使用 Cloud Healthcare API 将数据写入 FHIR 数据存储区。如需创建 Cloud Functions 函数,请执行以下操作:
- 前往 Cloud Functions,然后点击“创建函数”
- 将名称设置为 fhir-datastore-proxy,将区域设置为 us-central1,并将身份验证选项设置为“需要身份验证”
- 展开“运行时、构建、连接和安全设置”。您将添加五个运行时环境变量:
名称:CLOUD_FUNCTIONS_ENDPOINT | 值:Cloud Functions 函数的网址端点。您会在上面的“身份验证”块中看到此值,其格式为:https://us-central1-PROJECT_ID.cloudfunctions.net/fhir-datastore-proxy
名称:PROJECT_ID | 值:您的项目 ID
名称:DATASET_LOCATION | 值:FHIR Datastore 的位置
名称:DATASET_ID | 值:Healthcare Datastore ID
名称:FHIR_STORE_ID | 值:FHIR 存储区 ID
- 按“下一步”前往下一页,我们将在该页中添加代码
- 现在应该会显示一个内嵌编辑器,选择 Java 17 作为语言,然后前往 HelloHttpFunction.java 类。将其重命名为 FhirDatastoreProxy.java。别忘了还将入口点重命名为 gcfv2.FhirDatastoreProxy
- 从代码库复制代码,并将其粘贴到内嵌编辑器中
- 前往 pom.xml 文件,然后将代码库中的 pom 文件复制到内嵌编辑器中
- 点击“部署”,您的函数很快就会创建并运行
注意:
- 此函数中使用的 Cloud Healthcare API 会使用应用默认凭据对发送到 Healthcare API 的请求进行身份验证
- 保存已部署的函数网址,以便能够从 Android 应用中调用该函数。到目前为止,我们已创建 Android 应用使用 Healthcare API 将 FHIR 数据独立写入 BigQuery 所需的所有组件。现在,让我们确保所有部分都已连接,并且在提交调查问卷时会调用 API。
6. Android 项目和 Firebase 设置
我们将使用最新版本的 Android Studio 和已设置好的 Android 模拟器(您也可以使用自己的 Android 设备)。准备就绪后,请按以下步骤操作:
- 克隆 FHIR 应用示例代码库:https://github.com/google/fhir-app-examples
- 打开 Android Studio,选择“Import Project (Gradle, Eclipse ADT, etc.)”,然后从之前下载的源代码中选择 cloudfunction/ 文件夹。打开 app/google-services.json。为空,需要填充。
使用 ./gradlew signingReport 生成 SHA-1 密钥,并记下调试变体下的 SHA1 字段
使用 Firebase 控制台(按照第 1 步和第 2 步操作)将应用添加到 Firebase。在“调试签名证书 SHA-1”字段中,填写上一步中的值
下载 google-services.json,并将 Firebase 中的内容替换为应用文件夹中的空文件
Firebase SDK 已添加到 build Gradle 文件中
- 打开 FhirApplication.kt,并将 baseUrl 字段设置为 Cloud Functions 函数的网址
- 从 Android Studio 工具栏中选择“将项目与 Gradle 文件同步”
我们现已完成实现中的设置和依赖项包含部分。
7. 问卷设置和回答
我们已在代码库中设置了问卷。不过,我们先来了解一下代码:
- 确保 app/src/main/res/layout/activity_main.xml 文件中的 ConstraintLayout 内存在 FragmentContainerView
- 确保 QuestionnaireFragment 具有 JSON 编码的 FHIR 问卷,以渲染 fragment
在本例中,我们将使用 JSON 文件“new-patient-registration-paginated.json”来呈现 fragment。检查文件 MainActivity.kt、AddPatientFragment.kt 和 AddPatientViewModel.kt
现在,我们已经验证了 fragment、JSON 和模型,接下来运行应用,尝试为问卷中的字段输入答案
您会注意到字符串、日期、数字字段和其他条件的验证
您可以运行应用并检查日志,看看是否已创建记录

如需详细了解如何使用 fragment,请点击此处。问卷 fragment 和回答设置就差不多完成了。
8. FHIRStore 和 BigQuery 数据集结果显示
现在,我们已完成所有设置和更新,请点击“Sync Project with Gradle Files”。完成后,
- 在 Android 模拟器上运行应用,并观看问卷加载
- 回答问题,然后点击顶部的“提交”
- 您应该会在应用中看到“患者已保存”消息
查看 FHIR 存储区结果
前往 Google Cloud Healthcare FHIRViewer 控制台

选择您的 FHIR 存储区和查询,然后点击“运行搜索”,您应该会在下方看到搜索结果。
查看 BigQuery 数据集结果
前往 Google Cloud BigQuery 控制台,然后在“探索器”窗格中,前往您为此项目创建的数据集。

点击“预览”,您应该会在 BigQuery 数据集中看到与医疗保健 FHIR 存储区中相同的数量和结果数据。

现在,您可以对刚刚保存到云数据集中的 FHIR 数据执行 BigQuery SQL、Analytics 和 ML。
9. 搜索和离线功能
为了确保 OHS 支持的 Android FHIR SDK 应用具备离线功能,请务必遵循我们在此处讨论的实现中需要启用的设计指南。
对于搜索 FHIR 资源,我们提供了两种方法:
- Google Cloud 控制台中的 FHIR 查看器
- 使用 GET 或 POST 请求的 FHIR 搜索方法
10. 应用演示
现在,我们的应用已开发完成,让我们来试用一下,看看云端的结果。
11. 清理
为避免系统因本博文中使用的资源向您的 Google Cloud 账号收取费用,请按照以下步骤操作:
- 在 Google Cloud 控制台中,进入管理资源页面
- 在项目列表中,选择要删除的项目,然后点击“删除”
- 在对话框中输入项目 ID,然后点击“关停”以删除项目
12. 恭喜
恭喜!在此项目中,我们仅用了 7 个步骤就成功创建了一个 Android 应用,用于使用 Cloud Healthcare API 在 Cloud Healthcare FHIR 存储区和 BigQuery 数据集中存储和查询患者 FHIR 数据:
- 设置 Android 应用
- 设置 Google Cloud Healthcare API
- 已创建医疗保健数据集和 FHIR 数据存储区
- 创建了 BigQuery 数据集
- 配置了 BigQuery 流,以将 FHIR Datastore 数据写入 BigQuery 数据集
- 部署了 Cloud Functions 函数以将 R4 数据写入 FHIR Datastore
- 在提交问卷回答时触发 Android 应用中的 Cloud Functions
现在,步骤已经很清楚了,您可以放心地尝试对患者 FHIR 编辑同步到云执行相同的步骤。