118 lines
4.1 KiB
PHP
118 lines
4.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Balita;
|
|
use App\Models\dataBalita;
|
|
use App\Models\Kriteria;
|
|
use App\Models\Nilai;
|
|
use Illuminate\Http\Request;
|
|
|
|
class ProsesPerhitunganController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$balita = Balita::all();
|
|
$kriteria = Kriteria::all();
|
|
$nilai = Nilai::all();
|
|
|
|
$output = [];
|
|
|
|
// mendapatkan nilai maksimum dari setiap kdKriteria
|
|
$maxNilaiByKriteria = $nilai->groupBy('kdKriteria')->map(function ($grouped) {
|
|
return $grouped->max('nilai');
|
|
});
|
|
|
|
// Loop untuk mengumpulkan data untuk setiap balita
|
|
foreach ($balita as $b) {
|
|
$kdbalita = $b->kdbalita;
|
|
$namaBalita = $b->balita;
|
|
|
|
// Mengonversi nilai-nilai balita terpilih ke dalam bentuk array
|
|
$nilaiBalita = $nilai->where('kdbalita', $kdbalita)->toArray();
|
|
|
|
// Normalisasi nilai berdasarkan nilai maksimum untuk setiap kdKriteria
|
|
$normalizedNilai = array_map(function ($nilaiItem) use ($kriteria, $maxNilaiByKriteria) {
|
|
$matchingKriteria = $kriteria->where('kdKriteria', $nilaiItem['kdKriteria'])->first();
|
|
|
|
if ($matchingKriteria) {
|
|
$kdKriteria = $matchingKriteria->kdKriteria;
|
|
|
|
// Normalisasi nilai menggunakan nilai maksimum yang sesuai untuk setiap kdKriteria
|
|
$maxValueForKriteria = $maxNilaiByKriteria->get($kdKriteria);
|
|
if ($maxValueForKriteria) {
|
|
$normalizedValue = $nilaiItem['nilai'] / $maxValueForKriteria;
|
|
}
|
|
|
|
$nilaiItem['bobot'] = $matchingKriteria->bobot;
|
|
$nilaiItem['kriteria'] = $matchingKriteria->kriteria;
|
|
$nilaiItem['normalized'] = $normalizedValue;
|
|
$nilaiItem['nilaimaximum'] = $maxValueForKriteria;
|
|
$nilaiItem['nilai_preferensi'] = $normalizedValue * $nilaiItem['bobot'];
|
|
}
|
|
return $nilaiItem;
|
|
}, $nilaiBalita);
|
|
|
|
// Menghitung total preferensi untuk balita
|
|
$totalPreferensi = array_sum(array_column($normalizedNilai, 'nilai_preferensi'));
|
|
|
|
// Menentukan kategori gizi
|
|
if ($totalPreferensi > 90) {
|
|
$kategoriGizi = 'Gizi Baik';
|
|
} elseif ($totalPreferensi >= 81 && $totalPreferensi <= 90) {
|
|
$kategoriGizi = 'Gizi Sedang';
|
|
} elseif ($totalPreferensi >= 71 && $totalPreferensi <= 80) {
|
|
$kategoriGizi = 'Gizi Kurang';
|
|
} else {
|
|
$kategoriGizi = 'Gizi Buruk';
|
|
}
|
|
|
|
// Get additional data
|
|
$tanggal_timbang = dataBalita::where('nama_balita', $namaBalita)->value('tanggal_timbang');
|
|
$berat_badan = dataBalita::where('nama_balita', $namaBalita)->value('berat_badan');
|
|
$tinggi_badan = dataBalita::where('nama_balita', $namaBalita)->value('tinggi_badan');
|
|
|
|
// Menambahkan hasil kategori gizi tanpa melakukan perankingan
|
|
$output[] = [
|
|
'kdbalita' => $kdbalita,
|
|
'nama_balita' => $namaBalita,
|
|
'nilai' => $nilaiBalita,
|
|
'berat_badan' => $berat_badan,
|
|
'tinggi_badan' => $tinggi_badan,
|
|
'tanggal_timbang' => $tanggal_timbang,
|
|
'normalized_nilai' => $normalizedNilai,
|
|
'total_preferensi' => $totalPreferensi,
|
|
'kategori_gizi' => $kategoriGizi,
|
|
];
|
|
}
|
|
|
|
// Mengurutkan hasil berdasarkan total preferensi
|
|
usort($output, function ($a, $b) {
|
|
return $b['total_preferensi'] <=> $a['total_preferensi'];
|
|
});
|
|
|
|
// Menambahkan peringkat ke output
|
|
$currentRank = 1;
|
|
$previousTotalPreferensi = null;
|
|
foreach ($output as &$item) {
|
|
// Mengatur peringkat hanya ketika total preferensi berbeda dari entri sebelumnya
|
|
if ($item['total_preferensi'] !== $previousTotalPreferensi) {
|
|
$item['ranking'] = $currentRank;
|
|
}
|
|
|
|
// Increment the rank
|
|
$currentRank++;
|
|
}
|
|
|
|
// Mengurutkan hasil berdasarkan kdbalita
|
|
usort($output, function ($a, $b) {
|
|
return $a['kdbalita'] <=> $b['kdbalita'];
|
|
});
|
|
|
|
return view('pages.proses.index', [
|
|
'output' => $output,
|
|
]);
|
|
}
|
|
|
|
}
|