งานอัตโนมัติ 10 อย่างตั้งไว้ใน vercel.json (Vercel Cron) ทุกงานเรียก /api/cron/... พร้อม Authorization: Bearer CRON_SECRET — ถ้าไม่ตั้ง CRON_SECRET งานจะเปิดเฉพาะนอก production
| งาน | ความถี่ | ทำอะไร |
|---|---|---|
expire-holds | ทุกนาที | การจอง “รอชำระมัดจำ” ที่พ้นเวลาชำระ + ผ่อนผัน → “หมดเวลาชำระ” โต๊ะว่าง · นับการทิ้งการจองของเบอร์ (ครบ 3 ครั้งติด → บล็อก 60 นาที) · Audit “หมดเวลากันโต๊ะ” / “บล็อกเบอร์ (อัตโนมัติ)” · คิวข้อความ LINE “หมดเวลาชำระมัดจำ” ให้การจองที่ผูกไว้ · ปิดรายการรอคิวที่ถึงเวลาปิดรับจอง (“หมดเวลา”) และแจ้ง “โต๊ะว่างแล้ว” ให้รายการรอคิวของคืนที่เพิ่งมีโต๊ะว่าง · POS: บิลที่ลูกค้าเปิดเองจาก QR ในช่วงรับเงินก่อนและไม่มีการชำระภายใน 15 นาที (นับจากสั่งครั้งล่าสุด) → ยกเลิก (VOID) Audit “บิล QR หมดเวลาชำระ” · ร้านที่มีบิลลูกค้าจ่ายแล้ว (มีเลขคิว ยังเปิดอยู่) แต่เครื่องแคชเชียร์เงียบเกิน 3 นาที → แจ้งเตือนเด้งเจ้าของร้าน “เครื่องแคชเชียร์ออฟไลน์” ทันทีและย้ำทุก 10 นาที (venues.cashier_offline_notified_at ล้างเมื่อหายค้าง) |
retry-slips | ทุก 5 นาที | สลิปที่ค้างเพราะระบบตรวจสลิปล่ม/โควตาหมด/ธนาคารยังไม่ยืนยัน (≤ 20 ใบ/รอบ เก่าก่อน ทีละใบ รอ Thunder ได้ถึง 60 วิ/ใบ) ตารางลองใหม่ต่อสลิป: ทุก 5 นาที ×12 → ทุก 30 นาที ×24 → ทุก 60 นาที ×24 (~37 ชม.) แล้วหยุด (ใบยังอยู่ในคิว + แจ้งเตือนพนักงาน) · เจอ Thunder ล่ม 3 ใบติดจะหยุดรอบนั้นทันที (stoppedEarly) · ผ่าน → “รอเช็คอิน” Audit “ยืนยันอัตโนมัติ (สลิปผ่าน)” + ข้อความ LINE “จองสำเร็จ” · พบว่าสลิปยืนยันการจองอื่นไปแล้ว → ปฏิเสธการจองอัตโนมัติ Audit “ปฏิเสธ” โดย reverify:thunder + ข้อความ LINE |
review-reminders | ทุก 5 นาที | ร้านที่คิวสลิปยังมีใบค้าง และ push ล่าสุดเก่ากว่า 5 นาที → push “ยังมีสลิปรอตรวจ N ใบ” ถึงทีมงานที่เปิดแจ้งเตือน (ADR-0007) |
nightly-summary | ทุก 15 นาที | หลังจุดเปลี่ยนวันของร้าน (ค่าเริ่มต้น 06:00) → push “สรุปคืนที่ผ่านมา” ถึงเจ้าของร้านที่เปิดรับ 1 ครั้งต่อร้านต่อคืน (ข้ามคืนที่ไม่มีการจอง และร้านที่ถูกระงับ) |
line-outbox | ทุกนาที | (1) คิวข้อความ “อีก N นาทีโต๊ะจะถูกปล่อย” ให้การจองรอชำระที่ผูก LINE ซึ่งเหลือ ≤ 5 นาทีก่อนหมดผ่อนผันและยังไม่มีสลิปรอตรวจ (2) ปิดรายการรอคิวที่ถึงเวลาปิดรับจอง (3) แจ้ง “โต๊ะว่างแล้ว” ให้รายการรอคิวที่ผูก LINE ของคืนที่มีโต๊ะว่างและยังก่อนปิดรับจอง — ทุกคนพร้อมกัน ครั้งเดียว (4) ส่งข้อความที่ค้างในคิว ≤ 50 ข้อความ/รอบ ลองใหม่ 1 นาที → 5 → 15 → 1 ชม. → 6 ชม. แล้วหยุด (FAILED) · ลูกค้าบล็อก OA → เลิกส่งทุกการจองของคนนั้น · ร้านตก FREE/สวิตช์ปิด → ข้าม (SKIPPED) |
night-reminders | ทุก 15 นาที | ตั้งแต่ 12:00 (เวลาร้าน) ของวันที่มีคืนจอง → ข้อความ “คืนนี้ … มารับโต๊ะภายใน … น.” ถึงการจอง “รอเช็คอิน” ที่ผูก LINE ของร้าน PRO ครั้งเดียวต่อการจอง แล้วส่งคิวต่อทันที (≤ 100) |
pos-totals | ทุก 5 นาที | บิล POS ที่ถูกแตะจากมือถือพนักงาน/ลูกค้า/หลังบ้าน (totals_stale) → คำนวณยอดใหม่จากเหตุการณ์ (≤ 500 บิล/รอบ) |
pos-usage | ทุกวัน 20:45 UTC (03:45 น. ไทย) | นับเหตุการณ์ POS + การรับเงิน, เอกสารภาษี และไบต์ที่ซิงก์ ของเดือนนี้และเดือนก่อน ต่อร้าน → pos_usage (ดูที่ Platform → “ต้นทุน POS”) ใช้ตั้งราคา POS ภายหลัง |
pos-nights | ทุกชั่วโมง | สร้าง “คืน” (Service Date) ของวันนี้และพรุ่งนี้ล่วงหน้าให้ทุกร้านที่ขายผ่านแอปแคชเชียร์ — เครื่องที่ออฟไลน์ตอนข้ามวันจึงยังเปิดบิลได้ (ADR-0022) |
purge-slips | ทุกวัน 04:30 UTC (11:30 น. ไทย) | ลบ รูป สลิปมัดจำที่เก็บครบ 90 วัน และรูปสลิปค่าบริการที่เก็บครบ 1 ปี (≤ 200 รูป/รอบ/ชนิด) เก็บยอด/เลขอ้างอิง/ผลตรวจไว้ · ยกเลิกคำสั่งซื้อค่าบริการที่ไม่แนบสลิปใน 24 ชั่วโมง · ลบรายการรอคิวที่จบแล้วเกิน 90 วัน และประวัติข้อความ LINE เกิน 90 วัน · ลบบัญชีที่สมัครแล้ว ไม่ยืนยันอีเมล เกิน 30 วันและยังไม่ผูกกับร้าน/คำขอ/ห้องแชทใด ๆ (≤ 200 บัญชี/รอบ ลงบันทึกกิจกรรมของแพลตฟอร์มทุกครั้ง — บัญชีที่ยืนยันอีเมลแล้วไม่ถูกลบไม่ว่าจะนานแค่ไหน) · ล้างตารางนับจำกัดอัตราที่เก่ากว่า 24 ชั่วโมง |
หมายเหตุ
expire-holdsยังถูกเรียกแบบ lazy เมื่อลูกค้าเปิดใบจอง/กดจอง และเมื่อพนักงานเปิดหน้าคืนนี้ ดังนั้นแม้ cron หยุด ลูกค้าจะยังไม่เห็นโต๊ะค้างนาน แต่การนับบล็อกเบอร์อาจช้า- ข้อความ LINE ส่วนใหญ่ถูกส่ง ทันทีหลัง action (ลูกค้าแนบสลิป / พนักงานอนุมัติ-ย้าย-ยกเลิก) โดยไม่รอ cron — cron
line-outboxเป็นตัวเก็บตกและตัวลองใหม่ ถ้าหยุด ข้อความจะช้าแต่ไม่หาย (ยกเว้น “อีก N นาที” และ “โต๊ะว่างแล้ว” ที่มาจาก cron เท่านั้น) retry-slipsไม่ลองใหม่กรณี “ไม่พบรายการโอน / สลิปปลอม” และ “ไฟล์ไม่ใช่รูป” (ลูกค้าต้องแก้เอง)- รันเองในเครื่อง:
curl -H "Authorization: Bearer $CRON_SECRET" http://localhost:3000/api/cron/expire-holds(ทุกงานตอบ JSON สรุปจำนวนที่ทำ เช่นline-outboxตอบsent/failed/skipped/retried)
ถ้า cron หยุด
| อาการ | สาเหตุ | ตรวจที่ |
|---|---|---|
| โต๊ะสีเหลือง “รอชำระ” ค้างนานเกิน 40 นาทีบนผังที่ไม่มีใครเปิด | expire-holds ไม่รัน | Vercel → Project → Cron Jobs → log; CRON_SECRET ใน env ตรงกับที่ Vercel ส่ง |
| สลิปค้าง “ระบบตรวจสลิปล่ม (จะลองใหม่อัตโนมัติ)” ไม่เปลี่ยนเป็นชั่วโมง | retry-slips ไม่รัน หรือ Thunder ยังล่ม | log เดียวกัน; การ์ด Thunder ของร้าน |
| เจ้าของร้านไม่ได้ “สรุปคืนที่ผ่านมา” ตอนเช้า | nightly-summary ไม่รัน หรือปิดรับใน “บัญชีของฉัน” | log; การ์ดร้านใน “บัญชีของฉัน” |
| ลูกค้าไม่ได้ข้อความ LINE “โต๊ะว่างแล้ว” / “อีก N นาที” | line-outbox ไม่รัน หรือโควตา LINE หมด | log; การ์ด LINE ใน “ตั้งค่าแพลตฟอร์ม” (ตั้งค่า LINE) |
| รูปสลิปเก่ากว่า 90 วันยังอยู่ | purge-slips ไม่รัน | log; ไม่กระทบผู้ใช้ทันที |
Cron ตอบ 401 {"error":"unauthorized"} เมื่อ secret ไม่ตรง