Update send order ke Python MiniPCs
This commit is contained in:
@@ -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');
|
||||
|
||||
@@ -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';
|
||||
}
|
||||
|
||||
116
htdocs/app/Http/Controllers/LisController.php
Normal file
116
htdocs/app/Http/Controllers/LisController.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user