375 lines
14 KiB
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;
|
|
}
|
|
|
|
}
|