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

1- قبل البدء

ما ستقوم بإنشائه

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

ما ستتعرَّف عليه

  • كيفية دمج مكتبة التقاط البيانات المنظَّمة في تطبيق Android
  • كيفية عرض استبيان
  • كيفية الحصول على إجابات بصفتك "QuestionnaireResponse"
  • كيفية استخراج موارد FHIR من QuestionnaireResponse

المتطلبات

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

2. الإعداد

تنزيل الرمز

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

يتوفّر مشروع المبتدئين لهذا الدرس التطبيقي حول الترميز في codelabs/datacapture.

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

لنبدأ باستيراد تطبيق المبتدئين إلى Android Studio.

افتح "استوديو Android" واختَر Import Project (Gradle أو Eclipse ADT, etc.) واختر المجلد codelabs/datacapture من رمز المصدر الذي سبق لك تنزيله.

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

تشغيل تطبيق إجراء التفعيل

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

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

تطبيق Hello World

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

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

إضافة التبعيات إلى "مكتبة التقاط البيانات المنظَّمة"

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

dependencies {
    // ...

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

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

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

اختَر مزامنة المشروع مع ملفات 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 > التنسيق > 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 إلى FragmentContainerView

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

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

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

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

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

if (savedInstanceState == null) {
  supportFragmentManager.commit {
    setReorderingAllowed(true)
    add(
      R.id.fragment_container_view,
      QuestionnaireFragment.builder().setQuestionnaire(questionnaireJsonString!!).build()
    )
  }
}

اطّلِع على مزيد من المعلومات حول كيفية استخدام الأجزاء.

لنشغِّل الدرس التطبيقي حول الترميز بالنقر على زر التشغيل (زر التشغيل) في شريط أدوات "استوديو 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(). يؤدي ذلك إلى عرض رمز HAPI FHIR QuestionnaireResponse الذي يمكنك استخدامه مباشرةً أو مع أجزاء أخرى من حزمة Android FHIR SDK. يستخدم هذا الدرس التطبيقي حول الترميز مكتبات 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 من "مكتبة التقاط البيانات المنظَّمة".

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

ابحث عن طريقة 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. تهانينا!

لقد استخدمت مكتبة التقاط البيانات المنظَّمة لمعالجة استبيانات وردود FHIR في تطبيقك:

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

هذا كل ما تحتاج إليه لبدء الإعداد.

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

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

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

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

  • استكشاف وثائق "مكتبة التقاط البيانات المنظَّمة"
  • تخصيص شكل ومضمون الاستبيانات المعروضة
  • تطبيق "مكتبة التقاط البيانات المنظَّمة" في تطبيق Android الخاص بك

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