Update
This commit is contained in:
@@ -231,110 +231,80 @@ class AstmMessageService
|
||||
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;
|
||||
if (!empty($mltrData)) {
|
||||
Log::info("Trying robust parser for MTRSL:", $mltrData);
|
||||
|
||||
$resultSample = new ResultSample();
|
||||
$antibioticResults = [];
|
||||
$currentAntibiotic = [];
|
||||
|
||||
foreach ($mltrData as $field) {
|
||||
if (strlen($field) < 2) continue; // Lewati field kosong
|
||||
|
||||
// 1. Identifikasi TAG dan VALUE dari setiap field
|
||||
$tag = substr($field, 0, 2);
|
||||
$value = substr($field, 2);
|
||||
|
||||
// 2. Gunakan SWITCH pada TAG, bukan pada INDEX
|
||||
switch ($tag) {
|
||||
// == Data Pasien & Sampel ==
|
||||
case 'pi': $resultSample->patient_id = $value; break;
|
||||
case 'pn':
|
||||
$patientNames = explode(',', $value ?? null);
|
||||
$resultSample->patient_name_last = trim($patientNames[0] ?? '');
|
||||
$resultSample->patient_name_first = trim($patientNames[1] ?? '');
|
||||
$resultSample->patient_name_middle = trim($patientNames[2] ?? '');
|
||||
break;
|
||||
case 'pl': $resultSample->address_street = $value; break;
|
||||
case 'ci': $resultSample->accession_number = substr($value, 6); break;
|
||||
case 'o2': $resultSample->organism = $value; break;
|
||||
|
||||
// Tanggal bisa memiliki tag s1, s3, dll. Sesuaikan jika perlu
|
||||
case 's3':
|
||||
try {
|
||||
// Contoh parsing tanggal dari format Vitek: 08/25/2025
|
||||
$resultSample->test_complete_datetime = Carbon::createFromFormat('m/d/Y', $value)->format('Y-m-d H:i:s');
|
||||
} catch (Exception $e) {
|
||||
$resultSample->test_complete_datetime = now();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
// == Logika Cerdas untuk Blok Antibiotik ==
|
||||
case 'ra':
|
||||
// 'ra' adalah sinyal bahwa blok antibiotik SEBELUMNYA sudah selesai.
|
||||
// Jika $currentAntibiotic tidak kosong, simpan ke hasil utama.
|
||||
if (!empty($currentAntibiotic)) {
|
||||
$antibioticResults[] = $currentAntibiotic;
|
||||
}
|
||||
// Reset untuk menampung data antibiotik yang baru.
|
||||
$currentAntibiotic = [];
|
||||
break;
|
||||
case 'a1': $currentAntibiotic['antibiotic'] = $value; break; // Kode Antibiotik
|
||||
case 'a2': $currentAntibiotic['resistance'] = $value; break; // Nama Antibiotik
|
||||
case 'a3': $currentAntibiotic['value'] = $value; break; // Nilai MIC
|
||||
case 'a4': $currentAntibiotic['interpretation'] = $value; break; // Interpretasi
|
||||
case 'an':
|
||||
// Jika 'an' ada, ini adalah interpretasi final, timpa yang sebelumnya.
|
||||
$currentAntibiotic['interpretation'] = $value;
|
||||
break;
|
||||
|
||||
// == Metadata Lainnya (opsional) ==
|
||||
case 'ii': $resultSample->version_number = $value; break;
|
||||
case 'is': $resultSample->isolate_number = $value; 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']);
|
||||
// Penting: Simpan blok antibiotik TERAKHIR setelah loop selesai
|
||||
if (!empty($currentAntibiotic)) {
|
||||
$antibioticResults[] = $currentAntibiotic;
|
||||
}
|
||||
|
||||
$resultSample->sender_name = $alat ?? 'VITEK'; // Pastikan var $alat ada
|
||||
$resultSample->additional_result = json_encode($antibioticResults);
|
||||
|
||||
// Menyimpan data yang sudah diparse
|
||||
$resultSample->save();
|
||||
Log::info("Data MTRL Berhasil di Parse dan di simpan ", $resultSample->toArray());
|
||||
Log::info("Data MTRSL successfully parsed and saved.", $resultSample->toArray());
|
||||
return response()->json(['message' => 'Data berhasil diproses dan disimpan.']);
|
||||
} else {
|
||||
$headerData = explode("|", $response);
|
||||
|
||||
Reference in New Issue
Block a user