Initial commit
This commit is contained in:
239
INTERFACE_TIM_INTEGRATION.md
Normal file
239
INTERFACE_TIM_INTEGRATION.md
Normal file
@@ -0,0 +1,239 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user