1. Wprowadzenie
W tym ćwiczeniu z programowania dowiesz się, jak używać OHS (Open Health Stack) i Google Cloud Healthcare API do tworzenia innowacyjnych rozwiązań dla opieki zdrowotnej, które są bezpieczne, skalowalne i zgodne z przepisami. Połączenie tych zaawansowanych narzędzi umożliwia pracownikom służby zdrowia i programistom tworzenie rozwiązań opartych na danych, które mogą znacząco poprawić opiekę nad pacjentami i wyniki leczenia.
Chcemy wykorzystać możliwości Open Health Stack i Google Cloud Healthcare API w aplikacji mobilnej, która używa pakietu Android-FHIR SDK, aby umożliwić użytkownikom zarządzanie rekordami pacjentów FHIR w Google Cloud.
Przyjrzyjmy się krokom implementacji.
Co utworzysz
W tej implementacji:
- Użyjemy biblioteki Structured Data Capture Library do renderowania kwestionariusza oraz biblioteki FHIR Engine do przechowywania treści odpowiedzi w formacie FHIR.
- Dane zostaną przesłane do Cloud FHIR Store za pomocą Cloud Healthcare API.
- Przed przesłaniem uwierzytelnimy się za pomocą Firebase.

Diagram powyżej przedstawia przepływ. Szczegółowe wyjaśnienie każdego komponentu znajdziesz na blogu.
2. Wymagania
- Przeglądarka, np. Chrome lub Firefox.
- Projekt Google Cloud z włączonymi płatnościami.
- Najnowsza wersja Android Studio.
- Skonfigurowany emulator Androida (możesz też użyć fizycznego urządzenia z Androidem).
Tworzenie projektu
- W konsoli Google Cloud na stronie selektora projektu wybierz lub utwórz projekt Google Cloud .
- Sprawdź, czy w projekcie w chmurze włączone są płatności. Dowiedz się, jak sprawdzić, czy w projekcie są włączone płatności.
- Włącz niezbędne interfejsy API (BigQuery, Healthcare API).
Aktywowanie Cloud Shell
- Będziesz używać Cloud Shell, środowiska wiersza poleceń działającego w Google Cloud, które jest wstępnie załadowane narzędziem bq:
W konsoli Cloud kliknij Aktywuj Cloud Shell w prawym górnym rogu:

- Po połączeniu z Cloud Shell zobaczysz, że uwierzytelnianie zostało już przeprowadzone, a projekt jest już ustawiony na Twój identyfikator projektu. Jeśli projekt nie jest ustawiony, użyj tego polecenia, aby go ustawić:
gcloud config set project <YOUR_PROJECT_ID>
Informacje o poleceniach gcloud i ich użyciu znajdziesz w dokumentacji.
3. Konfiguracja Healthcare API
- Sprawdź, czy Healthcare API jest włączony: otwórz bibliotekę interfejsów API w konsoli Google Cloud, wyszukaj Healthcare API, kliknij WŁĄCZ, aby włączyć interfejs API i dodać konto usługi Healthcare do projektu.
- Przyznanie kontu usługi uprawnień administratora BigQuery: aby przyznać uprawnienia, wykonaj to polecenie gcloud w terminalu Cloud Shell:
gcloud projects add-iam-policy-binding <<YOUR_PROJECT_ID>> \
--member=serviceAccount:service-<<PROJECT_NUMBER>>@gcp-sa-healthcare.iam.gserviceaccount.com --role=roles/bigquery.admin
Uwaga: identyfikator projektu i numer projektu znajdziesz w konsoli. Informacje o identyfikacji znajdziesz w dokumentacji.
Tworzenie zbioru danych Healthcare
Aby utworzyć zbiór danych Healthcare, uruchom w Cloud Shell to polecenie:
gcloud beta healthcare datasets create <<DATASET_ID>> --location=us-central1
Ustaw lokalizację na region.
Tworzenie magazynu danych FHIR
Aby utworzyć magazyn danych FHIR, uruchom w Cloud Shell to polecenie:
gcloud beta healthcare fhir-stores create <<FHIR_STORE>> \
--dataset=<<DATASET_ID>> --location=us-central1 --version=r4
Ustaw lokalizację na region.
4. Konfiguracja i strumieniowe przesyłanie danych BigQuery
Obejmuje to zapisywanie danych z magazynu FHIR w zbiorze danych BigQuery, aby można było wykonywać na nich zapytania, programować je i analizować, wykorzystując możliwości BigQuery i BQML.
Tworzenie zbioru danych BigQuery
Zbiór danych BigQuery to zbiór tabel. Wszystkie tabele w zbiorze danych są przechowywane w tej samej lokalizacji danych location. Możesz też dołączyć niestandardowe ustawienia kontroli dostępu, aby ograniczyć dostęp do zbioru danych i jego tabel.
W Cloud Shell uruchom to polecenie:
bq mk --location=us-central1 --dataset <<PROJECT_ID>>:<<BQ_DATASET>>
Ustaw lokalizację na region.
Tworzenie strumienia BigQuery
Strumieniowe przesyłanie danych jest wymagane, aby eksportować zmiany zasobów do BigQuery za każdym razem, gdy zasób FHIR zostanie utworzony, zaktualizowany, zmodyfikowany lub usunięty w bazie FHIR. Każda baza może mieć maksymalnie 10 konfiguracji strumieniowego przesyłania danych.
- Otwórz konsolę Google Cloud Healthcare.
- Kliknij nowo utworzony ZBIÓR DANYCH.
- Kliknij nowo utworzony MAGAZYN DANYCH

- Kliknij DODAJ NOWĄ KONFIGURACJĘ STRUMIENIOWEGO PRZESYŁANIA DANYCH.

- Na liście wybierz nowo utworzony zbiór danych BigQuery, jako typ schematu wybierz „Analytics V2”, a jako typ zasobu „Pacjent” (możesz wybrać dowolną liczbę typów zasobów) i kliknij Gotowe.

To wszystko. Możesz już zapisywać dane z magazynu FHIR i przesyłać je strumieniowo do BigQuery.
5. Cloud Functions (zapisywanie danych R4 w magazynie danych FHIR za pomocą Healthcare API)
Cloud Functions umożliwia wygodne pisanie kodu i wdrażanie go w chmurze w sposób bezserwerowy. Jest skalowalna, płatność według wykorzystania, oparta na zdarzeniach i otwarta pod względem technologii i obsługi języków. Więcej funkcji znajdziesz w dokumentacji.
Funkcja, którą napiszemy, ma na celu uwierzytelnianie i zapisywanie danych w formacie FHIR R4 w magazynie danych FHIR za pomocą Cloud Healthcare API. Aby utworzyć funkcję w Cloud Functions:
- Otwórz Cloud Functions i kliknij UTWÓRZ FUNKCJĘ.
- Ustaw nazwę na fhir-datastore-proxy, region na us-central1, a opcję uwierzytelniania na „Wymagaj uwierzytelniania”.
- Rozwiń ustawienia środowiska wykonawczego, kompilacji, połączeń i zabezpieczeń. Dodasz 5 zmiennych środowiska wykonawczego:
Nazwa: CLOUD_FUNCTIONS_ENDPOINT | Wartość: adres URL punktu końcowego funkcji. Zobaczysz go w bloku Uwierzytelnianie powyżej. Będzie miał postać: https://us-central1-PROJECT_ID.cloudfunctions.net/fhir-datastore-proxy
Nazwa: PROJECT_ID | Wartość: identyfikator projektu
Nazwa: DATASET_LOCATION | Wartość: lokalizacja magazynu danych FHIR
Nazwa: DATASET_ID | Wartość: identyfikator magazynu danych Healthcare
Nazwa: FHIR_STORE_ID | Wartość: identyfikator magazynu FHIR
- Naciśnij Dalej, aby przejść do następnej strony, na której dodamy kod.
- Powinien się teraz wyświetlić edytor wbudowany. Wybierz język Java 17 i otwórz klasę HelloHttpFunction.java. Zmień jej nazwę na FhirDatastoreProxy.java. Nie zapomnij też zmienić nazwy punktu wejścia na gcfv2.FhirDatastoreProxy.
- Skopiuj kod z repozytorium i wklej go w edytorze wbudowanym.
- Otwórz plik pom.xml i skopiuj plik pom z repozytorium do edytora wbudowanego.
- Kliknij WDRÓŻ, a funkcja zostanie utworzona i wkrótce uruchomiona.
Uwaga:
- Cloud Healthcare API używany w tej funkcji korzysta z domyślnych danych logowania aplikacji do uwierzytelniania żądań przychodzących do Healthcare API.
- Zapisz adres URL wdrożonej funkcji, aby móc ją wywoływać z aplikacji na Androida. Do tej pory utworzyliśmy wszystkie elementy wymagane do tego, aby aplikacja na Androida mogła niezależnie zapisywać dane FHIR w BigQuery za pomocą Healthcare API. Teraz upewnijmy się, że wszystkie elementy są połączone, a interfejs API jest wywoływany po przesłaniu kwestionariusza.
6. Konfiguracja projektu na Androida i Firebase
Będziemy używać najnowszej wersji Android Studio i skonfigurowanego emulatora Androida (możesz też użyć fizycznego urządzenia z Androidem). Gdy to zrobisz, wykonaj te czynności:
- Sklonuj repozytorium z przykładami aplikacji FHIR: https://github.com/google/fhir-app-examples.
- Otwórz Android Studio, wybierz Import Project (Gradle, Eclipse ADT, etc.) (Importuj projekt (Gradle, Eclipse ADT itp.)) i wybierz folder cloudfunction/ z pobranego wcześniej kodu źródłowego. Otwórz app/google-services.json. Jest pusty i trzeba go wypełnić.
Wygeneruj klucz SHA-1 za pomocą polecenia ./gradlew signingReport i zanotuj pole SHA1 w wariancie debug.
Dodaj aplikację do Firebase za pomocą konsoli Firebase (wykonaj kroki 1 i 2). W polu „Debug signing certificate SHA-1” (Odcisk cyfrowy SHA-1 certyfikatu podpisywania debugowania) wpisz wartość z poprzedniego kroku.
Pobierz plik google-services.json i zastąp jego zawartością pusty plik w folderze app.
Pakiet SDK Firebase został już dodany w plikach Gradle kompilacji.
- Otwórz plik FhirApplication.kt i ustaw pole baseUrl na adres URL funkcji w Cloud Functions.
- Na pasku narzędzi Android Studio wybierz „Sync your project with Gradle files” (Zsynchronizuj projekt z plikami Gradle).
Ukończyliśmy już część implementacji dotyczącą konfiguracji i dodawania zależności.
7. Konfiguracja kwestionariusza i odpowiedzi
Mamy już skonfigurowany kwestionariusz w repozytorium. Przyjrzyjmy się jednak kodowi:
- Sprawdź, czy FragmentContainerView znajduje się w ConstraintLayout w pliku app/src/main/res/layout/activity_main.xml.
- Sprawdź, czy QuestionnaireFragment zawiera kwestionariusz FHIR zakodowany w formacie JSON, aby renderować fragment.
W tym przypadku użyjemy pliku json – „new-patient-registration-paginated.json” – do renderowania fragmentu. Sprawdź pliki MainActivity.kt, AddPatientFragment.kt i AddPatientViewModel.kt.
Po sprawdzeniu fragmentu, pliku JSON i modelu uruchom aplikację i spróbuj wpisać odpowiedzi w polach kwestionariusza.
Zauważysz sprawdzanie poprawności pól tekstowych, dat, pól numerycznych i innych warunków.
Możesz uruchomić aplikację i sprawdzić log, aby zobaczyć utworzony rekord.

Więcej informacji o korzystaniu z fragmentów znajdziesz tutaj. To już prawie wszystko, jeśli chodzi o konfigurację fragmentu kwestionariusza i odpowiedzi.
8. Wyświetlanie wyników w FHIRStore i zbiorze danych BigQuery
Po zakończeniu konfiguracji i aktualizacji kliknij „Sync Project with Gradle Files” (Zsynchronizuj projekt z plikami Gradle). Gdy to zrobisz:
- Uruchom aplikację w emulatorze Androida i zobacz, jak wczytuje się kwestionariusz.
- Odpowiedz na pytania i kliknij Prześlij u góry.
- W aplikacji powinien się wyświetlić komunikat „Patient is saved” (Pacjent został zapisany).
Wyświetlanie wyników w FHIR Store
Otwórz konsolę Google Cloud Healthcare FHIRViewer.

Wybierz bazę FHIR, zapytanie i kliknij URUCHOM WYSZUKIWANIE. Wyniki wyszukiwania powinny się wyświetlić poniżej. 
Wyświetlanie wyników w zbiorze danych BigQuery
Otwórz konsolę Google Cloud BigQuery console i w panelu Eksplorator otwórz zbiór danych utworzony na potrzeby tego projektu.

Kliknij Podgląd. W zbiorze danych BigQuery powinna się wyświetlić ta sama liczba i te same dane, które zostały znalezione w Healthcare FHIR Store.

Możesz teraz wykonywać w BigQuery zapytania SQL, analizy i uczenie maszynowe na danych FHIR zapisanych w zbiorze danych w chmurze.
9. Wyszukiwanie i funkcje offline
Aby zapewnić funkcje offline w aplikacji FHIR SDK na Androida opartej na OHS, postępuj zgodnie z wytycznymi dotyczącymi projektowania, które trzeba włączyć w implementacji omówionej w tym dokumencie.
Zasoby FHIR można wyszukiwać na 2 sposoby:
- FHIR Viewer w konsoli Google Cloud.
- Metoda wyszukiwania FHIR za pomocą żądań GET lub POST.
10. Prezentacja aplikacji
Aplikacja jest już gotowa. Możemy więc ją przetestować i zobaczyć wyniki w chmurze.
11. Zwalnianie miejsca
Aby uniknąć obciążenia konta Google Cloud opłatami za zasoby zużyte w tym poście, wykonaj te czynności:
- W konsoli Google Cloud otwórz stronę Zarządzanie zasobami.
- Z listy projektów wybierz projekt do usunięcia, a potem kliknij Usuń.
- W oknie wpisz identyfikator projektu i kliknij Wyłącz, aby usunąć projekt.
12. Gratulacje
Gratulacje! W tym projekcie udało nam się utworzyć aplikację na Androida, która umożliwia przechowywanie danych pacjentów FHIR i wysyłanie do nich zapytań w chmurze Healthcare FHIR Store i zbiorze danych BigQuery za pomocą Cloud Healthcare API. Wykonaliśmy tylko 7 kroków:
- Konfiguracja aplikacji na Androida.
- Konfigurowanie Google Cloud Healthcare API.
- Utworzenie zbioru danych Healthcare i magazynu danych FHIR.
- Utworzenie zbioru danych BigQuery.
- Skonfigurowanie strumienia BigQuery do zapisywania danych z magazynu danych FHIR w zbiorze danych BigQuery.
- Wdrożenie funkcji w Cloud Functions do zapisywania danych R4 w magazynie danych FHIR.
- Wywoływanie funkcji w Cloud Functions z aplikacji na Androida po przesłaniu odpowiedzi na kwestionariusz.
Teraz, gdy znasz już te kroki, możesz je wypróbować, aby zsynchronizować edycję danych pacjentów FHIR z chmurą.