'192.168.0.16', 'database' => 'lasucaai', 'username' => 'lasucaai', 'password' => 'is413#dfslw', ]; // ============================================================================ // Database Connection // ============================================================================ function getDashboardConnection($config) { $connectionOptions = [ "Database" => $config['database'], "Uid" => $config['username'], "PWD" => $config['password'], "TrustServerCertificate" => true, "Encrypt" => false, ]; $conn = sqlsrv_connect($config['server'], $connectionOptions); return $conn ?: null; } // ============================================================================ // Data Queries // ============================================================================ function getDashboardStats($conn) { $sql = "SELECT COUNT(DISTINCT r.ReportId) as TotalReports, COUNT(DISTINCT r.SourceFileName) as TotalFiles, COUNT(DISTINCT r.MillName) as TotalMills, COUNT(m.MetricId) as TotalMetrics, MIN(r.BeginningDate) as EarliestDate, MAX(r.EndingDate) as LatestDate FROM dbo.MillDataReports r LEFT JOIN dbo.MillDataMetrics m ON r.ReportId = m.ReportId"; $stmt = sqlsrv_query($conn, $sql); return sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC); } function getRecentReports($conn, $limit = 10) { $sql = "SELECT TOP(?) r.ReportId, r.SourceFileName, r.MillName, r.BeginningDate, r.EndingDate, r.CropDays, r.ProcessedAt FROM dbo.MillDataReports r ORDER BY r.ProcessedAt DESC"; $stmt = sqlsrv_query($conn, $sql, [$limit]); $reports = []; if ($stmt) { while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $reports[] = $row; } } return $reports; } function getKeyMetricTrends($conn) { // Get key grinding/production metrics across all reports with dates $sql = "SELECT r.MillName, r.BeginningDate, r.EndingDate, r.SourceFileName, m.MetricName, m.RunValueNumeric, m.ToDateValueNumeric, m.Category FROM dbo.MillDataMetrics m JOIN dbo.MillDataReports r ON m.ReportId = r.ReportId WHERE m.MetricName IN ( 'TC Ground This Week', 'TC Ground To Date', 'Hours This Week', 'Lost Time This Week', 'TC/GH This Week', 'Efficiency This Week' ) AND m.RunValueNumeric IS NOT NULL ORDER BY r.BeginningDate, r.MillName"; $stmt = sqlsrv_query($conn, $sql); $trends = []; if ($stmt) { while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $trends[] = $row; } } return $trends; } function getMillPerformanceSummary($conn) { // Get latest performance for each mill $sql = "WITH LatestReports AS ( SELECT MillName, MAX(ProcessedAt) as LatestProcessed FROM dbo.MillDataReports GROUP BY MillName ) SELECT r.MillName, r.BeginningDate, r.EndingDate, r.SourceFileName, MAX(CASE WHEN m.MetricName = 'TC Ground This Week' THEN m.RunValueNumeric END) as TCGround, MAX(CASE WHEN m.MetricName = 'Hours This Week' THEN m.RunValueNumeric END) as HoursRun, MAX(CASE WHEN m.MetricName = 'Lost Time This Week' THEN m.RunValueNumeric END) as LostTime, MAX(CASE WHEN m.MetricName = 'TC/GH This Week' THEN m.RunValueNumeric END) as TCPerHour, MAX(CASE WHEN m.MetricName = 'TC Ground To Date' THEN m.ToDateValueNumeric END) as TCToDate FROM dbo.MillDataReports r JOIN LatestReports lr ON r.MillName = lr.MillName AND r.ProcessedAt = lr.LatestProcessed LEFT JOIN dbo.MillDataMetrics m ON r.ReportId = m.ReportId GROUP BY r.MillName, r.BeginningDate, r.EndingDate, r.SourceFileName ORDER BY r.MillName"; $stmt = sqlsrv_query($conn, $sql); $summary = []; if ($stmt) { while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $summary[] = $row; } } return $summary; } function getCategoryBreakdown($conn) { $sql = "SELECT m.Category, COUNT(*) as MetricCount, COUNT(DISTINCT r.ReportId) as ReportCount FROM dbo.MillDataMetrics m JOIN dbo.MillDataReports r ON m.ReportId = r.ReportId WHERE m.Category IS NOT NULL GROUP BY m.Category ORDER BY COUNT(*) DESC"; $stmt = sqlsrv_query($conn, $sql); $breakdown = []; if ($stmt) { while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $breakdown[] = $row; } } return $breakdown; } function getWeeklyTrendData($conn) { // Get TC Ground per week for charting $sql = "SELECT r.MillName, r.BeginningDate, SUM(CASE WHEN m.MetricName = 'TC Ground This Week' THEN m.RunValueNumeric END) as TCGround, SUM(CASE WHEN m.MetricName = 'Hours This Week' THEN m.RunValueNumeric END) as HoursRun FROM dbo.MillDataReports r JOIN dbo.MillDataMetrics m ON r.ReportId = m.ReportId WHERE m.MetricName IN ('TC Ground This Week', 'Hours This Week') GROUP BY r.MillName, r.BeginningDate ORDER BY r.BeginningDate, r.MillName"; $stmt = sqlsrv_query($conn, $sql); $data = []; if ($stmt) { while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) { $data[] = $row; } } return $data; } function formatDate($date) { if ($date instanceof DateTime) { return $date->format('m/d/Y'); } return $date ?? '-'; } function formatShortDate($date) { if ($date instanceof DateTime) { return $date->format('M j'); } return $date ?? '-'; } // ============================================================================ // Main Logic // ============================================================================ $conn = getDashboardConnection($config); $connectionError = $conn === null; $stats = ['TotalReports' => 0, 'TotalFiles' => 0, 'TotalMills' => 0, 'TotalMetrics' => 0]; $recentReports = []; $keyTrends = []; $millPerformance = []; $categoryBreakdown = []; $weeklyTrends = []; $millNameLookup = []; if (!$connectionError) { // Load mill name mappings $millNameLookup = getMillNames($conn); $stats = getDashboardStats($conn); $recentReports = getRecentReports($conn, 10); $keyTrends = getKeyMetricTrends($conn); $millPerformance = getMillPerformanceSummary($conn); $categoryBreakdown = getCategoryBreakdown($conn); $weeklyTrends = getWeeklyTrendData($conn); sqlsrv_close($conn); } // Prepare chart data $chartLabels = []; $chartDatasets = []; $millColors = [ 'East Mill' => 'rgba(59, 130, 246, 1)', 'West Mill' => 'rgba(16, 185, 129, 1)', 'Mill 1' => 'rgba(245, 158, 11, 1)', 'Mill 2' => 'rgba(239, 68, 68, 1)', 'Mill 3' => 'rgba(139, 92, 246, 1)', 'Mill 4' => 'rgba(236, 72, 153, 1)', ]; // Group weekly trends by mill $millData = []; foreach ($weeklyTrends as $row) { $millCode = $row['MillName']; $date = formatShortDate($row['BeginningDate']); if (!isset($millData[$millCode])) { $millData[$millCode] = []; } $millData[$millCode][$date] = $row['TCGround']; if (!in_array($date, $chartLabels)) { $chartLabels[] = $date; } } foreach ($millData as $millCode => $data) { $millDisplayName = getMillDisplayName($millNameLookup, $millCode); $color = $millColors[$millCode] ?? $millColors[$millDisplayName] ?? 'rgba(107, 114, 128, 1)'; $bgColor = str_replace(', 1)', ', 0.2)', $color); $values = []; foreach ($chartLabels as $label) { $values[] = $data[$label] ?? null; } $chartDatasets[] = [ 'label' => $millDisplayName, 'data' => $values, 'borderColor' => $color, 'backgroundColor' => $bgColor, 'tension' => 0.3, 'fill' => false, ]; } // ============================================================================ // Page Layout // ============================================================================ $pageTitle = 'Mill Data Dashboard'; $pageSubtitle = 'Analytics & Performance Trends'; $pageDescription = 'Visual analytics dashboard for mill production data.'; $layoutWithoutSidebar = true; $layoutReturnUrl = '../overview.php'; $layoutReturnLabel = 'Back to overview'; $assetBasePath = '../'; require __DIR__ . '/../includes/layout/header.php'; ?>
No category data available.
| Mill | Source File | Begin Date | End Date | Crop Days | Processed | |
|---|---|---|---|---|---|---|
| View → |
No reports available.