นำเข้าข้อมูลเพื่อน (Import / Mapping)
ภาพรวม
Domain นี้มี 3 ตาราง แบ่งเป็น 2 กลไก: line_user_import กับ line_user_import_detail ใช้กับการ
นำเข้ารายชื่อเพื่อนใหม่ จากไฟล์ (หัวข้อ import กับรายละเอียดรายบรรทัด) ส่วน import_mapping_job
ใช้กับการ นำ CSV มาอัปเดตข้อมูลเพื่อนที่มีอยู่แล้ว โดยจับคู่ผ่าน unique key ที่เลือก
ตาราง line_user_import
| Column | Type | Nullable | Default | คำอธิบาย |
|---|---|---|---|---|
id | INTEGER | NOT NULL | nextval (serial) | Primary key ของงานนำเข้า |
line_oa_id | INTEGER | NOT NULL | – | LINE OA channel ปลายทางของการนำเข้า |
title | TEXT | NOT NULL | – | ชื่อเรียกงานนำเข้าที่ผู้ใช้ตั้ง |
file_name | TEXT | NOT NULL | – | ชื่อไฟล์ต้นฉบับที่อัปโหลด |
file_path | TEXT | NOT NULL | – | path ของไฟล์ที่จัดเก็บไว้ |
archive_path | TEXT | NULL | – | path ของไฟล์หลังย้ายไปเก็บถาวรเมื่อประมวลผลเสร็จ |
created_by | INTEGER | NOT NULL | 0 | user id ของผู้สั่งนำเข้า |
total_records | INTEGER | NOT NULL | 0 | จำนวนรายการทั้งหมดในไฟล์ |
total_processed | INTEGER | NOT NULL | 0 | จำนวนรายการที่ประมวลผลไปแล้ว |
process_attempt | INTEGER | NOT NULL | 0 | จำนวนครั้งที่พยายามประมวลผล (ใช้จำกัดการ retry) |
status | LineUserImportStatus (enum) | NOT NULL | new | สถานะงาน: new, processing, completed, failed |
summary_stats | JSONB | NULL | – | สรุปผลการนำเข้า เช่น จำนวนที่เพิ่มใหม่/ซ้ำ/ผิดรูปแบบ |
note | TEXT | NULL | – | หมายเหตุเพิ่มเติมของงานนำเข้า |
organization_id | INTEGER | NOT NULL | – | องค์กรเจ้าของงานนำเข้า |
created_date | TIMESTAMPTZ(3) | NOT NULL | CURRENT_TIMESTAMP | วันที่สร้างงาน |
updated_date | TIMESTAMPTZ(3) | NULL | – | วันที่แก้ไขล่าสุด |
deleted_date | TIMESTAMPTZ(3) | NULL | – | วันที่ลบแบบ soft delete |
ตาราง line_user_import_detail
| Column | Type | Nullable | Default | คำอธิบาย |
|---|---|---|---|---|
id | UUID | NOT NULL | gen_random_uuid() | Primary key ของรายการย่อย |
import_id | INTEGER | NOT NULL | – | งานนำเข้าที่รายการนี้สังกัด (FK ไป line_user_import.id) |
line_oa_id | INTEGER | NOT NULL | – | LINE OA channel ปลายทาง |
line_user_id | TEXT | NOT NULL | – | LINE user ID ที่อ่านได้จากไฟล์ |
line_user_profile | JSONB | NULL | – | โปรไฟล์ที่ดึงจาก LINE API สำหรับ user ID นี้ |
status | LineUserImportDetailStatus (enum) | NOT NULL | new | ผลของรายการนี้: new, insert (เพิ่มสำเร็จ), exist (มีอยู่แล้ว), undefined (ไม่พบใน LINE), error_format (รูปแบบไม่ถูกต้อง) |
error_message | TEXT | NULL | – | ข้อความอธิบายข้อผิดพลาดของรายการนี้ |
organization_id | INTEGER | NOT NULL | – | องค์กรเจ้าของข้อมูล |
created_date | TIMESTAMPTZ(3) | NOT NULL | CURRENT_TIMESTAMP | วันที่สร้าง |
updated_date | TIMESTAMPTZ(3) | NULL | – | วันที่แก้ไขล่าสุด |
deleted_date | TIMESTAMPTZ(3) | NULL | – | วันที่ลบแบบ soft delete |
ตาราง import_mapping_job
| Column | Type | Nullable | Default | คำอธิบาย |
|---|---|---|---|---|
id | INTEGER | NOT NULL | nextval (serial) | Primary key ของงาน mapping |
line_oa_id | INTEGER | NOT NULL | – | LINE OA channel ที่จะนำข้อมูลไปอัปเดต |
organization_id | INTEGER | NOT NULL | – | องค์กรเจ้าของงาน |
file_name | TEXT | NOT NULL | – | ชื่อไฟล์ CSV ต้นฉบับ |
file_path | TEXT | NOT NULL | – | path ของไฟล์ที่จัดเก็บไว้ |
status | VARCHAR(20) | NOT NULL | 'pending' | สถานะงาน: pending, processing, success, partial, failed |
unique_key | JSONB | NOT NULL | – | คีย์ที่ใช้จับคู่แถวใน CSV กับ line_user |
mappings | JSONB | NOT NULL | – | รายการจับคู่คอลัมน์ CSV กับ field ปลายทาง (JSON array) |
validation | JSONB | NULL | – | สรุปผลตรวจสอบก่อนนำเข้า (จำนวนทั้งหมด/จะอัปเดต/ไม่พบคู่/ข้อผิดพลาด) |
stats | JSONB | NULL | – | สรุปผลหลังประมวลผลจริง (total, updated, skipped, errors) |
error_log_path | TEXT | NULL | – | path ของไฟล์ log ข้อผิดพลาดรายบรรทัด |
created_by | INTEGER | NULL | – | user id ของผู้สั่งงาน |
created_date | TIMESTAMPTZ | NOT NULL | now() | วันที่สร้างงาน |
updated_date | TIMESTAMPTZ | NULL | – | วันที่แก้ไขล่าสุด |
deleted_date | TIMESTAMPTZ | NULL | – | วันที่ลบแบบ 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