# 🌍 UnitĂ© de Temps Globale - SystĂšme UnifiĂ© ## 🎯 Changement Majeur L'unitĂ© de temps (ms/s) est maintenant **globale** et **synchronisĂ©e dans toute l'application**! ## ✅ Ce qui a Ă©tĂ© fait ### 1. **Store Zustand Global** Ajout de `timeUnit` dans le store principal: ```typescript // apps/web/src/store/simulationStore.ts export type TimeUnit = 'ms' | 's'; interface SimulationState { timeUnit: TimeUnit; // UnitĂ© globale pour toute l'UI setTimeUnit: (unit: TimeUnit) => void; // ... autres Ă©tats } ``` ### 2. **SĂ©lecteur Unique [ms] [s]** Le sĂ©lecteur en haut Ă  droite du panneau de paramĂštres contrĂŽle **TOUTE** l'application: ``` ┌──────────────────────────────────────┐ │ ParamĂštres du rĂ©seau [ms] s │ ← ContrĂŽle TOUT ├─────────────────────────────────────── │ λ: 6.0 req/s │ ← Suit le sĂ©lecteur │ Temps simulation: 100 s │ ← A son propre sĂ©lecteur │ ÎŒc: 0.010 s │ ← Suit le sĂ©lecteur │ ÎŒ1: 0.120 s │ ← Suit le sĂ©lecteur └──────────────────────────────────────┘ ``` ### 3. **Synchronisation Automatique** Quand vous changez [ms] ↔ [s], **TOUT** se met Ă  jour: - ✅ Champ λ (taux d'arrivĂ©e) - ✅ Champs ÎŒ (temps de service) - ✅ Labels et helper texts - ✅ UnitĂ©s affichĂ©es (req/ms ↔ req/s, ms ↔ s) ### 4. **Fonctions Utilitaires** Nouveau fichier `apps/web/src/utils/timeFormat.ts`: ```typescript // Convertir temps selon l'unitĂ© convertTime(timeInMs, unit) → nombre affichĂ© // Convertir taux selon l'unitĂ© convertRate(rateInReqPerMs, unit) → nombre affichĂ© // Formater avec l'unitĂ© formatTime(100, 's') → "0.100 s" formatRate(0.008, 's') → "8.0 req/s" ``` ## 🔄 Comment ça fonctionne ### Architecture ``` ┌─────────────────────────────────────┐ │ Store Zustand (Global) │ │ timeUnit: 'ms' | 's' │ └──────────────┬──────────────────────┘ │ ├─â–ș ParameterPanel (utilise timeUnit) ├─â–ș ResultsDisplay (utilise timeUnit) ├─â–ș MetricsCard (utilise timeUnit) └─â–ș Tous les composants... ``` ### Avant (❌ ProblĂšme) ``` ParameterPanel: [local state] timeUnit = 'ms' ResultsDisplay: Affiche toujours en ms MetricsCard: Affiche toujours en ms → IncohĂ©rent et confus! ``` ### Maintenant (✅ Solution) ``` Store Global: timeUnit = 's' ↓ ParameterPanel: Lit store → Affiche en 's' ResultsDisplay: Lit store → Affiche en 's' MetricsCard: Lit store → Affiche en 's' → CohĂ©rent partout! ``` ## 📊 Exemple Concret **Vous sĂ©lectionnez [s]:** ### Panneau de paramĂštres: ``` λ = 6.0 req/s (au lieu de 0.006 req/ms) ÎŒc = 0.010 s (au lieu de 10 ms) ÎŒ1 = 0.120 s (au lieu de 120 ms) ``` ### RĂ©sultats de simulation: ``` Temps moyen dans le systĂšme: 0.156 s (au lieu de 156 ms) Temps d'attente: 0.024 s (au lieu de 24 ms) Temps de service: 0.132 s (au lieu de 132 ms) ``` ### MĂ©triques analytiques: ``` W (temps moyen): 0.156 s (au lieu de 156 ms) Wq (attente): 0.024 s (au lieu de 24 ms) ``` **Tout est synchronisĂ©!** ## 🎯 Deux SĂ©lecteurs Distincts ### 1. SĂ©lecteur Principal [ms] [s] **ContrĂŽle:** λ, ÎŒ, et TOUS les affichages de temps/taux **Position:** Haut Ă  droite du panneau paramĂštres ### 2. SĂ©lecteur Temps Simulation (ms/s/min/h) **ContrĂŽle:** UNIQUEMENT le temps de simulation **Position:** À cĂŽtĂ© du champ "Temps de simulation" **IndĂ©pendant:** Ne change PAS l'unitĂ© globale ## 💡 Utilisation ### ScĂ©nario 1: Tout en secondes ``` 1. SĂ©lectionnez [s] en haut Ă  droite 2. Entrez λ = 6 (req/s) 3. Entrez ÎŒc = 0.010 (s) 4. Entrez ÎŒ1 = 0.120 (s) 5. Temps simulation: 100 (avec son propre sĂ©lecteur en 's') → Tout affichĂ© en secondes dans l'application ``` ### ScĂ©nario 2: Tout en millisecondes ``` 1. SĂ©lectionnez [ms] en haut Ă  droite 2. Entrez λ = 0.006 (req/ms) 3. Entrez ÎŒc = 10 (ms) 4. Entrez ÎŒ1 = 120 (ms) 5. Temps simulation: 100000 (avec son propre sĂ©lecteur en 'ms') → Tout affichĂ© en millisecondes dans l'application ``` ## 🔧 Pour les DĂ©veloppeurs ### Utiliser l'unitĂ© globale dans un composant ```typescript import { useSimulationStore } from '../../store/simulationStore'; import { formatTime, formatRate } from '../../utils/timeFormat'; function MyComponent() { const { timeUnit } = useSimulationStore(); // Afficher un temps (stockĂ© en ms) const timeInMs = 156; const displayTime = formatTime(timeInMs, timeUnit); // timeUnit='s' → "0.156 s" // timeUnit='ms' → "156 ms" // Afficher un taux (stockĂ© en req/ms) const rateInReqPerMs = 0.008; const displayRate = formatRate(rateInReqPerMs, timeUnit); // timeUnit='s' → "8.0 req/s" // timeUnit='ms' → "0.008 req/ms" return (

Temps: {displayTime}

Taux: {displayRate}

); } ``` ### Fonctions utilitaires disponibles ```typescript import { convertTime, // Convertir temps ms → unitĂ© display convertRate, // Convertir taux req/ms → unitĂ© display formatTime, // Format temps avec unitĂ© formatRate, // Format taux avec unitĂ© getTimeUnitLabel, // "millisecondes" ou "secondes" getRateUnitLabel, // "req/ms" ou "req/s" } from '../utils/timeFormat'; ``` ## ✅ Avantages 1. **CohĂ©rence**: Toute l'application utilise la mĂȘme unitĂ© 2. **SimplicitĂ©**: Un seul sĂ©lecteur pour tout contrĂŽler 3. **ClartĂ©**: Plus de confusion entre ms et s 4. **FlexibilitĂ©**: Changez d'unitĂ© instantanĂ©ment partout 5. **MaintenabilitĂ©**: Code centralisĂ© et rĂ©utilisable ## 🐛 Correction du Bug λ **ProblĂšme original:** - Vous saisissiez λ = 6 req/s - Le systĂšme affichait ~1784 requĂȘtes au lieu de ~600 - IncohĂ©rence entre saisie et stockage **Cause:** - Le champ λ Ă©tait "controlled" avec `.toFixed()` - ProblĂšme de synchronisation entre l'affichage et la valeur interne - Conversion incorrecte entre unitĂ©s **Solution appliquĂ©e:** ```typescript // Avant value={getDisplayedArrivalRate().toFixed(...)} // ❌ ProblĂšme // Maintenant const getDisplayedArrivalRate = (): string => { const displayValue = timeUnit === 's' ? config.arrival_rate * 1000 : config.arrival_rate; return displayValue.toFixed(timeUnit === 's' ? 1 : 3); }; value={getDisplayedArrivalRate()} // ✅ FixĂ© ``` ## 📝 Checklist de Migration Si vous ajoutez un nouveau composant affichant des temps/taux: - [ ] Importer `useSimulationStore` et rĂ©cupĂ©rer `timeUnit` - [ ] Utiliser `formatTime()` ou `formatRate()` pour afficher - [ ] NE PAS hardcoder "ms" ou "req/ms" dans le JSX - [ ] Tester avec [ms] ET [s] pour vĂ©rifier la synchronisation ## 🎓 Exemple Complet ```typescript import { useSimulationStore } from '../../store/simulationStore'; import { formatTime } from '../../utils/timeFormat'; export default function ServerMetrics({ serverId }) { const { timeUnit, simulationResults } = useSimulationStore(); const stats = simulationResults?.server_stats[serverId]; if (!stats) return null; return (

Serveur {serverId}

Temps moyen: {formatTime(stats.average_system_time, timeUnit)}

Attente: {formatTime(stats.average_wait_time, timeUnit)}

Service: {formatTime(stats.average_service_time, timeUnit)}

); } ``` **RĂ©sultat avec [s]:** ``` Temps moyen: 0.156 s Attente: 0.024 s Service: 0.132 s ``` **RĂ©sultat avec [ms]:** ``` Temps moyen: 156 ms Attente: 24 ms Service: 132 ms ``` --- **L'application est maintenant entiĂšrement cohĂ©rente avec une unitĂ© de temps globale!** 🎉