تسجيل البيانات الصحية ومعالجتها باستخدام "مكتبة تسجيل البيانات المنظَّمة"

‫1. قبل البدء

ما ستنشئه

في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية إنشاء تطبيق Android باستخدام "مكتبة التقاط البيانات المنظَّمة". سيستخدم تطبيقك مكتبة "التقاط البيانات المنظَّمة" لعرض استبيانات FHIR والردود عليها ومعالجتها.

أهداف الدورة التعليمية

  • كيفية دمج مكتبة Structured Data Capture Library في تطبيق Android
  • كيفية عرض استبيان
  • كيفية الحصول على إجابات بصفتك QuestionnaireResponse
  • كيفية استخراج موارد FHIR من QuestionnaireResponse

المتطلبات

يركّز هذا الدرس التطبيقي على مكتبة التقاط البيانات المنظَّمة. يتم تجاهل المفاهيم ومجموعات الرموز غير ذات الصلة، ويتم توفيرها لك لنسخها ولصقها ببساطة. إذا لم يسبق لك إنشاء تطبيقات Android، يمكنك البدء بإنشاء تطبيقك الأول.

‫2. طريقة الإعداد

تنزيل الرمز

لتنزيل الرمز البرمجي الخاص بهذا الدرس التطبيقي حول الترميز، استنسِخ مستودع Android FHIR SDK: git clone https://github.com/google/android-fhir.git

يقع مشروع البداية الخاص بهذا الدرس العملي حول الترميز في codelabs/datacapture.

استيراد التطبيق إلى استوديو Android

لنبدأ باستيراد تطبيق البداية إلى استوديو Android.

افتح "استوديو Android"، وانقر على استيراد مشروع (Gradle وEclipse ADT وما إلى ذلك)، ثم اختَر مجلد codelabs/datacapture من الرمز المصدري الذي نزّلته سابقًا.

شاشة بدء "استوديو Android"

تشغيل التطبيق النموذجي

بعد استيراد المشروع إلى "استوديو Android"، يمكنك تشغيل التطبيق للمرة الأولى.

وصِّل جهاز Android بجهازك المضيف عبر USB، أو ابدأ محاكي "استوديو Android"، ثم انقر على "تشغيل" (زر التشغيل) في شريط أدوات "استوديو Android".

تطبيق Hello World

كما ترى، لا يتضمّن هذا الملف الكثير من المعلومات بعد، لذا لنبدأ مباشرةً بعرض استبيان في تطبيقك.

3- إضافة مكتبة "أداة التقاط البيانات المنظَّمة" إلى المشروع

إضافة التبعيات الخاصة بمكتبة Structured Data Capture Library

تتيح لك برامج المكتبة الاعتمادية الخاصة بمكتبة Structured Data Capture Library دمج هذه المكتبة في تطبيقك. أضِف الأسطر التالية إلى نهاية ملف app/build.gradle.kts الخاص بمشروعك:

dependencies {
    // ...

    implementation("com.google.android.fhir:data-capture:1.2.0")
    implementation("androidx.fragment:fragment-ktx:1.6.0")
}

مزامنة مشروعك مع ملفات Gradle

للتأكّد من توفّر جميع التبعيات لتطبيقك، عليك مزامنة مشروعك مع ملفات Gradle في هذه المرحلة.

انقر على مزامنة المشروع مع ملفات Gradle (زرّ مزامنة Gradle) من شريط أدوات "استوديو Android". يمكنك أيضًا تشغيل التطبيق مرة أخرى للتأكّد من أنّ التبعيات تعمل بشكل صحيح.

4. عرض استبيان

في هذه الخطوة، ستضيف وظيفة إلى تطبيق البداية لعرض استبيان في FragmentContainerView.

أثناء ذلك، سيطلب منك "استوديو Android" إضافة عمليات الاستيراد اللازمة:

  • androidx.core.os.bundleOf
  • androidx.fragment.app.add
  • androidx.fragment.app.commit
  • android.util.Log
  • com.google.android.fhir.datacapture.QuestionnaireFragment

الخطوة 1: إضافة FragmentContainerView

أضِف FragmentContainerView إلى تخطيط التطبيق. هذا هو المكان الذي سيتم فيه عرض QuestionnaireFragment الذي ستنشئه لاحقًا.

  1. افتح activity_main.xml (res > layout > activity_main.xml).
  2. ابحث عن خيارات "الرمز" و"التقسيم" و"التصميم" في أعلى يسار "أداة تعديل التنسيق".
  3. انقر على "عرض الرمز". خيارات عرض التنسيق
  4. لست بحاجة إلى TextView، لذا احذفه. احرص على حذف كل شيء من <TextView إلى />.
  5. أضِف FragmentContainerView داخل ConstraintLayout. يجب أن يبدو ملف activity_main.xml مشابهًا لما يلي:
    <?xml version="1.0" encoding="utf-8" ?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
    >
    
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/fragment_container_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintTop_toTopOf="parent" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

الخطوة 2: ضبط QuestionnaireFragment

يتطلّب QuestionnaireFragment نموذج استبيان FHIR بترميز JSON لعرضه. بما أنّ الاستبيان صغير الحجم (<512 كيلوبايت)، ستدرجه كـ String في Bundle من الوسيطات التي سيتم استخدامها لإنشاء الجزء. يجب تقديم الاستبيانات الأكبر حجمًا على شكل URI لأسباب تتعلّق بالأداء.

يمكنك الاطّلاع على ملف questionnaire.json إذا أردت ذلك، ولكن إحدى مزايا "مكتبة التقاط البيانات المنظَّمة" هي أنّك لست بحاجة إلى معرفة بنية استبيان FHIR (أو أي شيء عن FHIR) لكي يتم عرضه. ستلقي نظرة فاحصة على هذا الملف لاحقًا في الدرس العملي.

أنشئ QuestionnaireFragment باستخدام أداة الإنشاء الخاصة به، واضبط الاستبيان باستخدام دالة الإعداد. لعرض QuestionnaireFragment داخل حاوية التنسيق، استخدِم FragmentManager لإنشاء FragmentTransaction.

افتح MainActivity.kt وأضِف الرمز التالي إلى فئة MainActivity:

// Step 2: Configure a QuestionnaireFragment
questionnaireJsonString = getStringFromAssets("questionnaire.json")

val questionnaireFragment =
  QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()

الخطوة 3: إضافة QuestionnaireFragment إلى FragmentContainerView

لعرض QuestionnaireFragment داخل حاوية التنسيق، استخدِم FragmentManager لإنشاء FragmentTransaction. يتولّى FragmentManager عملية إنشاء مثيل باستخدام questionnaireParams الذي تم إنشاؤه سابقًا.

أضِف الرمز التالي إلى الفئة MainActivity:

// Step 3: Add the QuestionnaireFragment to the FragmentContainerView
if (savedInstanceState == null) {
  supportFragmentManager.commit {
    setReorderingAllowed(true)
    add(R.id.fragment_container_view, questionnaireFragment)
  }
}
// Submit button callback
supportFragmentManager.setFragmentResultListener(
  QuestionnaireFragment.SUBMIT_REQUEST_KEY,
  this,
) { _, _ ->
  submitQuestionnaire()
}

مزيد من المعلومات حول كيفية استخدام الأجزاء

لنبدأ بتشغيل الدرس العملي من خلال النقر على "تشغيل" (زر التشغيل) في شريط أدوات "استوديو Android". من المفترض أن يظهر لك ما يلي:

عرض الاستبيان في المحاكي

تنقَّل في الاستبيان وحاوِل إدخال بعض الإجابات. يتم استخدام بعض أدوات الإجابة المختلفة، بما في ذلك القيم المنطقية والنصوص والتواريخ، والتي تم عرضها تلقائيًا استنادًا إلى النوع الأساسي في استبيان FHIR الأصلي.

من الناحية الفنية، هذا كل ما عليك فعله لعرض استبيان. تهانينا!

لن يكون الاستبيان مفيدًا جدًا إذا لم تتمكّن من الاطّلاع على الإجابات التي يدخلها المستخدمون. لننتقل إلى الخطوة التالية للحصول على ردّ على الاستبيان.

5. الحصول على ردّ على استبيان

في الخطوات السابقة، عرضت استبيان FHIR في تطبيقك.

في هذا القسم، ستحصل على الإجابات من الاستبيان كـ QuestionnaireResponse.

ابحث عن طريقة submitQuestionnaire() وأضِف الرمز التالي:

// Get a questionnaire response
val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container_view)
        as QuestionnaireFragment
val questionnaireResponse = fragment.getQuestionnaireResponse()

// Print the response to the log
val jsonParser = FhirContext.forCached(FhirVersionEnum.R4).newJsonParser()
val questionnaireResponseString =
    jsonParser.encodeResourceToString(questionnaireResponse)
Log.d("response", questionnaireResponseString)

للحصول على ردّ الاستبيان، عليك استرداد جزء الاستبيان الذي تم إنشاؤه سابقًا، ثم استخدام طريقة getQuestionnaireResponse(). يعرض هذا الرمز QuestionnaireResponse HAPI FHIR الذي يمكنك استخدامه مباشرةً أو مع أجزاء أخرى من حزمة تطوير البرامج لأجهزة Android لمعيار FHIR. يستخدم هذا الدرس التطبيقي حول الترميز مكتبات HAPI FHIR أخرى لتحويله إلى سلسلة JSON لعرضها في السجلّ.

أعِد تشغيل التطبيق لإنشائه من جديد باستخدام آخر التغييرات. بعد تشغيله، أدخِل بعض المعلومات في الاستبيان وانقر على إرسال. في السجلّ، من المفترض أن تظهر لك رسالة تحتوي على QuestionnaireResponse بتنسيق JSON.

D/response: {"resourceType":"QuestionnaireResponse","item":[{"linkId":"PR","text":"Patient information","item":[{"linkId":"PR-name","text":"Name","item":[{"linkId":"PR-name-given","text":"First Name","answer":[{"valueString":"Dani"}]},{"linkId":"PR-name-family","text":"Family Name","answer":[{"valueString":"Lee"}]}]},{"linkId":"PR-birthdate","text":"Date of Birth","answer":[{"valueDate":"1990-02-14"}]},{"linkId":"PR-id","text":"Identifying information","item":[{"linkId":"PR-name-id-url"},{"linkId":"PR-name-id","text":"Patient Id","answer":[{"valueString":"12345"}]}]}]}]}

6. استخراج مراجع FHIR من QuestionnaireResponse

الاستبيان المضمّن في المشروع المبدئي مخصّص لإجراء بسيط لتسجيل المرضى، لذا قد تحتاج في النهاية إلى استخدام ردود الاستبيان لإنشاء مورد "مريض" بتنسيق FHIR استنادًا إليها. تُعرف عملية التحويل هذه من ردّ على استبيان إلى موارد FHIR باسم استخراج البيانات. يمكننا إجراء ذلك باستخدام الفئة ResourceMapper في مكتبة Structured Data Capture Library.

لتنفيذ عملية استخراج البيانات، يجب إنشاء الاستبيان بحيث يتضمّن معلومات حول كيفية تنفيذ عملية استخراج البيانات. لحسن الحظ، تم إعداد نموذج الاستبيان مسبقًا من أجل الاستخراج المستند إلى التعريف.

ابحث عن طريقة submitQuestionnaire() وأضِف الرمز التالي:

lifecycleScope.launch {
  val questionnaire =
    jsonParser.parseResource(questionnaireJsonString) as Questionnaire
  val bundle = ResourceMapper.extract(questionnaire, questionnaireResponse)
  Log.d("extraction result", jsonParser.encodeResourceToString(bundle))
}

يتطلّب ResourceMapper.extract() استبيان HAPI FHIR، ويمكنك إنشاء هذا الاستبيان من خلال تحليل سلسلة JSON الخاصة بالاستبيان من الخطوة السابقة، بالإضافة إلى QuestionnaireResponse الذي حصلنا عليه سابقًا. تعرض هذه العملية حزمة معاملات HAPI FHIR تحتوي على مرجع واحد أو أكثر تم استخراجهما، وفي هذه الحالة مرجع واحد خاص بالمريض.

أعِد تشغيل التطبيق لإنشائه من جديد باستخدام آخر التغييرات. بعد تشغيلها، أدخِل بعض المعلومات وانقر على إرسال. في السجلّ، من المفترض أن تظهر الآن رسالة extraction result تحتوي على تمثيل JSON لحزمة FHIR المستخرَجة.

D/extraction result: {"resourceType":"Bundle","type":"transaction","entry":[{"resource":{"resourceType":"Patient","identifier":[{"value":"12345"}],"name":[{"family":"Lee","given":["Dani"]}],"birthDate":"1990-02-14"}}]}

7. تهانينا!

استخدام Structured Data Capture Library لمعالجة استبيانات FHIR وردودها في تطبيقك:

  • عرض استبيان
  • الحصول على ردّ على استبيان
  • استخراج مراجع FHIR من QuestionnaireResponse

هذا كل ما عليك فعله لتشغيلها.

أثناء المتابعة، قد تحتاج إلى استخدام موارد FHIR بطرق إضافية في تطبيقك. اطّلِع على مكتبة FHIR Engine في حزمة تطوير البرامج لأجهزة Android لمعيار FHIR للتعرّف على كيفية تخزين موارد FHIR وإدارتها محليًا في تطبيقك ومزامنة البيانات مع خادم FHIR بعيد.

المواضيع التي تناولناها

  • كيفية إضافة مكتبة "التقاط البيانات المنظَّمة" إلى تطبيق Android
  • كيفية استخدام QuestionnaireFragment وResourceMapper للعمل مع استبيانات FHIR

الخطوات التالية

  • الاطّلاع على مستندات Structured Data Capture Library
  • تخصيص شكل ومظهر الاستبيانات المعروضة
  • تطبيق Structured Data Capture Library في تطبيق Android الخاص بك

مزيد من المعلومات