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")