diff --git a/htdocs/app/Http/Controllers/DokterController.php b/htdocs/app/Http/Controllers/DokterController.php index a2fcd4e0..d7fb4915 100644 --- a/htdocs/app/Http/Controllers/DokterController.php +++ b/htdocs/app/Http/Controllers/DokterController.php @@ -51,6 +51,11 @@ define( 'API_ACCESS_KEY', 'AAAA6YBXh1k:APA91bFL0q7QAXQGohXMpTwHco79f13C8PFk1Oo8k class DokterController extends Controller { + protected $lisServiceUrl; + public function __construct() + { + $this->lisServiceUrl = env('LIS_SERVICE_URL', 'http://localhost:5000'); + } protected static function genSurat($id, $tabel){ if ($tabel == 'dengan kop'){ $kopsurat = url('/templateimage/kopsurat.png'); @@ -1127,7 +1132,7 @@ class DokterController extends Controller } return response()->json(['pesan' => $pesan, 'organism' => $organism]); return back(); - } else if ($worklist == 'getbbachtect' OR $worklist == 'getmgit' OR $worklist == 'getgenexpert' OR $worklist == 'getabbot'){ + } else if ($worklist == 'getbbachtect' OR $worklist == 'getmgit' OR $worklist == 'getabbot'){ $isidata = $request->input('isi'); try { $ketemu = ''; @@ -1166,6 +1171,67 @@ class DokterController extends Controller $pesan = $isidata.'
'.$e->getMessage(); } return $pesan; + } else if ($worklist == 'getgenexpert'){ + $isidata = $request->input('isi'); + try { + $ketemu = ''; + $cekada = ResultSample::where('accession_number', 'LIKE', $nofoto.'%')->get(); + if ($cekada->isNotEmpty()){ + foreach($cekada as $rows){ + $ketemu .= ($ketemu ? '
' : '') . $rows->test_status; + } + } else { + $payload = [ + 'command' => 'request_result', + 'data' => [ + 'sample_id' => $nofoto + ], + ]; + $response = Http::timeout(30)->post($this->lisServiceUrl . '/command', $payload); + if ($response->successful()) { + Log::info('Permintaan hasil berhasil dikirim ke LIS service.', [ + 'sample_id' => $nofoto, + 'response' => $response->json() + ]); + } else { + Log::error('Gagal terhubung ke LIS service saat meminta hasil.', [ + 'sample_id' => $nofoto, + 'status' => $response->status(), + 'body' => $response->body() + ]); + } + } + if ($ketemu != ''){ + if (is_null($isidata) || $isidata == ''){ + $isidata = $ketemu; + } else { + $isidata = $isidata.'
'.$ketemu; + } + } + if (!is_null($isidata) && $isidata != ''){ + KomponenJawaban::updateOrCreate( + [ + 'accnumber' => $nofoto, + 'template' => $request->input('jenis'), + 'komponen' => $request->input('komponen'), + ], + [ + 'isidata' => $isidata, + 'created_by' => Session('nama') + ] + ); + } + + $pesan = $isidata; + + } catch (Exception $e) { + $pesan = (is_null($isidata) ? '' : $isidata . '
') . 'Error: ' . $e->getMessage(); + Log::error('Exception dalam fungsi requestResult.', [ + 'sample_id' => $nofoto, + 'exception' => $e->getMessage() + ]); + } + return response($pesan, 200); } else if ($worklist == 'addviralload'){ $tabelawal = $request->input('tabelawal'); $idtabel = $request->input('idtabel'); diff --git a/htdocs/app/Http/Controllers/FrontpageController.php b/htdocs/app/Http/Controllers/FrontpageController.php index 5c581366..95ba07b6 100644 --- a/htdocs/app/Http/Controllers/FrontpageController.php +++ b/htdocs/app/Http/Controllers/FrontpageController.php @@ -4,6 +4,8 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Http; + use App\Services\AstmMessageService; use App\Services\SerialCommunicationService; use App\Http\Controllers\SendMail; @@ -29,21 +31,58 @@ use Validator; use Session; use DateTime; use QrCode; +use Exception; use Carbon\Carbon; -use Aranyasen\HL7\Message; -use Aranyasen\HL7\Connection; -use Aranyasen\HL7\Segment; -use Aranyasen\HL7\Segments\MSH; -use Aranyasen\HL7\Segments\PV1; -use Aranyasen\HL7\Segments\OBR; -use Aranyasen\HL7\Segments\ORC; -use Aranyasen\HL7\Segments\PID; -use Aranyasen\HL7\Segments\OBX; -use Aranyasen\HL7\Segments\NTE; -use Aranyasen\HL7\Segments\EVN; + class FrontpageController extends Controller { + protected $lisServiceUrl; + + public function __construct() + { + // Mengambil URL service dari file .env, dengan fallback default + $this->lisServiceUrl = env('LIS_SERVICE_URL', 'http://localhost:5000'); + } + private function sendRegistrationToLis(array $data) + { + // Memetakan data dari fungsi register Anda ke format yang dibutuhkan LIS service + // PENTING: Pastikan pemetaan ini benar, terutama 'test_code'. + $payload = [ + 'command' => 'register_patient', + 'data' => [ + 'patient_name' => $data['nama'], + 'patient_id' => $data['noregister'], // Menggunakan no register sebagai ID Pasien + 'sample_id' => $data['nofoto'], // Menggunakan nofoto sebagai ID Sampel unik + 'test_code' => $data['kd_spesimen'],// Kode tes spesifik untuk GeneXpert (e.g., MTBRIF) + 'test_name' => $data['nm_spesimen'], + 'dob' => $data['tgllahir'] ? \Carbon\Carbon::parse($data['tgllahir'])->format('Ymd') : '', + 'gender' => $data['jk'], + ], + ]; + + try { + $response = Http::timeout(30)->post($this->lisServiceUrl . '/command', $payload); + + if ($response->failed()) { + Log::error('Gagal mengirim data pendaftaran ke LIS service.', [ + 'sample_id' => $data['nofoto'], + 'status' => $response->status(), + 'response' => $response->body() + ]); + } else { + Log::info('Data pendaftaran berhasil dikirim ke LIS service.', [ + 'sample_id' => $data['nofoto'], + 'response' => $response->json() + ]); + } + } catch (Exception $e) { + Log::error('Koneksi ke LIS service gagal saat pendaftaran.', [ + 'sample_id' => $data['nofoto'], + 'exception' => $e->getMessage() + ]); + } + } public function index() { $data = []; $data['antrkrmsitu']= PeriksaSYNC::where('created_by', Session('username'))->where('status', '')->count(); @@ -748,6 +787,16 @@ class FrontpageController extends Controller 'nm_spesimen' => $nm_spesimen, ] ); + $dataForLis = [ + 'nama' => $nama, + 'noregister' => $noregister, + 'nofoto' => $nofoto, + 'kd_spesimen' => $kd_spesimen, + 'nm_spesimen' => $nm_spesimen, + 'tgllahir' => $tgllahir, + 'jk' => $jk, + ]; + $this->sendRegistrationToLis($dataForLis); } if ($pesan != ''){ return response()->json(['status' => 'Sukses', 'message' => $pesan], 201); @@ -956,6 +1005,16 @@ class FrontpageController extends Controller 'nm_spesimen' => $nm_spesimen, ] ); + $dataForLis = [ + 'nama' => $nama, + 'noregister' => $noregister, + 'nofoto' => $nofoto, + 'kd_spesimen' => $kd_spesimen, + 'nm_spesimen' => $nm_spesimen, + 'tgllahir' => $tgllahir, + 'jk' => $jk, + ]; + $this->sendRegistrationToLis($dataForLis); } return response()->json(['status' => 'Sukses', 'message' => $pesan], 201); } catch (Exception $e) { @@ -1195,6 +1254,16 @@ class FrontpageController extends Controller 'nm_spesimen' => $nm_spesimen, ] ); + $dataForLis = [ + 'nama' => $nama, + 'noregister' => $noregister, + 'nofoto' => $nofoto, + 'kd_spesimen' => $kd_spesimen, + 'nm_spesimen' => $nm_spesimen, + 'tgllahir' => $tgllahir, + 'jk' => $jk, + ]; + $this->sendRegistrationToLis($dataForLis); } $pesan = $pesan.' Nomor Lokal '.$nofoto.' dengan No. Urut '.$noloket.' Berhasil di Simpan'; if ($pesan != ''){ @@ -1311,6 +1380,16 @@ class FrontpageController extends Controller 'nm_spesimen' => $nm_spesimen, ] ); + $dataForLis = [ + 'nama' => $nama, + 'noregister' => $noregister, + 'nofoto' => $nofoto, + 'kd_spesimen' => $kd_spesimen, + 'nm_spesimen' => $nm_spesimen, + 'tgllahir' => $tgllahir, + 'jk' => $jk, + ]; + $this->sendRegistrationToLis($dataForLis); } if ($pesan != ''){ if ($file != '' AND $jenisgambar != ''){ @@ -1347,79 +1426,27 @@ class FrontpageController extends Controller $modality = $request->input('reques'); $cekdata = Periksa::where('nofoto', $nofoto)->first(); if (isset($cekdata->id)){ - $senderName = 'LIS_System'; - $versionNumber = 'V1.0'; $nama = $cekdata->nmpasien; $jk = $cekdata->jkpasien; $urgensi = $cekdata->urgensi ?? 'Elective'; $alamat = $cekdata->alamatpasien ?? 'Malang'; - $arrayttl = explode(" ", $nama); - $fname = iconv("UTF-8", "tis-620", $arrayttl[0]); - if (isset($arrayttl[1])){ - $tengah = iconv("UTF-8", "tis-620", $arrayttl[1]); - } - if (isset($arrayttl[2])){ - $blakang = iconv("UTF-8", "tis-620", $arrayttl[2]); - } else { - $blakang = $tengah; - $tengah = ''; - } - if ($jk == 'L'){ $panggilan = 'TN'; $jk = 'M'; } - else if ($jk == 'P') { $panggilan = 'NY'; $jk = 'F'; } - else { $panggilan = 'UNK'; $jk = 'O'; } - $panggilan = ''; - if ($blakang == ''){ $blakang = $fname; } - if ($urgensi == 'Elective'){ $urgensi = 'INPATIENT'; $prioritas = 'R'; } - else if ($urgensi == 'CITO'){ $urgensi = 'EMERGENCY'; $prioritas = 'A'; } - else { $urgensi = 'OUTPATIENT'; $prioritas = 'A'; } - $patient = [ - 'id' => $cekdata->id, - 'last_name' => $fname, - 'first_name' => $blakang, - 'middle_name' => $tengah, - 'suffix' => $panggilan, - 'dob' => $cekdata->noregister, - 'sex' => $jk, - 'address' => $alamat.'^^MALANG^^ID^65123', - 'phone' => $cekdata->tlppasien, - 'admitting_physician' => $cekdata->klinisi ?? 'Dokter Pengirim' - ]; - $order = [ - 'accession_number' => $cekdata->nofoto, - 'isolate_number' => 'MGIT^TestName', - 'organism' => $cekdata->reques ?? 'Mycobacterium tuberculosis', - 'exclude_isolate' => 'No', - 'priority' => $prioritas, - 'collection_date_time' => date("YmdHi"), - 'collected_by' => $cekdata->nmradiografer ?? Session('nama'), - 'received_by' => Session('nama'), - 'specimen_action_code' => '', - 'isolate_source_test' => 'Blood', - 'isolate_source_test_start_time'=> date("YmdHi"), - 'receipt_date_time' => date("YmdHi"), - 'specimen_type' => 'Blood Culture', - 'body_site' => 'Lung', - 'ordering_physician' => $cekdata->klinisi ?? 'Dokter Pengirim', - 'ordering_physician_phone' => '', - 'ordering_physician_fax' => '', - 'ordering_physician_pager' => '', - 'specimen_user_field_1' => '', - 'specimen_user_field_2' => '', - 'specimen_user_field_3' => '', - 'specimen_user_field_4' => '', - 'specimen_user_field_5' => '', - 'finalized_date_time' => date("YmdHi"), - 'specimen_reimbursement_value' => '100', - 'test_reimbursement_value' => '50', - 'isolate_classification' => 'Nosocomial' - ]; + Periksa::where('nofoto', $nofoto)->update([ 'excutor' => Session('id'), 'nmexcutor' => Session('nama'), ]); try { if ($modality == 'genexpert01' OR $modality == 'genexpert02' OR $modality == 'genexpert03'){ - $pesan = $this->Hl7Register($cekdata->id, $modality); + $dataForLis = [ + 'nama' => $cekdata->nmpasien, + 'noregister' => $cekdata->noregister, + 'nofoto' => $cekdata->nofoto, + 'kd_spesimen' => $cekdata->kd_spesimen, + 'nm_spesimen' => $cekdata->nm_spesimen, + 'tgllahir' => $cekdata->tgllahirpasien, + 'jk' => $cekdata->jkpasien, + ]; + $this->sendRegistrationToLis($dataForLis); } else { $pesan = 'Cannot send on Serial Port From Server'; } diff --git a/htdocs/app/Http/Controllers/LisController.php b/htdocs/app/Http/Controllers/LisController.php new file mode 100644 index 00000000..69b64992 --- /dev/null +++ b/htdocs/app/Http/Controllers/LisController.php @@ -0,0 +1,116 @@ +lisServiceUrl = env('LIS_SERVICE_URL', 'http://localhost:5000'); + } + + /** + * Mengirim perintah untuk mendaftarkan tes pasien baru ke GeneXpert. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\JsonResponse + */ + public function registerPatient(Request $request) + { + // Validasi input dari request (sangat direkomendasikan) + $validatedData = $request->validate([ + 'patient_name' => 'required|string|max:100', + 'patient_id' => 'required|string|max:50', + 'sample_id' => 'required|string|max:50', + 'test_code' => 'required|string|max:20', + 'test_name' => 'sometimes|string|max:50', + 'dob' => 'sometimes|date_format:Ymd', + 'gender' => 'sometimes|string|in:M,F,O,U', + ]); + + // Membangun payload sesuai format yang diharapkan oleh app.py + $payload = [ + 'command' => 'register_patient', + 'data' => $validatedData, + ]; + + try { + // Mengirim request POST ke service Python + $response = Http::timeout(30) // Set timeout 30 detik + ->post($this->lisServiceUrl . '/command', $payload); + + // Cek jika request gagal di level HTTP + if ($response->failed()) { + Log::error('Gagal terhubung ke LIS service saat registrasi.', [ + 'status' => $response->status(), + 'body' => $response->body() + ]); + return response()->json([ + 'error' => 'Tidak dapat terhubung ke LIS service.', + 'details' => $response->body() + ], 503); // Service Unavailable + } + + // Mengembalikan response dari service Python ke client + return response()->json($response->json(), $response->status()); + + } catch (\Illuminate\Http\Client\ConnectionException $e) { + Log::error('Koneksi ke LIS service gagal.', ['exception' => $e->getMessage()]); + return response()->json(['error' => 'Koneksi ke LIS service gagal.'], 504); // Gateway Timeout + } + } + + /** + * Mengirim perintah untuk meminta ulang hasil tes berdasarkan Sample ID. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\JsonResponse + */ + public function requestResult(Request $request) + { + // Validasi input + $validatedData = $request->validate([ + 'sample_id' => 'required|string|max:50', + ]); + + // Membangun payload + $payload = [ + 'command' => 'request_result', + 'data' => $validatedData, + ]; + + try { + // Mengirim request POST ke service Python + $response = Http::timeout(30)->post($this->lisServiceUrl . '/command', $payload); + + if ($response->failed()) { + Log::error('Gagal terhubung ke LIS service saat meminta hasil.', [ + 'status' => $response->status(), + 'body' => $response->body() + ]); + return response()->json([ + 'error' => 'Tidak dapat terhubung ke LIS service.', + 'details' => $response->body() + ], 503); + } + + return response()->json($response->json(), $response->status()); + + } catch (\Illuminate\Http\Client\ConnectionException $e) { + Log::error('Koneksi ke LIS service gagal.', ['exception' => $e->getMessage()]); + return response()->json(['error' => 'Koneksi ke LIS service gagal.'], 504); + } + } +}