MIF_E31210194/Modules/User/Http/Controllers/UserController.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'));
}
}