Files
aivanov_CIM/INTERFACE_TIM_INTEGRATION.md
2026-03-05 01:20:14 +01:00

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