ข้ามไปที่เนื้อหา

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 จากการสั่งยา

  1. แพทย์สั่งยารักษาหวัดให้ผู้ป่วย (3 รายการ)
  2. คลิก "Save as Template"
  3. ตั้งชื่อ: "ชุดรักษาหวัดผู้ใหญ่"
  4. ระบุโรค: "Upper Respiratory Tract Infection"
  5. เลือกประเภท: Personal
  6. คลิก "บันทึก Template"
  7. ระบบบันทึกลง localStorage
  8. ครั้งต่อไปเจอผู้ป่วยหวัด → เรียกใช้ Template ได้ทันที

Use Case 2: ใช้ Template Shared

  1. แพทย์เปิดใบสั่งยาผู้ป่วยความดันสูง
  2. คลิก "Use Template"
  3. เลือกแท็บ "ของโรงพยาบาล"
  4. เลือก "ชุดรักษาความดันโลหิตสูง (CPG 2023)"
  5. ระบบเพิ่มยา: Amlodipine 5mg + Enalapril 10mg
  6. แพทย์เช็คและ Confirm
  7. สั่งยาเสร็จภายใน 10 วินาที

Use Case 3: แก้ไข Template

  1. แพทย์เข้าหน้า Medication Templates
  2. เห็นรายการ Template ส่วนตัวทั้งหมด
  3. เลือก "ชุดรักษาหวัดผู้ใหญ่"
  4. คลิก "แก้ไข"
  5. เพิ่มยา Cetirizine 10mg
  6. คลิก "บันทึก"
  7. Template อัปเดต

สรุป

Medication Templates ช่วย:

ประหยัดเวลา - สั่งยาได้ใน 10 วินาที
ลดข้อผิดพลาด - ไม่ต้องพิมพ์ซ้ำ
มาตรฐานการรักษา - ตาม CPG
แชร์ความรู้ - Template ดีแชร์ให้เพื่อนใช้
RE MED ง่าย - เรียกใช้ใบสั่งยาเก่าได้

Data Storage: - Personal: localStorage (his_medication_templates_{doctorId}) - Shared: JSON file (medication-templates.json)


อัปเดตล่าสุด: 6 มกราคม 2026