Skip to main content

การลงมือทำ Action ของ Workflow

ภาพรวม

หลังจาก trigger engine ตัดสินแล้วว่า "ลูกค้าคนนี้เข้าเงื่อนไข ต้องทำ action นี้" งานจริงจะถูกส่งมาที่ queue action_execute โดยมี ActionExecutorService เป็นผู้ลงมือ ไฟล์นี้เป็นไฟล์ที่ใหญ่ที่สุด ในโปรเจกต์ (ราว 1,200 บรรทัด) เพราะต้องรองรับ action หลายชนิดที่ไปแตะระบบต่างกันทั้งหมด

การแยก queue ออกมาเช่นนี้ทำให้ขั้นตอนการประเมินกฎซึ่งทำงานเร็ว แยกออกจากขั้นตอนการลงมือทำ ซึ่งช้ากว่าและต้องเรียก API ภายนอกได้อย่างชัดเจน

Business Flow

  1. รับ ActionExecutePayload ซึ่งประกอบด้วย ruleId, ruleName, actionType, actionConfig, sourceConfig, userId, lineOaId, organizationId, triggerDepth, workflowId และ workflowNodePath
  2. ตรวจ delay ก่อนเสมอ — หาก actionConfig.delay มีค่า จะไม่ทำทันที แต่เรียก ScheduleAction เพื่อบันทึกลง scheduled_action (ดู Action แบบหน่วงเวลา / ตั้งเวลา)
  3. dispatch ตามค่า actionType
actionTypeการทำงาน
switch_rich_menupublish payload setRichMenuByTriggerRule เข้า queue line_change_richmenu
send_messagesendRichMessageToUser — โหลด rich message, สร้าง tracking link รายบุคคล, resolve merge tag, แนบ quick reply แล้ว push ผ่าน LINE
advanced_send_messageส่งข้อความแบบกำหนดเองผ่าน ResponseSenderService ซึ่งใช้ pipeline เดียวกับ AI response
send_booking_linkใช้ logic เดียวกับ advanced_send_message โดยมี bookingPayload เป็นแหล่งของ merge tag
add_to_audienceเพิ่มผู้ใช้เข้า audience โดยอัปเดต line_user.audience_ids และหากเป็น manual audience จะ regenerate ไฟล์ CSV ใหม่
remove_from_audienceถอนผู้ใช้ออกจาก audience พร้อม regenerate CSV
update_attributeอัปเดตคอลัมน์ของ line_user หรือ merge ค่าลง custom_attribute ซึ่งเป็น jsonb
talk_to_agentส่งต่อไปยัง mbox handoff เพื่อโอนแชทให้เจ้าหน้าที่
update_booking_statusอัปเดตสถานะการจองใน schema appointment
ชนิดอื่นlog warning แล้วคืน error ซึ่งจะทำให้ message เข้า DLQ
  1. การสร้าง tracking linkcreateTriggerRedirectMappings ห่อทุก URL และรูปในข้อความ ด้วยลิงก์ติดตาม โดยผูกกับ ruleId และ userId เพื่อให้ทราบว่าใครกดอะไรจาก workflow ใด และเรียก appendGaIdentityParam เพื่อต่อ param ของ GA หาก OA เปิดใช้ไว้
  2. regenerateAudienceCsv — เมื่อสมาชิกของ manual audience เปลี่ยน ระบบจะสร้าง CSV ใหม่ แล้วอัปโหลดขึ้น S3 ภายใต้ path รูปแบบ private/{lineOaHash}/audience/{filename}.csv เพื่อให้การ multicast รอบถัดไปใช้ข้อมูลล่าสุด
  3. error ทุกกรณีจะถูก log พร้อมบริบทของ rule และ user แล้วคืนขึ้นไปให้ชั้น mq เป็นผู้ตัดสินว่าจะ retry หรือส่งเข้า DLQ

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

  • internal/actionexecute/service.go (ประมาณ 1,236 บรรทัด)
    • ActionExecutorService.Execute(ctx, payload) — จุด dispatch หลัก
    • switchRichMenu(), sendRichMessageToUser(), handleAdvancedSendMessage(), handleTalkToAgent(), addToAudience(), removeFromAudience(), updateAttribute(), handleUpdateBookingStatus()
    • createTriggerRedirectMappings(), appendGaIdentityParam(), isManualAudience(), regenerateAudienceCsv(), buildAudienceCSV(), getLineUser()
  • internal/actionexecute/consumer.goConsumer.HandleActionExecute
  • internal/actionexecute/deps.go — interface seam ได้แก่ MessageTransformer, ResponseSender, MboxHandoff, AudienceCsvStorage, RedirectClient, LineClientFactory
  • internal/actionexecute/scheduler.goActionSchedulerService สำหรับบันทึก action ที่หน่วงเวลา
  • internal/actionexecute/payloads.go และ internal/actionexecute/helpers.go
  • cmd/worker/integration.go — จุด wiring ของ actionMessageTransformer, actionResponseSender, actionMboxHandoff และ actionCsvStorage ที่ผูกเข้ากับ service จริงของแต่ละโดเมน
  • Queue: consume action_execute และ publish line_change_richmenu (profile main)

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

  • รับ job จาก: เครื่องยนต์ Trigger / Workflow Automation, Action แบบหน่วงเวลา / ตั้งเวลา และ booking event trigger
  • ตารางที่เกี่ยวข้อง: line_user (attribute และ audience_ids), audience, rich_message, trigger_rule, line_oa, appointment.booking และกลุ่มตาราง quick reply
  • S3: เขียนไฟล์ CSV ของ audience ที่ถูก regenerate
  • LINE API: POST /v2/bot/message/push สำหรับส่งข้อความ และการ link rich menu ผ่าน queue
  • บริการอื่นภายใน worker: messagetrigger.ResponseSenderService สำหรับการส่งข้อความขั้นสูง และ AI, mbox.MboxHandoffService สำหรับโอนแชทให้เจ้าหน้าที่ รวมถึง utility ของ linemessageapi ได้แก่ TransformMessageObjects, ResolveMergeTags และ ExtractUrls
  • Redirect service และ campaignlink — ใช้สร้าง URL ที่มี tracking