Uploaded From CV. Swandhana Server
This commit is contained in:
555
app/Services/AstmMessageService.php
Normal file
555
app/Services/AstmMessageService.php
Normal file
@@ -0,0 +1,555 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use App\ResultSample;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Exception;
|
||||
use App\DataListiner;
|
||||
|
||||
// Proses untuk Growth and Detection Result
|
||||
function processGrowthDetectionResult($rawData){
|
||||
// Format: R|1| ^ ^ ^GND_MGIT^430100001234|INST_POSITIVE ^87| ...
|
||||
$resultData = explode('|', $rawData);
|
||||
|
||||
return [
|
||||
'test_type' => 'Growth/Detection',
|
||||
'accession_number' => $resultData[2],
|
||||
'status' => $resultData[3], // Positif atau Negatif
|
||||
'completion_time' => $resultData[7]
|
||||
];
|
||||
}
|
||||
// Proses untuk Isolate Result
|
||||
function processIsolateResult($rawData){
|
||||
$resultData = explode('|', $rawData);
|
||||
return [
|
||||
'test_type' => 'Isolate',
|
||||
'isolate_result' => $resultData[3],
|
||||
'antibiotic' => $resultData[4],
|
||||
'value' => $resultData[5],
|
||||
'status' => $resultData[6],
|
||||
'completion_time' => $resultData[10]
|
||||
];
|
||||
}
|
||||
// Proses untuk Other Test Result
|
||||
function processOtherResult($rawData){
|
||||
// Format: R|1| ^ ^ ^OTHER^Seq123|Complete| ...
|
||||
$resultData = explode('|', $rawData);
|
||||
|
||||
return [
|
||||
'test_type' => 'Other',
|
||||
'sequence_number' => $resultData[3],
|
||||
'result' => $resultData[4],
|
||||
'description' => $resultData[5],
|
||||
'completion_time' => $resultData[6]
|
||||
];
|
||||
}
|
||||
|
||||
class AstmMessageService
|
||||
{
|
||||
/**
|
||||
* Membersihkan string dari karakter non-printable
|
||||
*/
|
||||
private function cleanString($string)
|
||||
{
|
||||
return preg_replace('/[^\P{C}\n]+/u', '', $string);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parsing data berdasarkan format yang diberikan
|
||||
*/
|
||||
private function parseResultData($rawData, $format)
|
||||
{
|
||||
$resultData = explode('|', $rawData);
|
||||
$parsedData = [];
|
||||
|
||||
foreach ($format as $key => $index) {
|
||||
$parsedData[$key] = $resultData[$index] ?? null;
|
||||
}
|
||||
|
||||
return $parsedData;
|
||||
}
|
||||
/**
|
||||
* Proses hasil AST Record
|
||||
*/
|
||||
public function processAstResult($rawData)
|
||||
{
|
||||
$format = [
|
||||
'test_type' => 0,
|
||||
'accession_number' => 2,
|
||||
'antibiotic' => 3,
|
||||
'susceptibility' => 4,
|
||||
'value' => 5,
|
||||
'status' => 6,
|
||||
'completion_time' => 10
|
||||
];
|
||||
|
||||
return $this->parseResultData($rawData, $format);
|
||||
}
|
||||
/**
|
||||
* Proses hasil ID Record
|
||||
*/
|
||||
public function processIdResult($rawData)
|
||||
{
|
||||
$format = [
|
||||
'test_type' => 0,
|
||||
'accession_number' => 2,
|
||||
'organism_name' => 3,
|
||||
'status' => 6,
|
||||
'completion_time' => 10
|
||||
];
|
||||
|
||||
return $this->parseResultData($rawData, $format);
|
||||
}
|
||||
public function createHeader($senderName, $versionNumber)
|
||||
{
|
||||
$messageDateTime = Carbon::now()->format('YmdHis');
|
||||
return "H|{$senderName}|{$versionNumber}|{$messageDateTime}";
|
||||
}
|
||||
|
||||
// Fungsi untuk membuat Patient Record (P)
|
||||
public function createPatientRecord($patient)
|
||||
{
|
||||
// Extract fields from $patient array, adjust field positions based on mapping
|
||||
return "P|{$patient['id']}|{$patient['last_name']}|{$patient['first_name']}|{$patient['middle_name']}|{$patient['suffix']}|{$patient['dob']}|{$patient['sex']}|{$patient['address']}||{$patient['phone']}|{$patient['admitting_physician']}";
|
||||
}
|
||||
|
||||
// Fungsi untuk membuat Order Record (O)
|
||||
public function createOrderRecord($order)
|
||||
{
|
||||
// Order fields based on mapping (Accession Number, Test ID, etc.)
|
||||
return "O|{$order['accession_number']}|{$order['isolate_number']}|{$order['organism']}|{$order['exclude_isolate']}|{$order['priority']}|{$order['collection_date_time']}|{$order['collected_by']}|{$order['received_by']}|{$order['specimen_action_code']}|{$order['isolate_source_test']}|{$order['isolate_source_test_start_time']}|{$order['receipt_date_time']}|{$order['specimen_type']}|{$order['body_site']}|{$order['ordering_physician']}|{$order['ordering_physician_phone']}|{$order['ordering_physician_fax']}|{$order['ordering_physician_pager']}|{$order['specimen_user_field_1']}|{$order['specimen_user_field_2']}|{$order['specimen_user_field_3']}|{$order['specimen_user_field_4']}|{$order['specimen_user_field_5']}|{$order['finalized_date_time']}|{$order['specimen_reimbursement_value']}|{$order['test_reimbursement_value']}|{$order['isolate_classification']}"; }
|
||||
public function createTerminatorRecord($order)
|
||||
{
|
||||
// Order fields based on mapping (Accession Number, Test ID, etc.)
|
||||
return "L|1|N";
|
||||
}
|
||||
// Fungsi untuk membuat pesan lengkap (header + patient + order)
|
||||
public function createMessage($senderName, $versionNumber, $patient, $order)
|
||||
{
|
||||
$header = $this->createHeader($senderName, $versionNumber);
|
||||
$patientRecord = $this->createPatientRecord($patient);
|
||||
$orderRecord = $this->createOrderRecord($order);
|
||||
$terimatorRecord= $this->createTerminatorRecord($order);
|
||||
return implode("\n", [$header, $patientRecord, $orderRecord, $terimatorRecord]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Proses data ASTM Response
|
||||
*/
|
||||
public function processAstmResponse($response, $alat) {
|
||||
// Bersihkan data
|
||||
$astmData = $this->cleanString($response);
|
||||
// Validasi awal: response tidak kosong
|
||||
if (empty($astmData)) {
|
||||
Log::error("ASTM data kosong atau tidak valid.");
|
||||
}
|
||||
$headerData = [];
|
||||
$patientData = [];
|
||||
$orderData = [];
|
||||
$resultData = [];
|
||||
$instrumenDT = [];
|
||||
$mltrData = [];
|
||||
$isolate = null;
|
||||
$accession_number = null;
|
||||
$segments = explode("\n", $astmData);
|
||||
foreach ($segments as $rsegmen){
|
||||
$cekdata = explode('|', $rsegmen);
|
||||
$datapertama = $cekdata[0];
|
||||
$cleankode = preg_replace("/[^a-zA-Z]/", "", $datapertama);
|
||||
if ($cleankode == 'H'){
|
||||
$headerData = array_merge([$cleankode], array_slice($cekdata, 1));
|
||||
}
|
||||
if ($cleankode == 'P'){
|
||||
$patientData = array_merge([$cleankode], array_slice($cekdata, 1));
|
||||
}
|
||||
if ($cleankode == 'O'){
|
||||
$orderData = array_merge([$cleankode], array_slice($cekdata, 1));
|
||||
}
|
||||
if ($cleankode == 'R'){
|
||||
$resultData = array_merge([$cleankode], array_slice($cekdata, 1));
|
||||
}
|
||||
if ($cleankode == 'I'){
|
||||
$instrumenDT = array_merge([$cleankode], array_slice($cekdata, 1));
|
||||
}
|
||||
if ($cleankode == 'mtrsl'){
|
||||
$mltrData = array_merge([$cleankode], array_slice($cekdata, 1));
|
||||
}
|
||||
}
|
||||
if (!empty($patientData) && !empty($headerData)) {
|
||||
$resultSample = new ResultSample();
|
||||
$noregister = $patientData[4] ?? null;
|
||||
$resultSample->sender_name = $alat;
|
||||
$resultSample->version_number = $headerData[11] ?? $patientData[12] ?? null;
|
||||
$resultSample->message_datetime = $resultData[13] ?? null; // '20241130152734'
|
||||
// Patient Record (Segment P)
|
||||
$resultSample->patient_id = $patientData[4] ?? null; // '11607396'
|
||||
$resultSample->patient_name_last = $patientData[6] ?? null; // 'ZAKIYATUN'
|
||||
$resultSample->patient_name_first = $patientData[7] ?? null; // 'O'
|
||||
$resultSample->patient_name_middle = $patientData[8] ?? null;
|
||||
$resultSample->patient_name_suffix = $patientData[9] ?? null;
|
||||
$resultSample->patient_name_title = $patientData[10] ?? null;
|
||||
$resultSample->patient_dob = $resultData[11] ?? null; // '19800101'
|
||||
$resultSample->patient_sex = $patientData[12] ?? null; // 'F'
|
||||
$resultSample->address_street = $patientData[13] ?? null; // 'Street ABC'
|
||||
$resultSample->address_city = $patientData[14] ?? null;
|
||||
$resultSample->address_state = $patientData[15] ?? null;
|
||||
$resultSample->address_zip = $patientData[16] ?? null;
|
||||
$resultSample->address_country = $patientData[17] ?? null;
|
||||
$resultSample->patient_phone = $patientData[18] ?? null; // '081234567890'
|
||||
|
||||
// Order Record (Segment O)
|
||||
$resultSample->accession_number = $orderData[4] ?? null; // '12345'
|
||||
$resultSample->isolate_number = $orderData[5] ?? null; // '67890'
|
||||
$resultSample->organism = $orderData[6] ?? null; // 'E. coli'
|
||||
$resultSample->exclude_isolate_from_statistics = $isolate; // 'false'
|
||||
$resultSample->test_id = $orderData[8] ?? null; // 'Test123'
|
||||
|
||||
// Result Record (Segment R)
|
||||
$resultSample->result_type_code = $resultData[4] ?? null; // 'S'
|
||||
$resultSample->antibiotic = $resultData[5] ?? null; // 'Amoxicillin'
|
||||
$resultSample->antibiotic_concentration = $resultData[6] ?? null; // '100mg'
|
||||
$resultSample->antibiotic_concentration_units = $resultData[7] ?? null; // 'mg'
|
||||
$resultSample->test_status = $resultData[8] ?? null; // 'Completed'
|
||||
$resultSample->result_data = json_encode(array_slice($resultData, 9)); // Additional data (if any)
|
||||
|
||||
$resultSample->preliminary_final_status = $resultData[13] ?? null;
|
||||
$resultSample->test_start_datetime = $resultData[14] ?? null;
|
||||
$resultSample->result_status_datetime = $resultData[15] ?? null;
|
||||
$resultSample->test_complete_datetime = $resultData[16] ?? null;
|
||||
// Periksa apakah data duplikat berdasarkan accession_number
|
||||
//if (ResultSample::where('accession_number', $resultSample->accession_number)->exists()) {
|
||||
// return response()->json(['message' => 'Data sudah ada.'], 409);
|
||||
//}
|
||||
|
||||
// Simpan ke database
|
||||
if ($noregister){
|
||||
Log::info("Data berhasil disimpan:", $resultSample->toArray());
|
||||
$resultSample->save();
|
||||
}
|
||||
return response()->json(['message' => 'Data berhasil diproses dan disimpan.']);
|
||||
|
||||
} else {
|
||||
if (!empty($mltrData)){
|
||||
Log::info("Trying parser MTRSL :", $mltrData);
|
||||
$parsedData = [];
|
||||
$parsedData['antibiotics'] = [];
|
||||
$antibiotic = '';
|
||||
$resistance = '';
|
||||
$value = '';
|
||||
$interpretation = '';
|
||||
$mulaikirim = 0;
|
||||
$resultSample = new ResultSample();
|
||||
foreach ($mltrData as $index => $field) {
|
||||
if ($field == 'ra'){
|
||||
if ($antibiotic != ''){
|
||||
$parsedData['antibiotics'][] = [
|
||||
'antibiotic' => $antibiotic, // Antibiotik
|
||||
'resistance' => $resistance, // Hasil Resistansi
|
||||
'value' => $value, // Nilai
|
||||
'interpretation'=> $interpretation // Interpretasi
|
||||
];
|
||||
$antibiotic = '';
|
||||
$resistance = '';
|
||||
$value = '';
|
||||
$interpretation = '';
|
||||
} else {
|
||||
$mulaikirim = 1;
|
||||
}
|
||||
} else {
|
||||
if ($mulaikirim == 1){
|
||||
$antibiotic = substr($field, 2);
|
||||
$mulaikirim++;
|
||||
} else if ($mulaikirim == 2){
|
||||
$resistance = substr($field, 2);
|
||||
$mulaikirim++;
|
||||
} else if ($mulaikirim == 3){
|
||||
$value = substr($field, 2);
|
||||
$mulaikirim++;
|
||||
} else if ($mulaikirim == 4){
|
||||
$interpretation = substr($field, 2);
|
||||
$mulaikirim++;
|
||||
} else {
|
||||
$field = substr($field, 2);
|
||||
switch ($index) {
|
||||
case 0:
|
||||
$resultSample->sender_name = $alat;
|
||||
break;
|
||||
case 1:
|
||||
$resultSample->version_number = $field; // iiV2
|
||||
break;
|
||||
case 2:
|
||||
$resultSample->isolate_number = $field; // is000015F278BD
|
||||
break;
|
||||
case 4:
|
||||
$resultSample->patient_id = $field; // pi12009427
|
||||
break;
|
||||
case 5:
|
||||
$patientNames = explode(',', $field ?? null);
|
||||
if (count($patientNames) > 0) {
|
||||
$resultSample->patient_name_last = trim($patientNames[0]); // Last name
|
||||
}
|
||||
if (count($patientNames) > 1) {
|
||||
$resultSample->patient_name_first = trim($patientNames[1]); // First name
|
||||
}
|
||||
if (count($patientNames) > 2) {
|
||||
$resultSample->patient_name_middle = trim($patientNames[2]); // Middle name
|
||||
}
|
||||
break;
|
||||
case 6:
|
||||
$resultSample->address_street = $field; // plMANINJAU
|
||||
break;
|
||||
case 12:
|
||||
try {
|
||||
$resultSample->message_datetime = Carbon::parse($field)->format('Y-m-d') ?? null;
|
||||
}catch (Exception $e) {
|
||||
$resultSample->message_datetime = date('Y-m-d');
|
||||
}
|
||||
break;
|
||||
case 13:
|
||||
try {
|
||||
$resultSample->test_complete_datetime = Carbon::parse($field)->format('Y-m-d') ?? null;
|
||||
}catch (Exception $e) {
|
||||
$resultSample->test_complete_datetime = date('Y-m-d');
|
||||
}
|
||||
break;
|
||||
case 14:
|
||||
$resultSample->accession_number = substr($field, 6); // ci30112024.26859
|
||||
break;
|
||||
case 23:
|
||||
$resultSample->organism = $field; // o2Staphylococcus haemolyticus
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//$resultSample->specimen_type = $parsedData['specimen_type'] ?? null; // Could be inferred
|
||||
//$resultSample->test_id = $parsedData['test_id'] ?? null;
|
||||
|
||||
// Result Record
|
||||
|
||||
$resultSample->additional_result = json_encode($parsedData['antibiotics']);
|
||||
|
||||
// Menyimpan data yang sudah diparse
|
||||
$resultSample->save();
|
||||
Log::info("Data MTRL Berhasil di Parse dan di simpan ", $resultSample->toArray());
|
||||
return response()->json(['message' => 'Data berhasil diproses dan disimpan.']);
|
||||
} else {
|
||||
$headerData = explode("|", $response);
|
||||
if (isset($headerData[3])){
|
||||
$accnumber = $headerData[47] ?? null;
|
||||
$noregister = $headerData[16] ?? null;
|
||||
$nama = $headerData[18] ?? null;
|
||||
$urgensi = $headerData[50] ?? null; //A Critical R Normal
|
||||
$iddokter = $headerData[33] ?? null;
|
||||
$test_start_datetime = $headerData[52] ?? null;
|
||||
$result_status_datetime = $headerData[59] ?? null;
|
||||
$specimen_type = $headerData[60] ?? null;
|
||||
$resulttype = $headerData[34] ?? null;
|
||||
$resultstatus = $headerData[63] ?? null;
|
||||
$preliminary = $headerData[40] ?? null; //P
|
||||
$test_complete_datetime = $headerData[44] ?? null;
|
||||
$tesid = $headerData[62] ?? null;
|
||||
$alamat = $headerData[23] ?? null;
|
||||
$instrumen = $resultData[2] ?? null;
|
||||
$body_site = '';
|
||||
$tengah = '';
|
||||
$depan = '';
|
||||
$akhir = '';
|
||||
$suffix = '';
|
||||
$title = '';
|
||||
$concentration_unit = '';
|
||||
$kode = '';
|
||||
$antibiotic = '';
|
||||
$city = '';
|
||||
$state = '';
|
||||
$zipcode = '';
|
||||
$country = '';
|
||||
if ($resulttype){
|
||||
$getdataresult = explode('^', $resulttype);
|
||||
$kode = $getdataresult[3] ?? '';
|
||||
$concentration_unit = $getdataresult[4] ?? '';
|
||||
}
|
||||
if ($specimen_type){
|
||||
$getdata = explode('\n', $specimen_type);
|
||||
$specimen_type = $getdata[0];
|
||||
$body_site = $getdata[1] ?? '';
|
||||
}
|
||||
if ($tesid){
|
||||
$gettgl = explode('^', $tesid);
|
||||
$tesid = $gettgl[3] ?? null;
|
||||
}
|
||||
if ($instrumen){
|
||||
$gettgl = explode('^', $instrumen);
|
||||
$instrumen = $gettgl[0];
|
||||
$media_assay_type = $gettgl[1] ?? null;
|
||||
$protocol_length = $gettgl[2] ?? null;
|
||||
$instrument_number = $gettgl[3] ?? null;
|
||||
$instrument_location = $gettgl[4] ?? null;
|
||||
$protocol_name = $gettgl[5] ?? null;
|
||||
} else {
|
||||
$media_assay_type = null;
|
||||
$protocol_length = null;
|
||||
$instrument_number = null;
|
||||
$instrument_location = null;
|
||||
$protocol_name = null;
|
||||
}
|
||||
if ($isolate == '' OR $isolate == '0' OR is_null($isolate)){
|
||||
$isolate = false;
|
||||
} else { $isolate = true; }
|
||||
if ($test_complete_datetime){
|
||||
$test_complete_datetime = substr($test_complete_datetime, 0, 14);
|
||||
//$test_complete_datetime = Carbon::parse($test_complete_datetime)->format('Y-m-d H:i:s');
|
||||
}
|
||||
if ($result_status_datetime){
|
||||
$result_status_datetime = substr($result_status_datetime, 0, 14);
|
||||
//$result_status_datetime = Carbon::parse($result_status_datetime)->format('Y-m-d H:i:s');
|
||||
}
|
||||
if ($test_start_datetime){
|
||||
$test_start_datetime = substr($test_start_datetime, 0, 14);
|
||||
//$test_start_datetime = Carbon::parse($test_start_datetime)->format('Y-m-d H:i:s');
|
||||
}
|
||||
if ($nama){
|
||||
$getnama = explode('\015', $nama);
|
||||
$nama = $getnama[0];
|
||||
$getnama = explode('\n', $nama);
|
||||
$nama = $getnama[0];
|
||||
|
||||
$akhir = $getnama[1] ?? '';
|
||||
$depan = $getnama[2] ?? '';
|
||||
$tengah = $getnama[3] ?? '';
|
||||
$suffix = $getnama[4] ?? '';
|
||||
$title = $getnama[5] ?? '';
|
||||
|
||||
$nama = $nama.$akhir;
|
||||
}
|
||||
if ($alamat){
|
||||
$getnama = explode('^', $alamat);
|
||||
$alamat = $getnama[0];
|
||||
$city = $getnama[1] ?? '';
|
||||
$state = $getnama[2] ?? '';
|
||||
$zipcode = $getnama[3] ?? '';
|
||||
$country = $getnama[4] ?? '';
|
||||
}
|
||||
if ($test_start_datetime == ''){ $test_start_datetime = null; }
|
||||
if ($result_status_datetime == ''){ $result_status_datetime = null; }
|
||||
if ($test_complete_datetime == ''){ $test_complete_datetime = null; }
|
||||
|
||||
$resultSample->sender_name = $headerData[4] ?? 'Unkown';
|
||||
$resultSample->version_number = $headerData[12] ?? 'V0.0';
|
||||
$resultSample->message_datetime = $test_start_datetime;
|
||||
// Patient Record (Segment P)
|
||||
$resultSample->patient_id = $noregister; // '11607396'
|
||||
$resultSample->patient_name_last = $nama; // 'ZAKIYATUN'
|
||||
$resultSample->patient_name_first = $depan; // 'O'
|
||||
$resultSample->patient_name_middle = $tengah;
|
||||
$resultSample->patient_name_suffix = $suffix;
|
||||
$resultSample->patient_name_title = $title;
|
||||
$resultSample->patient_dob = $headerData[20] ?? null;
|
||||
$resultSample->patient_sex = $headerData[21] ?? null;
|
||||
$resultSample->address_street = $alamat;
|
||||
$resultSample->address_city = $city;
|
||||
$resultSample->address_state = $state;
|
||||
$resultSample->address_zip = $zipcode;
|
||||
$resultSample->address_country = $country;
|
||||
$resultSample->patient_phone = $headerData[25] ?? null;
|
||||
$resultSample->admitting_physician = $headerData[27] ?? null;
|
||||
$resultSample->patient_diagnosis = $headerData[33] ?? null;
|
||||
$resultSample->patient_therapy = json_encode($headerData);
|
||||
$resultSample->admit_datetime = null;
|
||||
$resultSample->room_number = $headerData[46] ?? '00001';
|
||||
$resultSample->hospital_service = $headerData[45] ?? 'RSSA Malang';
|
||||
$resultSample->hospital_client = $orderData[4] ?? 'Lab Mikro';
|
||||
|
||||
// Order Record (Segment O)
|
||||
$resultSample->accession_number = $accnumber; // '12345'
|
||||
$resultSample->isolate_number = $orderData[5] ?? null; // '67890'
|
||||
$resultSample->organism = $orderData[6] ?? null; // 'E. coli'
|
||||
$resultSample->exclude_isolate_from_statistics = $isolate; // 'false'
|
||||
$resultSample->specimen_type = $specimen_type;
|
||||
$resultSample->body_site = $body_site;
|
||||
$resultSample->test_id = $tesid; // 'Test123'
|
||||
$resultSample->urgensi = $urgensi; //A Critical R Normal
|
||||
|
||||
// Result Record (Segment R)
|
||||
$resultSample->result_type_code = $kode;
|
||||
$resultSample->antibiotic = $antibiotic;
|
||||
$resultSample->antibiotic_concentration = $concentration_unit; // '100mg'
|
||||
$resultSample->antibiotic_concentration_units = $concentration_unit; // 'mg'
|
||||
$resultSample->test_status = $resultstatus; // 'Completed'
|
||||
$resultSample->result_data = json_encode($orderData); // Additional data (if any)
|
||||
|
||||
$resultSample->preliminary_final_status = $preliminary;
|
||||
$resultSample->test_start_datetime = $test_start_datetime;
|
||||
$resultSample->result_status_datetime = $result_status_datetime;
|
||||
$resultSample->test_complete_datetime = $test_complete_datetime;
|
||||
|
||||
$resultSample->instrument_type = $instrumen;
|
||||
$resultSample->media_assay_type = $media_assay_type;
|
||||
$resultSample->protocol_length = $protocol_length;
|
||||
$resultSample->instrument_number = $instrument_number;
|
||||
$resultSample->instrument_location = $instrument_location;
|
||||
$resultSample->protocol_name = $protocol_name;
|
||||
$resultSample->additional_result = json_encode($resultData);
|
||||
if ($noregister){
|
||||
$resultSample->save();
|
||||
Log::info("Data ASTM Berhasil di Parse dan di simpan ", $resultSample->toArray());
|
||||
return response()->json(['message' => 'Data berhasil diproses dan disimpan.']);
|
||||
}
|
||||
} else {
|
||||
Log::debug("Abaikan Data Berikut ". json_encode($headerData));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Proses data ASTM Response
|
||||
*/
|
||||
public function processAstmMessages($dataListener) {
|
||||
foreach ($dataListener as $data) {
|
||||
try {
|
||||
// Ambil pesan ASTM dari kolom 'message' atau yang relevan
|
||||
$response = $data->rawdt;
|
||||
if ($data->alat == 'BD Mikro 1'){
|
||||
if ($data->no_id != ''){
|
||||
$rnmpas = $data->rnmpas;
|
||||
$getnama = explode('|', $rnmpas);
|
||||
$resultSample = new ResultSample();
|
||||
$resultSample->sender_name = $data->alat;
|
||||
$resultSample->message_datetime = $data->tgl_data;
|
||||
$resultSample->version_number = 'V1.0';
|
||||
$resultSample->patient_id = $data->urut;
|
||||
$resultSample->patient_name_last= $getnama[0];
|
||||
$resultSample->accession_number = $data->no_id;
|
||||
$resultSample->test_status = $data->organisme;
|
||||
$resultSample->save();
|
||||
DataListiner::where('urut', $data->urut)->update([
|
||||
'processed' => 1
|
||||
]);
|
||||
Log::info("Data ASTM BD ", $resultSample->toArray());
|
||||
|
||||
} else {
|
||||
DataListiner::where('urut', $data->urut)->update([
|
||||
'processed' => 9
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
// Lakukan parsing menggunakan method/fungsi yang sudah dibuat
|
||||
$result = $this->processAstmResponse($response, $data->alat);
|
||||
// Jika berhasil, tandai data sudah diproses
|
||||
if ($result) {
|
||||
DataListiner::where('urut', $data->urut)->update([
|
||||
'processed' => 1
|
||||
]);
|
||||
} else {
|
||||
Log::debug($result);
|
||||
}
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
Log::critical($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
88
app/Services/ResultProcessingService.php
Normal file
88
app/Services/ResultProcessingService.php
Normal file
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Models\Result;
|
||||
|
||||
class ResultProcessingService
|
||||
{
|
||||
// Proses untuk AST Result
|
||||
public function processAstResult($rawData)
|
||||
{
|
||||
// Format: R|1| ^ ^ ^AST_MGIT^439400005678^P^0.5^ug/ml| INST_COMPLETE^105^^S| ...
|
||||
// Parse raw data menjadi array atau objek
|
||||
$resultData = explode('|', $rawData);
|
||||
|
||||
return [
|
||||
'test_type' => 'AST',
|
||||
'accession_number' => $resultData[2],
|
||||
'antibiotic' => $resultData[3], // Seperti 'AST_MGIT'
|
||||
'susceptibility' => $resultData[4], // Seperti 'P' atau 'R'
|
||||
'value' => $resultData[5],
|
||||
'status' => $resultData[6],
|
||||
'completion_time' => $resultData[10]
|
||||
];
|
||||
}
|
||||
|
||||
// Proses untuk ID Result
|
||||
public function processIdResult($rawData)
|
||||
{
|
||||
// Format: R|1| ^ ^ ^ID^Seq123|Complete^MYCBTUB^45678^RM_VRE| ...
|
||||
$resultData = explode('|', $rawData);
|
||||
|
||||
return [
|
||||
'test_type' => 'ID',
|
||||
'sequence_number' => $resultData[3],
|
||||
'result' => $resultData[4], // Status 'Complete'
|
||||
'organism' => $resultData[5], // Organism name
|
||||
'resistance_marker' => $resultData[6], // Resistance marker info
|
||||
'completion_time' => $resultData[8]
|
||||
];
|
||||
}
|
||||
|
||||
// Proses untuk Growth and Detection Result
|
||||
public function processGrowthDetectionResult($rawData)
|
||||
{
|
||||
// Format: R|1| ^ ^ ^GND_MGIT^430100001234|INST_POSITIVE ^87| ...
|
||||
$resultData = explode('|', $rawData);
|
||||
|
||||
return [
|
||||
'test_type' => 'Growth/Detection',
|
||||
'accession_number' => $resultData[2],
|
||||
'status' => $resultData[3], // Positif atau Negatif
|
||||
'completion_time' => $resultData[7]
|
||||
];
|
||||
}
|
||||
|
||||
// Proses untuk Isolate Result
|
||||
public function processIsolateResult($rawData)
|
||||
{
|
||||
// Format: R|1| ^^^AST^^P^100.0^ug/mL| ^^R^R^^MGIT_960_AST92| ...
|
||||
$resultData = explode('|', $rawData);
|
||||
|
||||
return [
|
||||
'test_type' => 'Isolate',
|
||||
'isolate_result' => $resultData[3],
|
||||
'antibiotic' => $resultData[4],
|
||||
'value' => $resultData[5],
|
||||
'status' => $resultData[6],
|
||||
'completion_time' => $resultData[10]
|
||||
];
|
||||
}
|
||||
|
||||
// Proses untuk Other Test Result
|
||||
public function processOtherResult($rawData)
|
||||
{
|
||||
// Format: R|1| ^ ^ ^OTHER^Seq123|Complete| ...
|
||||
$resultData = explode('|', $rawData);
|
||||
|
||||
return [
|
||||
'test_type' => 'Other',
|
||||
'sequence_number' => $resultData[3],
|
||||
'result' => $resultData[4],
|
||||
'description' => $resultData[5],
|
||||
'completion_time' => $resultData[6]
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
26
app/Services/SerialCommunicationService.php
Normal file
26
app/Services/SerialCommunicationService.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
use Carbon\Carbon;
|
||||
use Fawno\PhpSerial\SerialDio;
|
||||
use Fawno\PhpSerial\SerialConfig;
|
||||
class SerialCommunicationService
|
||||
{
|
||||
public function sendMessageDevice1($message, $port = 'COM2')
|
||||
{
|
||||
$config = new SerialConfig();
|
||||
$config->setBaudRate(9600);
|
||||
$config->setParity(0);
|
||||
$config->setDataBits(8);
|
||||
$config->setStopBits(1);
|
||||
$config->setFlowControl(0);
|
||||
$serial = new SerialDio($port, $config);
|
||||
$serial->open('r+b');
|
||||
$serial->setBlocking(0);
|
||||
$serial->setTimeout(0, 0);
|
||||
$serial->send($message);
|
||||
$pesan = $serial->read();
|
||||
$serial->close();
|
||||
return $pesan;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user