Initial commit
This commit is contained in:
210
CORRECTIONS_INTERFACE_FINALE.md
Normal file
210
CORRECTIONS_INTERFACE_FINALE.md
Normal file
@@ -0,0 +1,210 @@
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user