203 lines
7.5 KiB
PHP
203 lines
7.5 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
use App\Models\Prediction; // Pastikan model ini sesuai nama
|
|
use Illuminate\Support\Facades\Http;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Certificate;
|
|
|
|
class PredictionController extends Controller {
|
|
public function form()
|
|
{
|
|
// Ambil daftar file CSV dari FastAPI
|
|
$response = Http::get("http://127.0.0.1:8000/files");
|
|
|
|
if ($response->failed()) {
|
|
return back()->withErrors(['error' => 'Gagal mengambil daftar file.']);
|
|
}
|
|
|
|
$files = $response->json()['files'] ?? [];
|
|
return view('user.prediksi', compact('files'));
|
|
}
|
|
|
|
public function submit(Request $request)
|
|
{
|
|
$validated = $request->validate([
|
|
'file' => 'required|string',
|
|
'RATA_RATA' => 'required|numeric',
|
|
'MAT' => 'required|numeric',
|
|
'BIO' => 'required|numeric',
|
|
'KIM' => 'required|numeric',
|
|
'BIG' => 'required|numeric',
|
|
'INDEKS' => 'required|numeric',
|
|
'certificate_average_score' => 'required|numeric'
|
|
]);
|
|
|
|
$inputData = $request->only(['RATA_RATA', 'MAT', 'BIO', 'KIM', 'BIG', 'INDEKS']);
|
|
|
|
$payload = [
|
|
'file' => $request->file,
|
|
'data' => $inputData,
|
|
'certificate_average_score' => $request->certificate_average_score
|
|
];
|
|
// dd($payload);
|
|
|
|
|
|
|
|
|
|
// Logging payload sebelum dikirim ke FastAPI
|
|
\Log::info('Payload dikirim ke FastAPI:', $payload);
|
|
|
|
$response = Http::post("http://127.0.0.1:8000/predict", $payload);
|
|
// dd($response->json());
|
|
|
|
|
|
|
|
// Logging respons dari FastAPI
|
|
\Log::info('Respons dari FastAPI:', $response->json());
|
|
|
|
|
|
if ($response->failed()) {
|
|
$errorDetail = $response->json()['detail'] ?? 'Terjadi kesalahan saat prediksi.';
|
|
return back()->withErrors(['error' => 'Prediksi gagal: ' . $errorDetail]);
|
|
}
|
|
|
|
|
|
$result = $response->json();
|
|
$prediction = $result['prediction'] ?? 'Tidak diketahui';
|
|
$score = $result['score'] ?? 0;
|
|
$prediction = Prediction::create([
|
|
'user_id' => auth()->id(),
|
|
'filename' => $validated['file'],
|
|
'rata_rata' => $validated['RATA_RATA'],
|
|
'mat' => $validated['MAT'],
|
|
'bio' => $validated['BIO'],
|
|
'kim' => $validated['KIM'],
|
|
'big' => $validated['BIG'],
|
|
'indeks' => $validated['INDEKS'],
|
|
'certificate_score' => $validated['certificate_average_score'],
|
|
'created_at' => now()->setTimezone('Asia/Jakarta')
|
|
|
|
]);
|
|
$prediction->update([
|
|
'model_prediction' => $result['prediction'],
|
|
'final_score' => $result['score'],
|
|
'result' => number_format($result['score'], 2) . '%',
|
|
|
|
]);
|
|
|
|
|
|
return back()->with([
|
|
'result' => number_format($result['score'], 2) . '%',
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
// public function showForm()
|
|
// {
|
|
// $dataDir = 'C:\laragon\www\TUGASA\BE\data';
|
|
// $models = [];
|
|
|
|
// if (is_dir($dataDir)) {
|
|
// $files = scandir($dataDir);
|
|
// $models = array_filter($files, function ($file) {
|
|
// return pathinfo($file, PATHINFO_EXTENSION) === 'csv';
|
|
// });
|
|
// }
|
|
|
|
// return view('user.prediksi', ['models' => $models]);
|
|
// }
|
|
|
|
// public function predict(Request $request)
|
|
// {
|
|
// $validated = $request->validate([
|
|
// 'model' => 'required|string',
|
|
// 'RATA_RATA' => 'required|numeric',
|
|
// 'MAT' => 'required|numeric',
|
|
// 'BIO' => 'required|numeric',
|
|
// 'KIM' => 'required|numeric',
|
|
// 'BIG' => 'required|numeric',
|
|
// 'INDEKS' => 'required|numeric',
|
|
// 'certificate_average_score' => 'required|numeric', // dari input hidden
|
|
// ]);
|
|
|
|
// $payload = [
|
|
// 'model' => $validated['model'],
|
|
// 'data' => [
|
|
// 'RATA_RATA' => $validated['RATA_RATA'],
|
|
// 'MAT' => $validated['MAT'],
|
|
// 'BIO' => $validated['BIO'],
|
|
// 'KIM' => $validated['KIM'],
|
|
// 'BIG' => $validated['BIG'],
|
|
// 'INDEKS' => $validated['INDEKS'],
|
|
// ],
|
|
// // 'certificate_average_score' => $validated['certificate_average_score']
|
|
// ];
|
|
|
|
// \Log::info('Payload to FastAPI:', $payload);
|
|
|
|
// try {
|
|
// $response = Http::withHeaders([
|
|
// 'Content-Type' => 'application/json'
|
|
// ])->post('http://localhost:8000/predict', $payload);
|
|
|
|
// if ($response->successful()) {
|
|
// $result = $response->json();
|
|
|
|
// // Simpan data awal terlebih dahulu
|
|
// // $prediction = Prediction::create([
|
|
// // 'user_id' => auth()->id(),
|
|
// // 'filename' => $validated['model'],
|
|
// // 'rata_rata' => $validated['RATA_RATA'],
|
|
// // 'mat' => $validated['MAT'],
|
|
// // 'bio' => $validated['BIO'],
|
|
// // 'kim' => $validated['KIM'],
|
|
// // 'big' => $validated['BIG'],
|
|
// // 'indeks' => $validated['INDEKS'],
|
|
// // 'certificate_score' => $validated['certificate_average_score'],
|
|
// // 'created_at' => now()->setTimezone('Asia/Jakarta')
|
|
|
|
// // ]);
|
|
|
|
// // Update hasil prediksi setelah data berhasil disimpan
|
|
// // $prediction->update([
|
|
// // 'model_prediction' => $result['prediction'],
|
|
// // 'final_score' => $result['total_score'],
|
|
// // 'result' => number_format($result['total_score'], 2) . '%',
|
|
|
|
// // ]);
|
|
|
|
// return back()->with([
|
|
// 'success' => 'Sistem memprediksi kemungkinan anda Lulus',
|
|
// 'result' => $result['prediction'],
|
|
// 'score' => number_format($result['total_score'], 2). '%'
|
|
// ]);
|
|
// } else {
|
|
// \Log::error('FastAPI error response', [
|
|
// 'status' => $response->status(),
|
|
// 'body' => $response->body(),
|
|
// ]);
|
|
// return back()->withErrors(['msg' => 'Gagal mendapatkan prediksi dari server.']);
|
|
// }
|
|
// } catch (\Exception $e) {
|
|
// \Log::error('Exception saat menghubungi FastAPI:', [
|
|
// 'error' => $e->getMessage(),
|
|
// ]);
|
|
// return back()->withErrors(['msg' => 'Terjadi kesalahan saat menghubungi server prediksi.']);
|
|
// }
|
|
// }
|
|
|
|
public function history()
|
|
{
|
|
$predictions = Prediction::where('user_id', auth()->id())
|
|
->whereNotNull('result')
|
|
->orderBy('created_at', 'desc')
|
|
->get();
|
|
|
|
return view('user.hasil_prediksi', compact('predictions'));
|
|
}
|
|
|
|
}
|