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

7.6 KiB

Corrections Interface Web TIM - Affichage Patient et Mise en Page

Date: 2026-02-12

Problèmes Corrigés

1. En-tête Patient Vide

Symptôme: L'en-tête patient affichait "Non renseigné" pour toutes les informations (âge, sexe, dates).

Cause: Les informations patient (âge, sexe, date de naissance) n'étaient pas stockées dans la table StayDB lors du traitement du séjour.

Solution:

  • Ajouté une extraction automatique des informations patient depuis les documents dans l'endpoint /stays/{stay_id}/coding-proposal
  • Extraction par regex des patterns suivants:
    • Date de naissance: Né le DD/MM/YYYY ou Date de naissance: DD/MM/YYYY
    • Sexe: Monsieur → M, Madame → F, ou Sexe: Masculin/Féminin
  • Calcul automatique de l'âge à partir de la date de naissance et de la date d'admission

Résultat:

Age: 76 ans
Sex: M (Masculin)
Birth date: 1949-09-22
Admission: 2026-02-11
Discharge: 2026-02-11
Specialty: chirurgie

Fichier modifié: src/pipeline_mco_pmsi/api/tim_api.py

2. Mise en Page du Texte des Documents

Symptôme: Le texte des documents n'était pas bien cadré, difficile à lire avec une police monospace.

Cause: Le CSS utilisait font-family: 'Courier New', monospace sans padding ni bordure, rendant le texte difficile à lire.

Solution:

  • Changé la police pour 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif (plus lisible)
  • Ajouté un padding de 16px autour du texte
  • Ajouté un fond gris clair (#fafbfc) avec bordure
  • Ajouté word-wrap: break-word et overflow-wrap: break-word pour gérer les longs mots
  • Conservé white-space: pre-wrap pour respecter les sauts de ligne

Résultat: Le texte est maintenant bien cadré dans une boîte avec fond gris clair, plus facile à lire.

Fichier modifié: src/pipeline_mco_pmsi/api/static/css/documents.css

3. Optimisation de l'En-tête Patient

Symptôme: L'en-tête patient prenait trop de place verticalement.

Cause: Padding et marges trop importants, taille de police trop grande.

Solution:

  • Réduit le min-height de 80px à 60px
  • Réduit le padding de var(--spacing-lg) à var(--spacing-md) var(--spacing-lg)
  • Réduit la taille de police des labels (0.75em au lieu de 0.85em)
  • Réduit la taille de police des valeurs (0.95em au lieu de 1.05em)
  • Ajouté text-transform: uppercase et letter-spacing: 0.5px aux labels pour plus de clarté
  • Réduit les gaps entre les éléments

Résultat: L'en-tête est plus compact tout en restant lisible.

Fichier modifié: src/pipeline_mco_pmsi/api/static/css/main.css

Résultats Visuels

Avant

┌─────────────────────────────────────────────────────────────┐
│ Informations Patient                                        │
│ Identifiant: ••••6332    Âge: Non renseigné               │
│ Sexe: Non renseigné      IMC: Non renseigné               │
└─────────────────────────────────────────────────────────────┘

Après

┌─────────────────────────────────────────────────────────────┐
│ INFORMATIONS PATIENT                                        │
│ IDENTIFIANT: ••••6332    ÂGE: 76 ans                       │
│ SEXE: M                  IMC: Non renseigné                │
│                                                             │
│ INFORMATIONS SÉJOUR                                         │
│ ADMISSION: 11/02/2026    SORTIE: 11/02/2026               │
│ DURÉE: 0 jours          SPÉCIALITÉ: chirurgie             │
└─────────────────────────────────────────────────────────────┘

Code Ajouté

Extraction des Informations Patient (tim_api.py)

# Extraire les informations patient depuis les documents si non disponibles
age = stay.age
sex = stay.sex
birth_date = None

if not age or not sex:
    import re
    from datetime import datetime
    
    for doc in stay.documents:
        content = doc.content
        
        # Extraire la date de naissance
        if not birth_date:
            birth_match = re.search(r'(?:Né|Date de naissance).*?(\d{2})/(\d{2})/(\d{4})', content, re.IGNORECASE)
            if birth_match:
                day, month, year = birth_match.groups()
                birth_date = f"{year}-{month}-{day}"
                
                # Calculer l'âge
                if stay.admission_date:
                    birth_dt = datetime.strptime(birth_date, "%Y-%m-%d")
                    admission_dt = stay.admission_date
                    age = admission_dt.year - birth_dt.year
                    if (admission_dt.month, admission_dt.day) < (birth_dt.month, birth_dt.day):
                        age -= 1
        
        # Extraire le sexe
        if not sex:
            if re.search(r'\bMonsieur\b', content, re.IGNORECASE):
                sex = "M"
            elif re.search(r'\bMadame\b', content, re.IGNORECASE):
                sex = "F"
            elif re.search(r'Sexe\s*:\s*Masculin', content, re.IGNORECASE):
                sex = "M"
            elif re.search(r'Sexe\s*:\s*Féminin', content, re.IGNORECASE):
                sex = "F"

Nouveau CSS pour les Documents (documents.css)

.document-text {
    line-height: 1.8;
    white-space: pre-wrap;
    word-wrap: break-word;
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    font-size: 0.9em;
    color: var(--text-primary);
    max-width: 100%;
    overflow-wrap: break-word;
    padding: 16px;
    background: #fafbfc;
    border-radius: 6px;
    border: 1px solid #e1e4e8;
}

Test de Vérification

# Tester l'API
curl -s http://localhost:8001/stays/15_23096332/coding-proposal | python3 -c "
import sys, json
data = json.load(sys.stdin)
print(f'Age: {data.get(\"age\")} ans')
print(f'Sex: {data.get(\"sex\")}')
print(f'Birth date: {data.get(\"birth_date\")}')
print(f'Admission: {data.get(\"admission_date\")}')
print(f'Specialty: {data.get(\"specialty\")}')
"

# Résultat attendu:
# Age: 76 ans
# Sex: M
# Birth date: 1949-09-22
# Admission: 2026-02-11T23:09:28.661735
# Specialty: chirurgie

Prochaines Étapes

  1. Améliorer l'extraction des informations patient:

    • Extraire le poids et la taille si disponibles
    • Extraire les modes d'entrée et de sortie
    • Stocker ces informations dans la base lors du traitement initial
  2. Améliorer la mise en page des documents:

    • Ajouter la coloration syntaxique pour les sections importantes
    • Ajouter des boutons pour zoomer/dézoomer le texte
    • Améliorer la recherche dans les documents
  3. Optimiser les performances:

    • Mettre en cache les informations patient extraites
    • Éviter de re-parser les documents à chaque requête

Fichiers Modifiés

  • src/pipeline_mco_pmsi/api/tim_api.py - Extraction des infos patient
  • src/pipeline_mco_pmsi/api/static/css/main.css - Optimisation en-tête
  • src/pipeline_mco_pmsi/api/static/css/documents.css - Amélioration mise en page texte

Commandes Utiles

# Redémarrer le serveur
pkill -f "uvicorn pipeline_mco_pmsi.api.tim_api"
python -m uvicorn pipeline_mco_pmsi.api.tim_api:app --host 0.0.0.0 --port 8001

# Tester l'interface
firefox http://localhost:8001

# Voir les logs
tail -f api_server.log