📘 คู่มือ IT Support — PT Medical System
IT Support Manual · v5.5

PT Medical System

คู่มือการติดตั้ง บำรุงรักษา และแก้ไขปัญหา สำหรับเจ้าหน้าที่ IT
ระบบ: PT Medical — Transport + First Aid + Location + GPS + Monitor
Stack: HTML/JS · Supabase · Cloudinary · Google Apps Script · CMSV6 · Google Maps Platform
Repo: github.com/supwilaimedical/pt-medical-system
Version: 5.5 — ปรับปรุงล่าสุด 2026-04-17
🆕 What's new in v5.5 (Apr 2026):

📑 สารบัญ

  1. ภาพรวมระบบ
  2. Stack และส่วนประกอบ
  3. การเข้าถึง / Login
  4. โครงสร้างไฟล์
  5. ฐานข้อมูล Supabase
  6. Credential & Config
  7. Deploy / Hosting
  8. GPS Proxy Architecture
  9. Cloudinary (รูป + PDF)
  10. งานประจำ (Daily / Weekly)
  11. Troubleshoot ทั่วไป
  12. Backup / Recovery
  13. การเพิ่ม User ใหม่
  14. การอัปเกรด / Deploy ใหม่
  15. Contact & Escalation

1ภาพรวมระบบ

PT Medical System คือระบบจัดการผู้ป่วยฉุกเฉิน + ปฐมพยาบาล + ติดตามรถ แบบ Web-based ไม่ต้องติดตั้งโปรแกรม ใช้งานผ่าน Browser ได้เลย ทั้งบนคอม แท็บเล็ต และมือถือ

🚑 Transport
บันทึกเคสนำส่งผู้ป่วย V/S 3 จุด (ต้นทาง/ระหว่างทาง/ปลายทาง) + IV + Consent + DNR (บัตร ปชช./Passport + ลายเซ็นพยาน) + พิมพ์ A4 + OCR
🩹 First Aid
อีเวนท์ปฐมพยาบาล, Triage 4 ระดับ, V/S, Quick Dispense ยา, รายงานสรุป
📡 GPS Tracking
ตามรถ real-time + แชร์ลิงก์ (admin ลบหมดอายุได้) + กล้อง + ค้นหาสถานที่ใกล้สุด + ETA + เตือนความเร็ว ≥120 km/h
📍 Location
ฐานข้อมูลตำแหน่ง + แผนที่ + marker cluster + mini-map ซ้อน modal + share link
🖥️ Monitor
Dashboard รวมสถานะ real-time + ค้นหาสถานที่ใกล้สุดในแผนที่รถ
⚙️ Admin Panel
ตั้งค่า, Map Provider (Leaflet/Google), เช็ค API 5 ตัว, สถิติ, Activity Log, ภาพรวม + version

2Stack และส่วนประกอบ

หัวข้อบริการ / ไลบรารีหมายเหตุ
FrontendHTML + JS (Vanilla) + Bootstrap 5.3ไม่ใช้ Build tool — เปิดไฟล์ .html รันได้เลย
DatabaseSupabase PostgreSQLrwxaalgvkzlsyfzdebcj.supabase.co
RealtimeSupabase Realtime (Postgres changes)Sync ข้ามอุปกรณ์
AuthGoogle Apps Script (HR API)ไม่ใช้ Supabase Auth
File storageCloudinary (deimrg3xs)รูป + PDF (ใบ Refer, Consent, DNR, บัตร ปชช.)
GPS APICMSV6 / 808gpsต้อง Proxy เพราะเป็น HTTP
GPS ProxyRender.com + Google Apps Script fallbackTimeout 5s → ใช้ fallback
OCRGemini API via Cloudflare WorkerOCR บัตรประชาชน
Map (Leaflet)Leaflet 1.9.4 + MarkerClusterDefault — ฟรี, Tile จาก OSM/CartoDB
Map (Google) optionalGoogle Maps Platform — Maps JS, Places (New), Directions, Distance Matrix, Geocodingเปิดใน Admin → ต้องใส่ API key (ต้องเปิดทั้ง 5 API + ตั้ง referrer)
PDFPDF.js 2.16.105แสดงผล PDF ใน browser
Config fileshared/config.jswindow.APP_VERSION = "5.5" (อัพเดตทุก release)

3การเข้าถึง / Login

  1. เปิด Browser ไปที่ URL ระบบ (เช่น https://your-domain/pt-medical-system/)
  2. ใส่ Username และ Password ที่ HR ให้มา (ใช้ระบบเดียวกับข้อมูลพนักงาน)
  3. กด Login — ระบบจะเช็คผ่าน Google Apps Script (GAS HR API)
  4. ถ้า role เป็น Admin จะเห็นปุ่ม "ตั้งค่า" และเมนูเพิ่มเติม
💡 Session — เก็บใน browser's localStorage key: pt_user_meta ปิด browser แล้วเปิดใหม่ยังล็อกอินอยู่ — ถ้าอยาก logout ให้กดปุ่ม logout
⚠️ ถ้า Login ไม่ได้ — ตรวจสอบ: (1) Internet (2) GAS_AUTH_API_URL ยังทำงานอยู่ไหม (3) Username/Password ถูกต้องไหม (4) Browser console มี error อะไร

4โครงสร้างไฟล์

pt-medical-system/
├── index.html              ← Landing + Login + Admin
├── shared/                 ← ไลบรารีใช้ร่วมทุกโมดูล
│   ├── config.js           ← URL + Key ทั้งระบบ (สำคัญ!)
│   ├── auth.js             ← Login, session
│   ├── realtime.js         ← Supabase realtime
│   ├── cloudinary.js       ← Upload
│   ├── gps-providers.js    ← Adapter GPS (CMSV6...)
│   └── styles.css          ← CSS รวม
├── transport/index.html    ← โมดูล Transport
├── firstaid/index.html     ← โมดูล First Aid
├── gps/
│   ├── index.html          ← Dashboard GPS (Admin)
│   └── share.html          ← หน้าแชร์สาธารณะ (no auth)
├── location/index.html     ← โมดูล Location
├── monitor/index.html      ← Dashboard Monitor
├── migration/*.sql         ← SQL สำหรับ Supabase
├── cloudflare/             ← Cloudflare Worker code
└── docs/                   ← เอกสาร

5ฐานข้อมูล Supabase

Tables หลัก

Tableหน้าที่Module
casesเคส Transport — ข้อมูลผู้ป่วย V/S, IV, สถานะTransport
transport_consentsConsent ทุก version (ไม่ลบ)Transport
fa_eventsอีเวนท์ปฐมพยาบาลFirst Aid
fa_registryผู้บาดเจ็บในอีเวนท์First Aid
loc_customersลูกค้า/สถานที่บนแผนที่Location
loc_shared_tokensลิงก์แชร์ locationLocation
gps_providersบัญชี GPS (CMSV6)GPS
gps_vehiclesรถที่ sync มาจาก CMSV6GPS
gps_shared_tokensลิงก์แชร์ GPS + สิทธิ์กล้องGPS
settingsตั้งค่าระบบ (key-value)All
activity_logบันทึกกิจกรรม user (audit trail)All
analyticsSnapshot เคสสำหรับรีพอร์ตAll

การเข้าถึง Supabase

  1. เข้า https://supabase.com/dashboard → เลือก project rwxaalgvkzlsyfzdebcj
  2. Table Editor → เลือก table ที่ต้องการดู/แก้
  3. SQL Editor → รัน query ได้โดยตรง
  4. Settings → API → ดู URL และ anon key
🔒 ห้ามแชร์ service_role key — ใช้เฉพาะ anon key สำหรับ client-side service_role key มีสิทธิ์เต็ม bypass RLS — แชร์แล้วอันตรายมาก

6Credential & Config

ทุกค่าที่เป็น public (URL, anon key, cloudinary cloud name) อยู่ใน shared/config.js

const CONFIG = {
  SUPABASE_URL: 'https://rwxaalgvkzlsyfzdebcj.supabase.co',
  SUPABASE_ANON_KEY: 'sb_publishable_...',
  CLOUDINARY_CLOUD_NAME: 'deimrg3xs',
  CLOUDINARY_UPLOAD_PRESET: 'pt-medical',
  GAS_AUTH_API_URL: 'https://script.google.com/macros/s/.../exec',
  GPS_PROXY_URL: 'https://gps-proxy-lpdq.onrender.com',
  GPS_PROXY_FALLBACK: 'https://script.google.com/macros/.../exec',
  OCR_PROXY_URL: 'https://gps-proxy.supwilai-ambulance.workers.dev'
};
⚠️ Secret ที่ห้ามเข้า git: Supabase service_role key, Gemini API key, รหัสบัญชี CMSV6 — เก็บไว้ที่ Cloudflare Secret, Render env, หรือ .env ที่ ignore แล้ว

7Deploy / Hosting

ระบบเป็น Static site — ไม่มี backend ต้อง deploy เองก็ได้ หรือโฮสต์ที่:

✅ เปิด HTTPS — จำเป็น! เพราะ (1) Service Worker ต้องการ (2) getUserMedia (กล้อง) ต้องการ (3) Supabase realtime ใช้ wss://

8GPS Proxy Architecture

CMSV6 เป็น HTTP ไม่ใช่ HTTPS — browser จะ block เพราะ mixed content ระบบเลยผ่าน proxy 2 ชั้น:

ลำดับบริการURL / ตั้งค่าTimeout
1 (เร็ว)Render.comgps-proxy-lpdq.onrender.com5 วิ
2 (fallback)Google Apps Scriptเดียวกับ AUTH_APIช้ากว่าแต่นิ่ง
⚠️ Render free tier "นอน" หลังไม่ใช้ 15 นาที — ต่อครั้งแรกอาจรอ 30 วิ ระบบจะ fallback ไป GAS ถ้า timeout

การตรวจสอบ

9Cloudinary (รูป + PDF)

ใช้ Upload preset pt-medical แบบ unsigned (client upload ได้ตรง)

Folder structure

🛑 ถ้า PDF view ไม่ได้ — ไปที่ Cloudinary Dashboard → Settings → Security → เปิด "Allow delivery of PDF and ZIP files"

10งานประจำ (Daily / Weekly)

Daily

Weekly

Monthly

11Troubleshoot ปัญหาที่พบบ่อย

อาการสาเหตุวิธีแก้
หน้าแชร์ GPS loading ค้าง Token ไม่มี / หมดอายุ / provider off เช็ค gps_shared_tokensstatus='Active' และ expires_at > now()
GPS Refresh ช้ามาก (>10s) Render proxy หลับ — ใช้ GAS fallback ไปเปิด URL Render ตรงๆ ครั้งเดียวให้ตื่น ปกติเร็วภายใน 30 วิ
PDF Refer ไม่โชว์ Cloudinary PDF delivery ปิดอยู่ Settings → Security → เปิด "Allow delivery of PDF"
Refer docs หายหลังเปิดเคสใหม่ Bug เก่า (แก้แล้ว commit 468ab80) อัปเดต code เป็น version ล่าสุด
Login บอก "รหัสผิด" ทั้งที่ถูก GAS API ไม่ตอบ / URL เปลี่ยน เปิด Browser Console ดู error → เช็ค GAS_AUTH_API_URL ยัง deploy อยู่ไหม
Realtime ไม่ sync ข้าม device (1) Realtime ปิด (2) RLS block (3) WebSocket block Admin → ภาพรวม → เช็ค Realtime Status → ถ้าไม่เขียวเข้า Supabase เปิด realtime
Device B sync แล้ว Device A หายข้อมูล Race condition — Device A overwrite สอนผู้ใช้ Refresh ก่อน Save (ดู docs/MULTI_DEVICE_WORKFLOW.md)
แผนที่ไม่โหลด tile CartoDB ล่ม / CORS เปลี่ยน tile เป็น OSM: https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png
กล้อง CMSV6 เปิดไม่ได้ HLS port 6604 block / session หมดอายุ Admin → GPS Provider → ทดสอบเชื่อมต่อ → re-login
หน้าเด้งกลับ Login ตลอด pt_user_meta โดนลบ / corrupt Browser → Console → localStorage.clear() แล้ว Login ใหม่

12Backup / Recovery

Backup รายเดือน

  1. เข้า Supabase Dashboard → Database → Backups
  2. คลิก "Download backup" (backup อัตโนมัติทำทุกวัน เก็บ 7 วัน)
  3. หรือใช้ SQL Editor → export table ที่สำคัญเป็น CSV
  4. เก็บไฟล์ backup ที่ Google Drive / OneDrive (อย่าเก็บเครื่องเดียว)

Recovery

  1. Supabase → Database → Backups → "Restore" (pro plan เท่านั้น)
  2. หรือ Import CSV กลับเข้า table เดิม (SQL: COPY table FROM 'file.csv' CSV HEADER)
  3. ทดสอบใน staging ก่อน restore production
💾 Cloudinary ไม่ต้อง backup — Cloudinary มี durability เองแล้ว แต่ URL ทั้งหมดอยู่ใน Supabase อยู่แล้ว — ถ้าลบ Cloudinary → PDF/รูปหายหมด

13การเพิ่ม User ใหม่

ระบบใช้ GAS HR API ไม่ใช่ Supabase Auth ดังนั้น:

  1. ติดต่อ HR ให้เพิ่มพนักงานในระบบ HR (Google Sheet หลัง GAS)
  2. กำหนด username/password และ role (Admin / User)
  3. HR save sheet → GAS จะเห็นผู้ใช้ใหม่อัตโนมัติ
  4. แจ้งผู้ใช้ login ที่ URL ระบบ
ℹ️ Role ที่ใช้: Admin เห็น ตั้งค่า + Provider GPS + Log
User (ค่า default) เห็นโมดูลอื่นทั้งหมดเว้นแต่ตั้งค่า

14การอัปเกรด / Deploy ใหม่

  1. Dev push code ขึ้น GitHub (repo supwilaimedical/pt-medical-system)
  2. ถ้าใช้ Cloudflare Pages / Netlify / GitHub Pages — auto deploy
  3. ถ้า self-host — git pull บน server
  4. ถ้ามี migration SQL ใหม่ (folder migration/) — รันใน Supabase SQL Editor
  5. ทดสอบ smoke test: Login → เปิดแต่ละโมดูล → สร้างเคสทดสอบ
🛑 Rollback — ถ้า deploy แล้วพัง: git revert HEAD แล้ว push หรือ redeploy commit เก่า (Cloudflare Pages/Netlify เก็บ history ให้)

15Contact & Escalation

ระดับติดต่อเคสที่เหมาะ
L1IT Support (คุณ)Login ไม่ได้, ใช้งาน UI ไม่เป็น
L2System AdminSupabase ล่ม, RLS error, Proxy ตาย
L3Developer (repo maintainer)Bug ใน code, schema migration, new feature
📞 Emergency — ถ้าทั้งระบบใช้งานไม่ได้เกิน 30 นาที โทรหา Developer ทันที (แจ้งระดับความรุนแรง + จำนวนผู้กระทบ + error screenshot)
© PT Medical System · IT Support Manual v1.0 · ปรับปรุง 2026-04-15
สำหรับใช้ภายในองค์กรเท่านั้น