diff --git a/htdocs/app/Console/Commands/ProcessAstmMessages.php b/htdocs/app/Console/Commands/ProcessAstmMessages.php index f10ebc2a..e087fec4 100644 --- a/htdocs/app/Console/Commands/ProcessAstmMessages.php +++ b/htdocs/app/Console/Commands/ProcessAstmMessages.php @@ -22,7 +22,7 @@ class ProcessAstmMessages extends Command public function handle() { // Ambil data dari DataListener - $dataListener = DataListiner::whereNull('processed')->get(); + $dataListener = DataListiner::where('processed', '0')->orderBy('created_at', 'DESC')->get(); if ($dataListener) { $jumlah = count($dataListener); $pesan = $this->astmMessageService->processAstmMessages($dataListener); diff --git a/htdocs/app/Http/Controllers/DokterController.php b/htdocs/app/Http/Controllers/DokterController.php index d7fb4915..51728b9d 100644 --- a/htdocs/app/Http/Controllers/DokterController.php +++ b/htdocs/app/Http/Controllers/DokterController.php @@ -1080,6 +1080,7 @@ class DokterController extends Controller ]); } } + $jsondata = json_decode($jsondata, true); if(is_array($jsondata) && count($jsondata) > 0){ foreach ($jsondata as $item){ RekapAntibiotik::updateOrCreate( @@ -1102,9 +1103,9 @@ class DokterController extends Controller $gentabel = RekapAntibiotik::where('orderid', $orderid)->get(); if (!empty($gentabel)){ $nomor = 1; - $isidata = ''; + $isidata = $isidata.'
NoAntibiotikValueS/I/R
'; foreach($gentabel as $rtabel){ - $isidata = $isidata.''; + $isidata = $isidata.''; $nomor++; } $isidata = $isidata.'
NoAntibiotikValueS/I/R
'.$nomor.''.$rtabel->antibiotic.''.$rtabel->value.''.$rtabel->interpretation.'
'.$nomor.''.$rtabel->resistance.''.$rtabel->value.''.$rtabel->interpretation.'
'; @@ -1328,10 +1329,10 @@ class DokterController extends Controller $setval = $batasbawah; } if ($nomor == 1){ - $tabel = '
NoAntibiotikSubDisc ContentS/I/R
'.$nomor.''.$getdata->antibiotik.''.$getdata->subantibiotik.''.$getdata->diskcontent.''.$setnilai.'
'; + $tabel = '
NoAntibiotikSubDisc ContentS/I/R
'.$nomor.''.$getdata->antibiotik.' '.$getdata->subantibiotik.''.$getdata->diskcontent.''.$setnilai.'
'; } else { - $baris = ''.$nomor.''.$getdata->antibiotik.''.$getdata->subantibiotik.''.$getdata->diskcontent.''.$setnilai.''; + $baris = ''.$nomor.''.$getdata->antibiotik.' '.$getdata->subantibiotik.''.$getdata->diskcontent.''.$setnilai.''; $tabel = str_replace('', $baris, $tabelawal); $tabel = $tabel.''; } @@ -1730,6 +1731,36 @@ class DokterController extends Controller 'antibiotikall' => $antibiotikall, ); } + /* + $getsirab = SiraB::orderBy('family', 'ASC')->orderBy('spesies', 'ASC')->where('cek', '1')->get(); + foreach($getsirab as $row){ + $family = $row->family; + $spesies= $row->spesies; + $getallantibiotik = SiraB::where('family', $family)->where('spesies', $spesies)->get(); + foreach ($getallantibiotik as $row2){ + SiraB::updateOrCreate( + [ + 'family' => $row->family, + 'spesies' => $row->spesies, + 'antibiotik' => $row2->antibiotik, + 'subantibiotik' => $row2->subantibiotik, + ], + [ + 'diskcontent' => $row2->diskcontent, + 'batasatas' => $row2->batasatas, + 'midrange' => $row2->midrange, + 'batasbawah' => $row2->batasbawah, + 'sumber' => $row2->sumber, + 'kodedok' => $row2->kodedok, + 'atu' => $row2->atu, + 'kelompok' => $row2->kelompok, + 'glassreportname' => trim($row2->glassreportname), + 'cek' => '0', + ] + ); + } + } + */ echo json_encode($arrayfiles); } else if ($idpasien == 'Bakteri'){ $getsirab = Organisms::where('kelompok', 'biakankultur')->orderBy('category', 'ASC')->orderBy('name', 'ASC')->get(); diff --git a/htdocs/app/Http/Controllers/FrontpageController.php b/htdocs/app/Http/Controllers/FrontpageController.php index 8804a60d..3cc188ed 100644 --- a/htdocs/app/Http/Controllers/FrontpageController.php +++ b/htdocs/app/Http/Controllers/FrontpageController.php @@ -762,6 +762,27 @@ class FrontpageController extends Controller 'orderid' => $notransaksi, ]); $pesan = $nofoto; + DB::table('paslab')->insert([ + 'rnoreg' => $nofoto, + 'nama' => $nama, + 'norm' => $noregister, + 'rtglast' => $mulai, + 'alamat' => $alamat, + 'rjenis' => $jk, + 'umur' => $usia, + 'namadok' => $klinisi, + 'ruangan' => 'Mikrobiologi', + 'tes' => $rekues, + 'alat' => 'ALL', + 'kd_spesimen' => $kd_spesimen, + 'nm_spesimen' => $nm_spesimen, + 'tgllahir' => $tgllahir, + 'flg_vitek1' => false, + 'flg_vitek2' => false, + 'flg_bd1' => false, + 'flg_bd2' => false, + 'flg_gxp' => false, + ]); if ($kd_spesimen != '' AND $nm_spesimen != ''){ PendaftaranOnListiner::updateOrCreate( [ @@ -786,16 +807,7 @@ 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); @@ -999,6 +1011,7 @@ class FrontpageController extends Controller 'flg_vitek2' => false, 'flg_bd1' => false, 'flg_bd2' => false, + 'flg_gxp' => false, ]); if ($kd_spesimen != '' AND $nm_spesimen != ''){ PendaftaranOnListiner::updateOrCreate( @@ -1398,6 +1411,30 @@ class FrontpageController extends Controller 'kd_spesimen' => $kd_spesimen, 'nm_spesimen' => $nm_spesimen, ]); + $ceksudah = DB::table('paslab')->where('rnoreg', $nofoto)->count(); + if ($ceksudah == 0){ + DB::table('paslab')->insert([ + 'rnoreg' => $nofoto, + 'nama' => $nama, + 'norm' => $noregister, + 'rtglast' => $mulai, + 'alamat' => $alamat, + 'rjenis' => $jk, + 'umur' => $usia, + 'namadok' => $getdata->dokter ?? 'Unkown', + 'ruangan' => 'Mikrobiologi', + 'tes' => $rekues, + 'alat' => 'ALL', + 'kd_spesimen' => $kd_spesimen, + 'nm_spesimen' => $nm_spesimen, + 'tgllahir' => $tgllahir, + 'flg_vitek1' => false, + 'flg_vitek2' => false, + 'flg_bd1' => false, + 'flg_bd2' => false, + ]); + } + $pesan = $pesan.' Data Berhasil di Update'; if ($kd_spesimen != '' AND $nm_spesimen != ''){ PendaftaranOnListiner::updateOrCreate( @@ -1423,6 +1460,7 @@ class FrontpageController extends Controller 'nm_spesimen' => $nm_spesimen, ] ); + /* $dataForLis = [ 'nama' => $nama, 'noregister' => $noregister, @@ -1433,6 +1471,7 @@ class FrontpageController extends Controller 'jk' => $jk, ]; $this->sendRegistrationToLis($dataForLis); + */ } if ($pesan != ''){ if ($file != '' AND $jenisgambar != ''){ @@ -1479,19 +1518,28 @@ class FrontpageController extends Controller 'nmexcutor' => Session('nama'), ]); try { - if ($modality == 'genexpert01' OR $modality == 'genexpert02' OR $modality == 'genexpert03'){ - $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'; + $ceksudah = DB::table('paslab')->where('rnoreg', $nofoto)->count(); + if ($ceksudah == 0){ + DB::table('paslab')->insert([ + 'rnoreg' => $nofoto, + 'nama' => $nama, + 'norm' => $cekdata->noregister, + 'rtglast' => $cekdata->mulai, + 'alamat' => $alamat, + 'rjenis' => $jk, + 'umur' => $cekdata->usia, + 'namadok' => $getdata->dokter ?? 'Unkown', + 'ruangan' => 'Mikrobiologi', + 'tes' => $cekdata->reques, + 'alat' => 'ALL', + 'kd_spesimen' => $cekdata->kd_spesimen, + 'nm_spesimen' => $cekdata->nm_spesimen, + 'tgllahir' => $cekdata->tgllahirpasien, + 'flg_vitek1' => false, + 'flg_vitek2' => false, + 'flg_bd1' => false, + 'flg_bd2' => false, + ]); } }catch (Exception $e) { $pesan = $e->getMessage(); diff --git a/htdocs/app/Http/Controllers/ReportController.php b/htdocs/app/Http/Controllers/ReportController.php index b91f11e1..7e6b2ef7 100644 --- a/htdocs/app/Http/Controllers/ReportController.php +++ b/htdocs/app/Http/Controllers/ReportController.php @@ -308,25 +308,34 @@ class ReportController extends Controller } } public function genRekapAntibiotik(Request $request) { - $data = []; - $bulan = $request->input('bulan'); - $tahun = $request->input('tahun'); + $data = []; + $bulan = $request->input('bulan'); + $tahun = $request->input('tahun'); if ($tahun == '' OR is_null($tahun)){ - $getarray = explode('?', $bulan); - $bulan = $getarray[0] ?? date('m'); - $tahun = $getarray[1] ?? date('Y'); - $bulan = str_replace('bulan=', '', $bulan); - $tahun = str_replace('tahun=', '', $tahun); - } + $getarray = explode('?', $bulan); + $bulan = $getarray[0] ?? date('m'); + $tahun = $getarray[1] ?? date('Y'); + $bulan = str_replace('bulan=', '', $bulan); + $tahun = str_replace('tahun=', '', $tahun); + } if ($bulan == '' OR $bulan == 'ALL' OR $bulan == 'Pick Month') { - $orderbydate = Periksa::whereYear('daftar', $tahun)->get(); - $jsonantibiotik = RekapAntibiotik::whereIn('orderid', $orderbydate->pluck('id'))->get()->groupBy('orderid'); + $orderbydate = Periksa::whereYear('daftar', $tahun)->orderBy('daftar', 'asc')->get(); } else { - $orderbydate = Periksa::whereMonth('daftar', $bulan)->whereYear('daftar', $tahun)->get(); - $jsonantibiotik = RekapAntibiotik::whereIn('orderid', $orderbydate->pluck('id'))->get()->groupBy('orderid'); + $orderbydate = Periksa::whereMonth('daftar', $bulan)->whereYear('daftar', $tahun)->orderBy('daftar', 'asc')->get(); } - return view('admin.rekapantibiotik', compact('orderbydate', 'jsonantibiotik', 'bulan', 'tahun')); - } + + $orderIds = $orderbydate->pluck('id'); + + $allAntibiotics = RekapAntibiotik::whereIn('orderid', $orderIds)->get(); + + $masterAntibioticList = $allAntibiotics->pluck('resistance')->unique()->sort()->values(); + + $jsonantibiotik = $allAntibiotics->groupBy('orderid')->map(function ($items) { + return $items->pluck('interpretation', 'resistance'); + }); + + return view('admin.rekapantibiotik', compact('orderbydate', 'jsonantibiotik', 'bulan', 'tahun', 'masterAntibioticList')); + } public function genGlassReport(Request $request) { $data = []; $bulan = $request->input('bulan'); diff --git a/htdocs/app/ResultOnListiner.php b/htdocs/app/ResultOnListiner.php new file mode 100644 index 00000000..4a548391 --- /dev/null +++ b/htdocs/app/ResultOnListiner.php @@ -0,0 +1,15 @@ +json(['message' => 'Data berhasil diproses dan disimpan.']); } else { - if (!empty($mltrData)){ - Log::info("Trying parser MTRSL :", $mltrData); - $parsedData = []; - $parsedData['antibiotics'] = []; - $antibiotic = ''; - $resistance = ''; - $value = ''; - $interpretation = ''; - $mulaikirim = 0; - $resultSample = new ResultSample(); - foreach ($mltrData as $index => $field) { - if ($field == 'ra'){ - if ($antibiotic != ''){ - $parsedData['antibiotics'][] = [ - 'antibiotic' => $antibiotic, // Antibiotik - 'resistance' => $resistance, // Hasil Resistansi - 'value' => $value, // Nilai - 'interpretation'=> $interpretation // Interpretasi - ]; - $antibiotic = ''; - $resistance = ''; - $value = ''; - $interpretation = ''; - } else { - $mulaikirim = 1; - } - } else { - if ($mulaikirim == 1){ - $antibiotic = substr($field, 2); - $mulaikirim++; - } else if ($mulaikirim == 2){ - $resistance = substr($field, 2); - $mulaikirim++; - } else if ($mulaikirim == 3){ - $value = substr($field, 2); - $mulaikirim++; - } else if ($mulaikirim == 4){ - $interpretation = substr($field, 2); - $mulaikirim++; - } else { - $field = substr($field, 2); - switch ($index) { - case 0: - $resultSample->sender_name = $alat; - break; - case 1: - $resultSample->version_number = $field; // iiV2 - break; - case 2: - $resultSample->isolate_number = $field; // is000015F278BD - break; - case 4: - $resultSample->patient_id = $field; // pi12009427 - break; - case 5: - $patientNames = explode(',', $field ?? null); - if (count($patientNames) > 0) { - $resultSample->patient_name_last = trim($patientNames[0]); // Last name - } - if (count($patientNames) > 1) { - $resultSample->patient_name_first = trim($patientNames[1]); // First name - } - if (count($patientNames) > 2) { - $resultSample->patient_name_middle = trim($patientNames[2]); // Middle name - } - break; - case 6: - $resultSample->address_street = $field; // plMANINJAU - break; - case 12: - try { - $resultSample->message_datetime = Carbon::parse($field)->format('Y-m-d') ?? null; - }catch (Exception $e) { - $resultSample->message_datetime = date('Y-m-d'); - } - break; - case 13: - try { - $resultSample->test_complete_datetime = Carbon::parse($field)->format('Y-m-d') ?? null; - }catch (Exception $e) { - $resultSample->test_complete_datetime = date('Y-m-d'); - } - break; - case 14: - $resultSample->accession_number = substr($field, 6); // ci30112024.26859 - break; - case 23: - $resultSample->organism = $field; // o2Staphylococcus haemolyticus - break; + if (!empty($mltrData)) { + Log::info("Trying robust parser for MTRSL:", $mltrData); + + $resultSample = new ResultSample(); + $antibioticResults = []; + $currentAntibiotic = []; + + foreach ($mltrData as $field) { + if (strlen($field) < 2) continue; // Lewati field kosong + + // 1. Identifikasi TAG dan VALUE dari setiap field + $tag = substr($field, 0, 2); + $value = substr($field, 2); + + // 2. Gunakan SWITCH pada TAG, bukan pada INDEX + switch ($tag) { + // == Data Pasien & Sampel == + case 'pi': $resultSample->patient_id = $value; break; + case 'pn': + $patientNames = explode(',', $value ?? null); + $resultSample->patient_name_last = trim($patientNames[0] ?? ''); + $resultSample->patient_name_first = trim($patientNames[1] ?? ''); + $resultSample->patient_name_middle = trim($patientNames[2] ?? ''); + break; + case 'pl': $resultSample->address_street = $value; break; + case 'ci': $resultSample->accession_number = substr($value, 6); break; + case 'o2': $resultSample->organism = $value; break; + + // Tanggal bisa memiliki tag s1, s3, dll. Sesuaikan jika perlu + case 's3': + try { + // Contoh parsing tanggal dari format Vitek: 08/25/2025 + $resultSample->test_complete_datetime = Carbon::createFromFormat('m/d/Y', $value)->format('Y-m-d H:i:s'); + } catch (Exception $e) { + $resultSample->test_complete_datetime = now(); } - } + break; + + // == Logika Cerdas untuk Blok Antibiotik == + case 'ra': + // 'ra' adalah sinyal bahwa blok antibiotik SEBELUMNYA sudah selesai. + // Jika $currentAntibiotic tidak kosong, simpan ke hasil utama. + if (!empty($currentAntibiotic)) { + $antibioticResults[] = $currentAntibiotic; + } + // Reset untuk menampung data antibiotik yang baru. + $currentAntibiotic = []; + break; + case 'a1': $currentAntibiotic['antibiotic'] = $value; break; // Kode Antibiotik + case 'a2': $currentAntibiotic['resistance'] = $value; break; // Nama Antibiotik + case 'a3': $currentAntibiotic['value'] = $value; break; // Nilai MIC + case 'a4': $currentAntibiotic['interpretation'] = $value; break; // Interpretasi + case 'an': + // Jika 'an' ada, ini adalah interpretasi final, timpa yang sebelumnya. + $currentAntibiotic['interpretation'] = $value; + break; + + // == Metadata Lainnya (opsional) == + case 'ii': $resultSample->version_number = $value; break; + case 'is': $resultSample->isolate_number = $value; break; } } - - //$resultSample->specimen_type = $parsedData['specimen_type'] ?? null; // Could be inferred - //$resultSample->test_id = $parsedData['test_id'] ?? null; - // Result Record - - $resultSample->additional_result = json_encode($parsedData['antibiotics']); + // Penting: Simpan blok antibiotik TERAKHIR setelah loop selesai + if (!empty($currentAntibiotic)) { + $antibioticResults[] = $currentAntibiotic; + } + + $resultSample->sender_name = $alat ?? 'VITEK'; // Pastikan var $alat ada + $resultSample->additional_result = json_encode($antibioticResults); // Menyimpan data yang sudah diparse $resultSample->save(); - Log::info("Data MTRL Berhasil di Parse dan di simpan ", $resultSample->toArray()); + Log::info("Data MTRSL successfully parsed and saved.", $resultSample->toArray()); return response()->json(['message' => 'Data berhasil diproses dan disimpan.']); } else { $headerData = explode("|", $response); diff --git a/htdocs/database/migrations/2024_11_14_093751_create_periksa_table.php b/htdocs/database/migrations/2024_11_14_093751_create_periksa_table.php index dfcea1ce..f418dad0 100644 --- a/htdocs/database/migrations/2024_11_14_093751_create_periksa_table.php +++ b/htdocs/database/migrations/2024_11_14_093751_create_periksa_table.php @@ -50,7 +50,7 @@ return new class extends Migration $table->string('nmanalis', 250)->nullable(); $table->string('nmexcutor', 250)->nullable(); $table->string('klinisi', 250)->nullable(); - $table->string('klinis', 250)->nullable(); + $table->mediumText('klinis')->nullable(); $table->integer('poli_id')->nullable(); $table->text('keterangan')->nullable(); $table->text('kesimpulan')->nullable(); diff --git a/htdocs/resources/views/admin/rekapantibiotik.blade.php b/htdocs/resources/views/admin/rekapantibiotik.blade.php index fbd4cd03..154551ce 100644 --- a/htdocs/resources/views/admin/rekapantibiotik.blade.php +++ b/htdocs/resources/views/admin/rekapantibiotik.blade.php @@ -37,9 +37,9 @@ bhp_antibiotiktambahan id_esbl id_mrsa - @if(isset($jsonantibiotik) && !empty($jsonantibiotik)) - @foreach($jsonantibiotik->first() as $antibiotic) - {{ $antibiotic->antibiotic }} + @if(isset($masterAntibioticList)) + @foreach($masterAntibioticList as $antibioticName) + {{ strtoupper($antibioticName) }} @endforeach @endif @@ -72,12 +72,16 @@ {{ $data->bhp_antibiotiktambahan}} {{ $data->id_esbl}} {{ $data->id_mrsa}} - @if(isset($jsonantibiotik[$data->id]) && !empty($jsonantibiotik[$data->id])) - @foreach($jsonantibiotik[$data->id] as $antibiotic) - {{ $antibiotic->interpretation }} + @php + $patientResults = $jsonantibiotik->get($data->id); + @endphp + + @if(isset($masterAntibioticList)) + @foreach($masterAntibioticList as $antibioticName) + + {{ $patientResults[$antibioticName] ?? '-' }} + @endforeach - @else -   @endif @endforeach diff --git a/htdocs/resources/views/dokter/pemeriksaan.blade.php b/htdocs/resources/views/dokter/pemeriksaan.blade.php index 31ea13ba..2f3ce6ba 100644 --- a/htdocs/resources/views/dokter/pemeriksaan.blade.php +++ b/htdocs/resources/views/dokter/pemeriksaan.blade.php @@ -2069,6 +2069,7 @@ @push('script')