MIF_E31230333/app/Http/Controllers/Admin/RuleController.php

148 lines
4.8 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Rule;
use App\Models\Penyakit;
use App\Models\Gejala;
use Illuminate\Http\Request;
class RuleController extends Controller
{
// Tentukan nilai pakar dari nilai CF
private function nilaiPakarDariCF(float $cf): int
{
if ($cf <= 0.2) return 1;
if ($cf <= 0.4) return 2;
if ($cf <= 0.6) return 3;
if ($cf <= 0.8) return 4;
return 5;
}
// Tampilkan daftar semua rule
public function index()
{
$rules = Rule::with(['penyakit', 'gejala'])
->when(request('penyakit_id'), fn($q) =>
$q->where('id_penyakit', request('penyakit_id'))
)
->when(request('search'), fn($q) =>
$q->where('kode_rule', 'like', '%' . request('search') . '%')
)
->orderBy('kode_rule')
->paginate(15);
$semuaPenyakit = Penyakit::orderBy('kode')->get();
return view('admin.rule.index', compact('rules', 'semuaPenyakit'));
}
// Tampilkan form tambah rule
public function create()
{
$penyakit = Penyakit::orderBy('kode')->get();
$gejala = Gejala::orderBy('kode')->get();
return view('admin.rule.form', compact('penyakit', 'gejala'));
}
// Simpan rule baru
public function store(Request $request)
{
$request->validate([
'id_penyakit' => 'required|exists:tbl_penyakit,id',
'id_gejala' => 'required|exists:tbl_gejala,id',
'nilai_mb' => 'required|numeric|min:0|max:1',
'nilai_md' => 'required|numeric|min:0|max:1',
], [
'id_penyakit.required' => 'Pilih penyakit terlebih dahulu.',
'id_gejala.required' => 'Pilih gejala terlebih dahulu.',
'nilai_mb.required' => 'Nilai MB wajib diisi.',
'nilai_md.required' => 'Nilai MD wajib diisi.',
]);
// Cek kombinasi penyakit-gejala sudah ada
$sudahAda = Rule::where('id_penyakit', $request->id_penyakit)
->where('id_gejala', $request->id_gejala)
->exists();
if ($sudahAda) {
return back()->withErrors(['id_gejala' => 'Rule untuk kombinasi penyakit dan gejala ini sudah ada.']);
}
// Hitung CF dan nilai pakar otomatis
$mb = (float) $request->nilai_mb;
$md = (float) $request->nilai_md;
$cf = round($mb - $md, 4);
$pakar = $this->nilaiPakarDariCF($cf);
// Auto-generate kode rule jika kosong
$kodeRule = $request->kode_rule;
if (empty($kodeRule)) {
$lastRule = Rule::orderByDesc('id')->first();
$nextNum = $lastRule ? (intval(substr($lastRule->kode_rule, 1)) + 1) : 1;
$kodeRule = 'R' . str_pad($nextNum, 3, '0', STR_PAD_LEFT);
}
Rule::create([
'kode_rule' => strtoupper($kodeRule),
'id_penyakit' => $request->id_penyakit,
'id_gejala' => $request->id_gejala,
'nilai_mb' => $mb,
'nilai_md' => $md,
'nilai_cf' => $cf,
'nilai_pakar' => $pakar,
]);
return redirect()->route('admin.rule.index')
->with('success', 'Rule "' . $kodeRule . '" berhasil ditambahkan.');
}
// Tampilkan form edit rule
public function edit(Rule $rule)
{
$penyakit = Penyakit::orderBy('kode')->get();
$gejala = Gejala::orderBy('kode')->get();
return view('admin.rule.form', compact('rule', 'penyakit', 'gejala'));
}
// Update rule
public function update(Request $request, Rule $rule)
{
$request->validate([
'id_penyakit' => 'required|exists:tbl_penyakit,id',
'id_gejala' => 'required|exists:tbl_gejala,id',
'nilai_mb' => 'required|numeric|min:0|max:1',
'nilai_md' => 'required|numeric|min:0|max:1',
]);
// Hitung CF dan nilai pakar otomatis
$mb = (float) $request->nilai_mb;
$md = (float) $request->nilai_md;
$cf = round($mb - $md, 4);
$pakar = $this->nilaiPakarDariCF($cf);
$rule->update([
'id_penyakit' => $request->id_penyakit,
'id_gejala' => $request->id_gejala,
'nilai_mb' => $mb,
'nilai_md' => $md,
'nilai_cf' => $cf,
'nilai_pakar' => $pakar,
]);
return redirect()->route('admin.rule.index')
->with('success', 'Rule "' . $rule->kode_rule . '" berhasil diperbarui.');
}
// Hapus rule
public function destroy(Rule $rule)
{
$kode = $rule->kode_rule;
$rule->delete();
return redirect()->route('admin.rule.index')
->with('success', 'Rule "' . $kode . '" berhasil dihapus.');
}
}