Files
2026-04-27 10:26:26 +07:00

371 lines
15 KiB
PHP

<?php
class Receive_result extends MY_Controller
{
public function __construct()
{
parent::__construct();
$this->db_onedev = $this->load->database("onedev", true);
$this->db_log = $this->load->database("cpone_log", true);
$this->load->helper(array('form', 'url'));
// Increase PHP limits for large data processing
ini_set('memory_limit', '256M');
ini_set('max_execution_time', '300');
ini_set('max_input_time', '300');
}
function getInput()
{
$data = file_get_contents("php://input");
if ($data === '' || $data === false) {
if (isset($this->input)) {
$data = $this->input->raw_input_stream;
}
}
// Log raw body for debugging
$data_size = strlen((string)$data);
error_log("RECEIVE RAW LEN=".$data_size." (".round($data_size/1024/1024, 2)."MB)");
error_log("RECEIVE RAW HEAD=".substr((string)$data, 0, 1000));
// Check if data size exceeds reasonable limits
$max_size = 100 * 1024 * 1024; // 100MB
if ($data_size > $max_size) {
error_log("WARNING: Received data size exceeds limit: ".round($data_size/1024/1024, 2)."MB");
}
$this->sys_input = json_decode($data, true);
if ($this->sys_input === null) {
error_log("json_decode error: ".json_last_error_msg());
}
}
function index()
{
// Use parsed input from MY_Controller core
$prm = $this->sys_input;
if (!is_array($prm)) {
echo json_encode([
"status" => "ERR",
"message" => "Body JSON invalid"
]);
exit;
}
// Log incoming keys for debugging
error_log("RECEIVE TOP KEYS=".implode(',', array_keys($prm)));
// Accept three formats:
// A) { md5: string, data: { order_id, lab_number, results } }
// B) { md5: string, compressed: true, data: base64_compressed_string }
// C) { order_id, lab_number, results } (fallback, no md5)
$data = null;
$md5 = null;
if (isset($prm["compressed"]) && $prm["compressed"] === true && isset($prm["data"]) && isset($prm["md5"])) {
// Handle compressed data
$compressed_data = base64_decode($prm["data"]);
if ($compressed_data === false) {
echo json_encode([
"status" => "ERR",
"message" => "Failed to decode base64 compressed data"
]);
exit;
}
$decompressed_json = gzuncompress($compressed_data);
if ($decompressed_json === false) {
echo json_encode([
"status" => "ERR",
"message" => "Failed to decompress data"
]);
exit;
}
$data = json_decode($decompressed_json, true);
if ($data === null) {
echo json_encode([
"status" => "ERR",
"message" => "Failed to decode decompressed JSON: " . json_last_error_msg()
]);
exit;
}
$md5 = $prm["md5"];
//$this->insert_error('Receive_result:compressed', '', json_encode($data), "Received compressed data");
error_log("Received compressed data, decompressed size: " . strlen($decompressed_json) . " bytes");
} else if (isset($prm["data"]) && isset($prm["md5"])) {
// Handle normal uncompressed data
$data = $prm["data"];
$md5 = $prm["md5"];
} else if (isset($prm["order_id"]) && isset($prm["lab_number"]) && isset($prm["results"])) {
// Handle direct format (fallback)
$data = $prm;
} else {
echo json_encode([
"status" => "ERR",
"message" => "Missing md5/data in payload"
]);
exit;
}
$user_id = 555;
$l_md5 = md5(json_encode($data, JSON_UNESCAPED_UNICODE | JSON_INVALID_UTF8_SUBSTITUTE));
if ($md5 !== null && $md5 != $l_md5) {
echo json_encode([
"status" => "ERR",
"message" => "MD5 mismatch",
"recv_md5" => $md5,
"calc_md5" => $l_md5
]);
exit();
}
$order_id = $data["order_id"];
$lab_number = $data["lab_number"];
$results = $data["results"];
$critical_values = isset($data["critical_values"]) ? $data["critical_values"] : [];
if($lab_number == null)
{
echo json_encode([
"status" => "ERR",
"message" => "Lab number tidak ditemukan",
]);
exit;
}else{
$sql = "INSERT INTO log_receive_result(
Log_ReceiveResultT_OrderHeaderID,
Log_ReceiveResultT_OrderHeaderLabNumber,
Log_ReceiveResultData,
Log_ReceiveResultCreated
) VALUES (?, ?, ?, NOW())";
$query = $this->db_log->query($sql, [$order_id, $lab_number, json_encode($results)]);
if (!$query)
{
echo json_encode([
"status" => "ERR",
"message" => "Gagal menyimpan log",
"query" => $this->db_log->last_query()
]);
exit;
}
$log_id = $this->db_log->insert_id();
}
$this->db_onedev->trans_begin();
if(count($results) > 0)
{
$arr_result = [];
foreach($results as $result)
{
$temp_r = $result;
$temp_r['N_OrderDetailID'] = $result['T_OrderDetailT_OrderDetailOldID'];
unset($temp_r['T_OrderDetailT_OrderDetailOldID']);
$temp_r['L_OrderDetailID'] = $result['T_OrderDetailID'];
unset($temp_r['T_OrderDetailID']);
unset($temp_r['T_OrderDetailT_OrderPromiseID']);
unset($temp_r['T_OrderDetailDetailDeleted']);
unset($temp_r['T_OrderDetailDetailDeletedUserID']);
unset($temp_r['T_OrderDetailNat_InstrumentID']);
unset($temp_r['T_OrderDetailT_OrderDetailOrderID']);
$arr_result[] = $temp_r;
}
foreach($arr_result as $result)
{
$sql = "SELECT * FROM result_t_orderdetail WHERE N_OrderDetailID = ?";
$query = $this->db_onedev->query($sql, [$result['N_OrderDetailID']]);
$check_exist = $query->result_array();
if(count($check_exist) > 0)
{
$query = $this->db_onedev->where('N_OrderDetailID', $result['N_OrderDetailID'])->update('result_t_orderdetail', $result);
if(!$query)
{
$this->db_onedev->trans_rollback();
$this->insert_error('Receive_result:updatetemp', $this->db_onedev->last_query(), json_encode($result), "Gagal menyimpan data hasil pemeriksaan");
echo json_encode([
"status" => "ERR",
"message" => "Gagal update data hasil pemeriksaan",
"query" => $this->db_onedev->last_query()
]);
exit;
}
}else{
$query = $this->db_onedev->insert('result_t_orderdetail', $result);
if(!$query)
{
$this->db_onedev->trans_rollback();
$this->insert_error('Receive_result:inserttemp', $this->db_onedev->last_query(), json_encode($result), "Gagal menyimpan data hasil pemeriksaan");
echo json_encode([
"status" => "ERR",
"message" => "Gagal menyimpan data hasil pemeriksaan",
"query" => $this->db_onedev->last_query()
]);
exit;
}
}
$sql = "UPDATE t_orderdetail SET
T_OrderDetailResult = ?,
T_OrderDetailResultFlag = ?,
T_OrderDetailNote = ?,
T_OrderDetailNat_UnitID = ?,
T_OrderDetailNat_UnitName = ?,
T_OrderDetailVerification = ?,
T_OrderDetailVerDate = ?,
T_OrderDetailVerUserID = 555,
T_OrderDetailLastUpdated = NOW(),
T_OrderDetailNat_NormalValueID = ?,
T_OrderDetailNormalValueNote = ?,
T_OrderDetailNormalValueDescription = ?,
T_OrderDetailMinValue = ?,
T_OrderDetailMaxValue = ?,
T_OrderDetailMinValueInclusive = ?,
T_OrderDetailMaxValueInclusive = ?,
T_OrderDetailNat_MethodeID = ?,
T_OrderdetailNat_MethodeName = ?,
T_OrderDetailFlagResult = ?
WHERE T_OrderDetailID = ?";
$query = $this->db_onedev->query($sql, [
$result['T_OrderDetailResult'],
$result['T_OrderDetailResultFlag'],
$result['T_OrderDetailNote'],
$result['T_OrderDetailNat_UnitID'],
$result['T_OrderDetailNat_UnitName'],
$result['T_OrderDetailVerification'],
$result['T_OrderDetailVerDate'],
$result['T_OrderDetailNat_NormalValueID'],
$result['T_OrderDetailNormalValueNote'],
$result['T_OrderDetailNormalValueDescription'],
$result['T_OrderDetailMinValue'],
$result['T_OrderDetailMaxValue'],
$result['T_OrderDetailMinValueInclusive'],
$result['T_OrderDetailMaxValueInclusive'],
$result['T_OrderDetailNat_MethodeID'],
$result['T_OrderdetailNat_MethodeName'],
$result['T_OrderDetailFlagResult'],
$result['N_OrderDetailID']
]);
if(!$query)
{
$this->db_onedev->trans_rollback();
$this->insert_error('Receive_result:updateorderdetail', $this->db_onedev->last_query(), json_encode($result), "Gagal update data order detail");
echo json_encode([
"status" => "ERR",
"message" => "Gagal update data order detail - orderdetail".$result['T_OrderDetailT_TestName']." : ".$result['T_OrderDetailT_TestCode'],
"query" => $this->db_onedev->last_query()
]);
exit;
}
}
if($log_id > 0)
{
$sql = "UPDATE log_receive_result SET Log_ReceiveResultStatus = 'D', Log_ReceiveResultUpdated = NOW()
WHERE Log_ReceiveResultID = ?";
$query = $this->db_log->query($sql, [$log_id]);
if(!$query)
{
$this->insert_error('Receive_result:updateorderdetail - log_receive_result ', $this->db_log->last_query(), json_encode($result), "Gagal update data order detail");
echo json_encode([
"status" => "ERR",
"message" => "Gagal update data order detail - log_receive_result",
"query" => $this->db_log->last_query()
]);
exit;
}
}
}else{
echo json_encode([
"status" => "ERR",
"message" => "Tidak ada data hasil pemeriksaan",
]);
exit;
}
if(count($critical_values) > 0){
foreach($critical_values as $critical_value){
$sql = "INSERT INTO critical_value(
CriticalValueT_OrderHeaderID,
CriticalValueT_OrderDetailID,
CriticalValueDescription,
CriticalValueCreated,
CriticalValueIsReported,
CriticalValueReportedM_UserID,
CriticalValueReportedDate,
CriticalValueReportedTo,
CriticalValueIsAdvised,
CriticalValueAdvisedDate,
CriticalValueAdvisedBy,
CriticalValueAdvisedNote,
CriticalValueAdvicedM_UserID,
CriticalValueIsActive
) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
$query = $this->db_onedev->query($sql, [
$critical_value['CriticalValueT_OrderHeaderID'],
$critical_value['CriticalValueT_OrderDetailID'],
$critical_value['CriticalValueDescription'],
$critical_value['CriticalValueCreated'],
$critical_value['CriticalValueIsReported'],
$critical_value['CriticalValueReportedM_UserID'],
$critical_value['CriticalValueReportedDate'],
$critical_value['CriticalValueReportedTo'],
$critical_value['CriticalValueIsAdvised'],
$critical_value['CriticalValueAdvisedDate'],
$critical_value['CriticalValueAdvisedBy'],
$critical_value['CriticalValueAdvisedNote'],
$critical_value['CriticalValueAdvicedM_UserID'],
$critical_value['CriticalValueIsActive']
]);
if(!$query)
{
$this->db_onedev->trans_rollback();
$this->insert_error('Receive_result:insertcriticalvalue - critical_value', $this->db_onedev->last_query(), json_encode($critical_value), "Gagal menyimpan data critical value");
echo json_encode([
"status" => "ERR",
"message" => "Gagal menyimpan data critical value",
"query" => $this->db_onedev->last_query()
]);
exit;
}
}
}
$this->db_onedev->trans_commit();
echo json_encode([
"status" => "OK",
"result" => [
"lab_number" => $lab_number
]
]);
exit;
}
function insert_error($fn,$query,$data,$message)
{
$sql = "INSERT INTO log_error_upload(
Log_ErrorUploadFn,
Log_ErrorUploadQuery,
Log_ErrorUploadData,
Log_ErrorUploadMessage,
Log_ErrorUploadCreated
) VALUES (?,?,?,?,NOW())";
$query = $this->db_log->query($sql, [$fn,$query,$data,$message]);
if(!$query)
{
return false;
}
return true;
}
}