211 lines
7.6 KiB
Markdown
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
|
|
```
|