TIF_E41201781/app/Http/Controllers/AnalisisController.php

375 lines
14 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Gejala;
use App\Models\Npakar;
use App\Models\Nuser;
use App\Models\Penyakit;
use App\Models\Penanganan;
use App\Models\Riwayat;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Illuminate\Support\Facades\Session;
use Dompdf\Dompdf;
use Dompdf\Options;
class AnalisisController extends Controller
{
public function index()
{
// Mengambil data gejala dari tabel Gejala
$gejala = Gejala::all();
// Mengambil data rentan dan nilai user dari tabel Nuser
$nuser = Nuser::pluck('nilai_user', 'rentan');
// Mengambil data nilai pakar dari gejala yang dipilih sesuai dengan penyakit yang mungkin diderita di dalam tabel Npakar
$npakar = Npakar::pluck('nilai_pakar', 'kode_gejala');
// Mengambil data deskripsi penyakit, saran penanganan, saran pencegahan, dari tabel penyakit
$penyakit = Penyakit::pluck('deskripsi_penyakit', 'saran_penanganan', 'saran_pencegahan');
return view('analisis.index', compact('gejala', 'nuser', 'npakar'));
}
private function getGejalaDipilih($jawaban)
{
// Inisialisasi array untuk menyimpan detail gejala yang dipilih
$gejalaDipilih = [];
// Inisialisasi array untuk melacak nomor urut CF
$cfCounterPerPenyakit = [];
// Looping untuk setiap jawaban yang dipilih
foreach ($jawaban as $index => $jawabanRentan) {
// Jika jawaban bukan "Pilih Rentan Jawaban", maka tambahkan ke array
if ($jawabanRentan !== "Pilih Rentan Jawaban") {
$kodeGejala = 'G' . ($index + 1); // Menggunakan index untuk menentukan kode gejala
// Ambil data gejala berdasarkan kode gejala
$gejala = Gejala::where('kode_gejala', $kodeGejala)->first();
// Ambil nilai user berdasarkan rentan yang dipilih
$nilaiUser = Nuser::where('rentan', $jawabanRentan)->value('nilai_user') ?? null;
// Tambahkan detail gejala ke dalam array jika gejala ditemukan
if ($gejala) {
// Iterasi melalui setiap nilai pakar yang terkait dengan gejala tersebut
foreach ($this->getNilaiPakarFromNpakar($gejala->kode_gejala) as $penyakit => $nilaiPakar) {
// Periksa apakah penyakit tersebut sudah ada dalam array gejalaDipilih
if (!isset($gejalaDipilih[$penyakit])) {
// Jika belum ada, inisialisasi array untuk penyakit tersebut
$gejalaDipilih[$penyakit] = [
'penyakit' => $penyakit,
'gejala' => []
];
// Inisialisasi nomor urut CF
$cfCounterPerPenyakit[$penyakit] = 0;
}
// Tambahkan nomor urut CF
$cfCounter = ++$cfCounterPerPenyakit[$penyakit];
$cfKey = 'cf' . $cfCounter;
// Tambahkan gejala ke dalam array penyakit yang sesuai
$gejalaDipilih[$penyakit]['gejala'][] = [
'kode_gejala' => $gejala->kode_gejala,
'nama_gejala' => $gejala->nama_gejala,
'pilihan_jawaban' => $jawabanRentan,
'nilai_user' => $nilaiUser, // Tambahkan nilai user ke dalam array
'nilai_pakar' => $nilaiPakar, // Tambahkan nilai pakar ke dalam array
$cfKey => $nilaiUser * $nilaiPakar, // Tambahkan nilai CF ke dalam array
];
}
}
}
}
// Hitung CFK untuk setiap gejala yang dipilih
foreach ($gejalaDipilih as $penyakit => &$detailPenyakit) {
$gejalaPenyakit = &$detailPenyakit['gejala'];
$cfCounter = 0; // Inisialisasi hitungan nilai CF yang digunakan
$cfUsed = []; // Array untuk menyimpan nilai CF yang digunakan dalam perhitungan CFK
foreach ($gejalaPenyakit as &$gejala) {
// Pastikan setiap gejala memiliki CF sebelum mengaksesnya
foreach ($gejala as $key => $value) {
if (strpos($key, 'cf') === 0 && is_numeric(substr($key, 2))) {
$cfUsed[$key] = $value; // Tambahkan nilai CF yang digunakan ke dalam array
$cfCounter++; // Hitung jumlah nilai CF yang digunakan
}
}
}
// Lakukan perhitungan CFK hanya jika ada minimal dua nilai CF yang digunakan
$cfUsedArr = [];
foreach($cfUsed as $c => $v)
{
$cfUsedArr[] = $v;
}
if ($cfCounter >= 2) {
// Hitung CFK1
$cfk1 = $cfUsed['cf1'] + $cfUsed['cf2'] * (1 - $cfUsed['cf1']);
$detailPenyakit['cf']['cfk1'] = $cfk1;
$detailPenyakit['cf']['cf_used'] = max($cfUsedArr);
// Perhitungan CFK untuk nilai CF yang lebih dari 2
$cfkPrev = $cfk1; // Simpan nilai CFK sebelumnya
for ($i = 2; $i < $cfCounter; $i++) {
$cfKey = 'cf' . ($i + 1);
$cfk = $cfkPrev + $cfUsed[$cfKey] * (1 - $cfkPrev);
$detailPenyakit['cf']['cfk' . $i] = $cfk;
$cfkPrev = $cfk; // Simpan nilai CFK sebelumnya untuk iterasi berikutnya
}
} elseif ($cfCounter === 1) {
// Jika hanya ada satu nilai CF yang digunakan, gunakan nilai tersebut sebagai nilai CFK
$detailPenyakit['cf']['cf_used'] = max($cfUsedArr);
}
}
return $gejalaDipilih;
}
private function getNilaiPakarFromNpakar($kodeGejala)
{
// Mengambil semua data penyakit yang memiliki gejala yang sama dari tabel Npakar
$penyakit = Npakar::where('kode_gejala', $kodeGejala)->get();
// Inisialisasi array untuk menyimpan nilai pakar untuk setiap penyakit
$nilaiPakarPerPenyakit = [];
// Looping untuk setiap data penyakit yang memiliki gejala yang sama
foreach ($penyakit as $data) {
// Menyimpan nilai pakar ke dalam array dengan key berdasarkan nama penyakit
$nilaiPakarPerPenyakit[$data->nama_penyakit] = $data->nilai_pakar;
}
return $nilaiPakarPerPenyakit;
}
public function hasilAnalisis(Request $request)
{
// Simpan hari, tanggal, dan waktu dalam sesi jika belum ada
if (!session()->has('hariTanggal')) {
session(['hariTanggal' => now()->locale('id_ID')->setTimezone('Asia/Jakarta')->isoFormat('dddd, D MMMM YYYY')]);
}
if (!session()->has('waktu')) {
session(['waktu' => now()->locale('id_ID')->setTimezone('Asia/Jakarta')->isoFormat('HH:mm:ss')]);
}
// Validasi request
$request->validate([
'pilihan_jawaban.*' => 'required',
]);
// Ambil data jawaban dari request
$jawaban = $request->input('pilihan_jawaban');
// Inisialisasi array untuk menyimpan jawaban beserta informasi kode gejala, nama gejala, dan pilihan jawaban
$jawabanDenganInfo = [];
// Looping untuk setiap jawaban yang dipilih
foreach ($jawaban as $index => $jawabanRentan) {
// Jika jawaban bukan "Pilih Rentan Jawaban", maka tambahkan ke array
if ($jawabanRentan !== "Pilih Rentan Jawaban") {
$kodeGejala = 'G' . ($index + 1); // Menggunakan index untuk menentukan kode gejala
// Ambil data gejala berdasarkan kode gejala
$gejala = Gejala::where('kode_gejala', $kodeGejala)->first();
// Tambahkan informasi kode gejala, nama gejala, dan pilihan jawaban ke dalam array jawabanDenganInfo
if ($gejala) {
$jawabanDenganInfo[] = [
'kode_gejala' => $kodeGejala,
'nama_gejala' => $gejala->nama_gejala,
'pilihan_jawaban' => $jawabanRentan,
];
}
}
}
// Gunakan $jawabanDenganInfo di sini untuk keperluan selanjutnya
// Ambil data gejala dipilih
$gejalaDipilih = $this->getGejalaDipilih($jawaban);
// Inisialisasi nilai certainty factor total untuk setiap penyakit
$cfTotalPerPenyakit = [];
// Looping untuk setiap penyakit
foreach ($gejalaDipilih as $penyakit => $detailPenyakit) {
// Inisialisasi nilai CFK untuk setiap penyakit
$cfk = 1;
// Hitung nilai CFK untuk setiap gejala pada penyakit tersebut
foreach ($detailPenyakit['gejala'] as $gejala) {
// Pastikan kunci cf_used tersedia di dalam array gejala
if (isset($gejala['cf_used'])) {
$cfk *= (1 - $gejala['cf_used']);
}
}
// Simpan nilai CFK untuk penyakit tersebut
$cfTotalPerPenyakit[$penyakit] = $cfk;
}
// Temukan nama penyakit dengan gejala terbanyak
$penyakitTerbanyak = null;
$jumlahGejalaTerbanyak = 0;
foreach ($gejalaDipilih as $penyakit => $detailPenyakit) {
if(isset($detailPenyakit['cf']['cfk1']))
{
$jumlahGejala = count($detailPenyakit['gejala']);
if ($jumlahGejala >= $jumlahGejalaTerbanyak) {
$jumlahGejalaTerbanyak = $jumlahGejala;
$penyakitTerbanyak = $penyakit;
}
}else{
$jumlahGejala = $detailPenyakit['cf']['cf_used'];
if ($jumlahGejala > $jumlahGejalaTerbanyak) {
$jumlahGejalaTerbanyak = $jumlahGejala;
$penyakitTerbanyak = $penyakit;
}
}
}
// dd($gejalaDipilih[$penyakitTerbanyak]);
// Ambil kunci terakhir dari array gejala yang dipilih untuk penyakit dengan gejala terbanyak
$keys = array_keys($gejalaDipilih[$penyakitTerbanyak]);
// $lastKey = end($keys);
// $lastKey = 0;
// foreach($keys as $gejalaPenyakitTerpilih)
// {
// if(is_array($gejalaPenyakitTerpilih))
// {
// foreach($gejalaPenyakitTerpilih as $g)
// {
// }
// }
// }
// Ambil nilai CFK terakhir dari array gejala yang dipilih
$cfkTerakhir = $gejalaDipilih[$penyakitTerbanyak]['cf'] ?? [];
// dd($gejalaDipilih[$penyakitTerbanyak]);
$listCfkTertinggi = [];
$cfkTerakhirHasil = 0;
foreach($cfkTerakhir as $c)
{
// if(is_array($c))
// {
// $cfkList = [];
// foreach($c as $cc)
// {
// $cfkList[] = $cc;
// }
// $listCfkTertinggil[] = max($cfkList);
// }else{
$listCfkTertinggi[] = $c;
// }
}
$cfkTerakhirHasil = max($listCfkTertinggi);
// Kalikan dengan 100 untuk mendapatkan persentase
// $cfkTerakhirPersen = $cfkTerakhir * 100;
$cfkTerakhirPersen = round($cfkTerakhirHasil * 100, 2); // Membulatkan ke dua angka di belakang koma
// dd($cfkTerakhir);
// Ambil deskripsi penyakit, saran penanganan, dan saran pencegahan dari database
$penyakit = Penyakit::where('nama_penyakit', $penyakitTerbanyak)->first();
$deskripsiPenyakit = $penyakit->deskripsi_penyakit;
$saranPenanganan = $penyakit->saran_penanganan;
$saranPencegahan = $penyakit->saran_pencegahan;
// Cari penanganan berdasarkan nama penyakit_gejala_terbanyak
$penanganan = Penanganan::where('nama_penyakit', $penyakitTerbanyak)->first();
$saranPenangananLanjutan = $penanganan->saran_penanganan_lanjutan;
// Tampilkan nilai-nilai perhitungan menggunakan dd()
// dd([
// 'cf_total_per_penyakit' => $cfTotalPerPenyakit,
// 'jawaban' => $jawabanDenganInfo,
// 'gejala_dipilih' => $gejalaDipilih,
// 'hasil_analisis' => [
// 'penyakit_gejala_terbanyak' => $penyakitTerbanyak,
// 'cfk_terakhir' => $cfkTerakhir,
// 'cfk_persen'=> $cfkTerakhirPersen,
// 'deskripsi_penyakit' => $deskripsiPenyakit,
// 'saran_penanganan' => $saranPenanganan,
// 'saran_pencegahan' => $saranPencegahan,
// ],
// 'perawatan_hari_1' => $perawatanHari1,
// 'perawatan_hari_2' => $perawatanHari2,
// ]);
// $hasilAnalisis = [
// 'jawabanDenganInfo' => $jawabanDenganInfo,
// 'gejalaDipilih' => $gejalaDipilih,
// 'cfTotalPerPenyakit' => $cfTotalPerPenyakit,
// 'penyakitTerbanyak' => $penyakitTerbanyak,
// 'cfkTerakhir' => $cfkTerakhir,
// 'cfkTerakhirPersen' => $cfkTerakhirPersen,
// 'deskripsiPenyakit' => $deskripsiPenyakit,
// 'saranPenanganan' => $saranPenanganan,
// 'saranPencegahan' => $saranPencegahan,
// ];
// Membuat array baru hanya dengan nama gejala yang dipilih
$gejala = [];
foreach ($gejalaDipilih as $info) {
foreach ($info['gejala'] as $gejalaItem) {
// Tambahkan nama gejala ke dalam array jika belum ada
if (!in_array($gejalaItem['nama_gejala'], $gejala)) {
$gejala[] = $gejalaItem['nama_gejala'];
}
}
}
// dd($gejalaDipilih);
// Mengonversi array ke dalam format JSON
//$data_analisis_dugaan = implode(', ', $gejala);
$data_analisis_dugaan = json_encode($gejala);
// Menyimpan data ke dalam database
Riwayat::create([
'username' => auth()->user()->username,
'datetime' => now()->setTimezone('Asia/Jakarta'), // Menggunakan now() untuk mendapatkan waktu saat ini dan kemudian mengatur zona waktunya
'jawabanDenganInfo' => $data_analisis_dugaan,
'penyakitTerbanyak' => $penyakitTerbanyak,
'cfkTerakhirPersen' => $cfkTerakhirPersen,
'saranPenanganan' => $saranPenanganan, // Menggunakan variabel $saranPenanganan yang sudah didefinisikan sebelumnya
'saran_penanganan_lanjutan' => $saranPenangananLanjutan,
]);
return view('analisis.hasil-analisis', compact('jawaban', 'jawabanDenganInfo', 'cfTotalPerPenyakit', 'penyakitTerbanyak', 'cfkTerakhirHasil', 'cfkTerakhirPersen', 'deskripsiPenyakit', 'saranPenanganan', 'saranPencegahan', 'gejalaDipilih'));
}
private function getNilaiPakar($kodeGejala)
{
// Ambil nilai pakar dari tabel Npakar berdasarkan kode gejala
return Npakar::where('kode_gejala', $kodeGejala)->value('nilai_pakar') ?? 0;
}
private function getNilaiUser($kodeGejala)
{
// Ambil nilai user dari tabel Nuser berdasarkan kode gejala
return Nuser::where('rentan', $kodeGejala)->value('nilai_user') ?? 0;
}
}