clqms-server/app/Controllers/ApiController.php
2025-11-17 15:17:13 +07:00

314 lines
15 KiB
PHP

<?php
namespace App\Controllers;
use CodeIgniter\API\ResponseTrait;
use App\Controllers\SecurityController;
class ApiController extends BaseController {
use ResponseTrait;
public function index() {
return "Tampilan TMS30i";
}
public function create () {
// ------------------------------------------------------------------------------------------
// Get Login Access untuk API
// ------------------------------------------------------------------------------------------
$username = $this->request->getServer('PHP_AUTH_USER');
$password = $this->request->getServer('PHP_AUTH_PW');
// ------------------------------------------------------------------------------------------
// Buat Objek untuk Auth Controller
// ------------------------------------------------------------------------------------------
$securityController = new SecurityController();
$auth = $securityController->auth_check($username, $password);
// $auth = True;
/////////////////////////////////////////////////////////////////////////////////////////////
// 1 - Untuk Autentikasi dan Lain"
/////////////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------------------
// Kredensial tidak valid, kembalikan pesan kesalahan dan Berhenti
// ------------------------------------------------------------------------------------------
if ( $auth == False) {
return $this->respond(["message" => "Maaf Akses Anda Ditolak"], 401);
}
// ------------------------------------------------------------------------------------------
// Terima data JSON dan Masukkan ke Variabel
// ------------------------------------------------------------------------------------------
$instrument_data_with_checksum = $this->request->getJSON();
$encrypted_instrument_data = $instrument_data_with_checksum->instrument_data;
$checksum_data = $instrument_data_with_checksum->checksum;
// ------------------------------------------------------------------------------------------
// Dekripsi Data JSON, Jika Tidak cocok kembalikan pesan kesalahan dan Berhenti
// ------------------------------------------------------------------------------------------
$decrypted_data = $securityController->decryptData($encrypted_instrument_data);
if ($decrypted_data == False) {
return $this->respond(["message" => "Enkripsi Tidak Cocok "], 400);
}
// ------------------------------------------------------------------------------------------
// Checksum Cek, Jika Tidak cocok kembalikan pesan kesalahan dan Berhenti
// ------------------------------------------------------------------------------------------
if ( $securityController->checksum_check($decrypted_data, $checksum_data) == False) {
return $this->respond(["message" => "Checksum Tidak Cocok "], 400);
}
/////////////////////////////////////////////////////////////////////////////////////////////
// 2 - Olah Data Untuk Disimpan ke Database
/////////////////////////////////////////////////////////////////////////////////////////////
// ------------------------------------------------------------------------------------------
// Decode Untuk Merubah Format Data Menjadi Array Asosiatif
// ------------------------------------------------------------------------------------------
$db = \Config\Database::connect();
$decrypted_data = json_decode($decrypted_data, true);
$total_simpan_non = count($decrypted_data['result_data']);
$total_simpan_non = strval($total_simpan_non);
$decrypted_data = $this->filterData($decrypted_data);
$sn_number = $decrypted_data['sn_number'];
$timezone = 7;
$total_simpan_filter = count($decrypted_data['result_data']);
$total_simpan_filter = strval($total_simpan_filter);
// Mulai transaksi
$db->transStart();
// Menyiapkan array untuk menyimpan data batch
$patresTechValues = [];
$patresFlagValues = [];
$flagdefCache = [];
$now = date('Y-m-d H:i:s');
// Proses setiap item dalam data yang diterima
foreach ($decrypted_data['result_data'] as $key => $value) {
$SAMP_ID = $value['SAMP_ID'];
$ITEM_NAME = $value['ITEM_NAME'];
$ASP_CNT = $value['ASP_CNT'];
// $CONC_DATA = isset($value['CONC_DATA']) ? $value['CONC_DATA'] : null;
// $OD_DATA = isset($value['OD_DATA']) ? $value['OD_DATA'] : null;
// Jika tidak ada nilai, set sebagai NULL
$CONC_DATA = isset($value['CONC_DATA']) ? "'".$value['CONC_DATA']."'" : 'NULL';
$OD_DATA = isset($value['OD_DATA']) ? "'".$value['OD_DATA']."'" : 'NULL';
$RST_DATE = $value['RST_DATE'];
$RST_DATE = date("Y-m-d H:i:s.v", strtotime($RST_DATE) - $timezone * 3600); // Ubah je Timezone tertentu
$FLAG = $value['Flag'];
$REACTION_NO = $value['ReactionNo'];
$DIL_ORD = $value['DIL_ORD'];
// Input ke Tabel PATRES - Input Satu Persatu
$sql = "INSERT INTO patres (EquipmentID, SampleID, TestTechCode, Aspcnt, Result, ResultDateTime, createdate)
VALUES ('$sn_number', '$SAMP_ID', '$ITEM_NAME', $ASP_CNT, $CONC_DATA, '$RST_DATE', '$now')";
$db->query($sql);
$patres_lastid = $db->insertID();
// Untuk Inputan ke Tabel PATRESTECH - Batch Input
$patresTechValues[] = " ($patres_lastid, 'OD_DATA', $OD_DATA, '$RST_DATE'),
($patres_lastid, 'REACTION_NO', '$REACTION_NO', '$RST_DATE'),
($patres_lastid, 'DIL_ORD', '$DIL_ORD', '$RST_DATE')";
// Cek apakah FLAG sudah ada di cache
if ($FLAG !== null) {
if (!isset($flagdefCache[$FLAG])) {
// Cek tabel flagdef untuk FLAG
$sql = "SELECT FlagDefID as flagdef_id FROM flagdef WHERE flag='$FLAG'";
$query = $db->query($sql);
$row = $query->getRow();
if ($row !== null) {
$FlagDefID = (int) $row->flagdef_id;
} else {
// Insert Data ke Tabel Flagdef
$sql = "INSERT INTO flagdef (Instrumentid, Flag, flagtext, FlagDesc, onscreen, onresult, createdate)
VALUES (1, '$FLAG', '$FLAG', '', 1, 1, '$now')";
$db->query($sql);
// Ambil FlagDefID baru
$sql = "SELECT FlagDefID as flagdef_id FROM flagdef WHERE flag='$FLAG'";
$query = $db->query($sql);
$row = $query->getRow();
$FlagDefID = (int) $row->flagdef_id;
}
// Simpan FlagDefID di cache
$flagdefCache[$FLAG] = $FlagDefID;
} else {
$FlagDefID = $flagdefCache[$FLAG];
}
// Siapkan query untuk INSERT INTO patresflag
$patresFlagValues[] = "($patres_lastid, $FlagDefID, '$RST_DATE')";
}
}
// Menyisipkan data ke tabel patresflag dalam satu batch
if (!empty($patresFlagValues)) {
$sql = "INSERT INTO patresflag (resultid, flagid, createdate)
VALUES " . implode(", ", $patresFlagValues);
$db->query($sql);
}
// Menyisipkan data ke tabel patrestech dalam satu batch
if (!empty($patresTechValues)) {
$sql = "INSERT INTO patrestech (resultid, DBField, DBValue, createdate)
VALUES " . implode(", ", $patresTechValues);
$db->query($sql);
}
$db->transComplete();
// Cek status transaksi
if (! $db->transStatus()) {
$db->transRollback();
// return $this->respond(['message' => 'Server tidak menyimpan data anda, dikarenakan terjadi kesalahan saat memproses data.'], 500);
return $this->respond(['message' => $db->error()], 500);
} else {
return $this->respond(['message' => "Menyimpan ". $total_simpan_filter . " dari " . $total_simpan_non ." data, Data berhasil diproses."], 201);
}
}
// Digunakan Untuk Memfilter Data Valid dan Tidak Valid
// Misal ada 2 Data :
// dengan Sampid dan semuanya sama namun beda flag maka cukup pilih/simpan data yang punya flag
public function filterData($decrypted_data) {
$filtered_data = array();
$filtered_data['sn_number'] = $decrypted_data['sn_number'];
$filtered_data['result_data'] = [];
$i = 0;
$status = false;
$length_array = count($decrypted_data['result_data']);
foreach ($decrypted_data['result_data'] as $key => $value) {
$SAMP_ID = $value['SAMP_ID'];
$ITEM_NAME = $value['ITEM_NAME'];
$ASP_CNT = $value['ASP_CNT'];
$CONC_DATA = $value['CONC_DATA'];
$OD_DATA = $value['OD_DATA'];
$RST_DATE = $value['RST_DATE'];
$FLAG = $value['Flag'];
$REACTION_NO = $value['ReactionNo'];
$DIL_ORD = $value['DIL_ORD'];
// Kondisi saat array bernilai 1
if ($i != 0) {
// Kondisi jika ada data array yang sama antara array 0 dan 1, 1 dan 2, dan seterusnya
if ( $SAMP_ID == $decrypted_data['result_data'][($i-1)]['SAMP_ID'] AND
$ITEM_NAME == $decrypted_data['result_data'][($i-1)]['ITEM_NAME'] AND
$ASP_CNT == $decrypted_data['result_data'][($i-1)]['ASP_CNT'] AND
$CONC_DATA == $decrypted_data['result_data'][($i-1)]['CONC_DATA'] AND
$OD_DATA == $decrypted_data['result_data'][($i-1)]['OD_DATA'] AND
$RST_DATE == $decrypted_data['result_data'][($i-1)]['RST_DATE'] AND
$REACTION_NO == $decrypted_data['result_data'][($i-1)]['ReactionNo']
) {
// Record Sebelumnya
$prev = [
"SAMP_ID" => $decrypted_data['result_data'][($i-1)]['SAMP_ID'],
"ITEM_NAME" => $decrypted_data['result_data'][($i-1)]['ITEM_NAME'],
"ASP_CNT" => $decrypted_data['result_data'][($i-1)]['ASP_CNT'],
"CONC_DATA" => $decrypted_data['result_data'][($i-1)]['CONC_DATA'],
"OD_DATA" => $decrypted_data['result_data'][($i-1)]['OD_DATA'],
"RST_DATE" => $decrypted_data['result_data'][($i-1)]['RST_DATE'],
"Flag" => $decrypted_data['result_data'][($i-1)]['Flag'],
"ReactionNo" => $decrypted_data['result_data'][($i-1)]['ReactionNo'],
"DIL_ORD" => $decrypted_data['result_data'][($i-1)]['DIL_ORD'],
];
// Record Saat ini
$current = [
"SAMP_ID" => $decrypted_data['result_data'][($i)]['SAMP_ID'],
"ITEM_NAME" => $decrypted_data['result_data'][($i)]['ITEM_NAME'],
"ASP_CNT" => $decrypted_data['result_data'][($i)]['ASP_CNT'],
"CONC_DATA" => $decrypted_data['result_data'][($i)]['CONC_DATA'],
"OD_DATA" => $decrypted_data['result_data'][($i)]['OD_DATA'],
"RST_DATE" => $decrypted_data['result_data'][($i)]['RST_DATE'],
"Flag" => $decrypted_data['result_data'][($i)]['Flag'],
"ReactionNo" => $decrypted_data['result_data'][($i)]['ReactionNo'],
"DIL_ORD" => $decrypted_data['result_data'][($i)]['DIL_ORD'],
];
// Simpan yang memiliki nilai flag ke temp data
if ($current['Flag'] == null) {
array_push($filtered_data['result_data'], $prev);
} else if ($prev['Flag'] == null) {
array_push($filtered_data['result_data'], $current);
}
// Status untuk melewati/skip index array saat ini
$status = true;
// Kondisi saat record tidak sama
} else {
// Jika sudah menyimpan record ganda diatas maka jangan jalankan ini
if ($status == false) {
$current = [
"SAMP_ID" => $decrypted_data['result_data'][($i-1)]['SAMP_ID'],
"ITEM_NAME" => $decrypted_data['result_data'][($i-1)]['ITEM_NAME'],
"ASP_CNT" => $decrypted_data['result_data'][($i-1)]['ASP_CNT'],
"CONC_DATA" => $decrypted_data['result_data'][($i-1)]['CONC_DATA'],
"OD_DATA" => $decrypted_data['result_data'][($i-1)]['OD_DATA'],
"RST_DATE" => $decrypted_data['result_data'][($i-1)]['RST_DATE'],
"Flag" => $decrypted_data['result_data'][($i-1)]['Flag'],
"ReactionNo" => $decrypted_data['result_data'][($i-1)]['ReactionNo'],
"DIL_ORD" => $decrypted_data['result_data'][($i-1)]['DIL_ORD'],
];
array_push($filtered_data['result_data'], $current);
// Ubah status
} else {
$status = false;
}
// Digunakan untuk menyimpan record terakhir
if ($i == ($length_array-1)) {
$current = [
"SAMP_ID" => $decrypted_data['result_data'][($i)]['SAMP_ID'],
"ITEM_NAME" => $decrypted_data['result_data'][($i)]['ITEM_NAME'],
"ASP_CNT" => $decrypted_data['result_data'][($i)]['ASP_CNT'],
"CONC_DATA" => $decrypted_data['result_data'][($i)]['CONC_DATA'],
"OD_DATA" => $decrypted_data['result_data'][($i)]['OD_DATA'],
"RST_DATE" => $decrypted_data['result_data'][($i)]['RST_DATE'],
"Flag" => $decrypted_data['result_data'][($i)]['Flag'],
"ReactionNo" => $decrypted_data['result_data'][($i)]['ReactionNo'],
"DIL_ORD" => $decrypted_data['result_data'][($i)]['DIL_ORD'],
];
array_push($filtered_data['result_data'], $current);
}
}
}
$i++;
}
return $filtered_data;
}
}