186 lines
6.6 KiB
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()]);
|
|
}
|
|
}
|
|
}
|