TIF_E41220410/app/Http/Controllers/DiagnosisController.php

169 lines
6.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Models\Gejala;
use App\Models\Penyakit;
use App\Models\Aturan;
use App\Models\Diagnosa;
use App\Models\DetailDiagnosa;
class DiagnosisController extends Controller
{
public function index()
{
$gejala = Gejala::all();
return view('user.diagnosis', compact('gejala'));
}
public function proses(Request $request)
{
// =====================================================
// REVISI 2 & 3: Minimal 3 gejala + peringatan
// =====================================================
$request->validate([
'gejala' => 'required|array|min:3',
'gejala.*' => 'string'
], [
'gejala.min' => '⚠️ PERINGATAN: Anda harus memilih minimal 3 gejala untuk melakukan diagnosis sesuai dengan rule base yang telah ditetapkan pakar.'
]);
$kodeGejalaDipilih = $request->gejala;
$cfUser = $request->cf_user;
$gejalaDipilih = Gejala::whereIn('kode', $kodeGejalaDipilih)->get();
if ($gejalaDipilih->count() == 0) {
return view('user.hasil', [
'hasil' => null,
'pesan' => 'Gejala tidak ditemukan.',
'gejalaDipilih' => collect()
]);
}
$gejalaIds = $gejalaDipilih->pluck('id')->toArray();
// =====================================================
// AMBIL SEMUA ATURAN
// =====================================================
$semuaAturan = Aturan::all();
$aturanPerPenyakit = [];
foreach ($semuaAturan as $aturan) {
$aturanPerPenyakit[$aturan->penyakit_id][] = $aturan->gejala_id;
}
// =====================================================
// REVISI 1: AND LOGIC - Rule hanya aktif jika SEMUA gejala terpenuhi
// =====================================================
$hasil = null;
$nilaiTertinggi = 0;
foreach ($aturanPerPenyakit as $penyakitId => $gejalaRequired) {
// CEK APAKAH SEMUA GEJALA YANG DIBUTUHKAN ADA
$semuaGejalaTerpenuhi = true;
foreach ($gejalaRequired as $gejalaId) {
if (!in_array($gejalaId, $gejalaIds)) {
$semuaGejalaTerpenuhi = false;
break;
}
}
// =====================================================
// HANYA PROSES JIKA SEMUA GEJALA TERPENUHI (RULE AKTIF)
// JIKA TIDAK, RULE DIABAIKAN (TIDAK DIHITUNG CF-NYA)
// =====================================================
if ($semuaGejalaTerpenuhi) {
$cfGabungan = 0;
foreach ($gejalaRequired as $gejalaId) {
$aturan = Aturan::where('penyakit_id', $penyakitId)
->where('gejala_id', $gejalaId)
->first();
if ($aturan) {
$kodeGejala = Gejala::find($gejalaId)->kode;
$cfUserValue = isset($cfUser[$kodeGejala]) ? (float) $cfUser[$kodeGejala] : 0;
$cf = $aturan->cf_pakar * $cfUserValue;
if ($cfGabungan == 0) {
$cfGabungan = $cf;
} else {
$cfGabungan = $cfGabungan + ($cf * (1 - $cfGabungan));
}
}
}
$nilai = $cfGabungan * 100;
if ($nilai > $nilaiTertinggi) {
$nilaiTertinggi = $nilai;
$hasil = Penyakit::find($penyakitId);
}
}
// =====================================================
// JIKA TIDAK TERPENUHI: rule DIABAIKAN (tidak ada perhitungan)
// =====================================================
}
// =====================================================
// HASIL DIAGNOSA
// =====================================================
if ($hasil == null) {
return view('user.hasil', [
'hasil' => null,
'pesan' => '⚠️ Tidak ditemukan penyakit yang sesuai. Pastikan gejala yang Anda pilih MEMENUHI SEMUA KRITERIA penyakit yang telah ditetapkan pakar. Contoh: Untuk penyakit Bulai, Anda harus memilih G1, G2, G3, G4 secara lengkap.',
'gejalaDipilih' => $gejalaDipilih
]);
}
return view('user.hasil', [
'hasil' => $hasil,
'gejalaDipilih' => $gejalaDipilih,
'persentase' => $nilaiTertinggi
]);
}
public function simpan(Request $request)
{
$request->validate([
'penyakit_id' => 'required|integer|exists:penyakit,id',
'cf_hasil' => 'required|numeric',
'gejala_id' => 'required|array|min:3',
'gejala_id.*' => 'integer|exists:gejala,id',
'cf_user' => 'required|array'
]);
$diagnosa = Diagnosa::create([
'pengguna_id' => Auth::id(),
'penyakit_id' => $request->penyakit_id,
'cf_hasil' => $request->cf_hasil,
'tanggal' => now()
]);
foreach ($request->gejala_id as $gid) {
DetailDiagnosa::create([
'diagnosa_id' => $diagnosa->id,
'gejala_id' => $gid,
'cf_user' => $request->cf_user[$gid] ?? 0
]);
}
return redirect()->route('riwayat')
->with('success', 'Diagnosa berhasil disimpan.');
}
public function riwayat()
{
$riwayat = Diagnosa::where('pengguna_id', Auth::id())
->with(['penyakit', 'detailDiagnosa.gejala'])
->orderBy('tanggal', 'desc')
->get();
return view('user.riwayat', compact('riwayat'));
}
}