Skip to main content

นำเข้าข้อมูลเพื่อน (Import / Mapping)

ภาพรวม

Domain นี้มี 3 ตาราง แบ่งเป็น 2 กลไก: line_user_import กับ line_user_import_detail ใช้กับการ นำเข้ารายชื่อเพื่อนใหม่ จากไฟล์ (หัวข้อ import กับรายละเอียดรายบรรทัด) ส่วน import_mapping_job ใช้กับการ นำ CSV มาอัปเดตข้อมูลเพื่อนที่มีอยู่แล้ว โดยจับคู่ผ่าน unique key ที่เลือก

ตาราง line_user_import

ColumnTypeNullableDefaultคำอธิบาย
idINTEGERNOT NULLnextval (serial)Primary key ของงานนำเข้า
line_oa_idINTEGERNOT NULLLINE OA channel ปลายทางของการนำเข้า
titleTEXTNOT NULLชื่อเรียกงานนำเข้าที่ผู้ใช้ตั้ง
file_nameTEXTNOT NULLชื่อไฟล์ต้นฉบับที่อัปโหลด
file_pathTEXTNOT NULLpath ของไฟล์ที่จัดเก็บไว้
archive_pathTEXTNULLpath ของไฟล์หลังย้ายไปเก็บถาวรเมื่อประมวลผลเสร็จ
created_byINTEGERNOT NULL0user id ของผู้สั่งนำเข้า
total_recordsINTEGERNOT NULL0จำนวนรายการทั้งหมดในไฟล์
total_processedINTEGERNOT NULL0จำนวนรายการที่ประมวลผลไปแล้ว
process_attemptINTEGERNOT NULL0จำนวนครั้งที่พยายามประมวลผล (ใช้จำกัดการ retry)
statusLineUserImportStatus (enum)NOT NULLnewสถานะงาน: new, processing, completed, failed
summary_statsJSONBNULLสรุปผลการนำเข้า เช่น จำนวนที่เพิ่มใหม่/ซ้ำ/ผิดรูปแบบ
noteTEXTNULLหมายเหตุเพิ่มเติมของงานนำเข้า
organization_idINTEGERNOT NULLองค์กรเจ้าของงานนำเข้า
created_dateTIMESTAMPTZ(3)NOT NULLCURRENT_TIMESTAMPวันที่สร้างงาน
updated_dateTIMESTAMPTZ(3)NULLวันที่แก้ไขล่าสุด
deleted_dateTIMESTAMPTZ(3)NULLวันที่ลบแบบ soft delete

ตาราง line_user_import_detail

ColumnTypeNullableDefaultคำอธิบาย
idUUIDNOT NULLgen_random_uuid()Primary key ของรายการย่อย
import_idINTEGERNOT NULLงานนำเข้าที่รายการนี้สังกัด (FK ไป line_user_import.id)
line_oa_idINTEGERNOT NULLLINE OA channel ปลายทาง
line_user_idTEXTNOT NULLLINE user ID ที่อ่านได้จากไฟล์
line_user_profileJSONBNULLโปรไฟล์ที่ดึงจาก LINE API สำหรับ user ID นี้
statusLineUserImportDetailStatus (enum)NOT NULLnewผลของรายการนี้: new, insert (เพิ่มสำเร็จ), exist (มีอยู่แล้ว), undefined (ไม่พบใน LINE), error_format (รูปแบบไม่ถูกต้อง)
error_messageTEXTNULLข้อความอธิบายข้อผิดพลาดของรายการนี้
organization_idINTEGERNOT NULLองค์กรเจ้าของข้อมูล
created_dateTIMESTAMPTZ(3)NOT NULLCURRENT_TIMESTAMPวันที่สร้าง
updated_dateTIMESTAMPTZ(3)NULLวันที่แก้ไขล่าสุด
deleted_dateTIMESTAMPTZ(3)NULLวันที่ลบแบบ soft delete

ตาราง import_mapping_job

ColumnTypeNullableDefaultคำอธิบาย
idINTEGERNOT NULLnextval (serial)Primary key ของงาน mapping
line_oa_idINTEGERNOT NULLLINE OA channel ที่จะนำข้อมูลไปอัปเดต
organization_idINTEGERNOT NULLองค์กรเจ้าของงาน
file_nameTEXTNOT NULLชื่อไฟล์ CSV ต้นฉบับ
file_pathTEXTNOT NULLpath ของไฟล์ที่จัดเก็บไว้
statusVARCHAR(20)NOT NULL'pending'สถานะงาน: pending, processing, success, partial, failed
unique_keyJSONBNOT NULLคีย์ที่ใช้จับคู่แถวใน CSV กับ line_user
mappingsJSONBNOT NULLรายการจับคู่คอลัมน์ CSV กับ field ปลายทาง (JSON array)
validationJSONBNULLสรุปผลตรวจสอบก่อนนำเข้า (จำนวนทั้งหมด/จะอัปเดต/ไม่พบคู่/ข้อผิดพลาด)
statsJSONBNULLสรุปผลหลังประมวลผลจริง (total, updated, skipped, errors)
error_log_pathTEXTNULLpath ของไฟล์ log ข้อผิดพลาดรายบรรทัด
created_byINTEGERNULLuser id ของผู้สั่งงาน
created_dateTIMESTAMPTZNOT NULLnow()วันที่สร้างงาน
updated_dateTIMESTAMPTZNULLวันที่แก้ไขล่าสุด
deleted_dateTIMESTAMPTZNULLวันที่ลบแบบ soft delete

หมายเหตุ

  • Foreign key: line_user_import_detail.import_id -> line_user_import.id ส่วน import_mapping_job ไม่มี FK constraint (อ้างอิงเชิงตรรกะเท่านั้น)
  • Index: line_user_import มี index บน line_oa_id, import_mapping_job มี import_mapping_job_oa_idx บน (line_oa_id, status)
  • import_mapping_job ไม่มีอยู่ใน schema.prisma — ถูกสร้างผ่าน manual SQL (manual-sql/9.import_mapping.sql) และประมวลผลแบบ asynchronous โดย worker-go ผ่านคิวชื่อ import_mapping_job ด้วยเหตุนี้ timestamp จึงเป็น TIMESTAMPTZ ธรรมดาและ status เป็น VARCHAR(20) แทนที่จะเป็น enum
  • โครงสร้าง unique_key เป็น JSON object รูปแบบ {"field":"mobile_no","csvColumn":"Phone Number"} โดยค่า field เป็นได้ทั้งชื่อคอลัมน์ของ line_user หรือ custom attribute ในรูปแบบ custom.<ชื่อ key>
  • โครงสร้าง mappings เป็น JSON array รูปแบบ [{"csvColumn":"Member Tier","target":"custom.member_tier"}] โดย target ชี้ไปยังคอลัมน์ของ line_user หรือ key ภายใน custom_attribute
  • โมดูล import-mapping ถูกลงทะเบียนใน system_module พร้อมให้สิทธิ์ role 1-2 แบบเต็ม และ role 3 เฉพาะ readAll,read ตามที่ระบุใน manual-sql/9.import_mapping.sql