169 lines
6.0 KiB
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'));
|
|
}
|
|
} |