Workshop on Vibe Coding for Clinical Innovation 2026 · ศูนย์การศึกษาต่อเนื่องของแพทย์ (ศ.น.พ.)
Working Prototype วิชา 7 · ต่อยอดจากวิชา 3–6 · นพ.กิตติพศ เกียรติพัฒนาชัย · User Code P49
· เวอร์ชัน 1.2.1
เว็บแอปทำงานได้จริงบนมือถือ/แท็บเล็ต ไม่ต้องติดตั้งอะไร
▶ เปิดแอปคัดกรอง ER/OPD ดูผลชุดทดสอบในแอป (แท็บ “ทดสอบ”) — 29 เคสพยาบาลคัดกรองหน้าห้องฉุกเฉินต้องจัดระดับความเร่งด่วน 1–5 ภายในไม่กี่นาที โดยเทียบเกณฑ์ 30 ข้อและรายการทรัพยากร 16 รายการจากความจำ และระดับที่ให้กำหนดช่องทาง ER หรือ OPD โดยอัตโนมัติ เคสก้ำกึ่งที่รอยต่อระดับ 2/3 จึงมักถูกดันขึ้นเพื่อความปลอดภัย ทำให้ผู้ป่วยที่ควรไป OPD ไหลเข้า ER
ระบบนี้เสนอระดับและช่องทาง พร้อมแสดงข้อเกณฑ์ที่เข้า/ไม่เข้าเป็นรายข้อ โดยพยาบาลเป็นผู้ตัดสินสุดท้ายเสมอและ override ได้ทุกครั้ง
.json ของโรงพยาบาลเองเข้ามาชุดหลัก: กรมการแพทย์ กระทรวงสาธารณสุข. MOPH ED. TRIAGE. พิมพ์ครั้งที่ 1 (2561) — แปลจาก ESI ใช้ 4 หัวข้อเป็นจุดตัด (ถอดความจาก text layer ของเล่ม พร้อมเลขหน้ากำกับทุกข้อ)
ชุดฉบับโรงพยาบาล: ชุดหลัก + จุดตัดตามอายุจาก วิธีปฏิบัติ PMK-WND-037 การคัดกรองผู้ป่วยนอก รพ.พระมงกุฎเกล้า (2561) — ระบุที่มารายข้อในแอป
เหตุผลที่ต้องมี 2 ชุด: คู่มือ MOPH ใช้เกณฑ์ shock SBP < 90 เท่ากันทุกช่วงอายุ
ถ้าใช้ตรงตัวกับทารกจะได้ระดับ 1 แทบทุกราย — แอปแสดงผลตามที่คู่มือเขียนโดยไม่แก้ให้เอง
แต่เปิดให้สลับไปใช้ชุดที่มีจุดตัดตามอายุได้ (ดูเคส 20b เทียบ 20c ในแท็บทดสอบ)
P49-triage.html — ตัวแอปengine.js — criteria engine รับเกณฑ์เป็นข้อมูล ยกเว้นสูตรจุดตัด shock ตามอายุจาก PMK-WND-037 ที่ชุดฉบับโรงพยาบาลเรียกใช้criteria-moph-2561.json · criteria-moph-2561-local.json — ชุดเกณฑ์kat-cases.js — ชุดทดสอบ 29 เคส (ใช้ร่วมกันทั้งในแอปและใน node test-engine.js)test-engine.js — ชุดตรวจ 58 ข้อ รันด้วย Nodesupabase-data.js — ชั้นข้อมูล Supabase (CRUD ครบสี่คำสั่งบนตารางจริง)supabase-w6-additions.sql — policy update/delete + trigger สร้าง profilessupabase-w7-hardening.sql — กันผู้ใช้แก้บทบาท/หน่วยงานตัวเอง + อ่านเคสหน่วยเดียวกันได้จริง พร้อมชุดทดสอบERD 9 ตารางที่ถอดมาจากแอปนี้ พร้อมคำอธิบาย relationship / data type / RLS และไฟล์ SQL ที่พร้อมรันใน Supabase SQL Editor (มี seed ชุดเกณฑ์จริงทั้ง 2 ฉบับ)
📐 ER Diagram (PDF 2 หน้า) 🗄 supabase-schema.sqlแอปเชื่อม Supabase (PostgreSQL) ผ่าน client SDK แล้ว ทำ CRUD ครบสี่คำสั่งบนตารางจริงตาม ERD:
cases → assessments → assessment_criteria → overridesoverridesความปลอดภัยหลายชั้น: Supabase Auth → RBAC จากคอลัมน์ role ใน profiles
→ validation ทั้งฝั่งหน้าเว็บและ CHECK constraint → RLS ทุกตาราง เทียบ auth.uid() กับเจ้าของแถว
กุญแจ: ค่าเชื่อมต่ออยู่ใน supabase-config.js ในรีโป — เป็น anon/publishable
key ที่ออกแบบให้เปิดเผยฝั่ง client ได้ เพราะเปิด RLS ครบทุกตาราง (ยังไม่ล็อกอิน = อ่านไม่ได้เลย) · ผู้ที่ล็อกอินแก้บทบาทหรือหน่วยงานของตัวเองไม่ได้ ปรับแล้ว 23 ก.ย. ใน supabase-w7-hardening.sql
· service_role key ไม่อยู่ในรีโปและห้ามใช้ฝั่งหน้าเว็บ · หน้าเว็บสาธารณะนี้จึงสาธิต CRUD
บนฐานข้อมูลจริงได้เมื่อเข้าสู่ระบบ
ไม่ล็อกอิน: เคสอยู่ใน localStorage ของเบราว์เซอร์เครื่องนั้นเท่านั้น
ล็อกอิน: แอปจะส่งเคสเข้า Supabase ภูมิภาค Singapore เมื่อผู้ใช้อ่านข้อมูลที่เก็บ ติ๊กยินยอมข้อ 1–2 และตอบคำถามตรวจความเข้าใจแล้ว · ข้อ 3–4 เลือกได้ ให้หรือถอนด้วยคลิกเดียว · ถอนข้อ 1–2 ด้วยปุ่มเดียวแล้วออกจากระบบ · บันทึกเวอร์ชันและเวลาของการให้หรือถอน 10 ครั้งล่าสุดไว้กับบัญชี · ตัวกั้นนี้อยู่ที่หน้าแอป ฐานข้อมูลยังไม่ตรวจความยินยอมเอง
ผู้รับผิดชอบ: นพ.กิตติพศ เกียรติพัฒนาชัย ผู้พัฒนา · ขอลบบัญชีหรือแจ้งเหตุผ่าน GitHub Issues โดยไม่ใส่ข้อมูลส่วนบุคคล
🔏 นโยบายความเป็นส่วนตัว + แบบขอความยินยอม (PDF)⚠️ เครื่องมือสาธิตเพื่อการเรียนการสอนเท่านั้น ใช้สถานการณ์จำลองทั้งหมด ไม่มีข้อมูลผู้ป่วยจริง ไม่เก็บชื่อ / HN / เลขบัตรประชาชน · ไม่ใช่เครื่องมือแพทย์ ยังไม่ผ่านการตรวจสอบความแม่นยำทางคลินิก และไม่ทดแทนการตัดสินใจของผู้คัดกรอง · เคสที่บันทึกก่อนเข้าสู่ระบบหรือก่อนให้ความยินยอมอยู่ใน localStorage ของเบราว์เซอร์เครื่องผู้ใช้ · เมื่อเข้าสู่ระบบและให้ความยินยอมแล้วจะบันทึกลงฐานข้อมูล Supabase ของผู้พัฒนา (ap-southeast-1) และเห็นได้เฉพาะแถวที่ตนมีสิทธิ์ตาม Row Level Security