From 68b3232ef2a08fa999ea816ee40462e2b1861332 Mon Sep 17 00:00:00 2001 From: GalangSefin <158027366+GalangSefin@users.noreply.github.com> Date: Tue, 12 May 2026 11:25:41 +0700 Subject: [PATCH] update --- .../Student/RecommendationApiController.php | 116 +++++- .../Student/RecommendationController.php | 21 +- ...3537_create_riwayat_rekomendasis_table.php | 26 +- .../encoders_15mapel.pkl | Bin .../feature_columns_15mapel.pkl | Bin resources/views/student/hasil.blade.php | 197 ++++++--- resources/views/student/prediksi.blade.php | 383 +++++++++++++----- routes/api.php | 4 - routes/web.php | 17 +- 9 files changed, 582 insertions(+), 182 deletions(-) rename {app/ai_model => flask_api}/encoders_15mapel.pkl (100%) rename {app/ai_model => flask_api}/feature_columns_15mapel.pkl (100%) diff --git a/app/Http/Controllers/Api/Student/RecommendationApiController.php b/app/Http/Controllers/Api/Student/RecommendationApiController.php index 7a9756a..4566758 100644 --- a/app/Http/Controllers/Api/Student/RecommendationApiController.php +++ b/app/Http/Controllers/Api/Student/RecommendationApiController.php @@ -7,7 +7,6 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Http; -use Illuminate\Validation\ValidationException; class RecommendationApiController extends Controller { @@ -49,15 +48,7 @@ public function hitungPrediksi(Request $request) 'gaji_ortu' => 'required|numeric|min:0', ]); - $gaji = (float) $validated['gaji_ortu']; - - if ($gaji < 2000000) { - $ekonomiOrangTua = 'Kurang Mampu'; - } elseif ($gaji <= 5000000) { - $ekonomiOrangTua = 'Menengah'; - } else { - $ekonomiOrangTua = 'Mampu'; - } + $ekonomiOrangTua = self::getLabelEkonomiSingkat($validated['gaji_ortu']); $payload = $validated; $payload['ekonomi_orang_tua'] = $ekonomiOrangTua; @@ -133,4 +124,109 @@ public function hitungPrediksi(Request $request) ], 500); } } + + public function getHasilRekomendasi($id) + { + $riwayat = RiwayatRekomendasi::findOrFail($id); + + return response()->json([ + 'success' => true, + 'data' => self::formatHasilData($riwayat) + ]); + } + + public static function formatHasilData(RiwayatRekomendasi $riwayat): array + { + return [ + 'id' => $riwayat->id, + 'hasil_rekomendasi_jurusan' => $riwayat->hasil_rekomendasi_jurusan, + 'label_ekonomi' => self::getLabelEkonomiDetail($riwayat->gaji_ortu), + 'minat_utama' => self::getMinatUtamaLabel($riwayat), + 'prospek_kerja' => self::getProspekKerjaText($riwayat->hasil_rekomendasi_jurusan), + 'gaji_ortu' => $riwayat->gaji_ortu, + 'riasec' => [ + 'r' => $riwayat->riasec_r, + 'i' => $riwayat->riasec_i, + 'a' => $riwayat->riasec_a, + 's' => $riwayat->riasec_s, + 'e' => $riwayat->riasec_e, + 'c' => $riwayat->riasec_c, + ], + ]; + } + + public static function getLabelEkonomiSingkat($gaji): string + { + $gaji = (float) $gaji; + + if ($gaji < 2000000) { + return 'Kurang Mampu'; + } elseif ($gaji <= 5000000) { + return 'Menengah'; + } + + return 'Mampu'; + } + + public static function getLabelEkonomiDetail($gaji): string + { + $gaji = (float) $gaji; + + if ($gaji < 2000000) { + return 'Kurang Mampu (< Rp 2.000.000)'; + } elseif ($gaji <= 5000000) { + return 'Menengah (Rp 2.000.000 - Rp 5.000.000)'; + } + + return 'Mampu (> Rp 5.000.000)'; + } + + public static function getMinatUtamaLabel(RiwayatRekomendasi $riwayat): string + { + $riasecScores = [ + 'r' => (float) $riwayat->riasec_r, + 'i' => (float) $riwayat->riasec_i, + 'a' => (float) $riwayat->riasec_a, + 's' => (float) $riwayat->riasec_s, + 'e' => (float) $riwayat->riasec_e, + 'c' => (float) $riwayat->riasec_c, + ]; + + arsort($riasecScores); + $topCode = array_key_first($riasecScores); + + $labels = [ + 'r' => 'Teknis & Lapangan', + 'i' => 'Sains, Riset & Analitis', + 'a' => 'Kreatif & Desain', + 's' => 'Sosial & Pelayanan', + 'e' => 'Bisnis & Kepemimpinan', + 'c' => 'Administratif & Terstruktur', + ]; + + return $labels[$topCode] ?? 'Belum teridentifikasi'; + } + + public static function getProspekKerjaText($jurusan): string + { + $jurusan = strtolower((string) $jurusan); + + if (str_contains($jurusan, 'ekonomi') || str_contains($jurusan, 'manajemen') || str_contains($jurusan, 'bisnis')) { + return 'Lulusan bidang ini dapat berkarier sebagai manajer bisnis, staf keuangan, analis pasar, konsultan bisnis, wirausahawan, maupun pegawai instansi pemerintah dan BUMN pada sektor ekonomi dan administrasi.'; + } + + if (str_contains($jurusan, 'teknik') || str_contains($jurusan, 'informatika') || str_contains($jurusan, 'komputer')) { + return 'Lulusan bidang ini memiliki peluang karier sebagai software developer, analis sistem, teknisi, network engineer, data analyst, maupun profesional teknologi di perusahaan swasta, startup, dan instansi pemerintah.'; + } + + if (str_contains($jurusan, 'kesehatan') || str_contains($jurusan, 'keperawatan') || str_contains($jurusan, 'farmasi')) { + return 'Lulusan bidang ini dapat berkarier di rumah sakit, klinik, laboratorium, industri kesehatan, layanan masyarakat, maupun lembaga penelitian kesehatan.'; + } + + if (str_contains($jurusan, 'pendidikan') || str_contains($jurusan, 'guru')) { + return 'Lulusan bidang ini memiliki prospek sebagai guru, tenaga pendidik, instruktur pelatihan, pengembang kurikulum, maupun konsultan pendidikan.'; + } + + return 'Prospek karier untuk jurusan ini sangat luas, mulai dari spesialis industri, konsultan ahli, hingga pegawai instansi pemerintah/BUMN di sektor terkait.'; + } } \ No newline at end of file diff --git a/app/Http/Controllers/Student/RecommendationController.php b/app/Http/Controllers/Student/RecommendationController.php index 6ca7815..bf0621d 100644 --- a/app/Http/Controllers/Student/RecommendationController.php +++ b/app/Http/Controllers/Student/RecommendationController.php @@ -3,25 +3,30 @@ namespace App\Http\Controllers\Student; use App\Http\Controllers\Controller; -use Illuminate\Http\Request; +use App\Http\Controllers\Api\Student\RecommendationApiController; use App\Models\RiwayatRekomendasi; class RecommendationController extends Controller { - // Menampilkan halaman form terpadu (Kuesioner + Nilai) public function prediction() { return view('student.prediksi'); } - // Menampilkan halaman hasil khusus berdasarkan ID public function result($id) { $riwayat = RiwayatRekomendasi::findOrFail($id); - - // Informasi Prospek Kerja berdasarkan hasil (Bisa kamu sesuaikan teksnya) - $prospekKerja = "Prospek karier untuk jurusan ini sangat luas, mulai dari spesialis industri, konsultan ahli, hingga pegawai instansi pemerintah/BUMN di sektor terkait."; - - return view('student.hasil', compact('riwayat', 'prospekKerja')); + $hasil = RecommendationApiController::formatHasilData($riwayat); + + $labelEkonomi = $hasil['label_ekonomi']; + $minatUtama = $hasil['minat_utama']; + $prospekKerja = $hasil['prospek_kerja']; + + return view('student.hasil', compact( + 'riwayat', + 'labelEkonomi', + 'minatUtama', + 'prospekKerja' + )); } } \ No newline at end of file diff --git a/database/migrations/2026_03_30_113537_create_riwayat_rekomendasis_table.php b/database/migrations/2026_03_30_113537_create_riwayat_rekomendasis_table.php index 3b624d8..86defbd 100644 --- a/database/migrations/2026_03_30_113537_create_riwayat_rekomendasis_table.php +++ b/database/migrations/2026_03_30_113537_create_riwayat_rekomendasis_table.php @@ -5,17 +5,12 @@ use Illuminate\Support\Facades\Schema; return new class extends Migration { - public function up(): void { + public function up(): void + { Schema::create('riwayat_rekomendasis', function (Blueprint $table) { $table->id(); - $table->foreignId('user_id')->constrained('users')->cascadeOnDelete(); // Hilangkan komentar jika sudah pakai login Auth - - // Kolom Profil - $table->integer('gaji_ortu'); - $table->integer('ekonomi_orang_tua'); // 0: Kurang, 1: Menengah, 2: Mampu - $table->integer('minat_bakat'); // 0-3 sesuai dataset - - // 15 Nilai Mata Pelajaran + $table->foreignId('user_id')->constrained('users')->cascadeOnDelete(); + $table->float('agama'); $table->float('pkn'); $table->float('bahasa_indonesia'); @@ -32,13 +27,22 @@ public function up(): void { $table->float('pjok'); $table->float('informatika'); - // Hasil Akhir + $table->float('riasec_r')->default(0); + $table->float('riasec_i')->default(0); + $table->float('riasec_a')->default(0); + $table->float('riasec_s')->default(0); + $table->float('riasec_e')->default(0); + $table->float('riasec_c')->default(0); + + $table->bigInteger('gaji_ortu'); $table->string('hasil_rekomendasi_jurusan')->nullable(); + $table->timestamps(); }); } - public function down(): void { + public function down(): void + { Schema::dropIfExists('riwayat_rekomendasis'); } }; \ No newline at end of file diff --git a/app/ai_model/encoders_15mapel.pkl b/flask_api/encoders_15mapel.pkl similarity index 100% rename from app/ai_model/encoders_15mapel.pkl rename to flask_api/encoders_15mapel.pkl diff --git a/app/ai_model/feature_columns_15mapel.pkl b/flask_api/feature_columns_15mapel.pkl similarity index 100% rename from app/ai_model/feature_columns_15mapel.pkl rename to flask_api/feature_columns_15mapel.pkl diff --git a/resources/views/student/hasil.blade.php b/resources/views/student/hasil.blade.php index 0398f88..e0d4930 100644 --- a/resources/views/student/hasil.blade.php +++ b/resources/views/student/hasil.blade.php @@ -5,81 +5,184 @@