การแจ้งเตือนการนัดหมาย
ภาพรวม
โมดูล appointment เปิดให้ลูกค้าจองคิวหรือทำนัดหมายผ่าน LINE ได้ หน้าที่ของฝั่ง Worker คือ ส่งข้อความแจ้งเตือนในจังหวะสำคัญ ได้แก่ การยืนยันการจอง การยกเลิก การเตือนก่อนถึงเวลานัด และการทำเครื่องหมายว่าลูกค้าไม่มาตามนัด
งานทั้งหมดทำงานบน profile cron-scheduler ประกอบด้วย consumer 1 ตัวสำหรับคิว
booking_notification และ cron scanner อีก 2 ตัวที่ทำงานทุกนาที
Business Flow
Consumer booking_notification
Consumer จะแยกการทำงานตามฟิลด์ประเภทของ payload
- ยืนยันการจอง (ค่า
confirmหรือไม่ระบุประเภท)- สร้าง flex message ยืนยันการจอง แสดงชื่อบริการ พนักงาน สาขา และวันเวลา
- resolve
channel_access_tokenจากตารางline_oaแล้ว push ข้อความให้ผู้ใช้ - อัปเดตแถวข้อมูลการจอง และ merge ข้อมูลชุด
appt_*ลงline_user.custom_attribute
- ยกเลิกการจอง (ค่า
cancel) — ส่งข้อความยกเลิกแบบ text แล้วอัปเดตสถานะการจอง
Cron เตือนก่อนถึงเวลานัด (ทุก 1 นาที)
- Query การจองที่เข้าเงื่อนไขทั้งหมดต่อไปนี้
- สถานะเป็น
confirmedและยังไม่เคยส่งการเตือน - journey ที่เกี่ยวข้องกำหนดค่า
reminder_hours_beforeมากกว่า 0 - ถึงเวลาที่ต้องเตือนแล้ว คือ เวลานัดหักด้วยจำนวนชั่วโมงที่ตั้งไว้ ผ่านไปแล้ว
- join ตาราง journey, service, staff และ location เพื่อดึงชื่อไปแสดงในข้อความ
- สถานะเป็น
- Publish payload เข้าคิว
booking_notificationเพื่อให้ consumer เป็นผู้ส่งจริง - ทำเครื่องหมายว่าส่งการเตือนแล้ว เพื่อป้องกันการส่งซ้ำ
Cron ตรวจการไม่มาตามนัด (ทุก 1 นาที)
- Query การจองที่สถานะยังเป็น
confirmedแต่เลยเวลาสิ้นสุดบวกระยะผ่อนผันไปแล้ว โดยระยะผ่อนผันมาจากno_show_grace_minutesของ journey หรือค่าเริ่มต้น 30 นาที - เปลี่ยนสถานะเป็น no-show แล้ว publish event ต่อ เพื่อให้ workflow นำไปประมวลผลได้
ไฟล์และฟังก์ชันหลัก
| ไฟล์ | หน้าที่ |
|---|---|
internal/appointment/booking_notification.go | BookingNotificationService.SendConfirmation, BookingNotificationService.HandleCancel, buildConfirmationFlex และโครงสร้าง BookingNotificationPayload ที่บรรจุข้อมูลการจองทั้งชุด |
internal/appointment/consumer.go | Consumer.HandleBookingNotification — dispatch ระหว่างการยืนยันและการยกเลิก |
internal/cronscheduler/booking_reminder.go | BookingReminderService.Run ตามตาราง */1 * * * * |
internal/cronscheduler/booking_noshow.go | BookingNoShowService.Run ตามตาราง */1 * * * * |
cmd/worker/main.go | runCronScheduler — จุดประกอบ service และ cron ทั้งหมด |
คิวที่เกี่ยวข้อง: booking_notification ทั้ง consume และ publish อยู่บน profile cron-scheduler
จุดเชื่อมต่อกับ Service อื่น
- รับงานจาก client-api-go เมื่อผู้ใช้จองหรือยกเลิกผ่าน LIFF, cms-api-go เมื่อผู้ดูแลระบบ จัดการคิว และ cron scanner ภายใน worker เอง
- ตารางใน schema
appointment—booking,journey(ค่าreminder_hours_beforeและno_show_grace_minutes),service,staff,location - ตารางใน schema public —
line_oa(token) และline_user(custom attribute ชุดappt_*) - LINE API —
POST /v2/bot/message/pushสำหรับ flex ยืนยัน ข้อความยกเลิก และข้อความเตือน - ทำงานคู่กับ Trigger จากเหตุการณ์การจอง ซึ่งทำให้เหตุการณ์การจองสามารถกระตุ้น workflow ต่อได้