87 lines
2.8 KiB
PHP
87 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\User;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use Illuminate\Http\Request;
|
|
use App\Models\Diagnosa;
|
|
use App\Models\Kriteria;
|
|
use App\Models\Kecerdasan;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class PerhitunganAPHController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$kriterias = Kriteria::orderBy('nama')->get();
|
|
$kecerdasans = Kecerdasan::orderBy('nama')->get();
|
|
|
|
return view('user.perhitunganaph', compact('kriterias', 'kecerdasans'));
|
|
}
|
|
|
|
public function analisa(Request $request)
|
|
{
|
|
$request->validate([
|
|
'kondisi' => 'required|array|min:2',
|
|
'kondisi.*' => 'regex:/^[A-Za-z0-9]+_[0-4]$/',
|
|
], [
|
|
'kondisi.min' => 'Pilih minimal 2 kriteria untuk analisa.',
|
|
'kondisi.required' => 'Anda harus memilih kriteria.',
|
|
]);
|
|
|
|
$kriterias = Kriteria::orderBy('nama')->get();
|
|
$kecerdasans = Kecerdasan::with(['basisPengetahuans' => function ($q) use ($request) {
|
|
$ids = array_map(fn($item) => explode('_', $item)[0], $request->input('kondisi', []));
|
|
$q->whereIn('kriteria_id', $ids);
|
|
}])->orderBy('nama')->get();
|
|
|
|
// Mapping level ke bobot
|
|
$arbobot = [0 => 0, 1 => 0.25, 2 => 0.5, 3 => 0.75, 4 => 1.0];
|
|
|
|
// Ambil tingkat kepastian per kriteria
|
|
$kepastian = [];
|
|
foreach ($request->kondisi as $item) {
|
|
[$kritId, $lvl] = explode('_', $item);
|
|
$kepastian[$kritId] = (int) $lvl;
|
|
}
|
|
|
|
$cfHasil = [];
|
|
foreach ($kecerdasans as $kec) {
|
|
$cfs = [];
|
|
foreach ($kec->basisPengetahuans as $bp) {
|
|
$level = $kepastian[$bp->kriteria_id] ?? 0;
|
|
$cfs[] = $bp->nilai * $arbobot[$level];
|
|
}
|
|
// Gabungan CF
|
|
$cfTotal = array_reduce($cfs, fn($acc, $cf) => $acc === null ? $cf : $acc + $cf * (1 - $acc), null);
|
|
$cfHasil[$kec->id] = round($cfTotal ?? 0, 4);
|
|
}
|
|
|
|
arsort($cfHasil);
|
|
$topId = array_key_first($cfHasil);
|
|
$presentase = ($cfHasil[$topId] ?? 0) * 100;
|
|
|
|
// Simpan diagnosa (jika masih ingin simpan ke Diagnosa)
|
|
Diagnosa::create([
|
|
'user_id' => Auth::id(),
|
|
'kecerdasan_id' => $topId,
|
|
'presentase' => $presentase,
|
|
'catatan' => null,
|
|
]);
|
|
|
|
// Kirim data ke view
|
|
return view('user.perhitunganaph', compact(
|
|
'kriterias',
|
|
'kecerdasans',
|
|
'kepastian',
|
|
'cfHasil'
|
|
))->with('success', 'Analisa berhasil dihitung.');
|
|
}
|
|
|
|
public function reset(Request $request)
|
|
{
|
|
$request->session()->forget('biodata');
|
|
return redirect()->route('user.perhitunganaph.index');
|
|
}
|
|
}
|