MIF_E31230333/app/Http/Controllers/DiagnosaController.php

103 lines
4.0 KiB
PHP

<?php
// ════════════════════════════════════════════════════════════════
// app/Http/Controllers/DiagnosaController.php
//
// KEGUNAAN: Controller untuk halaman konsultasi user.
// Menangani 3 halaman utama:
// 1. Tampilkan form checklist gejala (/konsultasi)
// 2. Proses diagnosa CF dan simpan hasil (/konsultasi/proses)
// 3. Tampilkan hasil diagnosa (/hasil/{id})
// 4. Tampilkan riwayat konsultasi (/riwayat)
// ════════════════════════════════════════════════════════════════
namespace App\Http\Controllers;
use App\Models\Gejala;
use App\Models\Konsultasi;
use App\Services\CertaintyFactorService;
use Illuminate\Http\Request;
class DiagnosaController extends Controller
{
public function __construct(private CertaintyFactorService $cfService) {}
// ── GET /konsultasi ───────────────────────────────────────
// Menampilkan halaman checklist gejala
public function index()
{
$semuaGejala = Gejala::orderBy('kode')->get();
// G01-G30 = Hama, G31-G60 = Penyakit
$gejalaHama = $semuaGejala->filter(fn($g) => (int) substr($g->kode, 1) <= 30);
$gejalaPenyakit = $semuaGejala->filter(fn($g) => (int) substr($g->kode, 1) > 30);
return view('user.konsultasi', compact('semuaGejala', 'gejalaHama', 'gejalaPenyakit'));
}
// ── POST /konsultasi/proses ───────────────────────────────
// Memproses gejala yang dipilih, menjalankan CF, simpan hasil
public function proses(Request $request)
{
$request->validate([
'gejala' => ['required', 'array', 'min:1'],
'gejala.*' => ['integer', 'exists:tbl_gejala,id'],
], [
'gejala.required' => 'Pilih minimal 1 gejala terlebih dahulu.',
'gejala.min' => 'Pilih minimal 1 gejala terlebih dahulu.',
]);
$gejalaIds = array_map('intval', $request->input('gejala'));
$cfUserMap = [];
// Jalankan mesin inferensi CF
$hasil = $this->cfService->hitung($gejalaIds, $cfUserMap);
if (isset($hasil['error'])) {
return back()->withErrors(['gejala' => $hasil['error']]);
}
// Gunakan user_id login, fallback ke 1 jika belum login
$userId = auth()->id() ?? 1;
$konsultasi = $this->cfService->simpan($userId, $gejalaIds, $cfUserMap, $hasil);
return redirect()->route('hasil.show', $konsultasi->id);
}
// ── GET /hasil/{id} ───────────────────────────────────────
// Menampilkan halaman hasil diagnosa
public function hasilShow(int $id)
{
$konsultasi = Konsultasi::with([
'hasilDiagnosa.penyakit.solusi',
'gejalaList.gejala',
])->findOrFail($id);
// Jika sudah login, pastikan hanya bisa lihat hasil sendiri
if (auth()->check() && $konsultasi->user_id !== auth()->id()) {
abort(403);
}
$gejalaIds = $konsultasi->gejalaList->pluck('id_gejala')->toArray();
$hasilInfer = $this->cfService->hitung($gejalaIds);
return view('user.hasil', compact('konsultasi', 'hasilInfer'));
}
// ── GET /riwayat ──────────────────────────────────────────
// Menampilkan riwayat konsultasi milik user yang login
public function riwayat()
{
$query = auth()->check()
? Konsultasi::where('user_id', auth()->id())
: Konsultasi::query();
$riwayat = $query
->with('hasilUtama.penyakit')
->latest('tanggal')
->paginate(10);
return view('user.riwayat', compact('riwayat'));
}
}