240 lines
6.5 KiB
Markdown
240 lines
6.5 KiB
Markdown
# Intégration Interface TIM - Connexion Backend
|
|
|
|
## Résumé des modifications
|
|
|
|
L'interface TIM a été connectée au backend pour afficher les données réelles des patients et séjours.
|
|
|
|
## Problème résolu
|
|
|
|
L'interface affichait "Non renseigné" pour toutes les informations patient (âge, dates d'admission/sortie, sexe, spécialité) car :
|
|
1. Les données n'étaient pas correctement transmises depuis l'API
|
|
2. Le modèle `StayDB` ne contenait pas tous les champs nécessaires
|
|
3. La structure des données n'était pas correctement mappée
|
|
|
|
## Modifications apportées
|
|
|
|
### 1. API Backend (`src/pipeline_mco_pmsi/api/tim_api.py`)
|
|
|
|
#### Ajout du champ `age` dans la réponse
|
|
```python
|
|
class CodingProposalResponse(BaseModel):
|
|
stay_id: str
|
|
age: Optional[int] = None # Nouveau champ
|
|
patient_id: Optional[str] = None
|
|
admission_date: Optional[str] = None
|
|
discharge_date: Optional[str] = None
|
|
birth_date: Optional[str] = None
|
|
sex: Optional[str] = None
|
|
weight: Optional[float] = None
|
|
height: Optional[float] = None
|
|
specialty: Optional[str] = None
|
|
# ...
|
|
```
|
|
|
|
#### Calcul de la date de naissance à partir de l'âge
|
|
```python
|
|
# Calculer la date de naissance approximative à partir de l'âge si disponible
|
|
birth_date = None
|
|
if stay.age and stay.admission_date:
|
|
from dateutil.relativedelta import relativedelta
|
|
birth_date = (stay.admission_date - relativedelta(years=stay.age)).isoformat()
|
|
|
|
return CodingProposalResponse(
|
|
stay_id=stay_id,
|
|
age=stay.age, # Transmettre l'âge directement
|
|
patient_id=stay.stay_id,
|
|
admission_date=stay.admission_date.isoformat() if stay.admission_date else None,
|
|
discharge_date=stay.discharge_date.isoformat() if stay.discharge_date else None,
|
|
birth_date=birth_date, # Date de naissance calculée
|
|
sex=stay.sex,
|
|
specialty=stay.specialty,
|
|
# ...
|
|
)
|
|
```
|
|
|
|
### 2. Frontend - PatientHeader (`src/pipeline_mco_pmsi/api/static/js/components/patient-header.js`)
|
|
|
|
#### Utilisation de l'âge fourni par le serveur
|
|
```javascript
|
|
calculateAge(birthDate, ageFromServer = null) {
|
|
// Si l'âge est déjà fourni par le serveur, l'utiliser
|
|
if (ageFromServer !== null && ageFromServer !== undefined) {
|
|
return ageFromServer;
|
|
}
|
|
|
|
// Sinon, calculer depuis birthDate
|
|
if (!birthDate) {
|
|
return null;
|
|
}
|
|
// ...
|
|
}
|
|
```
|
|
|
|
#### Rendu avec l'âge du séjour
|
|
```javascript
|
|
render(stay) {
|
|
const patient = stay.patient || {};
|
|
const admission = stay.admission || {};
|
|
const discharge = stay.discharge || {};
|
|
|
|
// Utiliser l'âge du séjour s'il est disponible
|
|
const age = stay.age || this.calculateAge(patient.birthDate, stay.age);
|
|
const bmi = this.calculateBMI(patient.weight, patient.height);
|
|
const duration = this.calculateStayDuration(admission.date, discharge.date);
|
|
// ...
|
|
}
|
|
```
|
|
|
|
### 3. Frontend - index.html
|
|
|
|
#### Transmission de l'âge dans l'objet stay
|
|
```javascript
|
|
const stay = {
|
|
stay_id: data.stay_id,
|
|
age: data.age, // Ajouter l'âge directement depuis l'API
|
|
patient: {
|
|
id: data.patient_id || data.stay_id,
|
|
birthDate: data.birth_date,
|
|
sex: data.sex,
|
|
weight: data.weight,
|
|
height: data.height
|
|
},
|
|
admission: {
|
|
date: data.admission_date,
|
|
mode: null,
|
|
specialty: data.specialty
|
|
},
|
|
discharge: {
|
|
date: data.discharge_date,
|
|
mode: null
|
|
},
|
|
codes: []
|
|
};
|
|
```
|
|
|
|
## Données disponibles dans StayDB
|
|
|
|
Le modèle `StayDB` contient les champs suivants :
|
|
- `stay_id`: Identifiant du séjour
|
|
- `admission_date`: Date d'admission
|
|
- `discharge_date`: Date de sortie
|
|
- `specialty`: Spécialité médicale
|
|
- `age`: Âge du patient
|
|
- `sex`: Sexe du patient (M/F)
|
|
- `unit`: Unité médicale (optionnel)
|
|
- `status`: Statut du séjour
|
|
|
|
## Données non disponibles
|
|
|
|
Les champs suivants ne sont pas stockés dans `StayDB` et s'affichent comme "Non renseigné" :
|
|
- `weight`: Poids du patient
|
|
- `height`: Taille du patient
|
|
- `admission.mode`: Mode d'entrée
|
|
- `discharge.mode`: Mode de sortie
|
|
|
|
Pour ajouter ces données, il faudrait :
|
|
1. Modifier le modèle `StayDB` pour inclure ces champs
|
|
2. Mettre à jour le pipeline de traitement pour extraire ces informations
|
|
3. Modifier l'API pour transmettre ces données
|
|
|
|
## Test de l'interface
|
|
|
|
### Créer un séjour de test
|
|
|
|
```python
|
|
from datetime import datetime
|
|
from pipeline_mco_pmsi.database.base import get_db
|
|
from pipeline_mco_pmsi.database.models import StayDB, ClinicalDocumentDB, CodeDB, EvidenceDB
|
|
|
|
db = next(get_db())
|
|
|
|
# Créer un séjour
|
|
stay = StayDB(
|
|
stay_id='TEST001',
|
|
admission_date=datetime(2024, 1, 15),
|
|
discharge_date=datetime(2024, 1, 20),
|
|
specialty='Chirurgie',
|
|
age=65,
|
|
sex='M',
|
|
status='proposed'
|
|
)
|
|
db.add(stay)
|
|
db.commit()
|
|
|
|
# Ajouter un document
|
|
doc = ClinicalDocumentDB(
|
|
document_id='DOC001',
|
|
stay_id=stay.id,
|
|
document_type='CR_HOSPI',
|
|
content='Patient de 65 ans admis pour appendicite aiguë.',
|
|
creation_date=datetime(2024, 1, 15),
|
|
author='Dr. Martin',
|
|
priority=1
|
|
)
|
|
db.add(doc)
|
|
db.commit()
|
|
|
|
# Ajouter un code avec preuve
|
|
dp = CodeDB(
|
|
stay_id=stay.id,
|
|
code='K35.8',
|
|
label='Appendicite aiguë',
|
|
type='dp',
|
|
confidence=0.95,
|
|
reasoning='Diagnostic principal',
|
|
referentiel_version='CIM-10 2024',
|
|
status='proposed',
|
|
model_name='llama3.2',
|
|
model_digest='abc123',
|
|
prompt_version='1.0'
|
|
)
|
|
db.add(dp)
|
|
db.commit()
|
|
|
|
# Ajouter une preuve
|
|
evidence = EvidenceDB(
|
|
code_id=dp.id,
|
|
document_id=doc.id,
|
|
span_start=0,
|
|
span_end=50,
|
|
text='Patient de 65 ans admis pour appendicite aiguë',
|
|
context='Patient de 65 ans admis pour appendicite aiguë.'
|
|
)
|
|
db.add(evidence)
|
|
db.commit()
|
|
```
|
|
|
|
### Démarrer le serveur
|
|
|
|
```bash
|
|
cd src
|
|
uvicorn pipeline_mco_pmsi.api.tim_api:app --reload --host 0.0.0.0 --port 8000
|
|
```
|
|
|
|
### Accéder à l'interface
|
|
|
|
1. Ouvrir http://localhost:8000 dans un navigateur
|
|
2. Entrer l'identifiant du séjour : `TEST001`
|
|
3. Cliquer sur "Charger le séjour"
|
|
|
|
### Résultat attendu
|
|
|
|
L'interface doit afficher :
|
|
- **Identifiant**: •••T001 (anonymisé)
|
|
- **Âge**: 65 ans
|
|
- **Sexe**: M
|
|
- **IMC**: Non renseigné (pas de poids/taille)
|
|
- **Admission**: 15/01/2024
|
|
- **Sortie**: 20/01/2024
|
|
- **Durée**: 5 jours
|
|
- **Spécialité**: Chirurgie
|
|
- **Mode d'entrée**: Non renseigné
|
|
- **Mode de sortie**: Non renseigné
|
|
|
|
## Prochaines étapes
|
|
|
|
1. Charger les documents du séjour depuis la base de données
|
|
2. Afficher les faits cliniques dans le panneau de détails
|
|
3. Implémenter la navigation entre codes, preuves et documents
|
|
4. Tester avec des séjours réels du pipeline
|