sistem_rekomendasi/app/Http/Controllers/Api/Admin/DashboardAdminController.php

88 lines
3.1 KiB
PHP

<?php
namespace App\Http\Controllers\Api\Admin;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Models\RiwayatRekomendasi;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Schema;
use Exception;
class DashboardAdminController extends Controller
{
public function index(Request $request)
{
try {
$tableName = (new RiwayatRekomendasi())->getTable();
$totalSiswa = User::whereIn('role', ['siswa', 'student'])->count();
if ($totalSiswa === 0) {
$totalSiswa = RiwayatRekomendasi::distinct('user_id')->count('user_id');
}
$totalRekomendasi = RiwayatRekomendasi::count();
$kolomAkurasi = null;
if (Schema::hasColumn($tableName, 'akurasi_prediksi')) {
$kolomAkurasi = 'akurasi_prediksi';
} elseif (Schema::hasColumn($tableName, 'probabilitas')) {
$kolomAkurasi = 'probabilitas';
} elseif (Schema::hasColumn($tableName, 'akurasi')) {
$kolomAkurasi = 'akurasi';
}
$rataAkurasi = null;
if ($kolomAkurasi) {
$avg = RiwayatRekomendasi::whereNotNull($kolomAkurasi)->avg($kolomAkurasi);
$rataAkurasi = $avg !== null ? round((float) $avg, 2) : null;
}
$akurasiStatus = $rataAkurasi !== null
? 'Berdasarkan rata-rata tingkat keyakinan dari seluruh hasil rekomendasi.'
: 'Belum ada nilai keyakinan prediksi yang tersimpan. Lakukan prediksi baru terlebih dahulu.';
$selectDistribusi = 'hasil_rekomendasi_jurusan as jurusan, COUNT(*) as total';
if ($kolomAkurasi) {
$selectDistribusi .= ', ROUND(AVG(' . $kolomAkurasi . '), 2) as rata_akurasi';
}
$distribusiJurusan = RiwayatRekomendasi::selectRaw($selectDistribusi)
->whereNotNull('hasil_rekomendasi_jurusan')
->groupBy('hasil_rekomendasi_jurusan')
->orderBy('total', 'desc')
->limit(10)
->get()
->map(function ($item) use ($kolomAkurasi) {
return [
'jurusan' => $item->jurusan,
'total' => (int) $item->total,
'rata_akurasi' => $kolomAkurasi && $item->rata_akurasi !== null
? round((float) $item->rata_akurasi, 2)
: null,
];
});
return response()->json([
'success' => true,
'data' => [
'total_siswa' => $totalSiswa,
'rekomendasi_diproses' => $totalRekomendasi,
'rata_rata_akurasi' => $rataAkurasi,
'akurasi_status' => $akurasiStatus,
'distribusi_jurusan' => $distribusiJurusan,
]
], 200);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error: ' . $e->getMessage()
], 500);
}
}
}