นำเข้าข้อมูลแบบจับคู่คอลัมน์ (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
- อัปโหลดไฟล์ —
POST /api/import-mapping/uploadรับไฟล์แบบ multipart ระบบเก็บไฟล์ลง object storage แล้วคืนรายชื่อหัวคอลัมน์ที่อ่านได้กลับไป - ดึงปลายทางที่ map ได้ —
GET /api/import-mapping/fieldsคืนรายการ field และ attribute ที่ map ข้อมูลเข้าไปได้ ซึ่งประกอบด้วย custom attribute จากattribute_masterรวมกับ field มาตรฐานของline_user - ตรวจสอบก่อนนำเข้า — ผู้ใช้จับคู่คอลัมน์แล้วเรียก
POST /api/import-mapping/validateระบบไล่ตรวจกับline_userของ OA ปัจจุบัน แล้วรายงานว่าแถวใดหา LINE user เจอ แถวใดไม่เจอ และแถวใดมีค่าผิดชนิดข้อมูล - ยืนยันนำเข้า —
POST /api/import-mappingสร้างแถวใหม่ในตารางimport_mapping_jobด้วยสถานะpendingแล้ว publish job id ลง RabbitMQ queueimport_mapping_job - worker ประมวลผล — worker-go ดึงงานไปอัปเดตข้อมูล
line_userจริง แล้วอัปเดตสถานะของ job กลับมา - ติดตามผล —
GET /api/import-mappingคืนรายการ job ทั้งหมดพร้อมสถานะแบบแบ่งหน้า ใช้ติดตามความคืบหน้าของการนำเข้าแต่ละรอบ
ทุก query ถูก scope ด้วยค่าใน CLS คือ lineOaId และ organizationId เช่นเดียวกับโมดูลอื่น
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/importmapping/ ประกอบด้วย controller.go, service.go และ dto.go
| Method | Route | Handler | Policy |
|---|---|---|---|
| POST | /api/import-mapping/upload | ct.upload | create import-mapping |
| GET | /api/import-mapping/fields | ct.fields | read import-mapping |
| POST | /api/import-mapping/validate | ct.validate | create import-mapping |
| POST | /api/import-mapping | ct.createJob | create import-mapping |
| GET | /api/import-mapping | ct.list | readAll 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ซึ่งกำหนดด้วย envRABBITMQ_QUEUE_IMPORT_MAPPING_JOBโดยฝั่ง consumer อยู่ที่ line-management-worker-go - Storage — เก็บไฟล์ CSV ต้นฉบับไว้บน object storage
- โมดูลที่เกี่ยวข้อง — LINE User Management ในฐานะปลายทางของข้อมูล, Attribute Master ที่นิยาม field ปลายทาง, Customer Database และ All Friend Listing ที่ใช้ดูประวัติการนำเข้า