surat/roche/index.php

269 lines
9.6 KiB
PHP
Raw Normal View History

2024-12-25 03:04:59 +00:00
<?php
include 'vendor/autoload.php';
include 'conn.php';
set_time_limit(0); // No Timeout
use Aranyasen\HL7;
use Aranyasen\HL7\Connection;
use Aranyasen\HL7\Message;
use Aranyasen\HL7\Segments\MSH;
use Aranyasen\HL7\Segments\MSA;
use Aranyasen\HL7\Messages\ACK;
//use PDO;
$port = 22220; // Replace with the desired port number
// Create a TCP/IP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=> 10, 'usec'=> 0));
//socket_set_nonblock($socket);
// Bind the socket to the specified address and port
if (!socket_bind($socket, '0.0.0.0', $port)) {
echo "Failed to bind socket: " . socket_strerror(socket_last_error()) . PHP_EOL;
exit;
}
// Start listening for incoming connections
if (!socket_listen($socket)) {
echo "Failed to listen on socket: " . socket_strerror(socket_last_error()) . PHP_EOL;
exit;
}
echo "Server listening on port {$port}" . PHP_EOL;
// Read data from the server
while ($clientSocket = socket_accept($socket)) {
//$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
echo "Failed to accept connection: " . socket_strerror(socket_last_error($socket)) . "\n";
break;
}
// Read message from the client
$message = '';
while (($data_request = socket_read($clientSocket, 1024)) !== false) {
error_log("req:".$data_request);
$message .= $data_request;
if (strpos($message, "\x1C") !== false) {
break;
}
}
$msg_ack = new Message(null, ['SEGMENT_SEPARATOR' => '\r']);
$msh_ack = new MSH();
$msh_ack->setVersionId('2.4');
$msh_ack->setField(3, 'LIS');
$msh_ack->setField(4, 'IOP Lab');
$msh_ack->setField(5, 'Ventana');
$msh_ack->setField(6, date('YmdHis'));
$msh_ack->setField(8, 'ACK');
//$msh_ack->setField(9, $message_control_id);
$msh_ack->setField(11, 'P');
$msg_ack->addSegment($msh_ack);
$msa_ack = new MSA();
$msa_ack->setField(1, 'AA');
//$msa_ack->setField(2, $message_control_id);
$msg_ack->addSegment($msa_ack);
//error_log('First:'.$msg_ack->toString());
//socket_write($clientSocket, " ".$msg_ack->toString()."", strlen($msg_ack->toString())) or die("Could not write output1\n");
//sleep(1);
//}
//error_log('before');
//error_log($message);
// Check if the message starts and ends correctly
$startMarker = "\x0B";
$endMarker = "\x1C";
$startPos = strpos($message, $startMarker);
$endPos = strpos($message, $endMarker);
if ($startPos !== false && $endPos !== false) {
//echo "Message starts and ends correctly\n";
//echo "Processed message: " . $message . "\n";
//error_log($message);
$data = $message;
$data = str_replace(" ", "", $data);
$data = str_replace("", "", $data);
$data = preg_replace("/^\s*[\r\n]+/m", "", $data);
$data = preg_replace("/^\h*\v+/m", "", $data);
//error_log("Clean of data");
//error_log($data); //. PHP_EOL;
//error_log("End Clean of data");
$hl7Message = new Message(
$data,
['SEGMENT_SEPARATOR' => '\r']
);
error_log($hl7Message->toString());
//echo '<pre>';
$msh = $hl7Message->getSegmentsByName('MSH');
$sac = $hl7Message->getSegmentsByName('SAC');
$obxs = $hl7Message->getSegmentsByName('OBX');
//var_dump($obxs);
//error_log('StainingRunNumber:' . $obxs[13]->getObservationValue());
//error_log('StainingRunStartTime:' . $obxs[14]->getObservationValue());
//error_log('StainingRunEstimatedMins:' . $obxs[15]->getObservationValue());
//StainingRunEstimatedMins
//StainingRunSlidePosition
//StainingRunCompletedTime
//StainingRunMins
if (isset($obxs) && !empty($obxs)) {
$message_string = $msh[0]->getField(9)[0] . (isset($msh[0]->getField(9)[0]) ? '^' . $msh[0]->getField(9)[1] : '');
$message_control_id = $msh[0]->getField(10);
//$message_control_id = $sac[0]->getField(7);
try {
$serverName = '10.10.20.112'; // Replace with your SQL Server name or IP address
$database = 'pathology'; // Replace with your database name
$username = 'applog'; // Replace with your username
$password = 'applog'; // Replace with your password
try {
$options = [
PDO::SQLSRV_ATTR_ENCODING => PDO::SQLSRV_ENCODING_UTF8,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
];
$conn = new PDO("sqlsrv:Server=$serverName;Database=$database", $username, $password, $options);
//$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// Perform database operations using the connection
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
}
$col3 =
mb_convert_encoding($hl7Message->toString(), 'UTF-8', mb_detect_encoding($hl7Message->toString()));
//utf8_encode($hl7Message->toString());
//error_log($col3);
$col4 = $obxs[13]->getObservationValue();
$col5 = $obxs[14]->getObservationValue();
$col6 = $obxs[15]->getObservationValue();
$col7 = $obxs[16]->getObservationValue();
$col8 = isset($obxs[17]) ? $obxs[17]->getObservationValue() : '';
$col9 = isset($obxs[18]) ? $obxs[18]->getObservationValue() : '';
$col10 = date('Y-m-d H:i:s');
$sql = "INSERT INTO roche_transaction_message (
message_control_id,
message,
message_hl7,
staining_run_number,
staining_run_start_time,
staining_run_estimated_mins,
staining_run_slide_position,
staining_run_completed_time,
staining_run_mins,
created_at,
updated_at,
transaction_at)
VALUES (:col1, :col2, :col3, :col4, :col5, :col6, :col7, :col8, :col9, " . time() . ", " . time() . ", :col10)";
$stmt = $conn->prepare($sql);
$stmt->bindParam(':col1', $message_control_id);
$stmt->bindParam(':col2', $message_string);
$stmt->bindParam(':col3', $col3);
$stmt->bindParam(':col4', $col4);
$stmt->bindParam(':col5', $col5);
$stmt->bindParam(':col6', $col6);
$stmt->bindParam(':col7', $col7);
if (isset($obxs[17])) {
$stmt->bindParam(':col8', $col8);
} else {
$stmt->bindParam(':col8', $col8);
}
if (isset($obxs[18])) {
$stmt->bindParam(':col9', $col9);
} else {
$stmt->bindParam(':col9', $col9);
}
$stmt->bindParam(':col10', $col10);
if ($stmt->execute()) {
}
$msg_ack = new Message(null, ['SEGMENT_SEPARATOR' => chr(13)]);
$msh_ack = new MSH();
$msh_ack->setVersionId('2.4');
$msh_ack->setField(3, 'VENTANA Connect');
$msh_ack->setField(4, 'Ventana');
$msh_ack->setField(5, 'APLAB');
$msh_ack->setField(6, date('YmdHis'));
$msh_ack->setField(8, ['ACK','O21']);
$msh_ack->setField(9, $message_control_id);
$msh_ack->setField(11, 'P');
$msg_ack->addSegment($msh_ack);
$msa_ack = new MSA();
$msa_ack->setField(1, 'AA');
$msa_ack->setField(2, $message_control_id);
$msg_ack->addSegment($msa_ack);
//$ack_msg = " ".$msg_ack->toString()."";
$ack_msg = chr(11).$msg_ack->toString().chr(28);
$dt = date('YmdHis');
//|".date('YmdHisu')."
$msg = chr(11)."MSH|^~\&|Ventana Transmit|VENTANA Connect|Ventana|APLAB|".$dt."||ACK^O21|".$message_control_id."|P|2.4|".chr(13)."MSA|AA|".$message_control_id."||||".chr(13).chr(28).chr(13);
socket_write($clientSocket, $msg, strlen($msg)) or die("Could not write output 2\n");
$message = '';
$message_string = '';
error_log('Second:'.$msg);
echo $msg . PHP_EOL;
socket_close($clientSocket);
} catch (PDOException $e) {
echo "Insertion failed: " . $e->getMessage();
}
$conn = null;
} else {
error_log('No OBX fail');
}
} else {// start end false
echo "Invalid message format\n";
}
// Close the client socket
//socket_close($clientSocket);
}
socket_close($socket);
function processHL7Message($hl7Message)
{
// Implement your logic to parse and process the HL7 message here
// You can use existing HL7 parsing libraries or implement your own parsing logic
// Example: Echo the parsed segments of the HL7 message
$segments = explode("\n", $hl7Message);
foreach ($segments as $segment) {
echo "Segment: " . $segment . PHP_EOL;
}
}