This commit is contained in:
Dwi Swandhana
2026-01-25 16:44:03 +07:00
parent 9f0d1118b0
commit 5df034f972
+144 -29
View File
@@ -115,6 +115,7 @@ class AstmMessageService
return "H|{$senderName}|{$versionNumber}|{$messageDateTime}";
}
// Fungsi untuk membuat Patient Record (P)
public function createPatientRecord($patient)
{
@@ -636,6 +637,146 @@ class AstmMessageService
}
}
}
protected function astmToDateTime(?string $value): ?string
{
if (!$value) return null;
if (preg_match('/(\d{14})/', $value, $m)) {
return Carbon::createFromFormat(
'YmdHis',
$m[1]
)->format('Y-m-d H:i:s');
}
return null;
}
protected function processBDAstmResponse(string $raw, $data): bool
{
try {
// =========================
// PREPARE
// =========================
$accnumber= '';
$resultDateTime = null;
$rawClean = preg_replace('/[\x02\x03\x04]/', '', $raw);
$lines = preg_split("/\r\n|\n|\r/", $rawClean);
$parsed = [
'header' => [],
'patient'=> [],
'order' => [],
'result' => [],
'instrument' => []
];
// =========================
// PARSE LOOP
// =========================
foreach ($lines as $line) {
if (str_starts_with($line, 'H|')) {
$f = explode('|', $line);
$parsed['header'] = [
'sender_name' => $data->alat,
'version_number' => $f[12] ?? 'V1.0',
'message_datetime' => $this->astmToDateTime($f[13] ?? null)
];
}
elseif (str_starts_with($line, 'P|')) {
$f = explode('|', $line);
$name = explode(' ', $f[5] ?? '');
$parsed['patient'] = [
'patient_id' => $f[3] ?? null,
'patient_name_last' => $name[0] ?? null,
'patient_name_first'=> $name[1] ?? null,
'patient_dob' => $this->astmToDateTime($f[7] ?? null),
'patient_sex' => $f[8] ?? null,
'patient_phone' => $f[13] ?? null,
'address_street' => $f[11] ?? null,
'hospital_client' => $f[29] ?? null,
];
}
elseif (str_starts_with($line, 'O|')) {
$f = explode('|', $line);
$test = explode('^', $f[4] ?? '');
$accnumber = $f[2] ?? null;
$parsed['order'] = [
'accession_number' => $f[2] ?? null,
'test_id' => $test[3] ?? null,
'specimen_type' => $f[15] ?? null,
'body_site' => $f[16] ?? null,
'test_start_datetime'=> $this->astmToDateTime($f[7] ?? null),
];
}
elseif (str_starts_with($line, 'R|')) {
$f = explode('|', $line);
$test = explode('^', $f[2] ?? '');
$resultDateTime = $this->astmToDateTime($f[11] ?? null);
// Instrument detail di akhir baris
preg_match('/(MGIT960|BACTECFX)[^|]*/', $line, $inst);
$parsed['result'] = [
'organism' => $test[2] ?? null,
'test_status' => explode('^', $f[3] ?? '')[0],
'result_status_datetime' => $this->astmToDateTime($f[11] ?? null),
];
$parsed['instrument'] = [
'instrument_type' => str_contains($line, 'MGIT960') ? 'MGIT960' : 'BACTECFX',
'instrument_number' => $inst[0] ?? null,
];
}
}
// =========================
// SAVE TO DATABASE
// =========================
$resultSample = new ResultSample();
$resultSample->fill(array_merge(
$parsed['header'],
$parsed['patient'],
$parsed['order'],
$parsed['result'],
$parsed['instrument']
));
$resultSample->additional_result = [
'raw_astm' => $raw,
'source' => 'BD'
];
$resultSample->save();
if ($accnumber != '' AND isset($resultDateTime)){
KomponenJawaban::updateOrCreate(
[
'accnumber' => $accnumber,
'komponen' => 'bd_result_date',
'isidata' => $resultDateTime,
],
[
'template' => 'Kultur',
'created_by' => 'BD'
]
);
}
return true;
} catch (\Throwable $e) {
Log::error('BD ASTM parse error', [
'msg' => $e->getMessage()
]);
return false;
}
}
/**
* Proses data ASTM Response
*/
@@ -646,29 +787,13 @@ class AstmMessageService
$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();
$result = $this->processBDAstmResponse($response, $data->alat);
DataListiner::where('urut', $data->urut)->update([
'processed' => 1
'processed' => $result ? 1 : 9
]);
Periksa::where('nofoto', $data->no_id)->whereNotIn('status', ['Selesai', 'Arsip', 'Dibatalkan (Arsip)', 'Batal'])->update([
'status' => 'Data BD di Terima ('.$data->organisme.')',
]);
Log::info("Data ASTM BD ", $resultSample->toArray());
PendaftaranOnListiner::where('rnoreg', $data->no_id)->update([
'rtglast' => date('Y-m-d'),
'flg_vitek1' => 0,
'flg_vitek2' => 0
]);
KomponenJawaban::updateOrCreate(
[
'accnumber' => $data->no_id,
@@ -680,17 +805,7 @@ class AstmMessageService
'created_by' => 'BD'
]
);
KomponenJawaban::updateOrCreate(
[
'accnumber' => $data->no_id,
'komponen' => 'bd_result_date',
'isidata' => $data->tgl_data,
],
[
'template' => 'Kultur',
'created_by' => 'BD'
]
);
} else {
DataListiner::where('urut', $data->urut)->update([
'processed' => 9