Ресурс для записи факта что пациент принимал/принимает/планирует принимать препарат. Отличается от MedicationRequest (рецепт от врача) и MedicationAdministration (зафиксированный приём, обычно в стационаре). MedicationStatement — это утверждение о приёме, без необходимости документировать каждое введение.
Использование в BloodGPT
- Источник — narrative-to-FHIR pipeline. LLM extracted entities →
ExtractedMedicationSchema→buildMedicationStatement()вnarrative-to-fhir/fhir-builders/medication-statement.ts. - Данные у нас в основном patient-reported или из выписок («принимал ramipril 5mg в день»). MedicationStatement adequate для этого, MedicationRequest требует Practitioner reference которого у нас нет.
- Resource не emit’ит
category— gap для иконок Timeline.
Ключевые поля для нас
subject—Patient/{id}medicationCodeableConcept— препарат (CodeableConcept). RxNorm coder когда нашёл, иначе толькоtext.status— enum["active", "completed", "entered-in-error", "intended", "stopped", "on-hold", "unknown", "not-taken"]. У нас mapped из LLM enumMedicationStatusEnum["active", "stopped", "intended", "unknown"]черезtoFhirMedicationStatus().dosage[].text— concatenationdosage+frequency(«5mg per day»)reasonCode— почему принимает (если LLM extracted)dateAsserted— наш ingest timeeffectivePeriod/effectiveDateTime— необязательно. Можем выставитьeffectivePeriod.startесли LLM extractedstartDate(legacybuildMedicationStatementвlib/fhir/resource-builders.ts:51-73это делает; narrative builder вnarrative-to-fhir/— нет).category— НЕ выставляется (gap). Стандартные значения R4:inpatient/outpatient/community/patientspecified. Для нашего use case (со слов пациента или из выписки) подходитcommunity(дома) илиpatientspecified(со слов).informationSource— кто сообщил (Patient / Practitioner / RelatedPerson / Organization). У нас не выставляется. Отдельный axis source-attribution — см.[[../product/timeline-page-design]]обсуждение 5 осей.
Status mapping
LLM-схема даёт упрощённые 4 значения, мы маппим в R4 enum:
| LLM | FHIR R4 |
|---|---|
active | active |
stopped | stopped |
intended | intended |
unknown | unknown |
Мы не используем completed / entered-in-error / on-hold / not-taken — narrative обычно не даёт сигнала достаточного для этих более тонких различий.
Failure modes
- Нет
informationSource— теряем axis «откуда мы это знаем». При timeline’е system-axis это заметно:patientspecifiedбезinformationSource: Patient— semantically избыточно. Если добавимcategory, стоит добавить иinformationSource. - Singular
0..1category — нельзя отметить «outpatient+chronic» одновременно. Если хотим больше — расширяйcoding[]внутри одной CodeableConcept. - Нет
effective[X]в narrative builder — теряем когда пациент начал принимать.dateAsserted≠effectiveDateTime. На clinical timeline это означает что MedicationStatement плавает по нашему ingest date, не по реальному началу приёма.
Открытые вопросы
- Default
category—communityилиpatientspecified? Зависит от того, считаем ли мы narrative «patient said» или «document recorded». Скорее всего ответ:patientspecifiedдля self-reported разделов,communityдля extracted из выписок. - Добавлять ли
effectivePeriodиз LLM extractedstartDate(как в legacylib/fhir/resource-builders.ts)? - Добавлять ли
informationSourceдля tracking «со слов пациента» vs «из документа»?
Связанные решения
[[../domain/category-coverage]](TBD) — какие category набор пишем[[../domain/fhir-resource-origin-and-lifecycle]]— origin tag (user-uploaded vs ai-generated) ОРТОГОНАЛЕН information source
Связано
[[fhir-resource-categories]]— общая концепция (включая текущий gap)[[fhir-allergy-intolerance]]— соседний resource (drug allergies cross-reference)[[fhir-condition]]—reasonCodeв MedicationStatement может ссылаться на Condition
Источники
Сноски
-
HL7 R4 spec, accessed 2026-05-17, https://hl7.org/fhir/R4/medicationstatement.html. ↩
-
ValueSet
medication-statement-category, accessed 2026-05-17, https://hl7.org/fhir/R4/valueset-medication-statement-category.html. ↩ -
ValueSet
medication-statement-status, accessed 2026-05-17, https://hl7.org/fhir/R4/valueset-medication-statement-status.html. ↩