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

211 lines
7.6 KiB
Markdown

# 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)
```python
# 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)
```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
```bash
# 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
```bash
# 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
```