diff --git a/htdocs/app/Http/Controllers/DokterController.php b/htdocs/app/Http/Controllers/DokterController.php index 91988d84..56799283 100644 --- a/htdocs/app/Http/Controllers/DokterController.php +++ b/htdocs/app/Http/Controllers/DokterController.php @@ -2009,10 +2009,9 @@ class DokterController extends Controller return back(); } } else if ($worklist == 'hapusdatapertumbuhankoloni'){ - $getdataawal = Periksa::where('nofoto', $nofoto)->first(); - $id = $getdataawal->id ?? $nofoto; + $idtabel = $request->input('id'); try { - $ceksek = DB::table('pertumkolomni')->where('orderid', $id)->first(); + $ceksek = DB::table('pertumkolomni')->where('id', $idtabel)->first(); Riwayat::create([ 'nofoto' => $nofoto, 'jawaban' => 'Menghapus Data Pertumbuhan Koloni', @@ -2020,7 +2019,7 @@ class DokterController extends Controller 'keterangan' => json_encode($ceksek), 'verifikasi' => '', ]); - DB::table('pertumkolomni')->where('orderid', $id)->delete(); + DB::table('pertumkolomni')->where('id', $idtabel)->delete(); return response()->json(['icon' => 'success', 'warna' => '#1dcbbd', 'status' => 'Success', 'message' => 'Delete Data Pertumbuhan Koloni Berhasil']); } catch (Exception $e) { $pesan = $e->getMessage(); diff --git a/htdocs/app/Http/Controllers/FrontpageController.php b/htdocs/app/Http/Controllers/FrontpageController.php index 5cc04217..4299937a 100644 --- a/htdocs/app/Http/Controllers/FrontpageController.php +++ b/htdocs/app/Http/Controllers/FrontpageController.php @@ -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; diff --git a/htdocs/resources/views/dokter/pemeriksaan.blade.php b/htdocs/resources/views/dokter/pemeriksaan.blade.php index a1c3518a..fa5fddb9 100644 --- a/htdocs/resources/views/dokter/pemeriksaan.blade.php +++ b/htdocs/resources/views/dokter/pemeriksaan.blade.php @@ -5412,7 +5412,7 @@ { text: 'Time', datafield: 'daftarjam', width: 80, cellsalign: 'center', align: 'center'}, { text: 'Inputor', filtertype: 'checkedlist', datafield: 'nmpendaftar', width: 110, cellsalign: 'left', align: 'center'}, { text: 'Comming From', filtertype: 'checkedlist', datafield: 'asalpasien', width: 120, cellsalign: 'left', align: 'center'}, - { text: 'Service', datafield: 'tlsreques', width: 150, cellsalign: 'left', align: 'center'}, + { text: 'Service', filtertype: 'checkedlist', datafield: 'tlsreques', width: 150, cellsalign: 'left', align: 'center'}, { text: 'Status', filtertype: 'checkedlist', datafield: 'tlsstatus', width: 150, cellsalign: 'left', align: 'center'}, { text: 'Themeplate', filtertype: 'checkedlist', datafield: 'dlp', width: 75, cellsalign: 'left', align: 'center'}, { text: 'Jenis', filtertype: 'checkedlist', datafield: 'diagnosa2', width: 75, cellsalign: 'left', align: 'center'}, diff --git a/htdocs/resources/views/dokter/ppds.blade.php b/htdocs/resources/views/dokter/ppds.blade.php index 8a714043..d7082103 100644 --- a/htdocs/resources/views/dokter/ppds.blade.php +++ b/htdocs/resources/views/dokter/ppds.blade.php @@ -5523,7 +5523,7 @@ { text: 'Time', datafield: 'daftarjam', width: 80, cellsalign: 'center', align: 'center'}, { text: 'Inputor', filtertype: 'checkedlist', datafield: 'nmpendaftar', width: 110, cellsalign: 'left', align: 'center'}, { text: 'Comming From', filtertype: 'checkedlist', datafield: 'asalpasien', width: 120, cellsalign: 'left', align: 'center'}, - { text: 'Service', datafield: 'tlsreques', width: 150, cellsalign: 'left', align: 'center'}, + { text: 'Service', filtertype: 'checkedlist', datafield: 'tlsreques', width: 150, cellsalign: 'left', align: 'center'}, { text: 'Status', filtertype: 'checkedlist', datafield: 'tlsstatus', width: 150, cellsalign: 'left', align: 'center'}, { text: 'Themeplate', filtertype: 'checkedlist', datafield: 'dlp', width: 75, cellsalign: 'left', align: 'center'}, { text: 'Jenis', filtertype: 'checkedlist', datafield: 'diagnosa2', width: 75, cellsalign: 'left', align: 'center'}, diff --git a/htdocs/resources/views/dokter/ppdsdeveloper.blade.php b/htdocs/resources/views/dokter/ppdsdeveloper.blade.php index 3486cc25..3f9dd7b1 100644 --- a/htdocs/resources/views/dokter/ppdsdeveloper.blade.php +++ b/htdocs/resources/views/dokter/ppdsdeveloper.blade.php @@ -5462,7 +5462,7 @@ { text: 'Time', datafield: 'daftarjam', width: 80, cellsalign: 'center', align: 'center'}, { text: 'Inputor', filtertype: 'checkedlist', datafield: 'nmpendaftar', width: 110, cellsalign: 'left', align: 'center'}, { text: 'Comming From', filtertype: 'checkedlist', datafield: 'asalpasien', width: 120, cellsalign: 'left', align: 'center'}, - { text: 'Service', datafield: 'tlsreques', width: 150, cellsalign: 'left', align: 'center'}, + { text: 'Service', filtertype: 'checkedlist', datafield: 'tlsreques', width: 150, cellsalign: 'left', align: 'center'}, { text: 'Status', filtertype: 'checkedlist', datafield: 'tlsstatus', width: 150, cellsalign: 'left', align: 'center'}, { text: 'Themeplate', filtertype: 'checkedlist', datafield: 'dlp', width: 75, cellsalign: 'left', align: 'center'}, { text: 'Jenis', filtertype: 'checkedlist', datafield: 'diagnosa2', width: 75, cellsalign: 'left', align: 'center'}, diff --git a/listener/app.py b/listener/app.py index 91a9785c..95f80990 100644 --- a/listener/app.py +++ b/listener/app.py @@ -81,6 +81,11 @@ GENEXPERT_RESULT_QUERY_INTERVAL_SECONDS = 120 GENEXPERT_RESULT_QUERY_MAX_DURATION_SECONDS = 21600 GENEXPERT_RESULT_QUERY_INFLIGHT_TIMEOUT_SECONDS = 45 GENEXPERT_ENABLE_RESULT_QUERY_SCHEDULER = False +GENEXPERT_RESPONSE_MODE_DEFAULT = "hl7_passive" +GENEXPERT_RESPONSE_MODE_BY_IP = { + # "10.10.120.73": "astm_active", + # "10.10.120.75": "hl7_passive", +} # Mapping Flag ke IP Address GeneXpert # Pastikan IP ini SESUAI dengan settingan "Server IP" di masing-masing alat (Client Mode) TARGET_MAPPING = { @@ -570,14 +575,71 @@ def frame_genexpert_response(hl7_message, framing): return f"\x0b{message}\x1c\r".encode("utf-8") return message.encode("utf-8") +def recv_genexpert_control_char(conn, timeout_seconds=5): + previous_timeout = conn.gettimeout() + try: + conn.settimeout(timeout_seconds) + return conn.recv(1) + finally: + conn.settimeout(previous_timeout) + +def send_genexpert_astm_frame(conn, ip_addr, payload, label=""): + try: + conn.sendall(b"\x05") + log_genexpert_handshake(ip_addr, "ENQ-TX", detail=f"label={label}") + + ctrl = recv_genexpert_control_char(conn, timeout_seconds=5) + if ctrl == b"\x06": + log_genexpert_handshake(ip_addr, "ACK-RX", detail=f"phase=pre-frame,label={label}") + elif ctrl == b"\x15": + log_genexpert_handshake(ip_addr, "NAK-RX", detail=f"phase=pre-frame,label={label}") + return False + else: + log_genexpert_handshake(ip_addr, "CTRL-RX", detail=f"phase=pre-frame,label={label},hex={ctrl.hex() if ctrl else 'timeout'}") + return False + + conn.sendall(payload) + log_genexpert_handshake(ip_addr, "FRAME-TX", detail=f"label={label},bytes={len(payload)}") + + ctrl = recv_genexpert_control_char(conn, timeout_seconds=5) + if ctrl == b"\x06": + log_genexpert_handshake(ip_addr, "ACK-RX", detail=f"phase=post-frame,label={label}") + conn.sendall(b"\x04") + log_genexpert_handshake(ip_addr, "EOT-TX", detail=f"label={label}") + return True + if ctrl == b"\x15": + log_genexpert_handshake(ip_addr, "NAK-RX", detail=f"phase=post-frame,label={label}") + conn.sendall(b"\x04") + log_genexpert_handshake(ip_addr, "EOT-TX", detail=f"label={label},after=nak") + return False + + log_genexpert_handshake(ip_addr, "CTRL-RX", detail=f"phase=post-frame,label={label},hex={ctrl.hex() if ctrl else 'timeout'}") + conn.sendall(b"\x04") + log_genexpert_handshake(ip_addr, "EOT-TX", detail=f"label={label},after=unexpected") + return False + except Exception as exc: + log_genexpert_handshake(ip_addr, "ASTM-SEND-ERROR", detail=f"label={label},error={exc}") + return False + +def get_genexpert_response_mode(ip_addr): + ip_addr = str(ip_addr or "").strip() + mode = GENEXPERT_RESPONSE_MODE_BY_IP.get(ip_addr, GENEXPERT_RESPONSE_MODE_DEFAULT) + if mode not in {"hl7_passive", "astm_active"}: + mode = GENEXPERT_RESPONSE_MODE_DEFAULT + return mode + def send_genexpert_response(conn, ip_addr, hl7_message, framing, label=""): log_genexpert_hl7("OUT", ip_addr, hl7_message, label=label) log_genexpert_hl7_full("OUT", ip_addr, hl7_message, label=label) payload = frame_genexpert_response(hl7_message, framing) + response_mode = get_genexpert_response_mode(ip_addr) print( f"[GENEXPERT-DEBUG] Send response ip={ip_addr}, framing={framing}, " - f"label={label}, bytes={len(payload)}" + f"response_mode={response_mode}, label={label}, bytes={len(payload)}" ) + if framing == "astm" and response_mode == "astm_active": + send_genexpert_astm_frame(conn, ip_addr, payload, label=label) + return conn.sendall(payload) def send_genexpert_transport_ack(conn, ip_addr, framing, reason="frame-received"):