141 lines
3.9 KiB
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'
|
|
));
|
|
}
|
|
|
|
}
|