update
This commit is contained in:
@@ -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
@@ -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")
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user