İlaçTarif masaüstü uygulamasına eklenecek İlaç Etkileşimi modülünün teknik tasarımı. Bu modül, bir reçetedeki birden fazla ilacın etken maddelerini analiz ederek olası etkileşimleri tespit edecek ve eczacıyı uyaracaktır.
Bu modül henüz geliştirilmemiştir. Aşağıdaki tasarım, mevcut İlaçTarif mimarisine (Prism modüler MVVM) uyumlu şekilde hazırlanmıştır.
Bir reçetede birden fazla ilaç bulunduğunda, bu ilaçların etken maddeleri birbirleriyle etkileşime girebilir. Etkileşim türleri:
- Kontrendikasyon — İlaçlar birlikte kullanılmamalı (ciddi risk)
- Majör Etkileşim — Yakın takip gerektirir, alternatif düşünülmeli
- Minör Etkileşim — Bilgilendirme amaçlı, genelde sorun oluşturmaz
- Sinerjik Etki — İlaçlar birbirinin etkisini artırabilir
Eczacının bu etkileşimleri reçete hazırlanırken görmesi, hasta güvenliği açısından kritiktir.
sequenceDiagram
participant E as 💊 İlaçTarif (Masaüstü)
participant S as 🌐 Mercury API
Note over E: Reçete taranır / barkodlar okunur
E->>E: Reçetedeki tüm barkodları topla
E->>S: POST /api/v1/drug-interaction/check
S->>S: Barkodlardan etken maddeleri çöz
S->>S: Etken madde çiftlerini etkileşim veritabanında ara
S->>E: Etkileşim sonuçları (varsa)
alt Etkileşim bulundu
E->>E: Uyarı panelini göster
E->>E: Ciddiyet seviyesine göre renklendir
else Etkileşim yok
E->>E: Panel gizli kalır
end
graph TD
BC["🔍 BarcodeCapturerModule<br/>(Barkod taranır)"] --> RX["📋 PrescriptionModule<br/>(Reçete oluşturulur)"]
BC --> CS["🛒 CrossSaleModule<br/>(Çapraz satış önerileri)"]
BC --> DI["⚠️ DrugInteractionModule<br/>(İlaç etkileşimi kontrolü)"]
RX -.->|"Prism Event"| DI
DI -.->|"Uyarı göster"| RX
style DI fill:#e74c3c,stroke:#333,color:#fff
style BC fill:#3498db,stroke:#333,color:#fff
style RX fill:#27ae60,stroke:#333,color:#fff
style CS fill:#f5a623,stroke:#333,color:#000
Modül, mevcut CrossSaleModule ile aynı tetikleme mekanizmasını kullanacaktır: barkod tarandığında Prism EventAggregator üzerinden event yayınlanacak, DrugInteractionModule bu event'i dinleyerek API'ye istek atacaktır.
CrossSaleModule referans alınarak aşağıdaki yapı oluşturulacaktır:
Modules.DrugInteractionModule/
├── DrugInteractionModule.cs # Prism modül bootstrap
├── Events/
│ └── DrugInteractionEvents.cs # Modül event tanımları
├── Models/
│ ├── InteractionResult.cs # Etkileşim sonuç modeli
│ ├── InteractionSeverity.cs # Ciddiyet seviyesi enum
│ └── ActiveIngredientPair.cs # Etken madde çifti
├── Requests/
│ ├── DrugInteractionRequest.cs # API istek sınıfı
│ └── Models/
│ ├── InteractionCheckRequest.cs # İstek DTO
│ └── InteractionCheckResponse.cs # Yanıt DTO
├── ViewModels/
│ └── DrugInteractionViewModel.cs # Ana ViewModel
├── Views/
│ ├── DrugInteractionPanelView.xaml # Uyarı paneli
│ └── DrugInteractionPanelView.xaml.cs
└── Dictionaries/
└── DrugInteractionStyles.xaml # Stil tanımları
| Metod | Endpoint | Açıklama |
|---|---|---|
| POST | /api/v1/drug-interaction/check |
Barkod listesinden etkileşim kontrolü yapılacak |
| GET | /api/v1/drug-interaction/details/{interactionId} |
Belirli etkileşimin detaylı açıklaması getirilecek |
| GET | /api/v1/drug-interaction/ingredient/{barcode} |
Tek ilacın etken madde bilgisi sorgulanacak |
İstek:
{
"pharmacistId": "string",
"barcodes": ["8699536090273", "8699514090120", "8680742080156"]
}Yanıt:
{
"hasInteractions": true,
"interactions": [
{
"id": "uuid",
"severity": "major",
"drug1": {
"barcode": "8699536090273",
"name": "Aspirin 100mg",
"activeIngredient": "Asetilsalisilik Asit"
},
"drug2": {
"barcode": "8699514090120",
"name": "Coumadin 5mg",
"activeIngredient": "Varfarin Sodyum"
},
"summary": "Kanama riski artabilir. Birlikte kullanımda INR takibi gereklidir.",
"recommendation": "Doktor bilgilendirilmeli, alternatif analjezik düşünülmelidir."
}
],
"checkedAt": "2026-02-12T15:30:00Z"
}Yanıt:
{
"id": "uuid",
"severity": "major",
"drug1ActiveIngredient": "Asetilsalisilik Asit",
"drug2ActiveIngredient": "Varfarin Sodyum",
"mechanism": "Her iki ilaç da antitrombosit/antikoagülan etki gösterir. Birlikte kullanım kanama riskini sinerjik olarak artırır.",
"clinicalEffect": "Gastrointestinal kanama, intrakraniyal kanama riski artışı",
"management": "Birlikte kullanım zorunluysa INR düzeyleri sık takip edilmeli. Mümkünse Parasetamol gibi alternatif analjezik tercih edilmelidir.",
"references": [
"TÜFAM İlaç Etkileşim Veritabanı",
"Stockley's Drug Interactions"
]
}graph LR
C["🔴 Kontrendike<br/>Birlikte kullanılmamalı"] --> M["🟠 Majör<br/>Yakın takip gerekli"]
M --> MI["🟡 Minör<br/>Bilgilendirme"]
MI --> S["🟢 Sinerjik<br/>Etki artışı olabilir"]
style C fill:#c0392b,stroke:#333,color:#fff
style M fill:#e67e22,stroke:#333,color:#fff
style MI fill:#f1c40f,stroke:#333,color:#000
style S fill:#27ae60,stroke:#333,color:#fff
InteractionSeverity (enum) {
Contraindicated, // Kontrendike — birlikte kullanılmamalı
Major, // Majör — yakın takip gerektirir
Minor, // Minör — bilgilendirme amaçlı
Synergistic // Sinerjik — etki artışı olabilir
}
InteractionCheckRequest {
PharmacistId: string // Eczacı kimliği
Barcodes: List<string> // Reçetedeki ilaç barkodları
}
DrugInfo {
Barcode: string // İlaç barkodu
Name: string // İlaç adı
ActiveIngredient: string // Etken madde
}
InteractionResult {
Id: UUID // Etkileşim kaydı
Severity: InteractionSeverity
Drug1: DrugInfo
Drug2: DrugInfo
Summary: string // Kısa açıklama
Recommendation: string // Eczacıya öneri
}
InteractionCheckResponse {
HasInteractions: boolean
Interactions: List<InteractionResult>
CheckedAt: DateTime
}
InteractionDetail {
Id: UUID
Severity: InteractionSeverity
Drug1ActiveIngredient: string
Drug2ActiveIngredient: string
Mechanism: string // Etkileşim mekanizması
ClinicalEffect: string // Klinik etki
Management: string // Yönetim önerisi
References: List<string> // Kaynak referansları
}
CrossSaleEvents yapısı referans alınacaktır:
DrugInteractionEvents {
// Barkod tarandığında tetiklenecek (List<string> barcodes)
DrugInteractionCheckEvent : PubSubEvent<List<string>>
// Etkileşim bulunduğunda paneli gösterecek
DrugInteractionShowEvent : PubSubEvent<InteractionCheckResponse>
// Panel gizlenecek
DrugInteractionHideEvent : PubSubEvent
// Detay görüntülenecek
DrugInteractionDetailEvent : PubSubEvent<InteractionResult>
}
sequenceDiagram
participant App as App.xaml.cs
participant Mod as DrugInteractionModule
participant DI as DryIoc Container
participant RM as RegionManager
App->>DI: ConfigureModuleCatalog
App->>Mod: RegisterTypes(registry)
Mod->>DI: Register<DrugInteractionRequest>
Mod->>DI: Register<DrugInteractionViewModel>
App->>Mod: OnInitialized(container)
Mod->>RM: RegisterViewWithRegion("DrugInteractionRegion", DrugInteractionPanelView)
App.xaml.cs içinde mevcut modül listesine eklenecektir:
catalog.AddModule<PrescriptionModule>();
catalog.AddModule<CrossSaleModule>();
catalog.AddModule<DrugInteractionModule>(); ← Yeni
RegionNames.cs dosyasına yeni bölge eklenecektir:
public static string DrugInteractionRegion => "DrugInteractionRegion";
Etkileşim uyarı paneli, reçete ekranının yanında (CrossSale paneline benzer konumda) görüntülenecektir.
graph TD
subgraph İlaçTarif Ana Ekran
subgraph Sol Panel
RX["📋 Reçete Listesi<br/>(PrescriptionRegion)"]
end
subgraph Sağ Panel
CS["🛒 Çapraz Satış<br/>(CrossSaleRegion)"]
DI["⚠️ İlaç Etkileşimi<br/>(DrugInteractionRegion)"]
end
end
style DI fill:#e74c3c,stroke:#333,color:#fff
style RX fill:#27ae60,stroke:#333,color:#fff
style CS fill:#f5a623,stroke:#333,color:#000
Her etkileşim için bir kart gösterilecektir:
graph TD
subgraph Etkileşim Kartı
H["🔴 MAJÖR ETKİLEŞİM"]
D1["💊 Aspirin 100mg<br/>Etken Madde: Asetilsalisilik Asit"]
ARROW["⚡ etkileşim ⚡"]
D2["💊 Coumadin 5mg<br/>Etken Madde: Varfarin Sodyum"]
MSG["⚠️ Kanama riski artabilir.<br/>INR takibi gereklidir."]
BTN["📖 Detayları Gör"]
end
H --> D1
D1 --> ARROW
ARROW --> D2
D2 --> MSG
MSG --> BTN
style H fill:#c0392b,stroke:#333,color:#fff
style MSG fill:#fff3cd,stroke:#333,color:#000
| Seviye | Arka Plan | Kenarlık | İkon |
|---|---|---|---|
| Kontrendike | #FADBD8 (açık kırmızı) |
#C0392B (koyu kırmızı) |
🔴 |
| Majör | #FDEBD0 (açık turuncu) |
#E67E22 (turuncu) |
🟠 |
| Minör | #FEF9E7 (açık sarı) |
#F1C40F (sarı) |
🟡 |
| Sinerjik | #D5F5E3 (açık yeşil) |
#27AE60 (yeşil) |
🟢 |
flowchart TD
A["Barkod taranır"] --> B["BarcodeCapturerModule"]
B --> C["PrescriptionModule<br/>Reçeteye ilaç eklenir"]
B --> D["EventAggregator<br/>DrugInteractionCheckEvent yayınlanır"]
D --> E["DrugInteractionViewModel<br/>Event dinlenir"]
E --> F{Reçetede 2+ ilaç var mı?}
F -->|Hayır| G["Panel gizli kalır"]
F -->|Evet| H["POST /api/v1/drug-interaction/check"]
H --> I{Etkileşim var mı?}
I -->|Hayır| G
I -->|Evet| J["DrugInteractionShowEvent yayınlanır"]
J --> K["Panel gösterilir<br/>Ciddiyet sırasına göre kartlar listelenir"]
K --> L["Eczacı 'Detayları Gör' tıklar"]
L --> M["GET /api/v1/drug-interaction/details/{id}"]
M --> N["Detay dialogu açılır"]
style A fill:#3498db,stroke:#333,color:#fff
style K fill:#e74c3c,stroke:#333,color:#fff
style N fill:#8e44ad,stroke:#333,color:#fff
Aynı barkod kombinasyonu için tekrarlanan API çağrılarını önlemek amacıyla:
- Anahtar: Sıralanmış barkod listesinin hash'i
- Süre: Oturum boyunca (uygulama kapanana kadar)
- Temizleme: Yeni reçete açıldığında önbellek sıfırlanacak
erDiagram
DRUG ||--o{ DRUG_INGREDIENT : contains
INGREDIENT ||--o{ DRUG_INGREDIENT : "is in"
INGREDIENT ||--o{ INTERACTION : "interacts as drug1"
INGREDIENT ||--o{ INTERACTION : "interacts as drug2"
DRUG {
string barcode PK
string name
string manufacturer
}
INGREDIENT {
int id PK
string name
string atc_code
}
DRUG_INGREDIENT {
string drug_barcode FK
int ingredient_id FK
float dosage_mg
}
INTERACTION {
int id PK
int ingredient1_id FK
int ingredient2_id FK
string severity
string summary_tr
string mechanism_tr
string clinical_effect_tr
string management_tr
string references
datetime updated_at
}
flowchart TD
A["POST /api/v1/drug-interaction/check<br/>Barkod listesi alınır"] --> B["Her barkod için<br/>etken maddeleri çöz"]
B --> C["Tüm etken madde çiftlerini oluştur<br/>(n*(n-1)/2 kombinasyon)"]
C --> D["Her çift için<br/>INTERACTION tablosunu sorgula"]
D --> E{Eşleşme var mı?}
E -->|Evet| F["Etkileşimleri ciddiyet sırasına göre<br/>sırala ve döndür"]
E -->|Hayır| G["hasInteractions: false döndür"]
style A fill:#3498db,stroke:#333,color:#fff
style F fill:#e74c3c,stroke:#333,color:#fff
style G fill:#27ae60,stroke:#333,color:#fff
Etkileşim veritabanı aşağıdaki kaynaklardan beslenecektir:
- TÜFAM (Türkiye Farmakovijilans Merkezi) ilaç etkileşim verileri
- DrugBank açık veri seti
- Stockley's Drug Interactions referans verileri
- Eczacı geri bildirimleri ile sürekli güncelleme
gantt
title İlaç Etkileşimi Modülü Geliştirme Planı
dateFormat YYYY-MM-DD
section Sunucu
Veritabanı şeması ve seed verisi :s1, 2026-03-01, 5d
API endpoint'leri geliştirme :s2, after s1, 7d
Etkileşim veritabanı doldurma :s3, after s1, 14d
section İlaçTarif (Masaüstü)
Prism modül iskeleti oluşturma :d1, 2026-03-01, 3d
API istek sınıfları :d2, after s2, 3d
ViewModel ve event entegrasyonu :d3, after d2, 5d
UI panel ve kart tasarımı :d4, after d3, 5d
Önbellekleme mekanizması :d5, after d4, 2d
section Test
Birim testleri :t1, after d5, 5d
Entegrasyon testleri :t2, after t1, 3d
Eczacı kullanıcı testleri :t3, after t2, 5d
| Dosya | Açıklama |
|---|---|
Modules/Modules.DrugInteractionModule/ |
Tüm modül dizini |
Modules.DrugInteractionModule.csproj |
Proje dosyası |
| Dosya | Değişiklik |
|---|---|
App.xaml.cs |
catalog.AddModule<DrugInteractionModule>() eklenecek |
Common.StaticObjects/RegionNames.cs |
DrugInteractionRegion eklenecek |
Common.Infrastructure/AggregatorEvents/ |
DrugInteractionEvents.cs eklenecek |
MedicineFullSystem.sln |
Yeni proje referansı eklenecek |
| Ana ekran XAML | DrugInteractionRegion ContentControl eklenecek |