Workflow การจัดการชุดยาแพทย์ (Medication Templates Workflow)
📋 สารบัญ
ภาพรวม
ไฟล์: modules/pharmacy/medication-templates.html
Medication Templates (ชุดยา) เป็น Feature ที่ช่วยให้แพทย์สามารถบันทึกชุดยาที่ใช้บ่อยไว้ แล้วเรียกใช้ซ้ำได้อย่างรวดเร็ว (RE MED) ลดเวลาในการสั่งยาและลดข้อผิดพลาด
วัตถุประสงค์
- ✅ ลดเวลาการสั่งยา
- ✅ ลดข้อผิดพลาดจากการพิมพ์ซ้ำ
- ✅ มาตรฐานการรักษาสำหรับโรคเดียวกัน
- ✅ แชร์ชุดยาที่ดีให้แพทย์อื่นใช้
ประเภท Template
1. Personal Templates (ชุดยาส่วนตัว)
คำอธิบาย: ชุดยาที่แพทย์สร้างเพื่อใช้เอง
ลักษณะ: - บันทึกใน localStorage - เฉพาะแพทย์ที่สร้างเท่านั้นที่เห็น - แก้ไข/ลบได้เฉพาะเจ้าของ
ตัวอย่าง:
{
"id": "TPL-DOC001-001",
"name": "ชุดรักษาหวัดของฉัน",
"type": "personal",
"doctorId": "DOC001",
"doctorName": "นพ.สมศักดิ์ แพทย์ดี",
"disease": "URI",
"createdAt": "2025-12-01T10:00:00",
"medications": [
{
"drugCode": "MED001",
"tradeName": "Paracetamol 500mg",
"dosage": "1-2 tab",
"frequency": "q4-6h",
"duration": "PRN"
}
]
}
2. Shared Templates (ชุดยาของโรงพยาบาล)
คำอธิบาย: ชุดยามาตรฐานที่โรงพยาบาลกำหนดให้แพทย์ทุกคนใช้
ลักษณะ: - บันทึกใน JSON file (medication-templates.json) - แพทย์ทุกคนเห็น - แก้ไขได้เฉพาะ Admin/เภสัชกร
ตัวอย่าง:
{
"id": "TPL-SHARED-001",
"name": "ชุดรักษาความดันโลหิตสูง",
"type": "shared",
"category": "cardiovascular",
"disease": "Hypertension",
"guidelines": "CPG Thailand 2023",
"createdBy": "ADMIN",
"approvedBy": "คณะกรรมการเภสัชกรรมและการบำบัด",
"medications": [
{
"drugCode": "MED030",
"tradeName": "Amlodipine 5mg",
"dosage": "1 tab",
"frequency": "od",
"timing": "hs"
}
]
}
Workflow
1. สร้าง Template
graph TB
A[แพทย์สั่งยาเสร็จ] --> B{บันทึกเป็น Template?}
B -->|No| C[จบการสั่งยา]
B -->|Yes| D[คลิก Save as Template]
D --> E[กรอกข้อมูล Template]
E --> F[ตั้งชื่อ Template]
F --> G[ระบุโรค/อาการ]
G --> H{ประเภท?}
H -->|Personal| I[บันทึกใน localStorage]
H -->|Shared| J[ส่งขอ Approve]
I --> K[เสร็จสิ้น]
J --> L[Admin อนุมัติ]
L --> M[บันทึกใน medication-templates.json]
M --> K
2. ใช้ Template (RE MED)
graph LR
A[แพทย์เปิดใบสั่งยาใหม่] --> B[คลิก Use Template]
B --> C[เลือก Personal/Shared]
C --> D[ค้นหา Template]
D --> E[เลือก Template ที่ต้องการ]
E --> F[ระบบเพิ่มยาทั้งชุด]
F --> G{ต้องการแก้ไข?}
G -->|Yes| H[แก้ไขรายการยา]
G -->|No| I[Confirm]
H --> I
I --> J[สั่งยาเสร็จสิ้น]
Features
1. สร้าง Template
function saveAsTemplate() {
const currentMedications = getMedicationsInOrder();
if (currentMedications.length === 0) {
alert('กรุณาเพิ่มยาก่อนบันทึก Template');
return;
}
// แสดง Modal
const modal = `
<div class="modal" id="saveTemplateModal">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5>บันทึกเป็น Template</h5>
</div>
<div class="modal-body">
<div class="mb-3">
<label>ชื่อ Template *</label>
<input type="text" class="form-control"
id="templateName"
placeholder="เช่น ชุดรักษาหวัด">
</div>
<div class="mb-3">
<label>โรค/อาการ</label>
<input type="text" class="form-control"
id="templateDisease"
placeholder="เช่น Upper Respiratory Tract Infection">
</div>
<div class="mb-3">
<label>ประเภท</label>
<select class="form-select" id="templateType">
<option value="personal">Personal (ส่วนตัว)</option>
<option value="shared">Shared (แชร์ให้ทุกคน)</option>
</select>
<small class="text-muted">
Shared template ต้องผ่านการอนุมัติจาก Admin
</small>
</div>
<div class="mb-3">
<label>รายการยา (${currentMedications.length} รายการ)</label>
<ul class="list-group">
${currentMedications.map(med => `
<li class="list-group-item">${med.tradeName}</li>
`).join('')}
</ul>
</div>
</div>
<div class="modal-footer">
<button class="btn btn-secondary" onclick="closeModal()">
ยกเลิก
</button>
<button class="btn btn-primary" onclick="confirmSaveTemplate()">
<i class="bi bi-save"></i> บันทึก Template
</button>
</div>
</div>
</div>
</div>
`;
document.body.insertAdjacentHTML('beforeend', modal);
$('#saveTemplateModal').modal('show');
}
async function confirmSaveTemplate() {
const name = document.getElementById('templateName').value;
const disease = document.getElementById('templateDisease').value;
const type = document.getElementById('templateType').value;
if (!name) {
alert('กรุณากรอกชื่อ Template');
return;
}
const templateData = {
name,
disease,
type,
doctorId: getCurrentUser().userId,
doctorName: getCurrentUser().name,
medications: getMedicationsInOrder(),
createdAt: new Date().toISOString()
};
const result = await medicationService.saveTemplate(templateData);
if (result.success) {
alert('บันทึก Template สำเร็จ');
$('#saveTemplateModal').modal('hide');
} else {
alert('เกิดข้อผิดพลาด: ' + result.message);
}
}
2. ใช้ Template
async function showTemplateModal() {
const doctorId = getCurrentUser().userId;
// โหลด Templates
const templates = await medicationService.getTemplates(doctorId, 'all');
const modal = `
<div class="modal fade" id="useTemplateModal">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5>เลือก Medication Template</h5>
<button type="button" class="btn-close"
data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<!-- Search -->
<input type="text" class="form-control mb-3"
id="searchTemplate"
placeholder="ค้นหาชื่อ Template หรือโรค...">
<!-- Tabs -->
<ul class="nav nav-tabs mb-3">
<li class="nav-item">
<a class="nav-link active" data-type="all">
ทั้งหมด (${templates.length})
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-type="personal">
ส่วนตัว
</a>
</li>
<li class="nav-item">
<a class="nav-link" data-type="shared">
ของโรงพยาบาล
</a>
</li>
</ul>
<!-- Template List -->
<div id="templateList">
${renderTemplateList(templates)}
</div>
</div>
</div>
</div>
</div>
`;
document.body.insertAdjacentHTML('beforeend', modal);
$('#useTemplateModal').modal('show');
}
function renderTemplateList(templates) {
if (templates.length === 0) {
return '<p class="text-muted">ไม่พบ Template</p>';
}
return templates.map(template => `
<div class="card mb-2" onclick="selectTemplate('${template.id}')">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h6>${template.name}</h6>
<div class="text-muted small">
${template.disease || '-'}
</div>
</div>
<div class="text-end">
<span class="badge ${template.type === 'personal' ? 'bg-primary' : 'bg-success'}">
${template.type === 'personal' ? 'Personal' : 'Shared'}
</span>
<div class="text-muted small mt-1">
${template.medications.length} รายการ
</div>
</div>
</div>
<div class="mt-2">
<button class="btn btn-sm btn-outline-primary"
onclick="event.stopPropagation(); viewTemplate('${template.id}')">
<i class="bi bi-eye"></i> ดูรายละเอียด
</button>
</div>
</div>
</div>
`).join('');
}
async function selectTemplate(templateId) {
const template = await medicationService.getTemplateById(templateId);
if (!template) {
alert('ไม่พบ Template');
return;
}
// เพิ่มยาทั้งชุด
template.medications.forEach(med => {
addMedicationToList(med);
});
$('#useTemplateModal').modal('hide');
showSuccessAlert(`เพิ่มยาจาก Template "${template.name}" เรียบร้อยแล้ว (${template.medications.length} รายการ)`);
}
3. แก้ไข/ลบ Template
function editTemplate(templateId) {
const template = medicationService.getTemplateById(templateId);
// ตรวจสอบสิทธิ์
if (template.type === 'personal' &&
template.doctorId !== getCurrentUser().userId) {
alert('คุณไม่มีสิทธิ์แก้ไข Template นี้');
return;
}
// แสดง Modal แก้ไข
showEditTemplateModal(template);
}
async function deleteTemplate(templateId) {
const confirmed = confirm('ต้องการลบ Template นี้หรือไม่?');
if (!confirmed) return;
const result = await medicationService.deleteTemplate(
templateId,
getCurrentUser().userId
);
if (result.success) {
alert('ลบ Template สำเร็จ');
refreshTemplateList();
} else {
alert('เกิดข้อผิดพลาด: ' + result.message);
}
}
Use Cases
Use Case 1: สร้าง Template จากการสั่งยา
- แพทย์สั่งยารักษาหวัดให้ผู้ป่วย (3 รายการ)
- คลิก "Save as Template"
- ตั้งชื่อ: "ชุดรักษาหวัดผู้ใหญ่"
- ระบุโรค: "Upper Respiratory Tract Infection"
- เลือกประเภท: Personal
- คลิก "บันทึก Template"
- ระบบบันทึกลง localStorage
- ครั้งต่อไปเจอผู้ป่วยหวัด → เรียกใช้ Template ได้ทันที
Use Case 2: ใช้ Template Shared
- แพทย์เปิดใบสั่งยาผู้ป่วยความดันสูง
- คลิก "Use Template"
- เลือกแท็บ "ของโรงพยาบาล"
- เลือก "ชุดรักษาความดันโลหิตสูง (CPG 2023)"
- ระบบเพิ่มยา: Amlodipine 5mg + Enalapril 10mg
- แพทย์เช็คและ Confirm
- สั่งยาเสร็จภายใน 10 วินาที
Use Case 3: แก้ไข Template
- แพทย์เข้าหน้า Medication Templates
- เห็นรายการ Template ส่วนตัวทั้งหมด
- เลือก "ชุดรักษาหวัดผู้ใหญ่"
- คลิก "แก้ไข"
- เพิ่มยา Cetirizine 10mg
- คลิก "บันทึก"
- Template อัปเดต
สรุป
Medication Templates ช่วย:
✅ ประหยัดเวลา - สั่งยาได้ใน 10 วินาที
✅ ลดข้อผิดพลาด - ไม่ต้องพิมพ์ซ้ำ
✅ มาตรฐานการรักษา - ตาม CPG
✅ แชร์ความรู้ - Template ดีแชร์ให้เพื่อนใช้
✅ RE MED ง่าย - เรียกใช้ใบสั่งยาเก่าได้
Data Storage:
- Personal: localStorage (his_medication_templates_{doctorId})
- Shared: JSON file (medication-templates.json)
อัปเดตล่าสุด: 6 มกราคม 2026