103 lines
4.0 KiB
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'));
|
|
}
|
|
}
|