กฎทริกเกอร์และงานตั้งเวลา
ภาพรวม
Domain นี้มี 4 ตาราง: trigger_rule เก็บกฎที่กำหนดว่า "เมื่อเกิดเหตุการณ์อะไร ให้ทำอะไร"
(source + action เป็น JSONB), trigger_log เก็บ log ทุกครั้งที่กฎถูกยิงพร้อมผลลัพธ์,
scheduled_action เก็บ action ที่ถูกตั้งเวลาไว้ให้ทำงานภายหลัง (queue) และ
scheduled_trigger_execution เก็บผลการรันกฎแบบตามตารางเวลาในแต่ละรอบ
ตาราง trigger_rule
| Column | Type | Nullable | Default | คำอธิบาย |
|---|
id | SERIAL | NO | nextval(...) | Primary key |
name | VARCHAR(255) | NO | - | ชื่อกฎทริกเกอร์ |
source_type | VARCHAR(30) | NO | - | ประเภทของแหล่งเหตุการณ์ที่ใช้ทริกเกอร์ |
source_config | JSONB | NO | - | การตั้งค่าของแหล่งเหตุการณ์ (เงื่อนไขการทริกเกอร์) |
action_type | VARCHAR(30) | NO | - | ประเภทของ action ที่จะทำเมื่อกฎถูกยิง |
action_config | JSONB | NO | - | การตั้งค่าของ action |
enabled | BOOLEAN | NO | true | เปิดใช้งานกฎนี้หรือไม่ |
frequency | VARCHAR(20) | NO | 'once_per_hour' | ความถี่สูงสุดที่กฎนี้ยิงได้ |
cooldown_seconds | INTEGER | YES | - | ระยะเวลาพักก่อนที่กฎจะยิงซ้ำได้ (วินาที) |
line_oa_id | INTEGER | NO | - | LINE OA ที่กฎนี้สังกัด |
organization_id | INTEGER | NO | - | องค์กรเจ้าของกฎ |
created_by | INTEGER | YES | - | ผู้สร้าง (user id) |
updated_by | INTEGER | YES | - | ผู้แก้ไขล่าสุด (user id) |
created_date | TIMESTAMPTZ(3) | NO | now() | วันเวลาที่สร้าง |
updated_date | TIMESTAMPTZ(3) | YES | - | วันเวลาที่แก้ไขล่าสุด |
deleted_date | TIMESTAMPTZ(3) | YES | - | วันเวลาที่ลบ (soft delete) |
workflow_id | INTEGER | YES | - | เวิร์กโฟลว์ที่กฎนี้เป็นส่วนหนึ่ง (FK ไป workflow.id) |
workflow_node_path | VARCHAR(500) | YES | - | ตำแหน่ง node ในเวิร์กโฟลว์ที่กฎนี้อ้างถึง |
ตาราง trigger_log
| Column | Type | Nullable | Default | คำอธิบาย |
|---|
id | BIGSERIAL | NO | nextval(...) | Primary key |
trigger_rule_id | INTEGER | NO | - | กฎที่ถูกยิงในครั้งนี้ |
audience_id | INTEGER | YES | - | audience ที่เกี่ยวข้องกับการยิงครั้งนี้ |
user_id | VARCHAR(255) | NO | - | ผู้ใช้ที่ถูกกฎนี้กระทำ (LINE user id) |
trigger_on | VARCHAR(20) | NO | - | เหตุการณ์ที่ทำให้กฎถูกยิง |
action_type | VARCHAR(30) | NO | - | ประเภทของ action ที่ถูกทำ |
action_config | JSONB | YES | - | การตั้งค่าของ action ที่ใช้จริงในครั้งนั้น |
status | VARCHAR(20) | NO | 'success' | ผลลัพธ์ของการทำ action |
error_message | TEXT | YES | - | ข้อความ error กรณีทำ action ไม่สำเร็จ |
line_oa_id | INTEGER | NO | - | LINE OA ที่เกี่ยวข้อง |
organization_id | INTEGER | NO | - | องค์กรที่เกี่ยวข้อง |
created_date | TIMESTAMPTZ(3) | NO | now() | วันเวลาที่บันทึก log |
ตาราง scheduled_action
| Column | Type | Nullable | Default | คำอธิบาย |
|---|
id | SERIAL | NO | nextval(...) | Primary key |
trigger_rule_id | INTEGER | YES | - | กฎที่สร้าง action ที่ตั้งเวลานี้ |
user_id | VARCHAR(64) | NO | - | ผู้ใช้เป้าหมายของ action (LINE user id) |
line_oa_id | INTEGER | NO | - | LINE OA ที่เกี่ยวข้อง |
organization_id | INTEGER | NO | - | องค์กรที่เกี่ยวข้อง |
action_type | VARCHAR(30) | NO | - | ประเภทของ action ที่จะทำเมื่อถึงเวลา |
action_config | JSONB | NO | - | การตั้งค่าของ action |
source_config | JSONB | YES | - | การตั้งค่าของแหล่งเหตุการณ์ที่ทำให้เกิด action นี้ |
execute_at | TIMESTAMPTZ | NO | - | วันเวลาที่กำหนดให้ทำ action |
expires_at | TIMESTAMPTZ | YES | - | วันเวลาที่ action หมดอายุ (ไม่ต้องทำอีก) |
status | VARCHAR(20) | NO | 'pending' | สถานะของ action ในคิว |
retry_count | INTEGER | NO | 0 | จำนวนครั้งที่พยายามทำใหม่ |
created_at | TIMESTAMPTZ | NO | now() | วันเวลาที่สร้างรายการ |
updated_at | TIMESTAMPTZ | NO | now() | วันเวลาที่แก้ไขล่าสุด |
executed_at | TIMESTAMPTZ | YES | - | วันเวลาที่ทำ action จริง |
workflow_id | INTEGER | YES | - | เวิร์กโฟลว์ต้นทางของ action นี้ |
workflow_node_path | VARCHAR(500) | YES | - | ตำแหน่ง node ในเวิร์กโฟลว์ที่สร้าง action นี้ |
ตาราง scheduled_trigger_execution
| Column | Type | Nullable | Default | คำอธิบาย |
|---|
id | SERIAL | NO | nextval(...) | Primary key |
trigger_rule_id | INTEGER | NO | - | กฎที่ถูกรันในรอบนี้ |
scheduled_at | TIMESTAMPTZ | NO | - | วันเวลาของรอบที่ตั้งไว้ |
started_at | TIMESTAMPTZ | NO | now() | วันเวลาที่เริ่มรัน |
completed_at | TIMESTAMPTZ | YES | - | วันเวลาที่รันเสร็จ |
status | VARCHAR(20) | NO | 'processing' | สถานะของรอบการรัน |
total_users | INTEGER | NO | 0 | จำนวนผู้ใช้ทั้งหมดในรอบนี้ |
processed_users | INTEGER | NO | 0 | จำนวนผู้ใช้ที่ประมวลผลสำเร็จ |
failed_users | INTEGER | NO | 0 | จำนวนผู้ใช้ที่ประมวลผลไม่สำเร็จ |
error_message | TEXT | YES | - | ข้อความ error ของรอบการรัน |
created_at | TIMESTAMPTZ | NO | now() | วันเวลาที่สร้างเรกคอร์ด |
หมายเหตุ
trigger_rule.workflow_id เป็น FK เดียวในกลุ่มนี้ที่ประกาศไว้ในระดับ schema — ชี้ไป
workflow.id (ดู เวิร์กโฟลว์อัตโนมัติ)
trigger_log.trigger_rule_id, scheduled_action.trigger_rule_id และ
scheduled_trigger_execution.trigger_rule_id อ้างถึง trigger_rule.id เชิงตรรกะ
แต่ไม่ได้ประกาศเป็น FK ใน schema
scheduled_trigger_execution มี unique constraint uq_scheduled_trigger_execution บน
(trigger_rule_id, scheduled_at) — กันไม่ให้รอบเดียวกันถูกรันซ้ำ
scheduled_action มี index สำหรับการดึงงานจากคิวโดยเฉพาะ: idx_scheduled_action_pending
(บน execute_at), idx_scheduled_action_processing (บน updated_at) และ
idx_scheduled_action_user (บน user_id, trigger_rule_id)
trigger_log มี index บน (trigger_rule_id, created_date DESC) สำหรับดึง log ล่าสุดของกฎ
trigger_rule มี index บน (line_oa_id, organization_id) และบน deleted_date
- คอลัมน์เวลาใน
scheduled_action และ scheduled_trigger_execution เป็น TIMESTAMPTZ
ความละเอียด default (microsecond) ต่างจากตารางอื่นในระบบที่ใช้ TIMESTAMPTZ(3)
- แหล่งเหตุการณ์ที่ทำให้
trigger_rule ถูกยิงส่วนหนึ่งมาจาก pg_notify / event outbox
(ดู pg_notify และ Event Outbox)