This commit is contained in:
Dwi Swandhana
2026-02-19 09:42:12 +07:00
parent 6d859d1c6a
commit fddfe775ce
2 changed files with 64 additions and 75 deletions
@@ -1858,54 +1858,31 @@ class DokterController extends Controller
} else if ($worklist == 'getgenexpert'){ } else if ($worklist == 'getgenexpert'){
$isidata = $request->input('isi'); $isidata = $request->input('isi');
try { try {
$ketemu = ''; $cekdata = Periksa::where('nofoto', $nofoto)->first();
$cekada = ResultSample::where('accession_number', 'LIKE', $nofoto.'%')->get(); $noregister = $cekdata->noregister ?? '';
if ($cekada->isNotEmpty()){ $url = 'http://10.10.120.14:6002/api/genexpert/query-result';
foreach($cekada as $rows){
$ketemu .= ($ketemu ? '<br />' : '') . $rows->test_status; $response = Http::withHeaders([
} 'Content-Type' => 'application/json',
} else { 'Accept' => 'application/json',
$payload = [ ])->timeout(30)
'command' => 'request_result', ->post($url, [
'data' => [ 'accnumber' => $nofoto,
'sample_id' => $nofoto 'register_no' => $noregister,
], ]);
];
$response = Http::timeout(30)->post($this->lisServiceUrl . '/command', $payload); if ($response->successful()) {
if ($response->successful()) {
Log::info('Permintaan hasil berhasil dikirim ke LIS service.', [ Log::info('requestResult.', [
'sample_id' => $nofoto, 'status' => $response->status(),
'response' => $response->json() 'message' => $response->json()
]); ]);
} else {
Log::error('Gagal terhubung ke LIS service saat meminta hasil.', [
'sample_id' => $nofoto,
'status' => $response->status(),
'body' => $response->body()
]);
}
} }
if ($ketemu != ''){
if (is_null($isidata) || $isidata == ''){ Log::error('Exception dalam fungsi requestResult.', [
$isidata = $ketemu; 'status' => $response->status(),
} else { 'message' => 'Python Server Error: ' . $response->body()
$isidata = $isidata.'<br />'.$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;
} catch (Exception $e) { } catch (Exception $e) {
$pesan = (is_null($isidata) ? '' : $isidata . '<br />') . 'Error: ' . $e->getMessage(); $pesan = (is_null($isidata) ? '' : $isidata . '<br />') . 'Error: ' . $e->getMessage();
Log::error('Exception dalam fungsi requestResult.', [ Log::error('Exception dalam fungsi requestResult.', [
+40 -28
View File
@@ -257,27 +257,22 @@ def build_genexpert_result_query(accnumber, msg_control_id):
) )
return query_msg return query_msg
def select_target_genexpert_ip(preferred_ip=None): def get_active_genexpert_ips():
with connection_lock: with connection_lock:
if preferred_ip: return list(active_genexpert_connections.keys())
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
def trigger_result_query_to_genexpert(accnumber, register_no, target_ip=None, wait_seconds=20): def trigger_result_query_to_genexpert(accnumber, register_no, target_ip=None, wait_seconds=20):
resolved_ip = select_target_genexpert_ip(target_ip) active_ips = get_active_genexpert_ips()
if not resolved_ip: if not active_ips:
return {"ok": False, "message": "Koneksi GeneXpert tidak ditemukan atau ambigu. Isi target_ip."} return {"ok": False, "message": "Tidak ada koneksi GeneXpert aktif."}
with connection_lock: if target_ip:
conn = active_genexpert_connections.get(resolved_ip) target_ips = [target_ip] if target_ip in active_ips else []
if not conn: if not target_ips:
return {"ok": False, "message": f"Koneksi GeneXpert {resolved_ip} tidak aktif."} 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') ts = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
msg_control_id = f"LISQRY{ts}{int(time.time() * 1000) % 1000:03d}" 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: with pending_query_lock:
pending_result_queries[accnumber] = { pending_result_queries[accnumber] = {
"register_no": register_no, "register_no": register_no,
"target_ip": resolved_ip, "target_ips": list(target_ips),
"msg_control_id": msg_control_id, "msg_control_id": msg_control_id,
"requested_at": datetime.datetime.now(), "requested_at": datetime.datetime.now(),
"event": pending_event, "event": pending_event,
"status": "requested", "status": "requested",
} }
try: sent_ips = []
conn.sendall(mllp_payload) failed_ips = []
logging.info(f"[GENEXPERT-QUERY] Kirim query hasil accnumber={accnumber} ke {resolved_ip}") for ip in target_ips:
print(f"[GENEXPERT-QUERY] Kirim query hasil accnumber={accnumber} ke {resolved_ip}") with connection_lock:
except Exception as e: 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: with pending_query_lock:
pending_result_queries.pop(accnumber, None) 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: if wait_seconds and wait_seconds > 0:
pending_event.wait(wait_seconds) pending_event.wait(wait_seconds)
@@ -313,22 +320,25 @@ def trigger_result_query_to_genexpert(accnumber, register_no, target_ip=None, wa
return { return {
"ok": True, "ok": True,
"message": "Hasil ditemukan dan disimpan ke LisPhoenix.", "message": "Hasil ditemukan dan disimpan ke LisPhoenix.",
"target_ip": resolved_ip, "target_ips": sent_ips,
"accnumber": accnumber, "accnumber": accnumber,
"source_ip": state.get("source_ip"),
} }
# Timeout/hasil belum masuk, biarkan state tetap ada agar response telat tetap bisa diproses. # Timeout/hasil belum masuk, biarkan state tetap ada agar response telat tetap bisa diproses.
return { return {
"ok": True, "ok": True,
"message": "Query terkirim. Menunggu hasil dari GeneXpert.", "message": "Query terkirim. Menunggu hasil dari GeneXpert.",
"target_ip": resolved_ip, "target_ips": sent_ips,
"accnumber": accnumber, "accnumber": accnumber,
"failures": failed_ips,
} }
return { return {
"ok": True, "ok": True,
"message": "Query terkirim.", "message": "Query terkirim.",
"target_ip": resolved_ip, "target_ips": sent_ips,
"accnumber": accnumber, "accnumber": accnumber,
"failures": failed_ips,
} }
@app.route("/api/genexpert/query-result", methods=["POST"]) @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: with pending_query_lock:
pending = pending_result_queries.get(sample_id) pending = pending_result_queries.get(sample_id)
if pending: if pending:
source_ip = str(device_name).replace("GeneXpert-", "").strip()
mapped_no_id = pending.get("register_no") or sample_id mapped_no_id = pending.get("register_no") or sample_id
mapped_seq_no = 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["status"] = "found"
pending["source_ip"] = source_ip
pending["response_at"] = datetime.datetime.now() pending["response_at"] = datetime.datetime.now()
pending_event = pending.get("event") pending_event = pending.get("event")