6.5 KiB
6.5 KiB
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 :
- Les données n'étaient pas correctement transmises depuis l'API
- Le modèle
StayDBne contenait pas tous les champs nécessaires - 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
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
# 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
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
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
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éjouradmission_date: Date d'admissiondischarge_date: Date de sortiespecialty: Spécialité médicaleage: Âge du patientsex: 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 patientheight: Taille du patientadmission.mode: Mode d'entréedischarge.mode: Mode de sortie
Pour ajouter ces données, il faudrait :
- Modifier le modèle
StayDBpour inclure ces champs - Mettre à jour le pipeline de traitement pour extraire ces informations
- Modifier l'API pour transmettre ces données
Test de l'interface
Créer un séjour de test
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
cd src
uvicorn pipeline_mco_pmsi.api.tim_api:app --reload --host 0.0.0.0 --port 8000
Accéder à l'interface
- Ouvrir http://localhost:8000 dans un navigateur
- Entrer l'identifiant du séjour :
TEST001 - 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
- Charger les documents du séjour depuis la base de données
- Afficher les faits cliniques dans le panneau de détails
- Implémenter la navigation entre codes, preuves et documents
- Tester avec des séjours réels du pipeline