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);
+ }
+ }
+}