<input type="time"> ใช้ 24 ชั่วโมง (lang="en-GB")PT Medical System คือระบบจัดการผู้ป่วยฉุกเฉิน + ปฐมพยาบาล + ติดตามรถ แบบ Web-based ไม่ต้องติดตั้งโปรแกรม ใช้งานผ่าน Browser ได้เลย ทั้งบนคอม แท็บเล็ต และมือถือ
| หัวข้อ | บริการ / ไลบรารี | หมายเหตุ |
|---|---|---|
| Frontend | HTML + JS (Vanilla) + Bootstrap 5.3 | ไม่ใช้ Build tool — เปิดไฟล์ .html รันได้เลย |
| Database | Supabase PostgreSQL | rwxaalgvkzlsyfzdebcj.supabase.co |
| Realtime | Supabase Realtime (Postgres changes) | Sync ข้ามอุปกรณ์ |
| Auth | Google Apps Script (HR API) | ไม่ใช้ Supabase Auth |
| File storage | Cloudinary (deimrg3xs) | รูป + PDF (ใบ Refer, Consent, DNR, บัตร ปชช.) |
| GPS API | CMSV6 / 808gps | ต้อง Proxy เพราะเป็น HTTP |
| GPS Proxy | Render.com + Google Apps Script fallback | Timeout 5s → ใช้ fallback |
| OCR | Gemini API via Cloudflare Worker | OCR บัตรประชาชน |
| Map (Leaflet) | Leaflet 1.9.4 + MarkerCluster | Default — ฟรี, Tile จาก OSM/CartoDB |
| Map (Google) optional | Google Maps Platform — Maps JS, Places (New), Directions, Distance Matrix, Geocoding | เปิดใน Admin → ต้องใส่ API key (ต้องเปิดทั้ง 5 API + ตั้ง referrer) |
| PDF.js 2.16.105 | แสดงผล PDF ใน browser | |
| Config file | shared/config.js | window.APP_VERSION = "5.5" (อัพเดตทุก release) |
https://your-domain/pt-medical-system/)localStorage key: pt_user_meta
ปิด browser แล้วเปิดใหม่ยังล็อกอินอยู่ — ถ้าอยาก logout ให้กดปุ่ม logout
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/ ← เอกสาร
| Table | หน้าที่ | Module |
|---|---|---|
cases | เคส Transport — ข้อมูลผู้ป่วย V/S, IV, สถานะ | Transport |
transport_consents | Consent ทุก version (ไม่ลบ) | Transport |
fa_events | อีเวนท์ปฐมพยาบาล | First Aid |
fa_registry | ผู้บาดเจ็บในอีเวนท์ | First Aid |
loc_customers | ลูกค้า/สถานที่บนแผนที่ | Location |
loc_shared_tokens | ลิงก์แชร์ location | Location |
gps_providers | บัญชี GPS (CMSV6) | GPS |
gps_vehicles | รถที่ sync มาจาก CMSV6 | GPS |
gps_shared_tokens | ลิงก์แชร์ GPS + สิทธิ์กล้อง | GPS |
settings | ตั้งค่าระบบ (key-value) | All |
activity_log | บันทึกกิจกรรม user (audit trail) | All |
analytics | Snapshot เคสสำหรับรีพอร์ต | All |
https://supabase.com/dashboard → เลือก project rwxaalgvkzlsyfzdebcjทุกค่าที่เป็น 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'
};
ระบบเป็น Static site — ไม่มี backend ต้อง deploy เองก็ได้ หรือโฮสต์ที่:
CMSV6 เป็น HTTP ไม่ใช่ HTTPS — browser จะ block เพราะ mixed content ระบบเลยผ่าน proxy 2 ชั้น:
| ลำดับ | บริการ | URL / ตั้งค่า | Timeout |
|---|---|---|---|
| 1 (เร็ว) | Render.com | gps-proxy-lpdq.onrender.com | 5 วิ |
| 2 (fallback) | Google Apps Script | เดียวกับ AUTH_API | ช้ากว่าแต่นิ่ง |
https://gps-proxy-lpdq.onrender.com ตรงๆ ควรตอบ 200/404ใช้ Upload preset pt-medical แบบ unsigned (client upload ได้ตรง)
pt-medical/transport/{case_id} — ใบ Refer ของแต่ละเคสpt-medical/firstaid/ — รูปอีเวนท์pt-medical/location/ — รูปสถานที่pt-medical/signatures/ — ลายเซ็น Consentpt-medical/logos/ — โลโก้บริษัท| อาการ | สาเหตุ | วิธีแก้ |
|---|---|---|
| หน้าแชร์ GPS loading ค้าง | Token ไม่มี / หมดอายุ / provider off | เช็ค gps_shared_tokens → status='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 ใหม่ |
COPY table FROM 'file.csv' CSV HEADER)ระบบใช้ GAS HR API ไม่ใช่ Supabase Auth ดังนั้น:
Admin เห็น ตั้งค่า + Provider GPS + LogUser (ค่า default) เห็นโมดูลอื่นทั้งหมดเว้นแต่ตั้งค่า
supwilaimedical/pt-medical-system)git pull บน servermigration/) — รันใน Supabase SQL Editorgit revert HEAD แล้ว push
หรือ redeploy commit เก่า (Cloudflare Pages/Netlify เก็บ history ให้)
| ระดับ | ติดต่อ | เคสที่เหมาะ |
|---|---|---|
| L1 | IT Support (คุณ) | Login ไม่ได้, ใช้งาน UI ไม่เป็น |
| L2 | System Admin | Supabase ล่ม, RLS error, Proxy ตาย |
| L3 | Developer (repo maintainer) | Bug ใน code, schema migration, new feature |