This commit is contained in:
Dwi Swandhana
2026-05-01 04:58:51 +07:00
parent d8c6ab7b55
commit 38ffa918c3
3 changed files with 71 additions and 41 deletions
@@ -1310,7 +1310,7 @@ class FrontpageController extends Controller
}
}
public function registerApi(Request $request) {
//Log::info(' Incomming '.json_encode($request->input()));
Log::info(' Incomming '.json_encode($request->input()));
$decodedData = $request->json()->all();
$norm = $decodedData['norm'] ?? null;
$nama = $decodedData['nama'] ?? null;
@@ -1325,41 +1325,33 @@ class FrontpageController extends Controller
$bpjs = $decodedData['nobpjs'] ?? '0';
$drpeminta = $decodedData['drpeminta'] ?? null;
$tlsasal = $decodedData['asalpasien'] ?? null;
//$rekues = $decodedData['layanan'] ?? null;
$diagnosa = $decodedData['diagnosa'] ?? null;
$statusbayar = $decodedData['statusbayar'] ?? null;
$notransaksi = $decodedData['notransaksi'] ?? null;
$insurance = $decodedData['asuransi'] ?? 'UMM';
$notransaksi = $decodedData['nomor_lab'] ?? null;
$insurance = $decodedData['jenispembayaran'] ?? 'UMM';
$klinis = $decodedData['klinis'] ?? null;
$klinisi = $decodedData['klinisi'] ?? $drpeminta;
$rekues = $decodedData['kode'] ?? null;
$rekues = $decodedData['jenispemeriksaan'] ?? null;
$nm_spesimen = $decodedData['spesimen'] ?? null;
$kd_spesimen = $decodedData['kodespesimen'] ?? null;
$pengambilan = $decodedData['pengambilan'] ?? null;
$nmrs = $decodedData['namarspengirim'] ?? 'RSSA Malang';
$nmrs = $decodedData['keteranganrujukan'] ?? 'RSSA Malang';
$tanggalregis = $decodedData['tanggalregis'] ?? date('Y-m-d');
$tanggalsampel = $decodedData['tanggalsampel'] ?? date('Y-m-d');
$telpon = str_replace('_', '', $nohap);
//$rekues = str_replace('_', ' ', $rekues);
$tlsasal = str_replace('_', ' ', $tlsasal);
$klinisi = str_replace('_', ' ', $klinisi);
$nama = str_replace('_', ' ', $nama);
$alamat = str_replace('_', ' ', $alamat);
$kd_spesimen = '';
$getkodespesimen= Organisms::where('name', $nm_spesimen)->where('kelompok', 'listkodespesimen')->first();
if (isset($getkodespesimen->category)){
$kd_spesimen= $getkodespesimen->category;
} else {
$cekdulu = explode(' ', $nm_spesimen);
if (isset($cekdulu[1])){
$kd_spesimen = str_replace('.', '', $cekdulu[0]);
} else {
foreach ($cekdulu as $kata) {
$kd_spesimen .= substr($kata, 0, 1);
}
}
Organisms::create([
'name' => $nm_spesimen,
'category' => $kd_spesimen,
'kelompok' => 'listkodespesimen'
]);
}
$iddokter = '';
$ruangan = 1;
@@ -1437,12 +1429,12 @@ class FrontpageController extends Controller
$check = Poli::where('subpoli', $rekues)->first();
if (isset($check->id)){
$poli_id = $check->id;
$kd_spesimen= $check->subsubpoli;
$nm_spesimen= $check->modaliti;
} else {
$poli_id = Poli::insertGetId([
'poli' => 'Mikrobiologi',
'subpoli' => $rekues,
'poli' => 'Mikrobiologi',
'subpoli' => $rekues,
'subsubpoli' => $kd_spesimen,
'modaliti' => $nm_spesimen,
]);
}
$nofoto = date('y').'-'.sprintf("% 06s", $noloket);
@@ -1492,6 +1484,10 @@ class FrontpageController extends Controller
'asuransi' => $insurance,
'urgensi' => $urgensi,
'daftar' => $mulai,
'diagnosa' => $diagnosa,
'pengambilan' => $pengambilan,
'tanggalregis' => $tanggalregis,
'tanggalsampel' => $tanggalsampel,
'pendaftar' => $clientIpNumeric,
'nmpendaftar' => $clientIp,
'orderid' => $notransaksi,
@@ -1501,7 +1497,7 @@ class FrontpageController extends Controller
if (in_array($poli_id, $daftaridtcm)){
$genexpert = false;
} else {
$genexpert = 1;
$genexpert = true;
}
Paslab::updateOrCreate(
@@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::table('periksa', function (Blueprint $table) {
if (!Schema::hasColumn('periksa', 'tanggalregis')) {
$table->date('tanggalregis')->nullable()->after('tgladendum');
}
if (!Schema::hasColumn('periksa', 'tanggalsampel')) {
$table->date('tanggalsampel')->nullable()->after('tanggalregis');
}
if (!Schema::hasColumn('periksa', 'pengambilan')) {
$table->string('pengambilan', 255)->nullable()->after('diagnosa2');
}
});
}
public function down(): void
{
Schema::table('periksa', function (Blueprint $table) {
if (Schema::hasColumn('periksa', 'tanggalregis')) {
$table->dropColumn('tanggalregis');
}
if (Schema::hasColumn('periksa', 'tanggalsampel')) {
$table->dropColumn('tanggalsampel');
}
if (Schema::hasColumn('periksa', 'pengambilan')) {
$table->dropColumn('pengambilan');
}
});
}
};
+15 -19
View File
@@ -450,29 +450,14 @@ def create_genexpert_rsp_z02_response(orders, incoming_hl7, ip_addr=None):
print(f"[GENEXPERT] Payload order dilewati rnoreg={sample_id} karena assay kosong.")
continue
first_name, last_name = split_patient_name(order.nama)
patient_name = sanitize_astm_field(f"{last_name}^{first_name}", uppercase=True, max_len=80, allow_component_sep=True)
dob = format_hl7_date(getattr(order, "tgllahir", None))
sex = map_hl7_sex(getattr(order, "rjenis", ""))
address = sanitize_astm_field(getattr(order, "alamat", ""), max_len=120)
room = sanitize_astm_field(getattr(order, "ruangan", ""), uppercase=True, max_len=80)
doctor = sanitize_astm_field(getattr(order, "namadok", ""), max_len=80)
requested_test_name = sanitize_astm_field(getattr(order, "tes", ""), max_len=120)
specimen_type = sanitize_astm_field(
getattr(order, "nm_spesimen", "") or getattr(order, "kd_spesimen", "") or "ORH",
uppercase=True,
max_len=40
)
print(
f"[GENEXPERT-DEBUG] Build RSP rnoreg={sample_id}, ip={ip_addr}, "
f"patient_id={patient_id}, assay_code={assay_code}, assay_source={assay_source}, "
f"capability_match={capability_match}, patient_name='{patient_name}', dob='{dob}', "
f"sex='{sex}', room='{room}', doctor='{doctor}', specimen_type='{specimen_type}', "
f"requested_test_name='{requested_test_name}', query_name='{query_name}', query_tag='{query_tag}'"
f"capability_match={capability_match}, query_name='{query_name}', query_tag='{query_tag}', "
"profile='minimal-rsp-z02'"
)
segments.append(f"PID|{patient_idx}||{patient_id}||{patient_name}||{dob}|{sex}|||{address}")
segments.append(f"PID|{patient_idx}||{patient_id}")
segments.append(f"ORC|NW|1|||||||{order_ts}")
segments.append(f"OBR|1|||{assay_code}|||||||A")
segments.append("TQ1|||||||||R")
@@ -627,7 +612,7 @@ def debug_genexpert_order_message(hl7_message, ip_addr=None):
print(
f"[GENEXPERT-ORDER-DEBUG] ip={ip_addr}, seg=PID, patient_id='{current_pid}', "
f"patient_name='{current_patient_name}', dob='{dob}', sex='{sex}', "
f"address='{address}', raw='{segment}'"
f"address='{address}', mode='minimal', raw='{segment}'"
)
elif seg_type == "ORC":
order_index = fields[2] if len(fields) > 2 else ""
@@ -2105,6 +2090,8 @@ def handle_genexpert_client(conn, addr):
log_genexpert_handshake(addr[0], "ETX-RX", detail=f"bytes={len(data)}")
if b"\x04" in data:
log_genexpert_handshake(addr[0], "EOT-RX", detail=f"bytes={len(data)}")
if b"\x15" in data:
log_genexpert_handshake(addr[0], "NAK-RX", detail=f"bytes={len(data)}")
# --- 1. HANDLE HANDSHAKE (ENQ) ---
# Jika alat kirim ENQ (\x05/♣), langsung balas ACK (\x06)
@@ -2115,6 +2102,10 @@ def handle_genexpert_client(conn, addr):
log_genexpert_handshake(addr[0], "ACK-TX", detail="reason=enq")
# Hapus ENQ dari buffer agar tidak mengganggu
buffer = buffer.replace(b'\x05', b'')
if b'\x15' in buffer:
log_genexpert_handshake(addr[0], "NAK-BUFFER-CLEAR", detail=f"buffer_len={len(buffer)}")
buffer = buffer.replace(b'\x15', b'')
# --- 2. CEK APAKAH PESAN SUDAH LENGKAP? ---
# Kita cari tanda akhir pesan umum:
@@ -2141,6 +2132,11 @@ def handle_genexpert_client(conn, addr):
# --- 3. PROSES JIKA LENGKAP ---
if msg_complete:
if end_marker_pos == 0 and buffer[:1] == b'\x04':
log_genexpert_handshake(addr[0], "EOT-CLEAR", detail="standalone-eot")
buffer = buffer[1:].lstrip(b'\r').lstrip(b'\n')
continue
# Ambil pesan dari awal sampai marker
# (Gunakan slice sampai end_marker_pos+1 agar karakter penutup ikut terambil/dibuang)
if end_marker_pos == -1: end_marker_pos = len(buffer)