544 lines
12 KiB
PHP
544 lines
12 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Barryvdh\DomPDF\Facade\Pdf;
|
|
use App\Models\Gejala;
|
|
//use App\Models\Rule;
|
|
use App\Models\Pasien;
|
|
use App\Models\Diagnosa;
|
|
use App\Models\Penyakit;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class DiagnosaController extends Controller
|
|
{
|
|
|
|
|
|
// FORM DIAGNOSA
|
|
|
|
public function index()
|
|
{
|
|
$gejalas = Gejala::all();
|
|
|
|
return view('user.diagnosa', compact('gejalas'));
|
|
}
|
|
|
|
|
|
|
|
// PROSES CERTAINTY FACTOR
|
|
|
|
public function proses(Request $request)
|
|
{
|
|
|
|
// AMBIL GEJALA YANG DIPILIH
|
|
|
|
$inputGejala = [];
|
|
|
|
foreach ($request->gejala ?? [] as $id => $nilai) {
|
|
|
|
if (!is_null($nilai) && $nilai !== '') {
|
|
|
|
$inputGejala[$id] = (float) $nilai;
|
|
}
|
|
}
|
|
|
|
|
|
// VALIDASI MINIMAL 1 GEJALA
|
|
|
|
if (empty($inputGejala)) {
|
|
|
|
return back()->with(
|
|
'error',
|
|
'Pilih minimal 1 gejala!'
|
|
);
|
|
}
|
|
|
|
|
|
// CEK APAKAH SEMUA TIDAK PERNAH
|
|
|
|
$semuaTidakPernah = true;
|
|
|
|
foreach ($inputGejala as $cf) {
|
|
|
|
if ($cf > 0) {
|
|
|
|
$semuaTidakPernah = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
// AMBIL HIPOTESIS H01
|
|
|
|
$hipotesis = Penyakit::where('kode', 'H01')->first();
|
|
|
|
if (!$hipotesis) {
|
|
|
|
return back()->with(
|
|
'error',
|
|
'Hipotesis H01 belum tersedia.'
|
|
);
|
|
}
|
|
|
|
|
|
// DATA PASIEN
|
|
|
|
$pasien = Pasien::where(
|
|
'user_id',
|
|
Auth::id()
|
|
)->latest()->first();
|
|
|
|
if (!$pasien) {
|
|
|
|
return back()->with(
|
|
'error',
|
|
'Data pasien belum tersedia.'
|
|
);
|
|
}
|
|
|
|
|
|
// JIKA SEMUA TIDAK PERNAH
|
|
|
|
if ($semuaTidakPernah) {
|
|
|
|
$diagnosa = Diagnosa::create([
|
|
|
|
'pasien_id' => $pasien->id,
|
|
|
|
'penyakit_id' => $hipotesis->id,
|
|
|
|
'cf_hasil' => 0,
|
|
|
|
'gejala_dipilih' => json_encode($inputGejala)
|
|
|
|
]);
|
|
|
|
return redirect()->route(
|
|
'diagnosa.hasil',
|
|
$diagnosa->id
|
|
);
|
|
}
|
|
|
|
|
|
// AMBIL DATA GEJALA
|
|
|
|
$gejalas = Gejala::whereIn(
|
|
'id',
|
|
array_keys($inputGejala)
|
|
)->get();
|
|
|
|
$cfCombine = null;
|
|
|
|
|
|
// HITUNG CERTAINTY FACTOR
|
|
|
|
foreach ($gejalas as $gejala) {
|
|
|
|
$cfUser = $inputGejala[$gejala->id] ?? 0;
|
|
|
|
if ($cfUser <= 0) {
|
|
continue;
|
|
}
|
|
|
|
// CF Pakar
|
|
$cfPakar = $gejala->mb - $gejala->md;
|
|
|
|
// CF Gejala
|
|
$cfGejala = $cfPakar * $cfUser;
|
|
|
|
// Kombinasi CF
|
|
if (is_null($cfCombine)) {
|
|
|
|
$cfCombine = $cfGejala;
|
|
|
|
} else {
|
|
|
|
$cfCombine = $cfCombine + ($cfGejala * (1 - $cfCombine));
|
|
}
|
|
}
|
|
|
|
|
|
// VALIDASI HASIL CF
|
|
|
|
if (is_null($cfCombine)) {
|
|
|
|
return back()->with(
|
|
'error',
|
|
'Perhitungan Certainty Factor gagal dilakukan.'
|
|
);
|
|
}
|
|
|
|
|
|
// SIMPAN DIAGNOSA
|
|
|
|
$diagnosa = Diagnosa::create([
|
|
|
|
'pasien_id' => $pasien->id,
|
|
|
|
'penyakit_id' => $hipotesis->id,
|
|
|
|
'cf_hasil' => $cfCombine,
|
|
|
|
'gejala_dipilih' => json_encode($inputGejala)
|
|
|
|
]);
|
|
|
|
return redirect()->route(
|
|
'diagnosa.hasil',
|
|
$diagnosa->id
|
|
);
|
|
}
|
|
|
|
|
|
|
|
// HASIL DIAGNOSA
|
|
|
|
public function hasil($id)
|
|
{
|
|
$diagnosa = Diagnosa::with([
|
|
'pasien',
|
|
'penyakit'
|
|
])->findOrFail($id);
|
|
|
|
|
|
// REKOMENDASI
|
|
|
|
$diagnosa->rekomendasi =
|
|
$this->getRekomendasi(
|
|
$diagnosa->cf_hasil
|
|
);
|
|
|
|
|
|
// UPAYA PENCEGAHAN
|
|
|
|
$diagnosa->upaya_pencegahan =
|
|
$this->getUpayaPencegahan(
|
|
$diagnosa->rekomendasi
|
|
);
|
|
|
|
|
|
// RISIKO KOMPLIKASI
|
|
|
|
$diagnosa->risiko_komplikasi =
|
|
$this->getRisikoKomplikasi(
|
|
$diagnosa->rekomendasi
|
|
);
|
|
|
|
if(auth()->user()->role=='admin'){
|
|
|
|
return view(
|
|
'admin.hasil',
|
|
compact('diagnosa')
|
|
);
|
|
|
|
}
|
|
|
|
return view(
|
|
'user.hasil',
|
|
compact('diagnosa')
|
|
);
|
|
}
|
|
|
|
|
|
// REKOMENDASI PEMERIKSAAN
|
|
|
|
private function getRekomendasi($cf)
|
|
{
|
|
if ($cf <= 0.20) {
|
|
return 'Lakukan Pemantauan Mandiri';
|
|
} elseif ($cf <= 0.40) {
|
|
return 'Lakukan Pemeriksaan Tekanan Darah';
|
|
} elseif ($cf <= 0.70) {
|
|
return 'Konsultasikan dengan Tenaga Kesehatan';
|
|
}
|
|
|
|
return 'Segera Datangi Fasilitas Kesehatan';
|
|
}
|
|
|
|
private function getUpayaPencegahan($rekomendasi)
|
|
{
|
|
switch ($rekomendasi) {
|
|
|
|
case 'Lakukan Pemantauan Mandiri':
|
|
return '
|
|
<ul>
|
|
<li>Menerapkan pola hidup sehat dengan mengonsumsi makanan bergizi seimbang.</li>
|
|
<li>Mengurangi konsumsi garam, makanan tinggi lemak, dan makanan olahan.</li>
|
|
<li>Melakukan aktivitas fisik secara teratur minimal 30 menit setiap hari.</li>
|
|
<li>Mengelola stres dan mencukupi waktu istirahat.</li>
|
|
<li>Menghindari kebiasaan merokok dan konsumsi alkohol.</li>
|
|
<li>Melakukan pemantauan kondisi kesehatan secara berkala.</li>
|
|
</ul>';
|
|
|
|
case 'Lakukan Pemeriksaan Tekanan Darah':
|
|
return '
|
|
<ul>
|
|
<li>Melakukan pemeriksaan tekanan darah menggunakan alat ukur yang valid.</li>
|
|
<li>Pemeriksaan dapat dilakukan secara mandiri maupun di Posbindu, apotek, puskesmas, klinik, atau rumah sakit.</li>
|
|
<li>Mencatat hasil pemeriksaan sebagai bahan pemantauan.</li>
|
|
<li>Menerapkan pola hidup sehat dan mengurangi faktor risiko hipertensi.</li>
|
|
<li>Apabila hasil tekanan darah tinggi secara berulang, segera konsultasikan kepada tenaga kesehatan.</li>
|
|
</ul>';
|
|
|
|
case 'Konsultasikan dengan Tenaga Kesehatan':
|
|
return '
|
|
<ul>
|
|
<li>Segera berkonsultasi dengan dokter atau tenaga kesehatan.</li>
|
|
<li>Melakukan pemeriksaan tekanan darah dan evaluasi kondisi kesehatan secara menyeluruh.</li>
|
|
<li>Mengikuti seluruh anjuran tenaga kesehatan terkait pemeriksaan maupun penanganan lanjutan.</li>
|
|
<li>Tidak menunda pemeriksaan apabila gejala masih berlanjut.</li>
|
|
<li>Terapkan pola hidup sehat selama menunggu pemeriksaan.</li>
|
|
</ul>';
|
|
|
|
default:
|
|
return '
|
|
<ul>
|
|
<li>Segera mendatangi fasilitas pelayanan kesehatan terdekat.</li>
|
|
<li>Melakukan pemeriksaan medis sesegera mungkin.</li>
|
|
<li>Tidak menunda pemeriksaan apabila gejala semakin berat atau muncul keluhan baru.</li>
|
|
<li>Mengikuti seluruh tindakan medis yang diberikan tenaga kesehatan.</li>
|
|
<li>Apabila mengalami kondisi darurat seperti nyeri dada hebat, sesak napas berat, atau penurunan kesadaran, segera mencari pertolongan medis darurat.</li>
|
|
</ul>';
|
|
}
|
|
}
|
|
|
|
private function getRisikoKomplikasi($rekomendasi)
|
|
{
|
|
switch ($rekomendasi) {
|
|
|
|
case 'Lakukan Pemantauan Mandiri':
|
|
return '
|
|
Belum terdapat indikasi yang mengarah pada risiko komplikasi akibat hipertensi.
|
|
Meskipun demikian, pengguna tetap disarankan menerapkan pola hidup sehat dan
|
|
melakukan pemantauan kondisi kesehatan secara berkala untuk mencegah peningkatan risiko di kemudian hari.
|
|
';
|
|
|
|
case 'Lakukan Pemeriksaan Tekanan Darah':
|
|
return '
|
|
Apabila tekanan darah tinggi tidak segera diketahui melalui pemeriksaan, kondisi tersebut
|
|
dapat berkembang tanpa disadari dan meningkatkan risiko terjadinya komplikasi hipertensi
|
|
dalam jangka panjang. Pemeriksaan tekanan darah secara dini sangat dianjurkan.
|
|
';
|
|
|
|
case 'Konsultasikan dengan Tenaga Kesehatan':
|
|
return '
|
|
Kombinasi gejala yang dialami memerlukan evaluasi lebih lanjut oleh tenaga kesehatan.
|
|
Apabila penyebab keluhan tidak segera diketahui dan ditangani, risiko terjadinya komplikasi
|
|
yang berhubungan dengan hipertensi maupun penyakit kardiovaskular lainnya dapat meningkat.
|
|
';
|
|
|
|
default:
|
|
return '
|
|
Gejala yang dialami memerlukan evaluasi medis segera. Penundaan pemeriksaan dapat meningkatkan
|
|
risiko terjadinya komplikasi serius, baik yang berkaitan dengan hipertensi maupun kondisi medis
|
|
lainnya. Oleh karena itu, segera lakukan pemeriksaan di fasilitas pelayanan kesehatan.
|
|
';
|
|
}
|
|
}
|
|
|
|
// CETAK PDF
|
|
|
|
public function pdf($id)
|
|
{
|
|
|
|
$diagnosa = Diagnosa::with([
|
|
'pasien',
|
|
'penyakit'
|
|
])->findOrFail($id);
|
|
//dd($diagnosa->gejala_dipilih);
|
|
// Tambahkan rekomendasi pemeriksaan
|
|
$diagnosa->rekomendasi =
|
|
$this->getRekomendasi(
|
|
$diagnosa->cf_hasil
|
|
);
|
|
|
|
$diagnosa->upaya_pencegahan =
|
|
$this->getUpayaPencegahan($diagnosa->rekomendasi);
|
|
|
|
$diagnosa->risiko_komplikasi =
|
|
$this->getRisikoKomplikasi($diagnosa->rekomendasi);
|
|
|
|
// AMBIL DATA GEJALA DIPILIH
|
|
|
|
$gejalaData = json_decode(
|
|
$diagnosa->gejala_dipilih,
|
|
true
|
|
) ?? [];
|
|
|
|
// ambil ID gejala
|
|
$gejalaIds = array_keys($gejalaData);
|
|
|
|
// ambil data gejala dari database
|
|
$gejalas = Gejala::whereIn(
|
|
'id',
|
|
$gejalaIds
|
|
)->get();
|
|
|
|
|
|
// TAMBAHKAN CF USER
|
|
|
|
foreach ($gejalas as $g) {
|
|
|
|
// ambil nilai user
|
|
$g->cf_user = $gejalaData[$g->id] ?? 0;
|
|
|
|
// ubah ke teks
|
|
if ($g->cf_user == 1) {
|
|
|
|
$g->keterangan_cf = 'Sangat Sering';
|
|
|
|
} elseif ($g->cf_user == 0.7) {
|
|
|
|
$g->keterangan_cf = 'Sering';
|
|
|
|
} elseif ($g->cf_user == 0.4) {
|
|
|
|
$g->keterangan_cf = 'Kadang-Kadang';
|
|
|
|
} else {
|
|
|
|
$g->keterangan_cf = 'Tidak Pernah';
|
|
}
|
|
}
|
|
|
|
|
|
// GENERATE PDF
|
|
|
|
$pdf = Pdf::loadView(
|
|
'pdf.diagnosa',
|
|
compact(
|
|
'diagnosa',
|
|
'gejalas'
|
|
)
|
|
);
|
|
|
|
return $pdf->download(
|
|
'hasil_diagnosa_' .
|
|
$diagnosa->id .
|
|
'.pdf'
|
|
);
|
|
}
|
|
|
|
|
|
|
|
// RIWAYAT USER
|
|
|
|
public function riwayat()
|
|
{
|
|
$pasien = Pasien::where(
|
|
'user_id',
|
|
Auth::id()
|
|
)->first();
|
|
|
|
$perPage = request()->perPage ?? 5;
|
|
|
|
if (!$pasien) {
|
|
|
|
$data = Diagnosa::where('id', 0)
|
|
->paginate($perPage);
|
|
|
|
return view(
|
|
'user.riwayat',
|
|
compact('data', 'perPage')
|
|
);
|
|
}
|
|
|
|
$data = Diagnosa::with([
|
|
'penyakit',
|
|
'pasien'
|
|
])
|
|
->where('pasien_id', $pasien->id)
|
|
->latest()
|
|
->paginate($perPage)
|
|
->withQueryString();
|
|
|
|
|
|
// TAMBAHKAN REKOMENDASI
|
|
|
|
foreach ($data as $diagnosa) {
|
|
|
|
$diagnosa->rekomendasi =
|
|
$this->getRekomendasi(
|
|
$diagnosa->cf_hasil
|
|
);
|
|
|
|
}
|
|
|
|
return view(
|
|
'user.riwayat',
|
|
compact('data', 'perPage')
|
|
);
|
|
}
|
|
|
|
|
|
|
|
// DASHBOARD USER
|
|
|
|
public function dashboard(Request $request)
|
|
{
|
|
$pasien = Pasien::where(
|
|
'user_id',
|
|
auth()->id()
|
|
)->first();
|
|
|
|
$perPage = $request->perPage ?? 5;
|
|
|
|
$totalDiagnosa = 0;
|
|
|
|
$lastDiagnosa = null;
|
|
|
|
$riwayat = collect();
|
|
|
|
if ($pasien) {
|
|
|
|
$riwayat = Diagnosa::with('penyakit')
|
|
->where('pasien_id', $pasien->id)
|
|
->latest()
|
|
->paginate($perPage)
|
|
->withQueryString();
|
|
|
|
|
|
// TAMBAHKAN REKOMENDASI
|
|
|
|
foreach ($riwayat as $diagnosa) {
|
|
|
|
$diagnosa->rekomendasi =
|
|
$this->getRekomendasi(
|
|
$diagnosa->cf_hasil
|
|
);
|
|
|
|
}
|
|
|
|
$totalDiagnosa = Diagnosa::where(
|
|
'pasien_id',
|
|
$pasien->id
|
|
)->count();
|
|
|
|
$lastDiagnosa = Diagnosa::where(
|
|
'pasien_id',
|
|
$pasien->id
|
|
)->latest()
|
|
->first();
|
|
|
|
if ($lastDiagnosa) {
|
|
|
|
$lastDiagnosa->rekomendasi =
|
|
$this->getRekomendasi(
|
|
$lastDiagnosa->cf_hasil
|
|
);
|
|
|
|
}
|
|
}
|
|
|
|
return view(
|
|
'user.dashboard',
|
|
compact(
|
|
'totalDiagnosa',
|
|
'lastDiagnosa',
|
|
'riwayat',
|
|
'perPage'
|
|
)
|
|
);
|
|
}
|
|
} |