Skip to main content

จัดการ Rich Message

ภาพรวม​

Rich Message คือชุดข้อความที่ประกอบขึ้นจากรายการเนื้อหาได้สูงสุด 5 รายการ แล้วส่งออกไปยังผู้ใช้ LINE เป็นข้อความติดกันหลายบับเบิล โมดูลนี้ทำหน้าที่ประกอบเนื้อหา ตรวจความครบถ้วนของแต่ละรายการ และแสดงตัวอย่างผลลัพธ์ในรูปแบบหน้าจอแชท

ผู้ใช้หลักคือทีมคอนเทนต์และทีมการตลาด

จุดสำคัญที่ต้องเข้าใจคือ Rich Message ไม่ได้ถูกส่งออกจากหน้านี้ แต่เป็นคลังเนื้อหาที่โมดูลอื่นเลือกไปใช้ ได้แก่ แคมเปญ ตอบกลับอัตโนมัติ กฎทริกเกอร์ และเวิร์กโฟลว์ การจัดตารางส่งและสถิติการส่งจึงอยู่ในโมดูลเหล่านั้น ไม่ใช่ที่นี่

แต่ละรายการเนื้อหาเลือกชนิดได้ 6 แบบ

ชนิดรายละเอียดเกณฑ์ที่ถือว่าครบถ้วน
ข้อความ (text)ข้อความตัวอักษรธรรมดามีข้อความที่ไม่ใช่ช่องว่าง
รูปภาพ (image)รูปภาพเดี่ยวมีไฟล์รูปภาพ
วิดีโอ (video)วิดีโอพร้อมภาพตัวอย่างมีไฟล์วิดีโอที่อัปโหลดสำเร็จแล้ว
รูปภาพกดได้ (tappable image)รูปภาพที่แบ่งพื้นที่กดได้หลายจุดมีไฟล์รูปภาพ (ไม่บังคับว่าต้องตั้งพื้นที่กดแล้ว)
Flexเขียน Flex JSON เองมีเนื้อหา JSON
Template Messageอ้างอิงเทมเพลตที่สร้างไว้แล้วเลือกเทมเพลตและดึงเนื้อหามาได้สำเร็จ

รูปภาพกดได้ต่างจากริชเมนูตรงที่ ไม่มีแม่แบบเลย์เอาต์สำเร็จรูป ทุกพื้นที่ต้องลากวาดเองบนรูป

นอกจากนี้ Rich Message หนึ่งชุดผูก Quick Reply ได้หนึ่งชุด ซึ่งจะแสดงเป็นปุ่มใต้ข้อความสุดท้าย

Business Flow​

1. หน้ารายการ​

  1. เมื่อเปิดหน้า ระบบตรวจสิทธิ์ก่อน แล้วโหลดเงื่อนไขการค้นหาล่าสุดจาก sessionStorage
  2. ตารางแสดงลำดับ ชื่อ Rich Message (คลิกเพื่อดูรายละเอียด) วันที่สร้าง (กำกับว่าเป็นเวลาประเทศไทย) และปุ่มดำเนินการ
  3. ปุ่มดำเนินการมีสี่ปุ่ม คือ ดูรายละเอียด แก้ไข คัดลอก และลบ โดยไม่มีกฎธุรกิจที่ปิดปุ่มใดในสถานะใด
  4. ตัวกรองมีสองช่อง คือ ค้นหาจากชื่อ และช่วงวันที่สร้าง โดยช่วงวันที่ถูกตีความเป็นเวลาประเทศไทยแล้วแปลงเป็นเวลามาตรฐานก่อนส่งไปยังเซิร์ฟเวอร์
  5. การลบต้องยืนยันผ่านกล่องข้อความก่อนเสมอ

ข้อควรทราบ — ปุ่มล้างตัวกรองในหน้านี้ล้าง cache ตัวกรองของทุกหน้าในระบบ ไม่ใช่เฉพาะหน้านี้ และตัวเลือกเวลาในตัวกรองช่วงวันที่ยังปิดเวลาที่ผ่านมาแล้ว ซึ่งไม่สอดคล้องกับการค้นหาข้อมูลย้อนหลัง

2. ประกอบชุดข้อความ​

  1. หน้าฟอร์มรองรับสี่โหมด คือ สร้างใหม่ แก้ไข คัดลอก และดูรายละเอียด
  2. หน้าจอแบ่งเป็นสองฝั่ง ฝั่งซ้ายเป็นส่วนกรอกข้อมูล ประกอบด้วยชื่อ Rich Message ตัวเลือก Quick Reply และรายการเนื้อหา ส่วนฝั่งขวาเป็นหน้าจอตัวอย่างที่ตรึงติดขอบบนไว้ให้เห็นตลอดขณะเลื่อนหน้า
  3. รายการเนื้อหาแต่ละรายการเป็นการ์ดที่มีสัญลักษณ์บอกความครบถ้วนอยู่ที่หัวการ์ด และมีปุ่มเลื่อนขึ้น เลื่อนลง และลบ โดยลบไม่ได้เมื่อเหลือเพียงรายการเดียว และการลบรายการที่กรอกครบแล้วต้องยืนยันก่อน
  4. ปุ่มเพิ่มรายการจะถูกปิดเมื่อครบ 5 รายการ อยู่ในโหมดดูรายละเอียด หรือยังมีรายการที่กรอกไม่ครบค้างอยู่
  5. การเปลี่ยนชนิดของรายการที่กรอกครบแล้วจะเตือนก่อน เพราะข้อมูลของชนิดเดิมจะถูกล้างทิ้ง
  6. ลำดับของรายการในฟอร์มคือลำดับบับเบิลที่ผู้ใช้ LINE จะเห็น การเลื่อนขึ้นลงจึงเปลี่ยนลำดับการแสดงผลจริง

3. ข้อกำหนดของแต่ละชนิดเนื้อหา​

  • ข้อความ — ยาวได้ไม่เกิน 500 ตัวอักษร พร้อมตัวนับจำนวนตัวอักษร
  • รูปภาพ — รับไฟล์ JPG, JPEG และ PNG ขนาดไม่เกิน 10 เมกะไบต์ ระบบตรวจทั้งประเภทไฟล์ นามสกุล และขนาด ก่อนรับเข้าระบบ
  • วิดีโอ — รับไฟล์ MP4, M4V และ MOV ขนาดไม่เกิน 200 เมกะไบต์
  • รูปภาพกดได้ — รับ JPG และ PNG ขนาดไม่เกิน 10 เมกะไบต์ และความกว้างต้องอย่างน้อย 1040 พิกเซล เมื่ออัปโหลดผ่านแล้วระบบเปิดหน้าต่างตั้งพื้นที่กดให้อัตโนมัติ
  • Flex — กรอก JSON ในกล่องข้อความ โดยระบบตรวจว่าเป็น JSON ที่ถูกต้อง
  • Template Message — เลือกจากรายการเทมเพลตที่เปิดใช้งานอยู่ พร้อมปุ่มโหลดรายการใหม่

4. ขั้นตอนการอัปโหลดวิดีโอ​

การอัปโหลดวิดีโอเป็นขั้นตอนที่แยกจากการบันทึกฟอร์ม และเริ่มทำงานทันทีที่ผู้ใช้เลือกไฟล์

  1. ระบบสร้างภาพตัวอย่างในเบราว์เซอร์เอง โดยจับภาพเฟรมที่วินาทีที่หนึ่ง
  2. ส่งไฟล์วิดีโอพร้อมภาพตัวอย่างขึ้นเซิร์ฟเวอร์ พร้อมแสดงแถบความคืบหน้าประจำรายการนั้น
  3. เมื่อสำเร็จ ระบบเก็บที่อยู่ของวิดีโอและภาพตัวอย่างไว้ ทำให้ตอนบันทึกฟอร์มส่งเป็นที่อยู่ ไม่ใช่ไฟล์
  4. หากล้มเหลว ระบบแจ้งเตือนและล้างค่าของรายการนั้นให้กรอกใหม่
  5. วิดีโอที่ยังอัปโหลดไม่เสร็จจะไม่ปรากฏในหน้าจอตัวอย่าง

5. การตั้งพื้นที่กดบนรูปภาพ​

  1. หน้าต่างตั้งพื้นที่กดแสดงรูปภาพทางฝั่งซ้าย โดยย่อให้มีความกว้างคงที่แล้วคำนวณสัดส่วนจากขนาดจริงของรูป
  2. ผู้ใช้ลากเมาส์บนรูปเพื่อวาดกรอบสี่เหลี่ยม ลากได้ทุกทิศทาง กรอบจะเป็นเส้นประสีเขียวขณะวาด และเปลี่ยนเป็นสีแดงพร้อมข้อความเตือนเมื่อทับกับพื้นที่เดิม
  3. เงื่อนไขในการเพิ่มพื้นที่คือ ต้องไม่ทับพื้นที่เดิม ต้องมีขนาดใหญ่พอสมควร และรวมกันไม่เกิน 20 พื้นที่
  4. เมื่อนำเมาส์ไปวางบนพื้นที่ที่วาดไว้แล้ว ระบบจะสลับเป็นโหมดลากย้าย ทำให้ปรับตำแหน่งได้โดยไม่วาดพื้นที่ใหม่ทับ พร้อมป้องกันไม่ให้เลื่อนออกนอกขอบรูปหรือทับพื้นที่อื่น
  5. พื้นที่แต่ละจุดมีป้ายกำกับเป็นตัวอักษร A, B, C ตามลำดับ และการลบพื้นที่จะจัดลำดับตัวอักษรใหม่ให้อัตโนมัติ
  6. แต่ละพื้นที่กำหนดการกระทำได้สามแบบ คือ เปิดลิงก์ ส่งข้อความ (ซึ่งช่วยเติมคำจากคีย์เวิร์ดของระบบตอบกลับอัตโนมัติ) และโทรออก
  7. ปุ่มบันทึกจะถูกปิดจนกว่าจะมีพื้นที่อย่างน้อยหนึ่งจุด ส่วนโหมดดูรายละเอียดจะปิดการวาด ลาก และลบทั้งหมด

ข้อควรทราบทางเทคนิค — พิกัดของพื้นที่กดถูกเก็บโดยอ้างอิงกับขนาดที่แสดงบนหน้าจอ ไม่ใช่ขนาดรูปต้นฉบับ ระบบจึงเก็บขนาดอ้างอิงคู่กันไปด้วยเพื่อให้ฝั่งปลายทางคำนวณกลับได้

6. หน้าจอตัวอย่างและการบันทึก​

  1. หน้าจอตัวอย่างอัปเดตอัตโนมัติแบบหน่วงเวลาเล็กน้อยขณะผู้ใช้พิมพ์ โดยแสดงเฉพาะรายการที่กรอกครบแล้วเท่านั้น
  2. หากผูก Quick Reply ไว้ ระบบจะดึงรายการปุ่มมาแสดงใต้ข้อความสุดท้ายด้วย
  3. ปุ่มบันทึกจะเปิดใช้งานเมื่อไม่มีข้อผิดพลาดค้างอยู่ มีชื่อ Rich Message และ ทุกรายการเนื้อหาผ่านเกณฑ์ความครบถ้วน
  4. การสร้างใหม่และการคัดลอกจะบันทึกทันทีโดยไม่ถามยืนยัน ส่วนการแก้ไขจะเปิดกล่องยืนยันก่อน
  5. หากเซิร์ฟเวอร์แจ้งข้อผิดพลาดที่ระบุรายการและฟิลด์ได้ ระบบจะแสดงข้อความที่รายการนั้นและทำเครื่องหมายว่ายังไม่ครบถ้วน มิฉะนั้นจะเปิดกล่องแจ้งข้อผิดพลาด

หน้าจอและองค์ประกอบหลัก​

หน้ารายการ​

ตัวควบคุมรายการ (src/components/rich-message-management/list/rich-message-management.container.tsx) ดูแลตาราง ตัวกรอง การแบ่งหน้า และการลบ โดยมีตารางและฟอร์มตัวกรองเป็นคอมโพเนนต์แสดงผลแยก

หน้าฟอร์ม​

ฟอร์มแบ่งเป็นตัวควบคุมที่ดูแลการโหลดและแปลงข้อมูล การประกอบข้อมูลส่งเซิร์ฟเวอร์ และการแปลข้อผิดพลาด กับคอมโพเนนต์ฟอร์มขนาดใหญ่ที่รวมการแสดงผลทุกชนิดเนื้อหา การตรวจไฟล์ และการอัปโหลดวิดีโอ

เมื่อเปิดข้อมูลเดิมขึ้นมาแก้ไข ระบบแปลงที่อยู่ของรูปภาพกลับเป็นไฟล์เพื่อให้แสดงผลและแก้ไขต่อได้ ส่วนวิดีโอจะใช้ตัวแทนไฟล์แล้วคงที่อยู่เดิมไว้ โดยไม่ดาวน์โหลดวิดีโอจริงกลับมา

หน้าต่างตั้งพื้นที่กด​

หน้าต่างนี้ (src/components/rich-message-management/form/modal/action-spot.tsx) รวมการวาด การลาก การปรับขนาด การตรวจการทับซ้อน และการตั้งค่าการกระทำต่อพื้นที่ไว้ในที่เดียว

ตัวช่วยตรวจความครบถ้วน​

ฟังก์ชันตรวจความครบถ้วนของรายการถูกแยกไว้เป็นไฟล์เดียว และถูกใช้ร่วมกันทั้งในสัญลักษณ์สถานะบนหัวการ์ด เงื่อนไขเปิดปุ่มเพิ่มรายการ เงื่อนไขเปิดปุ่มบันทึก และการกรองรายการที่จะแสดงในหน้าจอตัวอย่าง

ปลายทาง API​

การทำงานปลายทาง
รายการ Rich MessageGET /rich-message
ข้อมูลรายตัวGET /rich-message/{id}
รายการสำหรับ dropdown ของโมดูลอื่นGET /rich-message/find-all-object
สร้างหรือคัดลอกPOST /rich-message
แก้ไขPUT /rich-message/{id}
ลบDELETE /rich-message/{id}
อัปโหลดวิดีโอพร้อมภาพตัวอย่างPOST /rich-message/gen-thumbnail-video
รายการเทมเพลตข้อความGET /template-message/find-all-object
เนื้อหาของเทมเพลตGET /template-message/{id}
ข้อมูล Quick ReplyGET /quick-reply/{id}

ข้อจำกัดที่กำหนดไว้ตายตัว​

รายการเนื้อหาต่อชุดสูงสุด 5 รายการ, พื้นที่กดต่อรูปสูงสุด 20 จุด, รูปภาพไม่เกิน 10 เมกะไบต์, วิดีโอไม่เกิน 200 เมกะไบต์, รูปภาพกดได้ต้องกว้างอย่างน้อย 1040 พิกเซล, ข้อความไม่เกิน 500 ตัวอักษร, ข้อความในพื้นที่กดไม่เกิน 400 ตัวอักษร และหมายเลขโทรศัพท์ไม่เกิน 10 หลัก

จุดเชื่อมต่อกับฟีเจอร์อื่น​

  • Template Message — รายการเนื้อหาชนิดเทมเพลตพึ่งพาโมดูลนี้ทั้งรายการให้เลือกและเนื้อหาที่นำมาแสดง
  • Quick Reply — ผูกได้หนึ่งชุดต่อ Rich Message และแสดงเป็นปุ่มในหน้าจอตัวอย่าง
  • ตอบกลับอัตโนมัติ — ช่องข้อความในพื้นที่กดช่วยเติมคำจากคีย์เวิร์ดของโมดูลตอบกลับอัตโนมัติ
  • ริชเมนู — ทั้งสองโมดูลใช้โครงสร้างข้อมูลของพื้นที่กดร่วมกัน และใช้ป้ายกำกับตัวอักษรชุดเดียวกัน
  • ผู้บริโภคปลายทาง — แคมเปญ ตอบกลับอัตโนมัติ กฎทริกเกอร์ และเวิร์กโฟลว์ ดึงรายการ Rich Message ที่เปิดใช้งานอยู่ไปกำหนดเป็นเนื้อหาที่จะส่ง
  • สิทธิ์การเข้าถึง — หน้ารายการใช้สิทธิ์ของโมดูล Rich Message ตามปกติ แต่ หน้าฟอร์มถูกผูกกับสิทธิ์ของโมดูลจัดการ LINE OA แทน ซึ่งเป็นความไม่สอดคล้องที่ควรทราบเมื่อกำหนดสิทธิ์ให้ผู้ใช้

รายละเอียดฝั่ง Backend (CMS API)​

ฝั่ง backend มองโมดูลนี้เป็น คลังเก็บข้อความที่นำไปใช้ซ้ำได้ โดยผู้บริโภคหลักคือแคมเปญและระบบตอบกลับอัตโนมัติ ซึ่งตรงกับที่หน้าเว็บอธิบายไว้ว่า Rich Message ไม่ได้ถูกส่งออกจากหน้านี้

กฎที่ backend ตรวจตอนบันทึก​

  • ชื่อซ้ำถูกปฏิเสธ ด้วย error code RMS_001 ระบบไม่ยอมให้มี Rich Message ชื่อเดียวกันในขอบเขตของ OA เดียวกัน
  • เนื้อหาชนิด Flex ถูกส่งไปให้ LINE ตรวจสอบจริง ไม่ได้ตรวจแค่ว่าเป็น JSON ที่ถูกรูปแบบ ถ้า LINE ปฏิเสธจะได้ error code RMS_002 ข้อนี้อธิบายว่าทำไม JSON ที่ผ่านการตรวจฝั่งหน้าเว็บแล้วยังบันทึกไม่ผ่านได้ — หน้าเว็บตรวจแค่ไวยากรณ์ ส่วน LINE ตรวจโครงสร้างของ Flex Message
  • ไฟล์แนบถูกอัปโหลดขึ้น object storage ผ่านบริการจัดเก็บไฟล์กลาง สิ่งที่บันทึกในฐานข้อมูลคือที่อยู่ของไฟล์ ไม่ใช่ตัวไฟล์
  • ทั้งการสร้างและการแก้ไขรับข้อมูลแบบ multipart เพราะต้องรองรับไฟล์แนบไปพร้อมกับข้อมูลอื่น

การสร้างภาพตัวอย่างวิดีโอ​

POST /api/rich-message/gen-thumbnail-video เป็น endpoint แยกที่รับไฟล์วิดีโอเพื่อคืนภาพตัวอย่าง ซึ่งจำเป็นเพราะ LINE บังคับว่าบล็อกวิดีโอต้องมีภาพตัวอย่างเสมอ จึงเป็นขั้นตอนที่ข้ามไม่ได้ ไม่ใช่ของตกแต่ง

สิทธิ์และการลบ​

  • ทุกเส้นทางถูกครอบด้วย ModuleGate ของโมดูล rich-message ซึ่งบังคับใช้จริง ถ้าองค์กรถูกปิดโมดูลนี้ไว้ ทั้งหน้ารายการและหน้าฟอร์มจะใช้งานไม่ได้ ไม่ว่าหน้าเว็บจะตรวจสิทธิ์อย่างไร ข้อนี้ช่วยลดผลกระทบของความไม่สอดคล้องเรื่องสิทธิ์ของหน้าฟอร์มที่ระบุไว้ข้างต้น
  • ข้อมูลกำกับสิทธิ์รายการกระทำมีอยู่แต่ยังไม่บังคับใช้
  • GET /api/rich-message/find-all-object ที่โมดูลอื่นใช้ทำ dropdown ไม่มีข้อมูลกำกับสิทธิ์เลย ตามที่ระบบเวอร์ชันก่อนหน้าเป็น
  • DELETE /api/rich-message/:id เป็น soft delete ส่วนการลบจริงต้องเป็น super admin และต้องส่งพารามิเตอร์ยืนยัน

ผลข้างเคียงที่ควรรู้​

  • Redis cache — backend เก็บ cache ทั้งรายการและรายละเอียด โดยใช้คีย์และอายุ cache ชุดเดียวกับระบบเวอร์ชันก่อนหน้า
  • การแก้ Rich Message กระทบของที่อ้างอิงอยู่ — ระบบตอบกลับอัตโนมัติอ่านตาราง Rich Message โดยตรง และแคมเปญประกอบเนื้อหาจากข้อมูลชุดนี้ตอนจะส่ง ดังนั้นการแก้เนื้อหาหลังผูกไว้กับแคมเปญหรือกฎตอบกลับแล้ว จะเปลี่ยนสิ่งที่ถูกส่งออกไปจริงด้วย