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/YYYYouDate de naissance: DD/MM/YYYY - Sexe:
Monsieur→ M,Madame→ F, ouSexe: Masculin/Féminin
- Date de naissance:
- 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-wordetoverflow-wrap: break-wordpour gérer les longs mots - Conservé
white-space: pre-wrappour 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-heightde 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: uppercaseetletter-spacing: 0.5pxaux 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
-
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
-
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
-
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 patientsrc/pipeline_mco_pmsi/api/static/css/main.css- Optimisation en-têtesrc/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