Skip to main content

นำเข้าข้อมูลแบบจับคู่คอลัมน์ (Import Mapping)

ภาพรวม

Import Mapping เป็นเครื่องมือนำเข้าข้อมูลจากไฟล์ CSV เพื่อ อัปเดตข้อมูลของ line_user ที่มีอยู่แล้วในระบบ ซึ่งต่างจาก Customer Database ที่เก็บข้อมูลเป็นตารางแยก และต่างจากการ import all friends ที่สร้างเพื่อนใหม่

ลูกค้าอัปโหลด CSV ที่มีโครงสร้างแบบใดก็ได้ แล้วเป็นผู้กำหนดเองว่า:

  • คอลัมน์ใดใช้เป็น unique key สำหรับจับคู่กับ LINE user เช่น เบอร์โทรศัพท์หรือรหัสสมาชิก
  • คอลัมน์ใดจะ map ไปเป็น field มาตรฐานหรือ custom attribute ตัวใด

ระบบมี ขั้นตอน validate ให้ตรวจสอบล่วงหน้าว่าจะจับคู่ได้กี่แถวและจับคู่ไม่ได้กี่แถว ก่อนที่ผู้ใช้จะยืนยัน ส่วนการอัปเดตข้อมูลจริงถูกส่งต่อให้ worker-go ทำงานแบบ asynchronous ผ่าน RabbitMQ

Business Flow

  1. อัปโหลดไฟล์POST /api/import-mapping/upload รับไฟล์แบบ multipart ระบบเก็บไฟล์ลง object storage แล้วคืนรายชื่อหัวคอลัมน์ที่อ่านได้กลับไป
  2. ดึงปลายทางที่ map ได้GET /api/import-mapping/fields คืนรายการ field และ attribute ที่ map ข้อมูลเข้าไปได้ ซึ่งประกอบด้วย custom attribute จาก attribute_master รวมกับ field มาตรฐานของ line_user
  3. ตรวจสอบก่อนนำเข้า — ผู้ใช้จับคู่คอลัมน์แล้วเรียก POST /api/import-mapping/validate ระบบไล่ตรวจกับ line_user ของ OA ปัจจุบัน แล้วรายงานว่าแถวใดหา LINE user เจอ แถวใดไม่เจอ และแถวใดมีค่าผิดชนิดข้อมูล
  4. ยืนยันนำเข้าPOST /api/import-mapping สร้างแถวใหม่ในตาราง import_mapping_job ด้วยสถานะ pending แล้ว publish job id ลง RabbitMQ queue import_mapping_job
  5. worker ประมวลผล — worker-go ดึงงานไปอัปเดตข้อมูล line_user จริง แล้วอัปเดตสถานะของ job กลับมา
  6. ติดตามผลGET /api/import-mapping คืนรายการ job ทั้งหมดพร้อมสถานะแบบแบ่งหน้า ใช้ติดตามความคืบหน้าของการนำเข้าแต่ละรอบ

ทุก query ถูก scope ด้วยค่าใน CLS คือ lineOaId และ organizationId เช่นเดียวกับโมดูลอื่น

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

โค้ดอยู่ที่ internal/modules/importmapping/ ประกอบด้วย controller.go, service.go และ dto.go

MethodRouteHandlerPolicy
POST/api/import-mapping/uploadct.uploadcreate import-mapping
GET/api/import-mapping/fieldsct.fieldsread import-mapping
POST/api/import-mapping/validatect.validatecreate import-mapping
POST/api/import-mappingct.createJobcreate import-mapping
GET/api/import-mappingct.listreadAll import-mapping

ทุก route ครอบด้วย modulegate.ModuleGate(d, "import-mapping")

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

  • Permission — ต้องผ่าน ModuleGate("import-mapping") และมี PolicyModuleImportMapping เป็น metadata
  • ตารางที่เกี่ยวข้องimport_mapping_job, line_user, attribute_master และ line_oa
  • RabbitMQ — ส่งงานผ่าน queue import_mapping_job ซึ่งกำหนดด้วย env RABBITMQ_QUEUE_IMPORT_MAPPING_JOB โดยฝั่ง consumer อยู่ที่ line-management-worker-go
  • Storage — เก็บไฟล์ CSV ต้นฉบับไว้บน object storage
  • โมดูลที่เกี่ยวข้อง — LINE User Management ในฐานะปลายทางของข้อมูล, Attribute Master ที่นิยาม field ปลายทาง, Customer Database และ All Friend Listing ที่ใช้ดูประวัติการนำเข้า