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 link — createTriggerRedirectMappings ห่อทุก 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.go — Consumer.HandleActionExecute
  • internal/actionexecute/deps.go — interface seam ได้แก่ MessageTransformer, ResponseSender, MboxHandoff, AudienceCsvStorage, RedirectClient, LineClientFactory
  • internal/actionexecute/scheduler.go — ActionSchedulerService สำหรับบันทึก 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