Skip to main content

การแจ้งเตือนการนัดหมาย

ภาพรวม

โมดูล appointment เปิดให้ลูกค้าจองคิวหรือทำนัดหมายผ่าน LINE ได้ หน้าที่ของฝั่ง Worker คือ ส่งข้อความแจ้งเตือนในจังหวะสำคัญ ได้แก่ การยืนยันการจอง การยกเลิก การเตือนก่อนถึงเวลานัด และการทำเครื่องหมายว่าลูกค้าไม่มาตามนัด

งานทั้งหมดทำงานบน profile cron-scheduler ประกอบด้วย consumer 1 ตัวสำหรับคิว booking_notification และ cron scanner อีก 2 ตัวที่ทำงานทุกนาที

Business Flow

Consumer booking_notification

Consumer จะแยกการทำงานตามฟิลด์ประเภทของ payload

  • ยืนยันการจอง (ค่า confirm หรือไม่ระบุประเภท)
    1. สร้าง flex message ยืนยันการจอง แสดงชื่อบริการ พนักงาน สาขา และวันเวลา
    2. resolve channel_access_token จากตาราง line_oa แล้ว push ข้อความให้ผู้ใช้
    3. อัปเดตแถวข้อมูลการจอง และ merge ข้อมูลชุด appt_* ลง line_user.custom_attribute
  • ยกเลิกการจอง (ค่า cancel) — ส่งข้อความยกเลิกแบบ text แล้วอัปเดตสถานะการจอง

Cron เตือนก่อนถึงเวลานัด (ทุก 1 นาที)

  1. Query การจองที่เข้าเงื่อนไขทั้งหมดต่อไปนี้
    • สถานะเป็น confirmed และยังไม่เคยส่งการเตือน
    • journey ที่เกี่ยวข้องกำหนดค่า reminder_hours_before มากกว่า 0
    • ถึงเวลาที่ต้องเตือนแล้ว คือ เวลานัดหักด้วยจำนวนชั่วโมงที่ตั้งไว้ ผ่านไปแล้ว
    • join ตาราง journey, service, staff และ location เพื่อดึงชื่อไปแสดงในข้อความ
  2. Publish payload เข้าคิว booking_notification เพื่อให้ consumer เป็นผู้ส่งจริง
  3. ทำเครื่องหมายว่าส่งการเตือนแล้ว เพื่อป้องกันการส่งซ้ำ

Cron ตรวจการไม่มาตามนัด (ทุก 1 นาที)

  1. Query การจองที่สถานะยังเป็น confirmed แต่เลยเวลาสิ้นสุดบวกระยะผ่อนผันไปแล้ว โดยระยะผ่อนผันมาจาก no_show_grace_minutes ของ journey หรือค่าเริ่มต้น 30 นาที
  2. เปลี่ยนสถานะเป็น no-show แล้ว publish event ต่อ เพื่อให้ workflow นำไปประมวลผลได้

ไฟล์และฟังก์ชันหลัก

ไฟล์หน้าที่
internal/appointment/booking_notification.goBookingNotificationService.SendConfirmation, BookingNotificationService.HandleCancel, buildConfirmationFlex และโครงสร้าง BookingNotificationPayload ที่บรรจุข้อมูลการจองทั้งชุด
internal/appointment/consumer.goConsumer.HandleBookingNotification — dispatch ระหว่างการยืนยันและการยกเลิก
internal/cronscheduler/booking_reminder.goBookingReminderService.Run ตามตาราง */1 * * * *
internal/cronscheduler/booking_noshow.goBookingNoShowService.Run ตามตาราง */1 * * * *
cmd/worker/main.gorunCronScheduler — จุดประกอบ service และ cron ทั้งหมด

คิวที่เกี่ยวข้อง: booking_notification ทั้ง consume และ publish อยู่บน profile cron-scheduler

จุดเชื่อมต่อกับ Service อื่น

  • รับงานจาก client-api-go เมื่อผู้ใช้จองหรือยกเลิกผ่าน LIFF, cms-api-go เมื่อผู้ดูแลระบบ จัดการคิว และ cron scanner ภายใน worker เอง
  • ตารางใน schema appointmentbooking, journey (ค่า reminder_hours_before และ no_show_grace_minutes), service, staff, location
  • ตารางใน schema publicline_oa (token) และ line_user (custom attribute ชุด appt_*)
  • LINE APIPOST /v2/bot/message/push สำหรับ flex ยืนยัน ข้อความยกเลิก และข้อความเตือน
  • ทำงานคู่กับ Trigger จากเหตุการณ์การจอง ซึ่งทำให้เหตุการณ์การจองสามารถกระตุ้น workflow ต่อได้