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

1. قبل البدء

ما الذي ستقوم ببنائه

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

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

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

المتطلبات

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

2. الإعداد

تنزيل الرمز

لتنزيل الرمز الخاص بهذا الدرس التطبيقي حول الترميز، يُرجى استنساخ حزمة تطوير البرامج (SDK) الخاصة بإصدار Android FHIR: 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- إضافة مكتبة التقاط البيانات المنظَّمة إلى المشروع

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

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

dependencies {
    // ...

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

مزامنة مشروعك مع ملفات 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 > التنسيق > 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 الذي يمكنك استخدامه بشكل مباشر أو مع أجزاء أخرى من حزمة تطوير البرامج (SDK) لـ 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 من مكتبة التقاط البيانات المنظَّمة.

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

ابحث عن طريقة 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 التابعة لحزمة Android FHIR SDK للتعرّف على كيفية تخزين موارد FHIR وإدارتها محليًا في تطبيقك ومزامنة البيانات مع خادم FHIR بعيد.

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

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

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

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

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