371 lines
15 KiB
PHP
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;
|
|
}
|
|
|
|
}
|