176 lines
10 KiB
PHP
176 lines
10 KiB
PHP
<?php
|
|
// views/jobs/detail.php
|
|
require_once 'models/Job.php';
|
|
require_once 'models/Department.php';
|
|
|
|
$job_number = $_GET['id'] ?? '';
|
|
if (empty($job_number)) {
|
|
echo "<div class='text-center p-8 text-red-500 font-bold'>ไม่พบรหัสงาน</div>";
|
|
return;
|
|
}
|
|
|
|
$jobModel = new Job();
|
|
$job = $jobModel->getByJobNumber($job_number);
|
|
|
|
if (!$job) {
|
|
echo "<div class='text-center p-8 text-red-500 font-bold'>ไม่พบข้อมูลงาน {$job_number}</div>";
|
|
return;
|
|
}
|
|
|
|
$timelines = $jobModel->getJobTimelines($job['id']);
|
|
|
|
$statusColors = [
|
|
'pending' => 'bg-yellow-100 text-yellow-800 border-yellow-200',
|
|
'assigned' => 'bg-blue-100 text-blue-800 border-blue-200',
|
|
'accepted' => 'bg-indigo-100 text-indigo-800 border-indigo-200',
|
|
'in_progress' => 'bg-purple-100 text-purple-800 border-purple-200',
|
|
'completed' => 'bg-green-100 text-green-800 border-green-200',
|
|
'cancelled' => 'bg-red-100 text-red-800 border-red-200',
|
|
];
|
|
$statusNames = [
|
|
'pending' => 'รอดำเนินการ',
|
|
'assigned' => 'มอบหมายแล้ว',
|
|
'accepted' => 'กำลังไปรับ',
|
|
'in_progress' => 'กำลังไปส่ง',
|
|
'completed' => 'เสร็จสิ้น',
|
|
'cancelled' => 'ยกเลิก',
|
|
];
|
|
|
|
$priorityColors = [
|
|
'normal' => 'emerald',
|
|
'urgent' => 'amber',
|
|
'emergency' => 'red'
|
|
];
|
|
$priorityNames = [
|
|
'normal' => 'ทั่วไป (Normal)',
|
|
'urgent' => 'ด่วน (Urgent)',
|
|
'emergency' => 'ฉุกเฉิน (Emergency)'
|
|
];
|
|
|
|
$badgeClass = $statusColors[$job['status']] ?? 'bg-slate-100 text-slate-800';
|
|
$badgeName = $statusNames[$job['status']] ?? $job['status'];
|
|
$pColor = $priorityColors[$job['priority']] ?? 'emerald';
|
|
$pName = $priorityNames[$job['priority']] ?? $job['priority'];
|
|
?>
|
|
|
|
<div class="max-w-4xl mx-auto">
|
|
<div class="flex items-center justify-between mb-6">
|
|
<div>
|
|
<h2 class="text-2xl font-bold text-slate-800 dark:text-white flex items-center flex-wrap gap-2">
|
|
รายละเอียดงาน <span class="px-3 py-1 text-sm rounded-full border <?= $badgeClass ?>"><?= $badgeName ?></span>
|
|
</h2>
|
|
<p class="text-slate-500 dark:text-slate-400 mt-1">หมายเลขงาน: <?= $job['job_number'] ?></p>
|
|
</div>
|
|
<button onclick="window.history.back()" class="bg-white/50 dark:bg-slate-800 border border-slate-200 dark:border-slate-700 hover:bg-slate-100 dark:hover:bg-slate-700 text-slate-700 dark:text-slate-300 px-4 py-2 rounded-xl transition-colors shrink-0">
|
|
<i class="fa-solid fa-arrow-left me-1"></i> กลับ
|
|
</button>
|
|
</div>
|
|
|
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
|
<!-- ข้อมูลหลัก -->
|
|
<div class="md:col-span-2 space-y-6">
|
|
<div class="glass-card p-6 border-t-4 border-t-<?= $pColor ?>-500">
|
|
<h5 class="text-lg font-bold text-slate-800 dark:text-white mb-4 border-b border-slate-200 dark:border-slate-700 pb-2">ข้อมูลผู้ป่วย</h5>
|
|
<div class="flex flex-col sm:flex-row gap-6">
|
|
<?php if (!empty($job['patient_image'])): ?>
|
|
<div class="w-full sm:w-1/3">
|
|
<img src="<?= htmlspecialchars($job['patient_image']) ?>" class="w-full h-auto rounded-lg shadow-sm border border-slate-200 object-cover" alt="รูปผู้ป่วย">
|
|
</div>
|
|
<?php endif; ?>
|
|
<div class="flex-1">
|
|
<p class="text-sm text-slate-500 dark:text-slate-400 mb-1">ชื่อผู้ป่วย</p>
|
|
<h4 class="text-xl font-bold text-slate-800 dark:text-white mb-3">
|
|
<?= htmlspecialchars($job['patient_name'] ?: 'ไม่ระบุชื่อ (ดูรูปภาพ)') ?>
|
|
<?php if ($job['patient_hn']): ?>
|
|
<span class="text-sm font-normal text-slate-500">(HN: <?= htmlspecialchars($job['patient_hn']) ?>)</span>
|
|
<?php endif; ?>
|
|
</h4>
|
|
|
|
<div class="grid grid-cols-2 gap-4 mt-4">
|
|
<div>
|
|
<p class="text-sm text-slate-500 dark:text-slate-400 mb-1">ความเร่งด่วน</p>
|
|
<span class="px-2 py-1 bg-<?= $pColor ?>-100 text-<?= $pColor ?>-800 rounded text-xs font-medium border border-<?= $pColor ?>-200">
|
|
<?= $pName ?>
|
|
</span>
|
|
</div>
|
|
<div>
|
|
<p class="text-sm text-slate-500 dark:text-slate-400 mb-1">อุปกรณ์</p>
|
|
<p class="font-medium text-slate-800 dark:text-white"><?= strtoupper($job['equipment_type']) ?></p>
|
|
</div>
|
|
</div>
|
|
|
|
<?php if ($job['infection_control'] == 1): ?>
|
|
<div class="mt-4 bg-red-100 border border-red-400 text-red-700 px-3 py-2 rounded-lg flex items-center text-sm shadow-sm font-medium">
|
|
<i class="fa-solid fa-biohazard me-2 text-lg"></i> ผู้ป่วยโรคติดต่อ / แยกกักโรค
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="glass-card p-6">
|
|
<h5 class="text-lg font-bold text-slate-800 dark:text-white mb-4 border-b border-slate-200 dark:border-slate-700 pb-2">เส้นทางการเคลื่อนย้าย</h5>
|
|
|
|
<div class="flex items-center mb-4">
|
|
<div class="w-10 h-10 rounded-full bg-red-100 dark:bg-red-900/50 text-red-600 dark:text-red-400 flex items-center justify-center font-bold text-lg z-10 shadow-sm border border-red-200 shrink-0">A</div>
|
|
<div class="ml-4 flex-1">
|
|
<p class="text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wider">รับที่ (From)</p>
|
|
<p class="font-bold text-lg text-slate-800 dark:text-white"><?= htmlspecialchars($job['from_department_name'] ?? 'ไม่ระบุ') ?></p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="relative ml-5 border-l-2 border-dashed border-slate-300 dark:border-slate-600 h-8 -my-5 z-0"></div>
|
|
|
|
<div class="flex items-center mt-4">
|
|
<div class="w-10 h-10 rounded-full bg-green-100 dark:bg-green-900/50 text-green-600 dark:text-green-400 flex items-center justify-center font-bold text-lg z-10 shadow-sm border border-green-200 shrink-0">B</div>
|
|
<div class="ml-4 flex-1">
|
|
<p class="text-xs text-slate-500 dark:text-slate-400 uppercase tracking-wider">ส่งที่ (To)</p>
|
|
<p class="font-bold text-lg text-slate-800 dark:text-white"><?= htmlspecialchars($job['to_department_name'] ?? $job['to_department_custom'] ?? 'ไม่ระบุ') ?></p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<?php if (!empty($job['notes'])): ?>
|
|
<div class="glass-card p-6">
|
|
<h5 class="text-lg font-bold text-slate-800 dark:text-white mb-2 border-b border-slate-200 dark:border-slate-700 pb-2">หมายเหตุ</h5>
|
|
<p class="text-slate-700 dark:text-slate-300 whitespace-pre-line"><?= htmlspecialchars($job['notes']) ?></p>
|
|
</div>
|
|
<?php endif; ?>
|
|
</div>
|
|
|
|
<!-- Timeline -->
|
|
<div class="md:col-span-1">
|
|
<div class="glass-card p-6 h-full">
|
|
<h5 class="text-lg font-bold text-slate-800 dark:text-white mb-6 border-b border-slate-200 dark:border-slate-700 pb-2">ไทม์ไลน์ (Timeline)</h5>
|
|
|
|
<div class="relative border-l border-slate-200 dark:border-slate-700 ml-3 space-y-6 pb-4">
|
|
<?php if (empty($timelines)): ?>
|
|
<p class="text-slate-500 ml-4">ไม่มีข้อมูลไทม์ไลน์</p>
|
|
<?php else: ?>
|
|
<?php foreach($timelines as $index => $tl):
|
|
$isLast = ($index === count($timelines) - 1);
|
|
$tlColor = 'slate';
|
|
$icon = 'fa-circle-dot';
|
|
|
|
if (strpos($tl['status'], 'cancelled') !== false) { $tlColor = 'red'; $icon = 'fa-times'; }
|
|
elseif (strpos($tl['status'], 'completed') !== false) { $tlColor = 'green'; $icon = 'fa-check'; }
|
|
elseif (strpos($tl['status'], 'accepted') !== false) { $tlColor = 'blue'; $icon = 'fa-user-check'; }
|
|
?>
|
|
<div class="relative pl-6">
|
|
<div class="absolute -left-3 top-1 w-6 h-6 rounded-full bg-<?= $tlColor ?>-100 text-<?= $tlColor ?>-600 flex items-center justify-center border-2 border-white dark:border-slate-800 shadow-sm">
|
|
<i class="fa-solid <?= $icon ?> text-xs"></i>
|
|
</div>
|
|
<div class="<?= $isLast ? 'opacity-100' : 'opacity-75' ?>">
|
|
<p class="text-xs text-slate-500 mb-1"><?= date('d/m/Y H:i', strtotime($tl['created_at'])) ?></p>
|
|
<p class="font-medium text-sm text-slate-800 dark:text-white"><?= htmlspecialchars($tl['description']) ?></p>
|
|
<p class="text-xs text-slate-500 mt-1">โดย: <?= htmlspecialchars($tl['created_by_name'] ?? 'ระบบ') ?></p>
|
|
</div>
|
|
</div>
|
|
<?php endforeach; ?>
|
|
<?php endif; ?>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|