88 lines
3.1 KiB
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);
|
|
}
|
|
}
|
|
} |