90 lines
2.6 KiB
PHP
90 lines
2.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Pengguna;
|
|
|
|
use App\Http\Controllers\Pengguna\PenggunaController;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Diagnosa;
|
|
use App\Models\Kriteria;
|
|
use App\Models\Jurusan;
|
|
|
|
class DiagnosaController extends PenggunaController
|
|
{
|
|
public function index()
|
|
{
|
|
// Ambil semua kriteria
|
|
$kriterias = Kriteria::all();
|
|
return view('pengguna.diagnosa.index', compact('kriterias'));
|
|
}
|
|
|
|
public function analisa(Request $request)
|
|
{
|
|
if (empty($request->kondisi) || count($request->kondisi) < 2) {
|
|
$this->notification('success', 'Sehat', 'Tanpa kriteria signifikan');
|
|
return redirect()->route('pengguna.diagnosa.index');
|
|
}
|
|
|
|
$arbobot = [0, 1, 0.75, 0.5, 0.25];
|
|
$kepastian = [];
|
|
|
|
// Parse input kondisi: ["kriteriaId_level", ...]
|
|
foreach ($request->kondisi as $item) {
|
|
list($kriteriaId, $level) = explode('_', $item);
|
|
$kepastian[$kriteriaId] = (int) $level;
|
|
}
|
|
|
|
// Ambil semua jurusan dan basis pengetahuan yang relevan
|
|
$jurusans = Jurusan::with(['basisPengetahuan' => function ($q) use ($kepastian) {
|
|
$q->whereIn('kriteria_id', array_keys($kepastian));
|
|
}])->get();
|
|
|
|
$cfHasil = [];
|
|
|
|
// Hitung CF untuk tiap jurusan
|
|
foreach ($jurusans as $jurusan) {
|
|
$cfs = [];
|
|
foreach ($jurusan->basisPengetahuan as $bp) {
|
|
$level = $kepastian[$bp->kriteria_id] ?? 0;
|
|
$cfs[] = $bp->nilai * $arbobot[$level];
|
|
}
|
|
|
|
// Kombinasi CF
|
|
$cfTotal = 0;
|
|
foreach ($cfs as $idx => $cf) {
|
|
if ($idx === 0) {
|
|
$cfTotal = $cf;
|
|
} else {
|
|
$cfTotal = $cfTotal + $cf * (1 - $cfTotal);
|
|
}
|
|
}
|
|
|
|
$cfHasil[$jurusan->id] = round($cfTotal, 4);
|
|
}
|
|
|
|
// Urutkan dan simpan
|
|
arsort($cfHasil);
|
|
$topId = array_key_first($cfHasil);
|
|
|
|
Diagnosa::create([
|
|
'user_id' => session('biodata.user_id'),
|
|
'jurusan_id' => $topId,
|
|
'presentase' => $cfHasil[$topId] * 100,
|
|
'catatan' => null,
|
|
]);
|
|
|
|
// Kembali ke view hasil
|
|
return view('pengguna.diagnosa.analisa', [
|
|
'cfHasil' => $cfHasil,
|
|
'jurusans' => $jurusans,
|
|
'kepastian' => $kepastian,
|
|
'topId' => $topId,
|
|
]);
|
|
}
|
|
|
|
public function reset(Request $request)
|
|
{
|
|
$request->session()->forget('biodata');
|
|
return redirect()->route('pengguna.biodata.index');
|
|
}
|
|
}
|