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')); } }