SPK-Lahan-Tanaman-Cabai-SAW/app/Http/Controllers/PerhitunganController.php

259 lines
12 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use App\Models\Kriteria;
use App\Models\Penilaian;
use App\Models\Alternatif;
use App\Models\SubKriteria;
use App\Models\MemberKelompokTani;
use App\Models\HistorisPerhitungan;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class PerhitunganController extends Controller
{
public function index()
{
$user = Auth::user();
$kriterias = Kriteria::with('subkriterias')->get();
$penilaians = Penilaian::with('subkriteria')->get();
// Ambil alternatif sesuai role
if ($user->role === 'super_admin') {
$alternatifs = Alternatif::all();
} elseif ($user->role === 'admin') {
$member = MemberKelompokTani::where('user_id', $user->id)->first();
if ($member) {
$userIds = MemberKelompokTani::where('kelompok_tani_id', $member->kelompok_tani_id)->pluck('user_id');
$alternatifs = Alternatif::whereIn('user_id', $userIds)->get();
} else {
$alternatifs = collect(); // kosong jika admin belum terdaftar di kelompok
}
} else {
$alternatifs = Alternatif::where('user_id', $user->id)->get();
}
// STEP 1: ANALISA (nilai asli)
$analisa = [];
foreach ($alternatifs as $alt) {
$row = ['nama_lahan' => $alt->nama_lahan];
foreach ($kriterias as $krit) {
$penilaian = $penilaians->where('alternatif_id', $alt->id)
->where('kriteria_id', $krit->id)
->first();
$nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0;
$row[$krit->nama_kriteria] = $nilai;
}
$analisa[] = $row;
}
// STEP 2: MAX / MIN untuk normalisasi
$maxValues = [];
$minValues = [];
foreach ($kriterias as $krit) {
$nilaiList = [];
foreach ($alternatifs as $alt) {
$penilaian = $penilaians->where('alternatif_id', $alt->id)
->where('kriteria_id', $krit->id)
->first();
$nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0;
$nilaiList[] = $nilai;
}
$maxValues[$krit->nama_kriteria] = !empty($nilaiList) ? max($nilaiList) : 0;
$minValues[$krit->nama_kriteria] = !empty($nilaiList) ? min($nilaiList) : 0;
}
// STEP 3: Normalisasi
$normalisasi = [];
foreach ($alternatifs as $alt) {
$row = ['nama_lahan' => $alt->nama_lahan];
foreach ($kriterias as $krit) {
$penilaian = $penilaians->where('alternatif_id', $alt->id)
->where('kriteria_id', $krit->id)
->first();
$nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0;
$max = $maxValues[$krit->nama_kriteria] ?? 0;
$min = $minValues[$krit->nama_kriteria] ?? 0;
if ($krit->jenis === 'Benefit') {
$normal = $max != 0 ? $nilai / $max : 0;
} else {
$normal = $nilai != 0 ? $min / $nilai : 0;
}
$row[$krit->nama_kriteria] = round($normal, 4);
}
$normalisasi[] = $row;
}
// STEP 4: Konversi bobot
$bobotDesimal = [];
foreach ($kriterias as $krit) {
$bobotDesimal[$krit->nama_kriteria] = $krit->bobot / 100;
}
// STEP 5: Hitung Ranking
$ranking = [];
foreach ($alternatifs as $alt) {
$skor = 0;
$saran = [];
foreach ($kriterias as $krit) {
$penilaian = $penilaians->where('alternatif_id', $alt->id)
->where('kriteria_id', $krit->id)
->first();
$nilai = $penilaian && $penilaian->subkriteria ? $penilaian->subkriteria->bobot : 0;
$normal = 0;
if ($krit->jenis === 'Benefit') {
$max = $maxValues[$krit->nama_kriteria] ?? 0;
$normal = $max != 0 ? $nilai / $max : 0;
} else {
$min = $minValues[$krit->nama_kriteria] ?? 0;
$normal = $nilai != 0 ? $min / $nilai : 0;
}
$skor += $normal * ($krit->bobot / 100);
$sub = $penilaian?->subkriteria;
if ($sub) {
switch (strtolower($krit->nama_kriteria)) {
case 'curah hujan':
if ($sub->nama_sub_kriteria === '51 100 mm') {
$saran[] = "Curah hujan optimal untuk budidaya cabai. Tidak perlu intervensi tambahan terhadap sistem irigasi.";
} elseif ($sub->nama_sub_kriteria === '101 200 mm') {
$saran[] = "Curah hujan cukup tinggi. Pastikan drainase lahan baik agar akar tanaman tidak tergenang.";
} elseif ($sub->nama_sub_kriteria === '201 300 mm') {
$saran[] = "Curah hujan tinggi. Disarankan menggunakan bedengan tinggi dan sistem saluran air yang efisien untuk mencegah kebusukan akar.";
} elseif ($sub->nama_sub_kriteria === '< 50 atau > 300 mm') {
$saran[] = "Curah hujan ekstrem (terlalu rendah atau terlalu tinggi). Perlu sistem irigasi tambahan saat kering, dan peneduh serta drainase baik saat musim hujan.";
}
break;
case 'ph tanah':
if ($sub->nama_sub_kriteria === '6.0 6.8') {
$saran[] = "pH tanah berada dalam rentang optimal untuk tanaman cabai. Tidak perlu tindakan korektif.";
} elseif ($sub->nama_sub_kriteria === '5.5 5.9 atau 6.9 7.2') {
$saran[] = "pH tanah mendekati optimal, namun tetap disarankan memantau kondisi dan menyesuaikan dengan jenis varietas cabai.";
} elseif ($sub->nama_sub_kriteria === '5.0 5.4 atau 7.3 7.5') {
$saran[] = "pH tanah cukup menyimpang dari kondisi ideal. Pertimbangkan untuk menambahkan dolomit (kapur pertanian) atau belerang sesuai kebutuhan.";
} elseif ($sub->nama_sub_kriteria === '< 5.0 atau > 7.5') {
$saran[] = "pH tanah terlalu ekstrem untuk budidaya cabai. Lakukan koreksi tanah secara bertahap dan intensif untuk menyesuaikan ke tingkat netral.";
}
break;
case 'tekstur tanah':
if ($sub->nama_sub_kriteria === 'Lempung Berpasir') {
$saran[] = "Tekstur tanah sangat ideal untuk cabai. Sirkulasi udara dan drainase baik. Tidak perlu perbaikan.";
} elseif ($sub->nama_sub_kriteria === 'Lempung') {
$saran[] = "Tanah masih baik untuk cabai, meskipun perlu perhatian pada drainase terutama saat musim hujan.";
} elseif ($sub->nama_sub_kriteria === 'Lempung Liat') {
$saran[] = "Tanah agak berat, sebaiknya diberi bahan organik (kompos/pupuk kandang) untuk meningkatkan porositas.";
} elseif ($sub->nama_sub_kriteria === 'Berpasir Kasar atau Liat Berat') {
$saran[] = "Tekstur tanah kurang sesuai. Tambahkan bahan organik atau lakukan pencampuran tanah untuk meningkatkan struktur.";
}
break;
case 'temperatur':
if ($sub->nama_sub_kriteria === '24 - 28 °C') {
$saran[] = "Temperatur sangat ideal untuk pertumbuhan cabai. Tidak diperlukan tindakan tambahan.";
} elseif ($sub->nama_sub_kriteria === '29 32 °C atau 17 23 °C') {
$saran[] = "Temperatur cukup mendukung, namun pemantauan kelembapan tanah dan penyiraman teratur disarankan.";
} elseif ($sub->nama_sub_kriteria === '33 34 °C atau 14 16 °C') {
$saran[] = "Temperatur cenderung ekstrem, pertimbangkan penggunaan naungan atau penghangat untuk menstabilkan suhu.";
} elseif ($sub->nama_sub_kriteria === '> 34 °C atau < 14 °C') {
$saran[] = "Temperatur tidak cocok untuk cabai. Disarankan memilih tanaman yang lebih tahan suhu ekstrem atau melakukan penyesuaian mikroklimat.";
}
break;
case 'kelembapan':
if ($sub->nama_sub_kriteria === '60 80%') {
$saran[] = "Kelembapan sangat ideal untuk pertumbuhan cabai. Tidak diperlukan penyesuaian.";
} elseif ($sub->nama_sub_kriteria === '50 59%') {
$saran[] = "Kelembapan cukup baik, namun tetap jaga irigasi agar tetap stabil.";
} elseif ($sub->nama_sub_kriteria === '40 49%') {
$saran[] = "Kelembapan mulai rendah. Disarankan untuk meningkatkan frekuensi penyiraman atau memasang mulsa.";
} elseif ($sub->nama_sub_kriteria === '< 40% atau > 80%') {
$saran[] = "Kelembapan ekstrem. Perlu pengaturan irigasi atau drainase agar kondisi tanah sesuai kebutuhan cabai.";
}
break;
case 'tanaman sebelumnya':
if ($sub->nama_sub_kriteria === 'Padi, Jagung, Tebu, Bawang') {
$saran[] = "Tanaman sebelumnya sangat ideal. Lahan dalam kondisi baik untuk ditanami cabai.";
} elseif ($sub->nama_sub_kriteria === 'Bayam, Sawi, Kacang Tanah') {
$saran[] = "Tanaman sebelumnya cukup baik. Disarankan untuk melakukan pemupukan awal sebelum tanam cabai.";
} elseif ($sub->nama_sub_kriteria === 'Tomat, Terong, Tembakau') {
$saran[] = "Tanaman sebelumnya masih satu keluarga dengan cabai. Waspadai penyakit yang mungkin tertinggal di tanah.";
} elseif ($sub->nama_sub_kriteria === 'Semua Jenis Tanaman Cabai') {
$saran[] = "Tidak disarankan menanam cabai secara berulang. Rotasi tanaman diperlukan untuk mencegah resistensi penyakit.";
}
break;
}
}
}
$ranking[] = [
'nama_lahan' => $alt->nama_lahan,
'nilai_akhir' => round($skor, 4),
'rekomendasi' => $saran,
];
}
$ranking = collect($ranking)->sortByDesc('nilai_akhir')->values()->map(function ($item, $index) {
$item['ranking'] = $index + 1;
return $item;
})->toArray();
return view('admin.perhitungan', [
'analisa' => $analisa,
'normalisasi' => $normalisasi,
'ranking' => $ranking,
'kriterias' => $kriterias,
'title' => 'Perhitungan SAW',
]);
}
public function simpanKeHistoris(Request $request)
{
$user = Auth::user();
$hasilPerhitungan = $request->input('hasil');
$periode = Carbon::now()->format('Y-m');
foreach ($hasilPerhitungan as $hasil) {
HistorisPerhitungan::create([
'nama_lahan' => $hasil['nama_lahan'],
'user_id' => $user->id,
'nilai_akhir' => $hasil['nilai_akhir'],
'periode' => $periode,
]);
}
return redirect()->back()->with('success', 'Hasil perhitungan berhasil disimpan ke historis!');
}
public function historis()
{
$user = Auth::user();
if ($user->role === 'super_admin') {
$hasil_perhitungan = HistorisPerhitungan::all();
} elseif ($user->role === 'admin') {
$member = MemberKelompokTani::where('user_id', $user->id)->first();
if ($member) {
$userIds = MemberKelompokTani::where('kelompok_tani_id', $member->kelompok_tani_id)
->pluck('user_id');
$hasil_perhitungan = HistorisPerhitungan::whereIn('user_id', $userIds)->get();
} else {
$hasil_perhitungan = collect(); // kosong
}
} else {
$hasil_perhitungan = HistorisPerhitungan::where('user_id', $user->id)->get();
}
return view('admin.historis', [
'hasil_perhitungan' => $hasil_perhitungan,
'title' => 'Riwayat Perhitungan SAW',
]);
}
}