where(['not', ['RiaHDocID' => null]]) ->andWhere(['not', ['PatHN' => null]]) ->andWhere(['<>', 'RiaHDocID', '']) ->andWhere(['<>', 'PatHN', '']) ->asArray() ->orderBy(['RiaHDocDate' => SORT_DESC]) ->one(); if (!$query) { error_log('No data found'); return; } $sendMapping = []; // ---------- build grouped payloads ---------- $groupedByLabNo = []; $groupedRows = []; // เก็บแถวต้นฉบับต่อ labNo เพื่อใช้บันทึก LisResult ทีหลัง $query_lab = HanumanResultSikarinCheck::find() ->where(['not', ['RiaHDocID' => null]]) ->andWhere(['not', ['PatHN' => null]]) ->andWhere(['<>', 'RiaHDocID', '']) ->andWhere(['<>', 'PatHN', '']) ->andWhere(['LabNo' => $query['LabNo']]) ->asArray() ->orderBy(['RiaHDocDate' => SORT_DESC]) ->all(); /* ===== เพิ่มส่วนนี้: scan fallback แบบสั้น ===== */ $fallback = [ 'report_name' => '', 'report_dt' => '', 'approve_name' => '', 'approve_dt' => '', ]; foreach ($query_lab as $r) { if (empty($fallback['report_name']) && !empty($r['RiaLDUserNameEntry'])) { $fallback['report_name'] = $r['RiaLDUserNameEntry']; } if (empty($fallback['report_dt']) && !empty($r['RiaLDUserDateEntry'])) { $fallback['report_dt'] = $r['RiaLDUserDateEntry']; } if (empty($fallback['approve_name']) && !empty($r['RiaLDUserNameAppr'])) { $fallback['approve_name'] = $r['RiaLDUserNameAppr']; } if (empty($fallback['approve_dt']) && !empty($r['RiaLDUserDateAppr'])) { $fallback['approve_dt'] = $r['RiaLDUserDateAppr']; } } foreach ($query_lab as $rows) { $labNo = $rows['LabNo'] ?? ''; // build test item $testItem = [ 'TestCode' => (string)($rows['TestCode'] ?? ''), 'TestName' => (string)($rows['TestName'] ?? ''), 'TestRemark' => $rows['TestRemark'] ?? '', 'InformCriticalByCode' => '', 'InformCriticalBy' => '', 'InformCriticalTo' => '', 'InformCriticalDateTime' => '', 'CriticalFlag' => '', 'ReportResultByCode' => '', 'ReportResultBy' => (string)($rows['RiaLDUserNameEntry'] ?: $fallback['report_name']), 'ReportResultDateTime' => $this->dateTimeFormat($rows['RiaLDUserDateEntry'] ?: $fallback['report_dt']), 'ApproveResultByCode' => '', 'ApproveResultBy' => (string)($rows['RiaLDUserNameAppr'] ?: $fallback['approve_name']), 'ApproveResultDateTime' => $this->dateTimeFormat($rows['RiaLDUserDateAppr'] ?: $fallback['approve_dt']), //'Filedata' => $filesData, 'ResultList' => [[ 'ResultCode' => (string)($rows['ResultCode'] ?? ''), 'ResultName' => (string)($rows['ResultName'] ?? ''), 'ResultValue' => (string)($rows['RiaLDRsltAnal'] ?? ''), 'ResultUnit' => (string)($rows['LabUnit'] ?? ''), 'ResultFlag' => '', 'ReferenceRange' => trim(($rows['LabNormal1'] ?? '') . ' ' . ($rows['LabNormal2'] ?? '')), 'ResultRemark' => '', ]], ]; if (!isset($groupedByLabNo[$labNo])) { $groupedByLabNo[$labNo] = [ 'LabNo' => $labNo, 'RequestRemark' => '', 'ResultStatus' => '', 'TestList' => [], ]; } $groupedByLabNo[$labNo]['TestList'][] = $testItem; $groupedRows[$labNo][] = $rows; // เก็บแถวต้นฉบับต่อ lab $sendMapping[$rows['RiaHDocID']] = $rows['RiaHDocID']; } // end foreach build error_log("=== Hanuman Result Sikarin END ==="); var_dump($groupedByLabNo); die(); } /** helper: แปลง datetime เป็น dd/mm/YYYY H:i:s */ public function dateTimeFormat($value) { if (empty($value)) return ''; try { $dt = new \DateTime($value); return $dt->format('d/m/Y H:i:s'); } catch (\Throwable $e) { return ''; } } }