197 lines
7.5 KiB
PHP
197 lines
7.5 KiB
PHP
<?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);
|
||
?>
|