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 NULL–LINE OA channel ปลายทางของการนำเข้า
titleTEXTNOT NULL–ชื่อเรียกงานนำเข้าที่ผู้ใช้ตั้ง
file_nameTEXTNOT NULL–ชื่อไฟล์ต้นฉบับที่อัปโหลด
file_pathTEXTNOT NULL–path ของไฟล์ที่จัดเก็บไว้
archive_pathTEXTNULL–path ของไฟล์หลังย้ายไปเก็บถาวรเมื่อประมวลผลเสร็จ
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 NULL–LINE OA channel ปลายทาง
line_user_idTEXTNOT NULL–LINE 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 NULL–LINE OA channel ที่จะนำข้อมูลไปอัปเดต
organization_idINTEGERNOT NULL–องค์กรเจ้าของงาน
file_nameTEXTNOT NULL–ชื่อไฟล์ CSV ต้นฉบับ
file_pathTEXTNOT NULL–path ของไฟล์ที่จัดเก็บไว้
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_pathTEXTNULL–path ของไฟล์ log ข้อผิดพลาดรายบรรทัด
created_byINTEGERNULL–user 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