From fddfe775ce174754abcd5ad6783e61a9be4e2061 Mon Sep 17 00:00:00 2001 From: Dwi Swandhana Date: Thu, 19 Feb 2026 09:42:12 +0700 Subject: [PATCH] update --- .../app/Http/Controllers/DokterController.php | 71 +++++++------------ listener/app.py | 68 ++++++++++-------- 2 files changed, 64 insertions(+), 75 deletions(-) diff --git a/htdocs/app/Http/Controllers/DokterController.php b/htdocs/app/Http/Controllers/DokterController.php index 26fd2d9d..58a0f5a4 100644 --- a/htdocs/app/Http/Controllers/DokterController.php +++ b/htdocs/app/Http/Controllers/DokterController.php @@ -1858,54 +1858,31 @@ class DokterController extends Controller } 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() - ]); - } + $cekdata = Periksa::where('nofoto', $nofoto)->first(); + $noregister = $cekdata->noregister ?? ''; + $url = 'http://10.10.120.14:6002/api/genexpert/query-result'; + + $response = Http::withHeaders([ + 'Content-Type' => 'application/json', + 'Accept' => 'application/json', + ])->timeout(30) + ->post($url, [ + 'accnumber' => $nofoto, + 'register_no' => $noregister, + ]); + + if ($response->successful()) { + + Log::info('requestResult.', [ + 'status' => $response->status(), + 'message' => $response->json() + ]); } - 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; + + Log::error('Exception dalam fungsi requestResult.', [ + 'status' => $response->status(), + 'message' => 'Python Server Error: ' . $response->body() + ]); } catch (Exception $e) { $pesan = (is_null($isidata) ? '' : $isidata . '
') . 'Error: ' . $e->getMessage(); Log::error('Exception dalam fungsi requestResult.', [ diff --git a/listener/app.py b/listener/app.py index dae0b81e..ab715a40 100644 --- a/listener/app.py +++ b/listener/app.py @@ -257,27 +257,22 @@ def build_genexpert_result_query(accnumber, msg_control_id): ) return query_msg -def select_target_genexpert_ip(preferred_ip=None): +def get_active_genexpert_ips(): with connection_lock: - if preferred_ip: - if preferred_ip in active_genexpert_connections: - return preferred_ip - return None - - active_ips = list(active_genexpert_connections.keys()) - if len(active_ips) == 1: - return active_ips[0] - return None + return list(active_genexpert_connections.keys()) def trigger_result_query_to_genexpert(accnumber, register_no, target_ip=None, wait_seconds=20): - resolved_ip = select_target_genexpert_ip(target_ip) - if not resolved_ip: - return {"ok": False, "message": "Koneksi GeneXpert tidak ditemukan atau ambigu. Isi target_ip."} + active_ips = get_active_genexpert_ips() + if not active_ips: + return {"ok": False, "message": "Tidak ada koneksi GeneXpert aktif."} - with connection_lock: - conn = active_genexpert_connections.get(resolved_ip) - if not conn: - return {"ok": False, "message": f"Koneksi GeneXpert {resolved_ip} tidak aktif."} + if target_ip: + target_ips = [target_ip] if target_ip in active_ips else [] + if not target_ips: + return {"ok": False, "message": f"Koneksi GeneXpert {target_ip} tidak aktif."} + else: + # Default: kirim query ke semua GeneXpert yang sedang terkoneksi. + target_ips = active_ips ts = datetime.datetime.now().strftime('%Y%m%d%H%M%S') msg_control_id = f"LISQRY{ts}{int(time.time() * 1000) % 1000:03d}" @@ -288,21 +283,33 @@ def trigger_result_query_to_genexpert(accnumber, register_no, target_ip=None, wa with pending_query_lock: pending_result_queries[accnumber] = { "register_no": register_no, - "target_ip": resolved_ip, + "target_ips": list(target_ips), "msg_control_id": msg_control_id, "requested_at": datetime.datetime.now(), "event": pending_event, "status": "requested", } - try: - conn.sendall(mllp_payload) - logging.info(f"[GENEXPERT-QUERY] Kirim query hasil accnumber={accnumber} ke {resolved_ip}") - print(f"[GENEXPERT-QUERY] Kirim query hasil accnumber={accnumber} ke {resolved_ip}") - except Exception as e: + sent_ips = [] + failed_ips = [] + for ip in target_ips: + with connection_lock: + conn = active_genexpert_connections.get(ip) + if not conn: + failed_ips.append({"ip": ip, "error": "connection-not-active"}) + continue + try: + conn.sendall(mllp_payload) + sent_ips.append(ip) + logging.info(f"[GENEXPERT-QUERY] Kirim query hasil accnumber={accnumber} ke {ip}") + print(f"[GENEXPERT-QUERY] Kirim query hasil accnumber={accnumber} ke {ip}") + except Exception as e: + failed_ips.append({"ip": ip, "error": str(e)}) + + if not sent_ips: with pending_query_lock: pending_result_queries.pop(accnumber, None) - return {"ok": False, "message": f"Gagal kirim query ke GeneXpert {resolved_ip}: {e}"} + return {"ok": False, "message": "Gagal kirim query ke semua GeneXpert aktif.", "failures": failed_ips} if wait_seconds and wait_seconds > 0: pending_event.wait(wait_seconds) @@ -313,22 +320,25 @@ def trigger_result_query_to_genexpert(accnumber, register_no, target_ip=None, wa return { "ok": True, "message": "Hasil ditemukan dan disimpan ke LisPhoenix.", - "target_ip": resolved_ip, + "target_ips": sent_ips, "accnumber": accnumber, + "source_ip": state.get("source_ip"), } # Timeout/hasil belum masuk, biarkan state tetap ada agar response telat tetap bisa diproses. return { "ok": True, "message": "Query terkirim. Menunggu hasil dari GeneXpert.", - "target_ip": resolved_ip, + "target_ips": sent_ips, "accnumber": accnumber, + "failures": failed_ips, } return { "ok": True, "message": "Query terkirim.", - "target_ip": resolved_ip, + "target_ips": sent_ips, "accnumber": accnumber, + "failures": failed_ips, } @app.route("/api/genexpert/query-result", methods=["POST"]) @@ -451,10 +461,12 @@ def parse_hl7_result(conn, msg_id, hl7_message, device_name="GeneXpert"): with pending_query_lock: pending = pending_result_queries.get(sample_id) if pending: + source_ip = str(device_name).replace("GeneXpert-", "").strip() mapped_no_id = pending.get("register_no") or sample_id mapped_seq_no = sample_id - mapped_alat = f"GeneXpert-{pending.get('target_ip')}" + mapped_alat = f"GeneXpert-{source_ip}" if source_ip else device_name pending["status"] = "found" + pending["source_ip"] = source_ip pending["response_at"] = datetime.datetime.now() pending_event = pending.get("event")