บันทึกประสบการณ์ เบื้องหลังการพัฒนาระบบคัดกรอง COVID-19 สำหรับบุคลากรทางการแพทย์ โรงพยาบาลสระบุรี

Puwadon Sricharoen
5 min readApr 18, 2020

--

ขอมีส่วนร่วมในการปกป้องบุคลากรทางการแพทย์จาก COVID-19

ช่วงเวลานี้เป็นช่วงเวลาที่สำคัญที่สุดที่เราจะต้องทำงานร่วมกัน เพื่อแก้ไขปัญหาที่กำลังเกิดขึ้น ใช้เทคโนโลยีช่วยชะลอการแพร่ระบาดของ COVID-19 และทำให้ทุกคนกลับมาใช้ชีวิตตามปกติให้เร็วที่สุด

จุดเริ่มต้น

ผมได้รับการติดต่อจากคุณหมอชานนท์ หรือ นายแพทย์ชานนท์ นันทวงค์ จากโรงพยาบาลสระบุรี คุณหมอแจ้งว่าทางโรงพยาบาลตั้งทีม ZeroCOVID ขึ้นมา และอยากได้ระบบมาช่วยคัดกรองกลุ่มเสี่ยง COVID-19 สำหรับบุคลากรทางการแพทย์รวมถึงเจ้าหน้าที่ในโรงพยาบาลด้วย แนวคิดคือเจ้าหน้าที่ทุกคนต้องเข้ามาตอบแบบคัดกรองก่อนมาทำงานทุกวัน จากนั้นระบบจะแจ้งผลว่ามาทำงานได้หรือให้หยุดงาน และส่งผลวิเคราะห์ไปถึงหัวหน้างานและทีมในโรงพยาบาลที่ดูแลเรื่อง COVID-19 ต่อไป ทีมของโรงพยาบาลจะติดต่อกลับ เพื่อติดตามอาการของกลุ่มเสี่ยงต่อไป ลดความเสี่ยงในการคัดกรองที่ต้องวัดอุณหภูมิและซักประวัติแบบเดิม (ไม่เจอกันย่อมเสี่ยงน้อยกว่า)

ผู้ติดเชื้ออาจป่วยเนื่องจากไวรัสนี้เป็นเวลา 14 วันก่อนแสดงอาการ อาการทั่วไปของโรคติดเชื้อไวรัสโคโรนา 2019 คือเป็นไข้ อ่อนเพลียและไอแห้ง คนส่วนใหญ่ (ประมาณร้อยละ 80) หายจากโรคนี้ได้โดยไม่ต้องรับการรักษาพิเศษ ในกรณีส่วนน้อย โรคอาจรุนแรงจนถึงขั้นทำให้เสียชีวิตในผู้สูงอายุและผู้ที่มีโรคประจำตัว เช่น หอบหืด เบาหวาน หรือโรคหัวใจ

กลุ่มผู้สงสัยติดเชื้อที่เข้าเกณฑ์สอบสวนโรค (PUI) หรือ Patients under investigated คือ ผู้ป่วยติดเชื้อระบบทางเดินหายใจส่วนบน กรณีที่กลุ่ม PUI มีอาการโรคจะเข้ารับการรักษาในโรงพยาบาล แต่ในกรณีที่ตรวจแล้วไม่พบเชื้อ แพทย์จะรักษาตามอาการและกักตัวที่บ้าน 14 วัน ส่วนกลุ่ม PUI ที่ไม่มีอาการหรืออาการเล็กน้อย ก็ให้กลับบ้านได้แต่ต้องแยกกักสังเกตอาการ 14 วัน โดยเมื่อได้รับผลการตรวจจากห้องปฏิบัติการแล้ว โรงพยาบาลจะแจ้งผลให้ทราบ ถ้าตรวจพบเชื้อก็จะรับกลับมารักษาต่อไป

เงื่อนไขหลักๆ ในการวิเคราะห์คำตอบจากแบบคัดกรองนี้จะอยู่ที่อุณหภูมิร่างกาย หากสูงกว่า 37.5 องศาเซลเซียสและมีอาการผิดปกติเพิ่มเติมด้วย เช่น เจ็บคอ ไอ ปวดเมื่อยตามตัว หายใจลำบาก การรับกลิ่นผิดปกติ(ลดลง) ซึ่งอาการเหล่านี้ถูกพบในผู้ป่วย COVID-19 ด้วยเช่นกัน

เราแบ่งกลุ่มเสี่ยงออกมาเป็น 4 ระดับ โดยดูจากการมีไข้และอาการผิดปกติ เช่น ผู้ที่มีไข้ อาการไอ เจ็บคอ การได้รับกลิ่นลดลง ร่วมด้วย สามารถวิเคราะห์ได้ว่ามีความเสี่ยงสูงเข้าเกณฑ์ PUI (สีแดง) ซึ่งมีแนวทางในการปฏิบัติตัวต่างที่แตกต่างกัน ผู้ตอบแบบคัดกรองจะเห็นได้จากหน้าแจ้งผล

เมื่อผู้ตอบแบบคัดกรองเสร็จแล้วข้อมูลจะบันทึกลงในฐานข้อมูล โดยที่ทีมโรงพยาบาลสามารถเข้าดูข้อมูลทั้งหมดได้จากระบบแอดมินที่ต้องใช้ Username, Password ในการเข้าถึงข้อมูลต่อไป และสามารถ Export ข้อมูลรายวันได้จากระบบนี้เช่นกัน

ระบบแอดมินสำหรับทีมของโรงพยาบาล

สำหรับในเคสกลุ่มเสี่ยงทั้งสีเหลืองและสีแดง จะมีข้อมูลของผู้ตอบแบบสอบถาม เบอร์ติดต่อกลับ ชื่อหน่วยงานและหัวหน้างาน แจ้งลงในกลุ่มไลน์ของหัวหน้าหน่วยงานและทีมโรงพยาบาลโดยทันที ความสามารถนี้ช่วยให้การเฝ้าติดตามสะดวกยิ่งขึ้นโดยเฉพาะในเคสเร่งด่วน

ตัวอย่างการแจ้งกลุ่มเสี่ยงในลงใน LINE Group

ในแบบคัดกรองจะมีกลุ่มคำถามที่ช่วยระบุความความเสี่ยงของผู้ปฏิบัติงานด้วย ช่วยให้ทีมสามารถจัดระดับความเสี่ยงของกลุ่มผู้ปฏิบัติงานได้ชัดเจนขึ้น ตัวอย่างเช่น คุณปฏิบัติงานในแผนกที่มีบุคลากรป่วย (Confirmed Health Worker) หรือสงสัย (PUI)โรคโควิดหรือไม่, คุณปฏิบัติงานที่แผนกที่มีบุคลากรป่วย (Confirmed Health Worker) หรือสงสัย (PUI) โรคโควิดหรือไม่

นอกจากนี้ยังมีคำถามเพิ่มเติม เช่น ความพร้อมในการทำงานของวันนี้ ความวิตกกังวลกับสถานการณ์ในตอนนี้ คำตอบส่วนนี้ช่วยให้เข้าใจอารมณ์ ความรู้สึกของผู้ปฏิบัติงานโดยรวม ว่ายังทุกคนสามารถรับมือกับสถานการณ์ปัจจุบันได้ในระดับใด

คำถามเกี่ยวกับความวิตกกังวลกับสถานการณ์
คำถามช่วยจัดระดับความเสี่ยงของกลุ่มผู้ปฏิบัติงาน

เมื่อทางโรงพยาบาลมีข้อมูลเหล่านี้ ช่วยให้การคัดกรองมีประสิทธิภาพมากขึ้น ลดความเสี่ยงของการแพร่ระบาดให้กับบุคลากรทางการแพทย์ได้ค่อนข้างมาก รวมถึงการวางแผนและออกมาตรการเพิ่มเติมสำหรับควบคุมการระบาดสามารถอ้างอิงจากข้อมูลชุดนี้เช่นกัน

หลังจากได้คุยเรื่องความต้องการของระบบเบื้องแล้ว ทางคุณหมอก็สรุปข้อมูลทั้งหมดตามมาอีกครั้ง โดยมีรายละเอียดและขั้นตอนทำงานที่ชัดเจน ช่วยให้คุยกันไม่กี่ครั้งก็สามารถพัฒนาได้ทันที

รับบรีฟจากคุณหมอผ่าน Power Point

เริ่มพัฒนาระบบ

คุณหมอแจ้งตั้งแต่แรกแล้วว่าจะประชาสัมพันธ์ระบบคัดกรองผ่านทาง LINE ของโรงพยาบาล มีบุคลากรอยู่ประมาณ 2 พันคน เป็นโอกาสดีที่จะใช้ LINE Official Account โดยมี Rich Menu เป็นปุ่มเปิดแบบคัดกรองในรูปแบบของ LIFF App

ทางโรงพยาบาลมี LINE Official Account อยู่แล้ว

ผมเลือก VueJS ในการพัฒนาเว็บแอปพลิเคชั่นสำหรับตอบแบบคัดกรอง และใช้บริการของ Firebase ทั้งหมด ซึ่งมีทุกอย่างที่จำเป็นต้องใช้แล้ว แต่ขอแนะนำให้อ่าน Document อย่างละเอียดก่อนเพราะก็มีข้อจำกัดอยู่เช่นกัน อาจทำให้งานสะดุดระหว่างทางได้ ในส่วนของ CSS ผมเลือกที่จะเขียนขึ้นมาใหม่ทั้งหมด(ถนัดมากกว่า) โดยออกแบบการแสดงผลสำหรับจอมือถือเพียงอย่างเดียว

ภาพรวมของเทคโนโลยีที่ใช้ทั้งหมดในระบบ

ครอบครัว Firebase

Firebase Hosting เป็น Web Hosting ที่ให้พื้นที่ฟรี 1GB และ data transfer 10GB ต่อเดือน ผมทำ Multiple Sites เพื่อแยก LIFF App กับ Admin App ออกจากกัน ทำให้สามารถ deploy แยกกันได้และที่จำเป็นที่สุดคือมี SSL มาให้เลย เพราะการสร้าง LIFF ต้องใช้ HTTPS เท่านั้น

Cloud Firestore จัดเก็บข้อมูลอยู่ในรูปแบบของ collection และ document สามารถทำ listener เพื่อ stream ข้อมูลแบบ realtime แต่ก็มีข้อจำกัดของการ query ข้อมูลหลายเงื่อนไขอยู่เช่นกัน หากใครจำเป็นต้องใช้แนะนำให้หากข้อมูลและทดลองสร้าง Demo แบบง่ายๆก่อน

Cloud Functions ผมใช้สำหรับส่งแจ้งเตือนไปที่กลุ่มไลน์ของหัวหน้างานผ่าน LINE Notify โดยรับ Trigger จาก Cloud Firestore เมื่อมีการตอบแบบคัดกรองใหม่ ก็จะอ่านข้อความที่เข้ามาแล้วเอาไปเข้าเงื่อนไขเพื่อส่งการแจ้งเตือนต่อไป

Cloud Storage คุณสามารถ Upload และ Download ไฟล์ได้อย่างง่ายในพื้นที่ 5GB ฟรี (เกินจากนี้ก็ $0.026/GB ) พร้อมรองรับการขยายขนาดอัตโนมัติ ผมเอามาใช้เก็บรายงานแบบคัดกรองรายวัน ใช้ Cloud Functions ดึงรายงานประจำวันมาประมวลผล เก็บเป็น CSV แล้วอัปโหลดเข้า Cloud Storage จากนั้นส่ง URL สำหรับดาวน์โหลดไฟล์ไปให้หน้าแอดมินอีกที

Firebase Authentication ผมใช้ระบบสมาชิกของการเข้าใช้งานระบบแอดมินที่ทีมของโรงพยาบาลต้องใช้ดูข้อมูลการตอบแบบคัดกรอง ทั้งการ Register, Sign-in, Reset password

Firebase Performance Monitoring จะคอยเฝ้าดูข้อมูลการทำงานเรื่อง Traces ข้อมูลระยะเวลาที่วัดจากจุดหนึ่งไปยังอีกจุดหนึ่งในแอพ และ HTTP/S network requests ระยะเวลาที่วัดตั้งแต่แอพ request ไปยัง endpoint จนกระทั่งได้ response กลับมาโดยอัตโนมัติ (ไม่ต้องเขียนโค้ด)

GitHub + GitHub Actions

ผมแบ่งงานออกเป็น 3 repositories ช่วยให้การ deploy เร็วขึ้น หรือใครคิดจะรวมกันไว้ก็ไม่ใช่เรื่องผิดอะไร แต่จะต้องใช้เวลา deploy นานสักหน่อย ลองคิดว่าแก้ข้อความที่ผิดไป 1 คำ อาจจะต้องรอ Deploy Cloud Funcstions และ Admin Dashboard ขึ้นไปด้วย และเสีย Build Time ด้วย

GitHub Actions คือ ตัวช่วยชั้นดีที่จะช่วยให้คุณหมดกังวลเรื่องการ build และ deploy งานขึ้นเซิฟเวอร์ ทำให้ได้มีเวลาโฟกัสและหาจุดผิดพลาดกับตัวระบบได้มากกว่าเดิม อย่าลืมว่าเมื่อเวลามีจำกัดต้องออกแรงในงานที่สำคัญที่สุดก่อน

ผมมีตัวอย่างโค้ดที่ใช้กับ VueJS เพื่อ deploy ขึ้น Firebase Hosting ด้วย GitHub Actions โดยแยกส่วน build และ deploy ออกจากกัน เมื่อ build code เสร็จแล้วก็จะเก็บ dist ไว้ที่ artifact และเมื่อส่วนของ deploy ทำงาน ก็จะดาวน์โหลดออกมาแล้วเอาขึ้น Firebase Hosting อีกที ซึ่งจำเป็นต้องมี FIREBASE TOKEN ด้วย

name: Deploy to Production
on:
push:
branches:
- master
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@master
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: '10.x'
- name: Install Dependencies
run: npm ci
- name: Build
run: npm run build
- name: Archive Production Artifact
uses: actions/upload-artifact@master
with:
name: dist
path: dist
deploy:
name: Deploy
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@master
- name: Download Artifact
uses: actions/download-artifact@master
with:
name: dist
- name: Deploy to Firebase
uses: w9jds/firebase-action@master
with:
args: deploy --only hosting
env:
FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

ประโยชน์ของ Artifact หากมีสิ่งที่ต้องทำหลังจาก build code แล้ว เช่น Run unit-test หรือ deploy อีกหลายไซต์ ก็ไม่จำเป็นต้อง build ใหม่ เพียงแค่ดาวน์โหลดจาก Artifact แล้วเอาไปทำงานต่อได้ทันที

ตัวอย่างโค้ดนี้ใช้สำหรับ deploy ขึ้น Cloud Functions ด้วย GitHub Actions ข้อดีของหลัง Backend คือไม่ต้องเสียเวลา build หรือบางงานอาจจะมีรัน Unit Test นิดหน่อย เพียงแค่ติดตั้ง Dependencies ก็สามารถ deploy ได้เลย

name: Deploy to production
on:
push:
branches:
- master
jobs:
build:
name: Build and Deploy
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@master
- name: Setup Node
uses: actions/setup-node@v1
with:
node-version: '10.x'
- name: Install Dependencies
run: cd functions && npm ci
- name: Install firebase-tools
run: npm install -g firebase-tools
- name: Deploy
run: firebase deploy --only functions --token=${{ secrets.FIREBASE_TOKEN }} --non-interactive

ข้อดีของการแยกเซอร์วิสออกเป็น 3 repositories จะช่วยให้ deploy แยกส่วนกันได้ หากมีการแก้ไขด่วน (Hotfix) ก็ทำได้เร็วขึ้น ช่วยประหยัด build time ของ GitHub Actions ด้วย โดยที่ Plan free จะมีให้ใช้ 2,000 นาทีต่อเดือน

Audits Score

อย่าลืมวัดประสิทธิภาพของระบบที่ทำด้วย ความเร็วในการโหลดเว็บหรือขนาดของรูปภาพที่ใช้งาน เช็คว่าใส่ alt, attribute, meta tag ถูกต้องครบถ้วนหรือไม่ หรือกรณีอินเตอร์เน็ตช้าไม่สามารถโหลดรูปได้จะแสดงผลอย่างไร

Run Lighthouse in Chrome DevTools

เปิดให้ใช้งานจริง

ผ่านไป 2 สัปดาห์หลังจากเปิดใช้งาน มีบุคลากรเข้ามาตอบแบบคัดกรองแล้วมากกว่า 1 หมื่นครั้ง พบกลุ่มเสี่ยงกว่า 4 ร้อยครั้ง ทำให้ทีมโรงพยาบาลพบกลุ่มเสี่ยงได้เร็วขึ้น ลดเวลาที่ต้องใช้คัดกรองแบบนั่งถามตอบกันต่อหน้าได้อย่างมาก และได้รับความคิดเห็นที่เป็นประโยชน์จากทีมของโรงพยาบาลมากมาย ทำให้ได้รู้ว่าควรพัฒนาอะไรต่อไป

สถิติการเข้าใช้งานช่วง 2 สัปดาห์แรก

เมื่อทุกคนเปิดใจรับเทคโนโลยีเข้าไปช่วยทำงาน ยอมสละเวลาเรียนรู้สิ่งใหม่ อุปสรรคของเทคโนโลยีจะหมดไป จากประสบการณ์ส่วนตัวได้เห็นเทคโนโลยีในโรงพยาบาลหลายๆตัว มีปัญหากับการเรียนรู้ใหม่ของผู้ใช้งาน คงเป็นเพราะออกแบบให้ใช้งานยากเกินไปหรือผู้ใช้เองไม่พร้อมที่จะเรียนรู้ แต่ในกรณีของโรงพยาบาลสระบุรี ผมดูจากสถิติการใช้งานและข้อมูลที่ไหลเข้าตั้งแต่เที่ยงวันยันเที่ยงคืน โรงพยาบาลนี้มีบุคลากรที่เข้าถึงเทคโนโลยีได้อย่างดีเยี่ยม ขอชื่นชมครับ ❤️

องค์การอนามัยโลก (WHO) เปิดเผยในรายงานวันพุธที่ 8 เม.ย. พบว่ามีบุคลากรทางการแพทย์ติดเชื้อโควิด-19 มากกว่า 2 หมื่นคนใน 52 ประเทศ ผลเบื้องต้นชี้ว่าบุคลากรทางการแพทย์ติดเชื้อจากทั้งในสถานที่ทำงานและจากชุมชน

จากการศึกษาในเชิงลึกกรณีบุคลากรทางการแพทย์ติดเชื้อจากการดูแลผู้ป่วย พบว่า บุคลากรทางการแพทย์จำนวนหนึ่งไม่ทราบมาก่อนว่าผู้ป่วยมีอาการเข้าได้กับอาการของผู้ป่วยที่ติดเชื้อ COVID-19 จึงอยากขอให้ประชาชนที่มาใช้บริการทางการแพทย์ หรือระบบบริการสาธารณสุข หากอยู่ในกลุ่มเสี่ยง แม้จะมีอาการน้อยก็ขอให้แจ้งความเสี่ยงเหล่านั้นด้วย เพราะหากมีบุคลากรทางการแพทย์ติดเชื้อก็จะต้องถูกกักตัว หรือแยกออกไปจำนวนมาก จะส่งผลกระทบกับการให้บริการ

ผมขอใช้พื้นที่ตรงนี้เป็นกำลังใจให้กับคุณหมอและพยาบาลทุกท่าน รวมถึงเจ้าหน้าที่ที่เกี่ยวข้องการสู้ไวรัสโควิด-19 ครั้งนี้ด้วย ส่วนตัวผมเคยทำงานในโรงพยาบาลมาก่อน ทำให้คุ้นเคยและเข้าใจคุณหมอและพยาบาลเป็นอย่างดี ทุกคนเหนื่อย อยากกลับไปหาครอบครัวเช่นกัน

ปล. คิดไปคิดมาก็มีเรื่องที่น่าตลกคือ ผมยังไม่เคยเจอหน้าคุณหมอและไม่เคยไปโรงพยาบาลสระบุรีสักครั้งเดียว 😅

ข้อมูลเพิ่มเติม

เผยบุคลากรทางการแพทย์กว่า 2.2 หมื่นคนทั่วโลกติดโควิด

Coronavirus disease 2019 (COVID-19)Situation Report — 79

ฟังเสียงหมอไทยในแดนหน้าสมรภูมิ COVID-19

กรมควบคุมโรคแจงเกณฑ์ ส่งตรวจเชื้อโควิด-19

Firebase Zero Series Firebase Thailand

Special Thanks

prueba — doctores-freepik on Lottiefiles. Free Lottie Animation

--

--

Puwadon Sricharoen

I’m an optimistic person. Love to travel to a new places and enjoy to spending my free time and vacation day to pursue my hobbies.