242 lines
7.9 KiB
PHP
242 lines
7.9 KiB
PHP
<?php
|
|
|
|
namespace Modules\User\Http\Controllers;
|
|
|
|
use Illuminate\Contracts\Support\Renderable;
|
|
use Illuminate\Routing\Controller;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Collection;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Illuminate\Support\Facades\Storage;
|
|
use Illuminate\Support\Str;
|
|
|
|
use App\Models\Gejala;
|
|
use App\Models\Penyakit;
|
|
use App\Models\Riwayat;
|
|
use App\Models\Rule;
|
|
use App\Models\User;
|
|
|
|
use DataTables;
|
|
use GuzzleHttp\Client;
|
|
use Carbon\Carbon;
|
|
|
|
class UserController extends Controller
|
|
{
|
|
public function index()
|
|
{
|
|
$data = [
|
|
'subtitle' => 'Diagnosa',
|
|
];
|
|
|
|
$gejala = Gejala::all();
|
|
return view('user::index', compact('data', 'gejala'));
|
|
}
|
|
|
|
public function profile()
|
|
{
|
|
$data = [
|
|
'subtitle' => 'Akun anda',
|
|
];
|
|
|
|
return view('user::setting', compact('data'));
|
|
}
|
|
|
|
public function riwayat(Request $request)
|
|
{
|
|
if ($request->ajax()) {
|
|
$data = Riwayat::where('id_user', user()->id)->get();
|
|
// Convert the Eloquent Collection to a regular PHP array
|
|
$data->each(function ($item, $key) {
|
|
$item->rowIndex = $key + 1;
|
|
});
|
|
|
|
return Datatables::of($data)
|
|
->addIndexColumn()
|
|
->addColumn('title-post', function($row){
|
|
$text = '
|
|
<p class="mb-0">' . $row->gejala . '</p>
|
|
';
|
|
return $text;
|
|
})
|
|
->addColumn('jenis_gejala', function($row){
|
|
return $row->gejala;
|
|
})
|
|
->addColumn('tingkat', function($row){
|
|
return "<span class='text-success'>{$row->persen}%</span>";
|
|
})
|
|
->addColumn('link_youtube', function($row){
|
|
$checkSolusi = Penyakit::where('nama_penyakit', $row->penyakit)->first();
|
|
if($checkSolusi === NULL) {
|
|
return '-';
|
|
} else {
|
|
return $checkSolusi->youtube;
|
|
}
|
|
})
|
|
->addColumn('penjelasan', function($row){
|
|
return $row->solusi->penjelasan;
|
|
})
|
|
->addColumn('waktu_diagnosa', function($row){
|
|
return Carbon::parse($row->waktu)->format('j F Y H:i:s');
|
|
})
|
|
->rawColumns(['title-post', 'jenis_gejala', 'tingkat', 'link_youtube', 'waktu_diagnosa', 'penjelasan'])
|
|
->make(true);
|
|
}
|
|
|
|
$data = [
|
|
'subtitle' => 'Riwayat Diagnosa'
|
|
];
|
|
|
|
return view('user::riwayat.index', compact('data'));
|
|
}
|
|
|
|
public function update(Request $request)
|
|
{
|
|
$id = user()->id;
|
|
$validator = Validator::make($request->all(), [
|
|
'name' => 'required',
|
|
'email' => 'required',
|
|
]);
|
|
|
|
if ($validator->fails()) {
|
|
return redirect()->back()->with('error', $validator->errors()->first())->withInput();
|
|
}
|
|
|
|
$input = $request->all();
|
|
$findUser = User::find($id);
|
|
|
|
if($findUser) {
|
|
// update data
|
|
$findUser->name = $input['name'];
|
|
$findUser->email = $input['email'];
|
|
if(!empty($input['password'])) {
|
|
$findUser->password = bcrypt($input['password']);
|
|
}
|
|
|
|
// save data
|
|
$findUser->save();
|
|
return redirect()->back()->with('success', 'Successfully update data');
|
|
} else {
|
|
return redirect()->back()->with('error', 'Unexpected error');
|
|
}
|
|
}
|
|
|
|
public function diagnosa(Request $request)
|
|
{
|
|
$gejalaInput = $request->input('gejala');
|
|
if (empty($gejalaInput)) {
|
|
return redirect()->back()->with('error', 'Gagal! Anda belum memilih gejala yang dialami!.');
|
|
}
|
|
|
|
// Inisialisasi variabel untuk menyimpan hasil inferensi
|
|
$result = array();
|
|
|
|
// Inisialisasi variabel untuk menyimpan jumlah gejala pada setiap penyakit
|
|
$gejalaCount = array();
|
|
|
|
foreach ($gejalaInput as $kodeGejala) {
|
|
// Ambil aturan berdasarkan kode gejala
|
|
$aturan = Rule::where('kode_gejala', 'LIKE', '%' . $kodeGejala . '%')->get();
|
|
|
|
foreach ($aturan as $rule) {
|
|
$kodePenyakit = $rule['kode_penyakit'];
|
|
|
|
// Tambahkan jumlah gejala pada penyakit jika belum ada
|
|
if (!isset($gejalaCount[$kodePenyakit])) {
|
|
$gejalaCount[$kodePenyakit] = 1;
|
|
} else {
|
|
$gejalaCount[$kodePenyakit] += 1;
|
|
}
|
|
|
|
// Cek apakah penyakit sudah ada dalam hasil inferensi
|
|
if (isset($result[$kodePenyakit])) {
|
|
$result[$kodePenyakit]['count'] += 1;
|
|
} else {
|
|
// Ambil data penyakit dari database
|
|
$penyakitData = Penyakit::where('kode_penyakit', $kodePenyakit)->first();
|
|
|
|
// Tambahkan penyakit ke hasil inferensi
|
|
$result[$kodePenyakit] = array(
|
|
'kode_penyakit' => $penyakitData['kode_penyakit'],
|
|
'nama_penyakit' => $penyakitData['nama_penyakit'],
|
|
'penanganan' => $penyakitData['penanganan'],
|
|
'count' => 1
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
$match_count = 0;
|
|
$disease_count = 0;
|
|
|
|
// Hitung persentase kemunculan penyakit
|
|
foreach ($result as &$penyakit) {
|
|
$kodePenyakit = $penyakit['kode_penyakit'];
|
|
$totalGejalaCocok = $gejalaCount[$kodePenyakit];
|
|
|
|
$getTotalGejala = Rule::where('kode_penyakit', $kodePenyakit)->select('kode_gejala')->first();
|
|
$codeGejala = $getTotalGejala->kode_gejala;
|
|
|
|
$totalGejalaPenyakit = count(explode(" ", $kodeGejala)) > 0 ? count(explode(" ", $kodeGejala)) : 0;
|
|
$match_count++;
|
|
$disease_count = $totalGejalaPenyakit;
|
|
}
|
|
|
|
$persentase = ($match_count / $disease_count) * 100;
|
|
|
|
// Urutkan hasil berdasarkan count secara descending, kemudian berdasarkan nama_penyakit
|
|
usort($result, function ($a, $b) {
|
|
if ($b['count'] === $a['count']) {
|
|
return strcmp($a['nama_penyakit'], $b['nama_penyakit']);
|
|
}
|
|
return $b['count'] - $a['count'];
|
|
});
|
|
|
|
if (count($result) > 1) {
|
|
$persentase = 100;
|
|
}
|
|
|
|
date_default_timezone_set('Asia/Jakarta');
|
|
$riwayatJawabanData = array(
|
|
'waktu' => date('Y-m-d H:i:s'),
|
|
'jawaban' => implode(' ', $gejalaInput),
|
|
'persen' => $persentase,
|
|
'id_user' => user()->id,
|
|
'penyakit' => reset($result)['nama_penyakit'] // Tambahkan nama penyakit
|
|
);
|
|
// Periksa apakah data jawaban sudah ada sebelumnya
|
|
$isDuplicate = Riwayat::where('jawaban', $riwayatJawabanData['jawaban'])->where('id_user', $riwayatJawabanData['id_user'])->where('waktu', $riwayatJawabanData['waktu'])->count() > 0;
|
|
|
|
if (!$isDuplicate) {
|
|
Riwayat::create($riwayatJawabanData);
|
|
}
|
|
|
|
// Ambil nama gejala yang sudah dipilih
|
|
$namaGejala = array();
|
|
foreach ($gejalaInput as $kodeGejala) {
|
|
// Ambil data gejala dari database
|
|
$gejalaData = Gejala::where('kode_gejala', $kodeGejala)->first();
|
|
$namaGejala[] = $gejalaData['gejala'];
|
|
}
|
|
|
|
$totalGejalaPenyakit = array();
|
|
foreach ($result as &$penyakit) {
|
|
$kodePenyakit = $penyakit['kode_penyakit'];
|
|
$getTotalGejala = Rule::where('kode_penyakit', $kodePenyakit)->select('kode_gejala')->first();
|
|
$codeGejala = $getTotalGejala->kode_gejala;
|
|
|
|
$totalGejalaPenyakit[$kodePenyakit] = count(explode(" ", $kodeGejala)) > 0 ? count(explode(" ", $kodeGejala)) : 0;
|
|
}
|
|
|
|
$data = [
|
|
'subtitle' => 'Hasil Diagnosa',
|
|
];
|
|
|
|
$results = $result;
|
|
$gejala = $gejalaInput;
|
|
$nama = $namaGejala;
|
|
$total_gejala_penyakit = $totalGejalaPenyakit;
|
|
return view('user::diagnosa', compact('data', 'total_gejala_penyakit', 'results', 'gejala', 'nama', 'persentase'));
|
|
}
|
|
|
|
}
|