Update send order ke Python MiniPCs

This commit is contained in:
servdal
2025-08-23 19:59:36 +07:00
parent 094ceb0b9f
commit 0cecf8760c
3 changed files with 284 additions and 75 deletions

View File

@@ -51,6 +51,11 @@ define( 'API_ACCESS_KEY', 'AAAA6YBXh1k:APA91bFL0q7QAXQGohXMpTwHco79f13C8PFk1Oo8k
class DokterController extends Controller
{
protected $lisServiceUrl;
public function __construct()
{
$this->lisServiceUrl = env('LIS_SERVICE_URL', 'http://localhost:5000');
}
protected static function genSurat($id, $tabel){
if ($tabel == 'dengan kop'){
$kopsurat = url('/templateimage/kopsurat.png');
@@ -1127,7 +1132,7 @@ class DokterController extends Controller
}
return response()->json(['pesan' => $pesan, 'organism' => $organism]);
return back();
} else if ($worklist == 'getbbachtect' OR $worklist == 'getmgit' OR $worklist == 'getgenexpert' OR $worklist == 'getabbot'){
} else if ($worklist == 'getbbachtect' OR $worklist == 'getmgit' OR $worklist == 'getabbot'){
$isidata = $request->input('isi');
try {
$ketemu = '';
@@ -1166,6 +1171,67 @@ class DokterController extends Controller
$pesan = $isidata.'<br />'.$e->getMessage();
}
return $pesan;
} 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()
]);
}
}
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;
} catch (Exception $e) {
$pesan = (is_null($isidata) ? '' : $isidata . '<br />') . 'Error: ' . $e->getMessage();
Log::error('Exception dalam fungsi requestResult.', [
'sample_id' => $nofoto,
'exception' => $e->getMessage()
]);
}
return response($pesan, 200);
} else if ($worklist == 'addviralload'){
$tabelawal = $request->input('tabelawal');
$idtabel = $request->input('idtabel');

View File

@@ -4,6 +4,8 @@ namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Http;
use App\Services\AstmMessageService;
use App\Services\SerialCommunicationService;
use App\Http\Controllers\SendMail;
@@ -29,21 +31,58 @@ use Validator;
use Session;
use DateTime;
use QrCode;
use Exception;
use Carbon\Carbon;
use Aranyasen\HL7\Message;
use Aranyasen\HL7\Connection;
use Aranyasen\HL7\Segment;
use Aranyasen\HL7\Segments\MSH;
use Aranyasen\HL7\Segments\PV1;
use Aranyasen\HL7\Segments\OBR;
use Aranyasen\HL7\Segments\ORC;
use Aranyasen\HL7\Segments\PID;
use Aranyasen\HL7\Segments\OBX;
use Aranyasen\HL7\Segments\NTE;
use Aranyasen\HL7\Segments\EVN;
class FrontpageController extends Controller
{
protected $lisServiceUrl;
public function __construct()
{
// Mengambil URL service dari file .env, dengan fallback default
$this->lisServiceUrl = env('LIS_SERVICE_URL', 'http://localhost:5000');
}
private function sendRegistrationToLis(array $data)
{
// Memetakan data dari fungsi register Anda ke format yang dibutuhkan LIS service
// PENTING: Pastikan pemetaan ini benar, terutama 'test_code'.
$payload = [
'command' => 'register_patient',
'data' => [
'patient_name' => $data['nama'],
'patient_id' => $data['noregister'], // Menggunakan no register sebagai ID Pasien
'sample_id' => $data['nofoto'], // Menggunakan nofoto sebagai ID Sampel unik
'test_code' => $data['kd_spesimen'],// Kode tes spesifik untuk GeneXpert (e.g., MTBRIF)
'test_name' => $data['nm_spesimen'],
'dob' => $data['tgllahir'] ? \Carbon\Carbon::parse($data['tgllahir'])->format('Ymd') : '',
'gender' => $data['jk'],
],
];
try {
$response = Http::timeout(30)->post($this->lisServiceUrl . '/command', $payload);
if ($response->failed()) {
Log::error('Gagal mengirim data pendaftaran ke LIS service.', [
'sample_id' => $data['nofoto'],
'status' => $response->status(),
'response' => $response->body()
]);
} else {
Log::info('Data pendaftaran berhasil dikirim ke LIS service.', [
'sample_id' => $data['nofoto'],
'response' => $response->json()
]);
}
} catch (Exception $e) {
Log::error('Koneksi ke LIS service gagal saat pendaftaran.', [
'sample_id' => $data['nofoto'],
'exception' => $e->getMessage()
]);
}
}
public function index() {
$data = [];
$data['antrkrmsitu']= PeriksaSYNC::where('created_by', Session('username'))->where('status', '')->count();
@@ -748,6 +787,16 @@ class FrontpageController extends Controller
'nm_spesimen' => $nm_spesimen,
]
);
$dataForLis = [
'nama' => $nama,
'noregister' => $noregister,
'nofoto' => $nofoto,
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'jk' => $jk,
];
$this->sendRegistrationToLis($dataForLis);
}
if ($pesan != ''){
return response()->json(['status' => 'Sukses', 'message' => $pesan], 201);
@@ -956,6 +1005,16 @@ class FrontpageController extends Controller
'nm_spesimen' => $nm_spesimen,
]
);
$dataForLis = [
'nama' => $nama,
'noregister' => $noregister,
'nofoto' => $nofoto,
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'jk' => $jk,
];
$this->sendRegistrationToLis($dataForLis);
}
return response()->json(['status' => 'Sukses', 'message' => $pesan], 201);
} catch (Exception $e) {
@@ -1195,6 +1254,16 @@ class FrontpageController extends Controller
'nm_spesimen' => $nm_spesimen,
]
);
$dataForLis = [
'nama' => $nama,
'noregister' => $noregister,
'nofoto' => $nofoto,
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'jk' => $jk,
];
$this->sendRegistrationToLis($dataForLis);
}
$pesan = $pesan.' Nomor Lokal '.$nofoto.' dengan No. Urut '.$noloket.' Berhasil di Simpan';
if ($pesan != ''){
@@ -1311,6 +1380,16 @@ class FrontpageController extends Controller
'nm_spesimen' => $nm_spesimen,
]
);
$dataForLis = [
'nama' => $nama,
'noregister' => $noregister,
'nofoto' => $nofoto,
'kd_spesimen' => $kd_spesimen,
'nm_spesimen' => $nm_spesimen,
'tgllahir' => $tgllahir,
'jk' => $jk,
];
$this->sendRegistrationToLis($dataForLis);
}
if ($pesan != ''){
if ($file != '' AND $jenisgambar != ''){
@@ -1347,79 +1426,27 @@ class FrontpageController extends Controller
$modality = $request->input('reques');
$cekdata = Periksa::where('nofoto', $nofoto)->first();
if (isset($cekdata->id)){
$senderName = 'LIS_System';
$versionNumber = 'V1.0';
$nama = $cekdata->nmpasien;
$jk = $cekdata->jkpasien;
$urgensi = $cekdata->urgensi ?? 'Elective';
$alamat = $cekdata->alamatpasien ?? 'Malang';
$arrayttl = explode(" ", $nama);
$fname = iconv("UTF-8", "tis-620", $arrayttl[0]);
if (isset($arrayttl[1])){
$tengah = iconv("UTF-8", "tis-620", $arrayttl[1]);
}
if (isset($arrayttl[2])){
$blakang = iconv("UTF-8", "tis-620", $arrayttl[2]);
} else {
$blakang = $tengah;
$tengah = '';
}
if ($jk == 'L'){ $panggilan = 'TN'; $jk = 'M'; }
else if ($jk == 'P') { $panggilan = 'NY'; $jk = 'F'; }
else { $panggilan = 'UNK'; $jk = 'O'; }
$panggilan = '';
if ($blakang == ''){ $blakang = $fname; }
if ($urgensi == 'Elective'){ $urgensi = 'INPATIENT'; $prioritas = 'R'; }
else if ($urgensi == 'CITO'){ $urgensi = 'EMERGENCY'; $prioritas = 'A'; }
else { $urgensi = 'OUTPATIENT'; $prioritas = 'A'; }
$patient = [
'id' => $cekdata->id,
'last_name' => $fname,
'first_name' => $blakang,
'middle_name' => $tengah,
'suffix' => $panggilan,
'dob' => $cekdata->noregister,
'sex' => $jk,
'address' => $alamat.'^^MALANG^^ID^65123',
'phone' => $cekdata->tlppasien,
'admitting_physician' => $cekdata->klinisi ?? 'Dokter Pengirim'
];
$order = [
'accession_number' => $cekdata->nofoto,
'isolate_number' => 'MGIT^TestName',
'organism' => $cekdata->reques ?? 'Mycobacterium tuberculosis',
'exclude_isolate' => 'No',
'priority' => $prioritas,
'collection_date_time' => date("YmdHi"),
'collected_by' => $cekdata->nmradiografer ?? Session('nama'),
'received_by' => Session('nama'),
'specimen_action_code' => '',
'isolate_source_test' => 'Blood',
'isolate_source_test_start_time'=> date("YmdHi"),
'receipt_date_time' => date("YmdHi"),
'specimen_type' => 'Blood Culture',
'body_site' => 'Lung',
'ordering_physician' => $cekdata->klinisi ?? 'Dokter Pengirim',
'ordering_physician_phone' => '',
'ordering_physician_fax' => '',
'ordering_physician_pager' => '',
'specimen_user_field_1' => '',
'specimen_user_field_2' => '',
'specimen_user_field_3' => '',
'specimen_user_field_4' => '',
'specimen_user_field_5' => '',
'finalized_date_time' => date("YmdHi"),
'specimen_reimbursement_value' => '100',
'test_reimbursement_value' => '50',
'isolate_classification' => 'Nosocomial'
];
Periksa::where('nofoto', $nofoto)->update([
'excutor' => Session('id'),
'nmexcutor' => Session('nama'),
]);
try {
if ($modality == 'genexpert01' OR $modality == 'genexpert02' OR $modality == 'genexpert03'){
$pesan = $this->Hl7Register($cekdata->id, $modality);
$dataForLis = [
'nama' => $cekdata->nmpasien,
'noregister' => $cekdata->noregister,
'nofoto' => $cekdata->nofoto,
'kd_spesimen' => $cekdata->kd_spesimen,
'nm_spesimen' => $cekdata->nm_spesimen,
'tgllahir' => $cekdata->tgllahirpasien,
'jk' => $cekdata->jkpasien,
];
$this->sendRegistrationToLis($dataForLis);
} else {
$pesan = 'Cannot send on Serial Port From Server';
}

View File

@@ -0,0 +1,116 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class LisController extends Controller
{
/**
* Alamat IP dan port dari service Python/Flask.
* Sebaiknya diletakkan di file .env
* LIS_SERVICE_URL=http://127.0.0.1:5000
*/
protected $lisServiceUrl;
public function __construct()
{
// Mengambil URL service dari file .env, dengan fallback default
$this->lisServiceUrl = env('LIS_SERVICE_URL', 'http://localhost:5000');
}
/**
* Mengirim perintah untuk mendaftarkan tes pasien baru ke GeneXpert.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function registerPatient(Request $request)
{
// Validasi input dari request (sangat direkomendasikan)
$validatedData = $request->validate([
'patient_name' => 'required|string|max:100',
'patient_id' => 'required|string|max:50',
'sample_id' => 'required|string|max:50',
'test_code' => 'required|string|max:20',
'test_name' => 'sometimes|string|max:50',
'dob' => 'sometimes|date_format:Ymd',
'gender' => 'sometimes|string|in:M,F,O,U',
]);
// Membangun payload sesuai format yang diharapkan oleh app.py
$payload = [
'command' => 'register_patient',
'data' => $validatedData,
];
try {
// Mengirim request POST ke service Python
$response = Http::timeout(30) // Set timeout 30 detik
->post($this->lisServiceUrl . '/command', $payload);
// Cek jika request gagal di level HTTP
if ($response->failed()) {
Log::error('Gagal terhubung ke LIS service saat registrasi.', [
'status' => $response->status(),
'body' => $response->body()
]);
return response()->json([
'error' => 'Tidak dapat terhubung ke LIS service.',
'details' => $response->body()
], 503); // Service Unavailable
}
// Mengembalikan response dari service Python ke client
return response()->json($response->json(), $response->status());
} catch (\Illuminate\Http\Client\ConnectionException $e) {
Log::error('Koneksi ke LIS service gagal.', ['exception' => $e->getMessage()]);
return response()->json(['error' => 'Koneksi ke LIS service gagal.'], 504); // Gateway Timeout
}
}
/**
* Mengirim perintah untuk meminta ulang hasil tes berdasarkan Sample ID.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function requestResult(Request $request)
{
// Validasi input
$validatedData = $request->validate([
'sample_id' => 'required|string|max:50',
]);
// Membangun payload
$payload = [
'command' => 'request_result',
'data' => $validatedData,
];
try {
// Mengirim request POST ke service Python
$response = Http::timeout(30)->post($this->lisServiceUrl . '/command', $payload);
if ($response->failed()) {
Log::error('Gagal terhubung ke LIS service saat meminta hasil.', [
'status' => $response->status(),
'body' => $response->body()
]);
return response()->json([
'error' => 'Tidak dapat terhubung ke LIS service.',
'details' => $response->body()
], 503);
}
return response()->json($response->json(), $response->status());
} catch (\Illuminate\Http\Client\ConnectionException $e) {
Log::error('Koneksi ke LIS service gagal.', ['exception' => $e->getMessage()]);
return response()->json(['error' => 'Koneksi ke LIS service gagal.'], 504);
}
}
}