112 lines
3.5 KiB
PHP
112 lines
3.5 KiB
PHP
<?php
|
||
|
||
namespace App\Http\Controllers\User;
|
||
|
||
use App\Http\Controllers\Controller;
|
||
use App\Models\Konsultasi;
|
||
use App\Models\Gejala;
|
||
use App\Models\Rule;
|
||
use App\Models\HasilDiagnosa;
|
||
use Illuminate\Http\Request;
|
||
use Illuminate\Support\Str;
|
||
|
||
class KonsultasiController extends Controller
|
||
{
|
||
public function index()
|
||
{
|
||
// Gejala dikelompokkan berdasarkan bagian tanaman
|
||
// Sesuaikan kolom 'bagian' dengan struktur tabel gejala kamu
|
||
// Jika tidak ada kolom bagian, ganti dengan logika lain
|
||
|
||
$gejalaDaun = Gejala::where('bagian', 'daun')->orderBy('nama')->get();
|
||
$gejalaBatang = Gejala::where('bagian', 'batang')->orderBy('nama')->get();
|
||
$gejalaLain = Gejala::where('bagian', 'seluruh')->orWhereNull('bagian')->orderBy('nama')->get();
|
||
$gejalaBuah = Gejala::where('bagian', 'buah')->orderBy('nama')->get();
|
||
|
||
return view('user.index', compact('gejalaDaun', 'gejalaBatang', 'gejalaLain', 'gejalaBuah')); }
|
||
|
||
public function store(Request $request)
|
||
{
|
||
$request->validate([
|
||
'gejala' => ['required', 'array', 'min:1'],
|
||
'gejala.*' => ['exists:tbl_gejala,id'],
|
||
'cf_user' => ['required', 'array'],
|
||
'cf_user.*' => ['required', 'numeric', 'min:0.1', 'max:1'],
|
||
]);
|
||
|
||
$gejalaIds = array_map('intval', $request->gejala);
|
||
$cfUserInput = [];
|
||
foreach ($request->cf_user as $k => $v) {
|
||
$cfUserInput[(int)$k] = (float)$v;
|
||
}
|
||
|
||
$rules = Rule::whereIn('id_gejala', $gejalaIds)->with('penyakit')->get();
|
||
|
||
// CF combine per penyakit
|
||
$cfPerPenyakit = [];
|
||
|
||
foreach ($rules as $rule) {
|
||
$idPenyakit = $rule->id_penyakit;
|
||
$idGejala = $rule->id_gejala;
|
||
$cfUser = $cfUserInput[(int)$idGejala] ?? 0.5;
|
||
$cfPakar = $rule->nilai_cf;
|
||
|
||
// CF gejala = CF user × CF pakar
|
||
$cfGejala = $cfUser * $cfPakar;
|
||
|
||
if (!isset($cfPerPenyakit[$idPenyakit])) {
|
||
$cfPerPenyakit[$idPenyakit] = 0;
|
||
}
|
||
|
||
// CF combine = CF old + CF gejala × (1 - CF old)
|
||
$cfOld = $cfPerPenyakit[$idPenyakit];
|
||
$cfPerPenyakit[$idPenyakit] = $cfOld + $cfGejala * (1 - $cfOld);
|
||
}
|
||
|
||
// Buat record konsultasi
|
||
$konsultasi = Konsultasi::create([
|
||
'user_id' => auth()->id(),
|
||
'kode_konsultasi' => 'KST-' . strtoupper(Str::random(8)),
|
||
'tanggal' => now(),
|
||
'status' => count($cfPerPenyakit) > 0 ? 'selesai' : 'tidak_terdeteksi',
|
||
]);
|
||
|
||
// Simpan gejala
|
||
$attachData = [];
|
||
foreach ($gejalaIds as $idGejala) {
|
||
$attachData[$idGejala] = [
|
||
'cf_user' => $cfUserInput[(int)$idGejala] ?? 0.5
|
||
];
|
||
}
|
||
$konsultasi->gejala()->attach($attachData);
|
||
|
||
// Simpan hasil diagnosa
|
||
arsort($cfPerPenyakit);
|
||
$ranking = 1;
|
||
foreach ($cfPerPenyakit as $idPenyakit => $cf) {
|
||
if ($cf <= 0) continue;
|
||
HasilDiagnosa::create([
|
||
'id_konsultasi' => $konsultasi->id,
|
||
'id_penyakit' => $idPenyakit,
|
||
'nilai_cf_akhir' => round($cf, 4),
|
||
'persentase' => round($cf * 100, 2),
|
||
'ranking' => $ranking++,
|
||
]);
|
||
}
|
||
|
||
return redirect()->route('konsultasi.show', $konsultasi->id)
|
||
->with('success', 'Diagnosa berhasil! Berikut hasil analisis tanamanmu.');
|
||
}
|
||
|
||
public function show($id)
|
||
{
|
||
$konsultasi = Konsultasi::with([
|
||
'hasilDiagnosa.penyakit',
|
||
'hasilUtama.penyakit',
|
||
'gejala',
|
||
])->where('user_id', auth()->id())
|
||
->findOrFail($id);
|
||
|
||
return view('user.show', compact('konsultasi')); }
|
||
}
|