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'){
$isidata = $request->input('isi');
try {
$ketemu = '';
$cekada = ResultSample::where('accession_number', 'LIKE', $nofoto.'%')->get();
if ($cekada->isNotEmpty()){
foreach($cekada as $rows){
$ketemu .= ($ketemu ? '<br />' : '') . $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.'<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;
Log::error('Exception dalam fungsi requestResult.', [
'status' => $response->status(),
'message' => 'Python Server Error: ' . $response->body()
]);
} catch (Exception $e) {
$pesan = (is_null($isidata) ? '' : $isidata . '<br />') . 'Error: ' . $e->getMessage();
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
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")