使用 OHS 和 Google Cloud 管理 Android 应用中的 FHIR 数据

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 进行身份验证

8514f90f016ecfc0.png

上图显示了该流程。如需详细了解每个组件,请参阅此博客

2. 要求

  • 一个浏览器,例如 ChromeFirefox
  • 启用了结算功能的 Google Cloud 项目
  • 最新版本的 Android Studio
  • 已设置 Android 模拟器(您也可以使用实体 Android 设备)

创建项目

  1. Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目
  2. 确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能
  3. 启用必要的 API(BigQuery、Healthcare API)

激活 Cloud Shell

  1. 您将使用 Cloud Shell,这是一个在 Google Cloud 中运行的命令行环境,它预加载了 bq

在 Cloud 控制台中,点击右上角的“激活 Cloud Shell”:

51622c00acec2fa.png

  1. 连接到 Cloud Shell 后,您应该会看到自己已通过身份验证,并且相关项目已设置为您的项目 ID。如果您的项目未设置,请使用以下命令进行设置:
gcloud config set project <YOUR_PROJECT_ID>

如需了解 gcloud 命令和用法,请参阅文档

3. Healthcare API 设置

  1. 确保已启用 Healthcare API:前往 Google Cloud 控制台 API 库,搜索 Healthcare API,然后点击“启用”,系统将启用该 API 并将 Healthcare 服务账号添加到项目中
  2. 向服务账号授予 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 项流处理配置。

  1. 前往 Google Cloud Healthcare 控制台的浏览器页面
  2. 点击新创建的数据集
  3. 点击新创建的数据存储区 7acaa364337086aa.png
  4. 点击“添加新的流式传输配置”

caa2cc881d3406aa.png

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

1e038c694fcca1ef.png

大功告成。您已准备就绪,可以保存 FHIR 存储区数据并将其流式传输到 BigQuery。

5. Cloud Functions(使用 Healthcare API 将 R4 数据写入 FHIR 数据存储区)

借助 Cloud Functions,您可以方便地编写代码并以无服务器方式部署到云端。在技术和语言支持方面,它具有可伸缩性、随用随付、事件驱动和开放的特点。如需了解更多功能,请参阅文档

我们将编写的函数旨在对以 FHIR R4 格式传入的数据进行身份验证,并使用 Cloud Healthcare API 将数据写入 FHIR 数据存储区。如需创建 Cloud Functions 函数,请执行以下操作:

  1. 前往 Cloud Functions,然后点击“创建函数”
  2. 将名称设置为 fhir-datastore-proxy,将区域设置为 us-central1,并将身份验证选项设置为“需要身份验证”
  3. 展开“运行时、构建、连接和安全设置”。您将添加五个运行时环境变量:

名称: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

  1. 按“下一步”前往下一页,我们将在该页中添加代码
  2. 现在应该会显示一个内嵌编辑器,选择 Java 17 作为语言,然后前往 HelloHttpFunction.java 类。将其重命名为 FhirDatastoreProxy.java。别忘了还将入口点重命名为 gcfv2.FhirDatastoreProxy
  3. 代码库复制代码,并将其粘贴到内嵌编辑器中
  4. 前往 pom.xml 文件,然后将代码库中的 pom 文件复制到内嵌编辑器中
  5. 点击“部署”,您的函数很快就会创建并运行

注意:

  1. 此函数中使用的 Cloud Healthcare API 会使用应用默认凭据对发送到 Healthcare API 的请求进行身份验证
  2. 保存已部署的函数网址,以便能够从 Android 应用中调用该函数。到目前为止,我们已创建 Android 应用使用 Healthcare API 将 FHIR 数据独立写入 BigQuery 所需的所有组件。现在,让我们确保所有部分都已连接,并且在提交调查问卷时会调用 API。

6. Android 项目和 Firebase 设置

我们将使用最新版本的 Android Studio 和已设置好的 Android 模拟器(您也可以使用自己的 Android 设备)。准备就绪后,请按以下步骤操作:

  1. 克隆 FHIR 应用示例代码库:https://github.com/google/fhir-app-examples
  2. 打开 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 文件中

  1. 打开 FhirApplication.kt,并将 baseUrl 字段设置为 Cloud Functions 函数的网址
  2. 从 Android Studio 工具栏中选择“将项目与 Gradle 文件同步”

我们现已完成实现中的设置和依赖项包含部分。

7. 问卷设置和回答

我们已在代码库中设置了问卷。不过,我们先来了解一下代码:

  1. 确保 app/src/main/res/layout/activity_main.xml 文件中的 ConstraintLayout 内存在 FragmentContainerView
  2. 确保 QuestionnaireFragment 具有 JSON 编码的 FHIR 问卷,以渲染 fragment

在本例中,我们将使用 JSON 文件“new-patient-registration-paginated.json”来呈现 fragment。检查文件 MainActivity.ktAddPatientFragment.ktAddPatientViewModel.kt

现在,我们已经验证了 fragment、JSON 和模型,接下来运行应用,尝试为问卷中的字段输入答案

您会注意到字符串、日期、数字字段和其他条件的验证

您可以运行应用并检查日志,看看是否已创建记录

9e1bb440074f1a88.png

如需详细了解如何使用 fragment,请点击此处。问卷 fragment 和回答设置就差不多完成了。

8. FHIRStore 和 BigQuery 数据集结果显示

现在,我们已完成所有设置和更新,请点击“Sync Project with Gradle Files”。完成后,

  1. 在 Android 模拟器上运行应用,并观看问卷加载
  2. 回答问题,然后点击顶部的“提交”
  3. 您应该会在应用中看到“患者已保存”消息

查看 FHIR 存储区结果

前往 Google Cloud Healthcare FHIRViewer 控制台

1064f03b4e1e45f5.png

选择您的 FHIR 存储区和查询,然后点击“运行搜索”,您应该会在下方看到搜索结果。37a070480a06362c.png

查看 BigQuery 数据集结果

前往 Google Cloud BigQuery 控制台,然后在“探索器”窗格中,前往您为此项目创建的数据集。

7c483ec6d578b8cd.png

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

faafeae4a837a41c.png

现在,您可以对刚刚保存到云数据集中的 FHIR 数据执行 BigQuery SQL、Analytics 和 ML。

9. 搜索和离线功能

为了确保 OHS 支持的 Android FHIR SDK 应用具备离线功能,请务必遵循我们在此处讨论的实现中需要启用的设计指南

对于搜索 FHIR 资源,我们提供了两种方法:

  1. Google Cloud 控制台中的 FHIR 查看器
  2. 使用 GET 或 POST 请求的 FHIR 搜索方法

10. 应用演示

现在,我们的应用已开发完成,让我们来试用一下,看看云端的结果。

11. 清理

为避免系统因本博文中使用的资源向您的 Google Cloud 账号收取费用,请按照以下步骤操作:

  1. 在 Google Cloud 控制台中,进入管理资源页面
  2. 在项目列表中,选择要删除的项目,然后点击“删除”
  3. 在对话框中输入项目 ID,然后点击“关停”以删除项目

12. 恭喜

恭喜!在此项目中,我们仅用了 7 个步骤就成功创建了一个 Android 应用,用于使用 Cloud Healthcare API 在 Cloud Healthcare FHIR 存储区和 BigQuery 数据集中存储和查询患者 FHIR 数据:

  1. 设置 Android 应用
  2. 设置 Google Cloud Healthcare API
  3. 已创建医疗保健数据集和 FHIR 数据存储区
  4. 创建了 BigQuery 数据集
  5. 配置了 BigQuery 流,以将 FHIR Datastore 数据写入 BigQuery 数据集
  6. 部署了 Cloud Functions 函数以将 R4 数据写入 FHIR Datastore
  7. 在提交问卷回答时触发 Android 应用中的 Cloud Functions

现在,步骤已经很清楚了,您可以放心地尝试对患者 FHIR 编辑同步到云执行相同的步骤。