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