Files
gravity/บริหารจัดการคิวนวดแผนไทย/app/Services/NotificationService.php
T
2026-09-16 23:20:08 +07:00

80 lines
2.8 KiB
PHP

<?php
namespace App\Services;
/**
* Class NotificationService
* Enterprise Multi-Channel Notification Gateway (LINE Notify & LINE OA Flex Message)
*
* @package App\Services
*/
class NotificationService
{
private string $lineNotifyToken;
private bool $notifyEnabled;
public function __construct()
{
$config = require __DIR__ . '/../../config/integration.php';
$notif = $config['notification'];
$this->lineNotifyToken = $notif['line_notify']['token'] ?? '';
$this->notifyEnabled = $notif['line_notify']['enabled'] ?? true;
}
/**
* Notify when a new queue is assigned via Smart AI
*/
public function notifyQueueAssigned(array $queueData): bool
{
if (!$this->notifyEnabled || empty($this->lineNotifyToken)) return false;
$msg = "\n🟢 [จัดสรรคิวอัตโนมัติสำเร็จ]\n";
$msg .= "• หมายเลขคิว: {$queueData['queue_no']}\n";
$msg .= "• รหัสหมอนวด: T-{$queueData['assigned_therapist_id']}\n";
$msg .= "• รหัสห้องพัก: R-{$queueData['assigned_room_id']}\n";
$msg .= "• เวลาเริ่มประมาณการ: {$queueData['est_start_time']}\n";
$msg .= "• ข้อความจาก AI: {$queueData['ai_message']}";
return $this->sendLineNotify($msg);
}
/**
* Notify when TV display calls a queue
*/
public function notifyQueueCalled(string $queueNo, string $roomNo, string $patientName): bool
{
if (!$this->notifyEnabled || empty($this->lineNotifyToken)) return false;
$msg = "\n📣 [เรียกคิวเข้ารับบริการ]\n";
$msg .= "• ขอเชิญคิวหมายเลข: {$queueNo}\n";
$msg .= "• ผู้รับบริการ: {$patientName}\n";
$msg .= "• เข้ารับบริการที่ห้อง: {$roomNo}\n";
return $this->sendLineNotify($msg);
}
/**
* Send raw LINE Notify HTTP POST request
*/
private function sendLineNotify(string $message): bool
{
$ch = curl_init("https://notify-api.line.me/api/notify");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['message' => $message]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 3,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer {$this->lineNotifyToken}",
"Content-Type: application/x-www-form-urlencoded",
],
CURLOPT_SSL_VERIFYPEER => false,
]);
$res = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return $httpCode === 200;
}
}