'use client'; export const dynamic = 'force-dynamic'; import React, { useState, useEffect } from 'react'; import { Card } from 'primereact/card'; import { Button } from 'primereact/button'; import { Chart } from 'primereact/chart'; import { DataTable } from 'primereact/datatable'; import { Column } from 'primereact/column'; import { Tag } from 'primereact/tag'; import { Badge } from 'primereact/badge'; import { Toolbar } from 'primereact/toolbar'; import { Calendar } from 'primereact/calendar'; import { Dropdown } from 'primereact/dropdown'; import { ProgressBar } from 'primereact/progressbar'; import { useRouter } from 'next/navigation'; import { apiClient } from '../../../../services/api-client'; interface StatistiquesMaintenance { periode: { debut: string; fin: string; }; resume: { totalMaintenances: number; maintenancesTerminees: number; maintenancesEnCours: number; maintenancesPlanifiees: number; tauxReussite: number; coutTotal: number; dureeMovenneMaintenance: number; tempsMovenReponse: number; tempsMovenResolution: number; }; repartitionParType: Array<{ type: string; nombre: number; pourcentage: number; coutMoyen: number; }>; repartitionParPriorite: Array<{ priorite: string; nombre: number; pourcentage: number; tempsMovenResolution: number; }>; evolutionMensuelle: Array<{ mois: string; preventives: number; correctives: number; urgentes: number; cout: number; }>; performanceTechniciens: Array<{ technicienId: number; technicienNom: string; nombreMaintenances: number; tauxReussite: number; dureeMovenne: number; evaluationMoyenne: number; specialites: string[]; }>; materielsProblematiques: Array<{ materielId: number; materielNom: string; materielType: string; nombrePannes: number; coutMaintenance: number; tempsArret: number; dernierePanne: string; fiabilite: number; }>; indicateursPerformance: { mtbf: number; // Mean Time Between Failures mttr: number; // Mean Time To Repair disponibilite: number; fiabilite: number; maintenabilite: number; }; coutParCategorie: Array<{ categorie: string; cout: number; pourcentage: number; }>; tendances: { evolutionCouts: number; // pourcentage d'évolution evolutionNombreMaintenances: number; evolutionTempsReponse: number; evolutionDisponibilite: number; }; } const StatistiquesMaintenancePage = () => { const [statistiques, setStatistiques] = useState(null); const [loading, setLoading] = useState(true); const [dateDebut, setDateDebut] = useState(new Date(Date.now() - 6 * 30 * 24 * 60 * 60 * 1000)); // -6 mois const [dateFin, setDateFin] = useState(new Date()); const [filterType, setFilterType] = useState(null); const [chartOptions] = useState({ responsive: true, plugins: { legend: { position: 'top' as const, } }, scales: { y: { beginAtZero: true } } }); const router = useRouter(); const typeOptions = [ { label: 'Tous', value: null }, { label: 'Préventive', value: 'PREVENTIVE' }, { label: 'Corrective', value: 'CORRECTIVE' }, { label: 'Planifiée', value: 'PLANIFIEE' }, { label: 'Urgente', value: 'URGENTE' } ]; useEffect(() => { loadStatistiques(); }, [dateDebut, dateFin, filterType]); const loadStatistiques = async () => { try { setLoading(true); console.log('🔄 Chargement des statistiques maintenance...'); const params = new URLSearchParams(); params.append('dateDebut', dateDebut.toISOString().split('T')[0]); params.append('dateFin', dateFin.toISOString().split('T')[0]); if (filterType) params.append('type', filterType); const response = await apiClient.get(`/api/maintenances/statistiques?${params.toString()}`); console.log('✅ Statistiques chargées:', response.data); setStatistiques(response.data); } catch (error) { console.error('❌ Erreur lors du chargement des statistiques:', error); } finally { setLoading(false); } }; const getEvolutionChartData = () => { if (!statistiques?.evolutionMensuelle) return {}; return { labels: statistiques.evolutionMensuelle.map(e => e.mois), datasets: [ { label: 'Préventives', data: statistiques.evolutionMensuelle.map(e => e.preventives), borderColor: '#3b82f6', backgroundColor: 'rgba(59, 130, 246, 0.1)', tension: 0.4 }, { label: 'Correctives', data: statistiques.evolutionMensuelle.map(e => e.correctives), borderColor: '#f59e0b', backgroundColor: 'rgba(245, 158, 11, 0.1)', tension: 0.4 }, { label: 'Urgentes', data: statistiques.evolutionMensuelle.map(e => e.urgentes), borderColor: '#ef4444', backgroundColor: 'rgba(239, 68, 68, 0.1)', tension: 0.4 } ] }; }; const getRepartitionTypeChartData = () => { if (!statistiques?.repartitionParType) return {}; return { labels: statistiques.repartitionParType.map(r => r.type), datasets: [{ data: statistiques.repartitionParType.map(r => r.nombre), backgroundColor: [ '#3b82f6', '#f59e0b', '#10b981', '#ef4444' ] }] }; }; const getCoutChartData = () => { if (!statistiques?.coutParCategorie) return {}; return { labels: statistiques.coutParCategorie.map(c => c.categorie), datasets: [{ data: statistiques.coutParCategorie.map(c => c.cout), backgroundColor: [ '#8b5cf6', '#06b6d4', '#84cc16', '#f97316', '#ec4899' ] }] }; }; const performanceBodyTemplate = (rowData: any) => { return (
{rowData.tauxReussite}%
); }; const evaluationBodyTemplate = (rowData: any) => { return (
{rowData.evaluationMoyenne}/5
{[1, 2, 3, 4, 5].map((star) => ( ))}
); }; const fiabiliteBodyTemplate = (rowData: any) => { const couleur = rowData.fiabilite > 80 ? 'success' : rowData.fiabilite > 60 ? 'warning' : 'danger'; return (
{rowData.fiabilite}%
); }; const coutBodyTemplate = (rowData: any) => { return (
{rowData.coutMaintenance.toLocaleString('fr-FR')} € {rowData.nombrePannes} pannes
); }; const leftToolbarTemplate = () => { return (
); }; const rightToolbarTemplate = () => { return (
); }; if (loading) { return (
); } if (!statistiques) { return (

Aucune donnée disponible pour la période sélectionnée

); } return (
{/* Filtres */}
setDateDebut(e.value as Date)} showIcon dateFormat="dd/mm/yy" />
setDateFin(e.value as Date)} showIcon dateFormat="dd/mm/yy" />
setFilterType(e.value)} placeholder="Tous les types" />
{/* Métriques principales */}
{statistiques.resume.totalMaintenances}
Total maintenances
{statistiques.resume.tauxReussite}%
Taux de réussite
{statistiques.resume.coutTotal.toLocaleString('fr-FR')} €
Coût total
{statistiques.indicateursPerformance.disponibilite}%
Disponibilité
{/* Graphiques */}
{statistiques.indicateursPerformance.mtbf}h
MTBF
{statistiques.indicateursPerformance.mttr}h
MTTR
{statistiques.indicateursPerformance.fiabilite}%
Fiabilité
{statistiques.indicateursPerformance.maintenabilite}%
Maintenabilité
{/* Tableaux détaillés */}
{/* Tendances */}
0 ? 'text-red-600' : 'text-green-600'}`}> {statistiques.tendances.evolutionCouts > 0 ? '+' : ''}{statistiques.tendances.evolutionCouts}%
Évolution coûts
0 ? 'text-red-600' : 'text-green-600'}`}> {statistiques.tendances.evolutionNombreMaintenances > 0 ? '+' : ''}{statistiques.tendances.evolutionNombreMaintenances}%
Évolution nombre
0 ? 'text-red-600' : 'text-green-600'}`}> {statistiques.tendances.evolutionTempsReponse > 0 ? '+' : ''}{statistiques.tendances.evolutionTempsReponse}%
Temps réponse
0 ? 'text-green-600' : 'text-red-600'}`}> {statistiques.tendances.evolutionDisponibilite > 0 ? '+' : ''}{statistiques.tendances.evolutionDisponibilite}%
Disponibilité
); }; export default StatistiquesMaintenancePage;