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 '
- Menerapkan pola hidup sehat dengan mengonsumsi makanan bergizi seimbang.
- Mengurangi konsumsi garam, makanan tinggi lemak, dan makanan olahan.
- Melakukan aktivitas fisik secara teratur minimal 30 menit setiap hari.
- Mengelola stres dan mencukupi waktu istirahat.
- Menghindari kebiasaan merokok dan konsumsi alkohol.
- Melakukan pemantauan kondisi kesehatan secara berkala.
';
case 'Lakukan Pemeriksaan Tekanan Darah':
return '
- Melakukan pemeriksaan tekanan darah menggunakan alat ukur yang valid.
- Pemeriksaan dapat dilakukan secara mandiri maupun di Posbindu, apotek, puskesmas, klinik, atau rumah sakit.
- Mencatat hasil pemeriksaan sebagai bahan pemantauan.
- Menerapkan pola hidup sehat dan mengurangi faktor risiko hipertensi.
- Apabila hasil tekanan darah tinggi secara berulang, segera konsultasikan kepada tenaga kesehatan.
';
case 'Konsultasikan dengan Tenaga Kesehatan':
return '
- Segera berkonsultasi dengan dokter atau tenaga kesehatan.
- Melakukan pemeriksaan tekanan darah dan evaluasi kondisi kesehatan secara menyeluruh.
- Mengikuti seluruh anjuran tenaga kesehatan terkait pemeriksaan maupun penanganan lanjutan.
- Tidak menunda pemeriksaan apabila gejala masih berlanjut.
- Terapkan pola hidup sehat selama menunggu pemeriksaan.
';
default:
return '
- Segera mendatangi fasilitas pelayanan kesehatan terdekat.
- Melakukan pemeriksaan medis sesegera mungkin.
- Tidak menunda pemeriksaan apabila gejala semakin berat atau muncul keluhan baru.
- Mengikuti seluruh tindakan medis yang diberikan tenaga kesehatan.
- Apabila mengalami kondisi darurat seperti nyeri dada hebat, sesak napas berat, atau penurunan kesadaran, segera mencari pertolongan medis darurat.
';
}
}
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'
)
);
}
}