MIF_E31221259/app/Http/Controllers/User/NewAhpController.php

141 lines
3.9 KiB
PHP

<?php
namespace App\Http\Controllers\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Models\MapelUn;
use App\Models\Jurusan;
use App\Models\BasisAhp;
use App\Models\NilaiUn;
use App\Models\HasilAhp;
class NewAhpController extends Controller
{
/**
* Tampilkan form input dan data awal.
*/
public function index()
{
$mapels = MapelUn::pluck('nama', 'id');
$jurusans = Jurusan::pluck('nama', 'id');
$basisAhp = BasisAhp::all()
->groupBy('mapel_id')
->map(fn($rows) => $rows->pluck('cf_value','jurusan_id'))
->toArray();
return view('user.new', compact('mapels', 'jurusans', 'basisAhp'));
}
/**
* Proses perhitungan SPK AHP + CF.
*/
public function process(Request $request)
{
// validasi input
$request->validate([
'nilai.*' => 'required|numeric|min:0|max:100',
]);
$userId = Auth::id();
$mapels = MapelUn::pluck('nama','id')->toArray();
$jurusans = Jurusan::pluck('nama','id')->toArray();
$basisAhp = BasisAhp::all()
->groupBy('mapel_id')
->map(fn($rows) => $rows->pluck('cf_value','jurusan_id')->toArray())
->toArray();
// Ambil skor UN dari request
$scores = array_map('floatval', $request->input('nilai'));
$ids = array_keys($mapels);
$n = count($ids);
// 1. Matriks perbandingan kriteria
$matrixCrit = [];
foreach ($ids as $i) {
foreach ($ids as $j) {
$den = $scores[$j] ?: 1;
$matrixCrit[$i][$j] = round($scores[$i] / $den, 4);
}
}
// 2. Jumlah kolom
$sumColCrit = [];
foreach ($ids as $j) {
$col = array_column($matrixCrit, $j);
$sumColCrit[$j] = round(array_sum($col), 4);
}
// 3. Normalisasi & bobot kriteria
$normCrit = [];
$critWeights = [];
foreach ($ids as $i) {
$rowSum = 0;
foreach ($ids as $j) {
$normCrit[$i][$j] = $sumColCrit[$j]
? round($matrixCrit[$i][$j] / $sumColCrit[$j], 4)
: 0;
$rowSum += $normCrit[$i][$j];
}
$critWeights[$i] = round($rowSum / $n, 4);
}
// 4. Bobot alternatif per kriteria
$altWeights = [];
foreach ($ids as $cid) {
$row = $basisAhp[$cid] ?? [];
$totalCF = array_sum($row);
foreach ($jurusans as $aid => $_) {
$altWeights[$cid][$aid] = $totalCF
? round(($row[$aid] ?? 0) / $totalCF, 4)
: 0;
}
}
// 5. Hitung skor global
$globalScores = [];
foreach ($jurusans as $aid => $_) {
$s = 0;
foreach ($ids as $cid) {
$s += $critWeights[$cid] * ($altWeights[$cid][$aid] ?? 0);
}
$globalScores[$aid] = $s;
}
arsort($globalScores);
// Simpan ke database (Menambahkan data tanpa menghapus data lama)
if ($userId) {
// Menambahkan nilai UN tanpa memperbarui data yang sudah ada
foreach ($scores as $mid => $val) {
NilaiUn::create([
'user_id' => $userId,
'mapel_id' => $mid,
'nilai' => $val,
]);
}
// Menambahkan hasil AHP tanpa menghapus data sebelumnya
$rank = 1;
foreach ($globalScores as $aid => $s) {
HasilAhp::create([
'user_id' => $userId,
'jurusan_id' => $aid,
'score' => $s,
'ranking' => $rank++,
]);
}
}
// Render kembali view dengan data hasil
return view('user.new', compact(
'mapels','jurusans','basisAhp',
'matrixCrit','sumColCrit','normCrit','critWeights',
'altWeights','globalScores',
'ids'
));
}
}