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

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 :

  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

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é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

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

  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