MIF_E31230333/app/Http/Controllers/User/KonsultasiController.php

112 lines
3.5 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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')); }
}