TIF_E41212062/app/Http/Controllers/DiagnosaController.php

186 lines
6.6 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Diagnosa;
use App\Models\Gejala;
use App\Models\NilaiKeyakinanCF;
use App\Models\Penyakit;
use App\Models\Rule;
use Yajra\DataTables\Facades\DataTables;
class DiagnosaController extends Controller
{
public function __construct()
{
$this->middleware('auth');
parent::__construct();
}
public function index(Request $request)
{
if ($request->ajax()) {
$data = Diagnosa::with("data_penyakit")->latest();
return DataTables::of($data)
->addIndexColumn()
->addColumn('gejala', function ($data) {
$gejala = "";
$value_gejala = json_decode($data->code_gejala);
foreach ($value_gejala as $item) {
$model = Gejala::where("code", $item)->first();
if ($model) {
$gejala .= $model->code . '-' . $model->name . '<br>';
} else {
$gejala .= $item . '<br>';
}
}
return $gejala;
})
->addColumn('cf_user', function ($data) {
$cf_user = "";
$value_cfuser = json_decode($data->value_cf_user);
foreach ($value_cfuser as $item) {
$text = "";
if ($item == 1) {
$text = "Sangat Yakin";
} elseif ($item == 0.8) {
$text = "Yakin";
} else if ($item == 0.6) {
$text = "Cukup Yakin";
} elseif ($item == 0.4) {
$text = "Sedikit Yakin";
} elseif ($item == 0.2) {
$text = "Tidak Tahu";
} elseif ($item == 0) {
$text = "Tidak";
}
$cf_user .= $text . " ($item)" . '<br>';
}
return $cf_user;
})
->addColumn('result', function ($data) {
return $data->result . " %";
})
->addColumn('cf_pakar', function ($data) {
$cf_pakar = "";
$value_cfpakar = json_decode($data->value_cf_pakar);
foreach ($value_cfpakar as $item) {
$cf_pakar .= $item . '<br>';
}
return $cf_pakar;
})
->addColumn('image', function ($data) {
if ($data->data_penyakit->image) {
$url = $data->data_penyakit->image;
return '<a href="/storage/' . $url . '" target="_blank"><img src="' . asset("storage/$url") . '" style="width: 35px"></a>';
}
return '';
})
->addColumn('action', function ($data) {
return '<button type="button" class="btn btn-danger btn-rounded btn-fw p-2" id="delete" value="' . $data->id . '">Hapus</button>';
})
->rawColumns(['action', 'gejala', 'cf_user', 'cf_pakar', 'result', 'image'])
->make(true);
}
return view('diagnosa.index');
}
public function add()
{
$gejala = Gejala::all();
$nilaiKeyakinanCF = NilaiKeyakinanCF::orderBy("nilai", "desc")->get();
return view('diagnosa.create', compact('gejala', 'nilaiKeyakinanCF'));
}
public function proses(Request $request)
{
$gejalaDipilih = $request->input('gejala'); // Gejala yang dipilih user
$cfUserValues = $request->input('cf_user'); // Nilai CF User (0 - 1)
if (empty($gejalaDipilih)) {
return redirect()->route('diagnosa.index')->with('error', 'Silakan pilih minimal satu gejala.');
}
$cfPakarSaved = [];
$gejalaSaved = [];
$cfPakar = [];
$cfHE = [];
// Mengambil nilai CF dari pakar berdasarkan gejala yang dipilih
foreach ($gejalaDipilih as $key => $idGejala) {
$gejala = Gejala::find($idGejala);
if (!$gejala) continue;
$gejalaSaved[] = $gejala->code;
$cfPakar[$idGejala] = $gejala->value_cf_pakar;
$cfPakarSaved[] = $gejala->value_cf_pakar;
$cfHE[$idGejala] = $cfPakar[$idGejala] * $cfUserValues[$key];
}
// Menghitung CF Combine
$cfCombine = array_shift($cfHE);
foreach ($cfHE as $cf) {
$cfCombine = ($cfCombine + $cf) * (1 - $cfCombine);
}
$persen = $cfCombine * 100;
// Menentukan penyakit berdasarkan gejala
$penyakit = $this->deteksiPenyakit($gejalaDipilih);
// Simpan hasil ke database
$diagnosa = Diagnosa::create([
'code_gejala' => json_encode($gejalaSaved),
'value_cf_user' => json_encode($cfUserValues),
'value_cf_pakar' => json_encode($cfPakarSaved),
'result' => round($persen),
'id_penyakit' => $penyakit->id ?? 'null',
'penyakit' => $penyakit->name ?? 'Tidak Diketahui',
'solution' => $penyakit->solution ?? 'Tidak ada solusi'
]);
return redirect()->route('diagnosa.index')->with('success', 'Diagnosa berhasil dilakukan!');
}
private function deteksiPenyakit($gejalaDipilih)
{
$rules = Rule::whereIn('id_gejala', $gejalaDipilih)->get();
$penyakitTeridentifikasi = [];
foreach ($rules as $rule) {
$penyakitTeridentifikasi[$rule->id_penyakit] = ($penyakitTeridentifikasi[$rule->id_penyakit] ?? 0) + 1;
}
arsort($penyakitTeridentifikasi); // Urutkan penyakit berdasarkan gejala terbanyak
$idPenyakitTerbesar = key($penyakitTeridentifikasi);
return Penyakit::find($idPenyakitTerbesar);
}
public function delete(Request $request)
{
$id = $request->id;
$data = Diagnosa::findOrFail($id);
try {
$data->delete();
return response()->json(['status' => 'success', 'message' => 'Berhasil Menghapus Data']);
} catch (\Illuminate\Database\QueryException $ex) {
if ($ex->getCode() === '23000')
return response()->json(['status' => 'error', 'message' => 'Gagal Menghapus Data: Terdapat Ketergantungan Data.']);
} catch (\Throwable $e) {
return response()->json(['status' => 'error', 'message' => 'Terjadi Kesalahan: ' . $e->getMessage()]);
}
}
}