Files
2026-04-28 21:15:09 +03:00

197 lines
7.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* @api-readonly
* NDT Dashboard statistics and charts data
* Cached for 10 minutes to improve performance
*/
use Illuminate\Support\Facades\Cache;
// Cache key - invalidate when data changes
$cacheKey = 'ndt_dashboard_data_v1';
$cacheDuration = 10; // minutes
// Check for force refresh
$forceRefresh = request('refresh') === '1';
// Try to get from cache first
if (!$forceRefresh && Cache::has($cacheKey)) {
$response = Cache::get($cacheKey);
echo json_encode_tr($response);
exit();
}
$testTypes = log_test_types();
// Aylara göre rapor dosyası yükleme durumu için veri hazırlama
$uploadedReportData = [];
$ndtData = []; // NDT verileri için dizi
$ndtChartDataLab = [];
$ndtChartDataTestType = [];
foreach ($testTypes as $key => $table) {
// Burada her bir test türü için rapor dosyası yükleme durumunu kontrol et
// Memory optimization: Count instead of fetching all data
$uploadedCount = DB::table($table)->whereNotNull('report_file')->count();
$notUploadedCount = DB::table($table)->whereNull('report_file')->count();
$totalCount = DB::table($table)->count();
// Only fetch necessary fields for calculations - optimize query
$reportFiles = DB::table($table)
->select("{$key}_result", "{$key}_request_no", "{$key}_request_date", "test_laboratory_{$key}", "report_file")
->whereNotNull("{$key}_request_date")
->get();
// NDT türleri için veri hazırlama
$resultField = "{$key}_result";
if ($key === 'pmi') {
$reportField = 'no_of_testing_report';
} elseif ($key === 'pwht') {
$reportField = 'no_of_pwht_report';
} else {
$reportField = "{$key}_report";
}
$requestedField = "{$key}_request_no";
$requestedCount = count(array_filter($reportFiles->toArray(), fn($file) => $file->{$requestedField} !== null)); // İstenen NDT sayısı
$receivedResultCount = count(array_filter($reportFiles->toArray(), fn($file) => $file->{$resultField} !== null)); // Alınan sonuç sayısı
$receivedReportCount = count(array_filter($reportFiles->toArray(), fn($file) => $file->report_file !== null)); // Alınan rapor sayısı
// Bekleyen rapor sayısını hesapla
$waitingReportsCount = $receivedResultCount - $receivedReportCount;
// Aylık verileri hazırlama
$monthlyDataLab = []; // Laboratuvar bazında veri
$monthlyDataTestType = []; // Test türü bazında veri
foreach ($reportFiles as $file) {
if(rejected_date($file->{$key . '_request_date'})) {
continue;
}
$month = date('M.Y', strtotime($file->{$key . '_request_date'})); // Aylık format
$labKey = $file->{"test_laboratory_{$key}"}; // Laboratuvar anahtarı
$upperKey = strtoupper($key);
// Laboratuvar bazında veri - requested/received mantığı
if (!isset($monthlyDataLab[$month][$upperKey][$labKey])) {
$monthlyDataLab[$month][$upperKey][$labKey] = [
'requested' => 0,
'received' => 0,
];
}
// Requested: request_no dolu olanlar
if ($file->{$requestedField} != '' && $file->{$requestedField} !== null) {
$monthlyDataLab[$month][$upperKey][$labKey]['requested']++;
// Received: result dolu olanlar (requested olanlar içinden)
if ($file->{$resultField} != '' && $file->{$resultField} !== null) {
$monthlyDataLab[$month][$upperKey][$labKey]['received']++;
}
}
// Test türü bazında veri - requested/received mantığı
if (!isset($monthlyDataTestType[$month][$upperKey])) {
$monthlyDataTestType[$month][$upperKey] = [
'requested' => 0,
'received' => 0,
];
}
// Requested: request_no dolu olanlar
if ($file->{$requestedField} != '' && $file->{$requestedField} !== null) {
$monthlyDataTestType[$month][$upperKey]['requested']++;
// Received: result dolu olanlar (requested olanlar içinden)
if ($file->{$resultField} != '' && $file->{$resultField} !== null) {
$monthlyDataTestType[$month][$upperKey]['received']++;
}
}
}
// Aylık verileri dxChart için uygun formatta hazırlama - requested/received
foreach ($monthlyDataLab as $month => $counts) {
foreach ($counts as $lab => $data) {
foreach ($data as $upperKey => $data) {
$ndtChartDataLab[] = [
'month' => $month,
'test_type' => $lab,
'laboratory' => $upperKey,
'requested' => $data['requested'],
'received' => $data['received'],
];
}
}
}
foreach ($monthlyDataTestType as $month => $counts) {
foreach ($counts as $testType => $data) {
// Her bir test tipi için ayrı bir dizi oluştur - requested/received
$ndtChartDataTestType[] = [
'month' => $month,
'test_type' => $testType,
'requested' => $data['requested'],
'received' => $data['received'],
];
}
}
// Aylık verileri tarihe göre sıralama
usort($ndtChartDataTestType, function($a, $b) {
return strtotime($a['month']) - strtotime($b['month']);
});
// Aylık verileri tarihe göre sıralama
usort($ndtChartDataLab, function($a, $b) {
return strtotime($a['month']) - strtotime($b['month']);
});
// dxDataGrid için uygun formatta veri hazırlama
$ndtDataForGrid[] = [
'test_type' => strtoupper($key),
'responsible' => @$reportFiles[0]?->{"test_laboratory_{$key}"}, // Buraya ilgili taşeron firma bilgisi eklenmeli
'requested' => $totalCount,
'received_result' => $receivedResultCount,
'received_reports' => $receivedReportCount,
'waiting_reports' => $waitingReportsCount,
];
$uploadedReportData[$key] = [
'uploaded' => $uploadedCount,
'not_uploaded' => $notUploadedCount,
];
}
// Yükleme durumunun toplam sayıya oranı için veri hazırlama
$uploadRatioData = [];
foreach ($uploadedReportData as $key => $counts) {
$totalReports = $counts['uploaded'] + $counts['not_uploaded'];
$uploadRatioData[$key] = $totalReports > 0 ? ($counts['uploaded'] * 100 / $totalReports) : 0; // Oranı hesapla
}
// Her bir test tipi için ayrı seriler oluşturma
$testTypeSeries = [];
foreach ($ndtChartDataTestType as $entry) {
$testTypeSeries[$entry['test_type']][] = $entry;
}
// Her bir test tipi için ayrı seriler oluşturma
$labSeries = [];
foreach ($ndtChartDataLab as $entry) {
$entry['laboratory'] = trim($entry['laboratory']);
$entry['laboratory'] = $entry['laboratory'] == "" ? "Empty" : $entry['laboratory'];
$labSeries[$entry['laboratory']][$entry['test_type']][] = $entry;
}
// JSON çıktısı oluşturma
$response = [
'uploadReportData' => $uploadedReportData,
'uploadRatioData' => $uploadRatioData,
'ndtData' => $ndtDataForGrid, // NDT verilerini dxDataGrid için güncelledik
'ndtChartDataLab' => $ndtChartDataLab, // Laboratuvar bazında aylık veri
'ndtChartDataTestType' => $ndtChartDataTestType, // Test türü bazında aylık veri
'testTypeSeries' => $testTypeSeries,
'labSeries' => $labSeries,
'cached_at' => now()->format('Y-m-d H:i:s'),
];
// Cache the response for faster subsequent loads
Cache::put($cacheKey, $response, now()->addMinutes($cacheDuration));
echo json_encode_tr($response);
?>