nang cap san sang import

This commit is contained in:
2026-05-01 04:33:00 +00:00
parent 6c74c17b48
commit 6ef2e9fe4e
93 changed files with 6542 additions and 12 deletions

View File

@@ -0,0 +1,36 @@
# TASK: Xây dựng Command Import Dữ liệu lớn (CSV/Excel)
# Context: Import file CSKH "phẳng" vào cấu trúc Database Relational mới.
## Yêu cầu Kỹ thuật
- Sử dụng package `spatie/simple-excel` với cơ chế **Lazy Collection** (Generator) để chống tràn bộ nhớ (OOM).
- Tạo command: `php artisan app:import-cskh {file_path}`.
- Bọc logic xử lý mỗi chunk (ví dụ 100 dòng) bằng `DB::transaction()`.
- Có `ProgressBar` của Symfony Console để theo dõi.
## Luồng xử lý Data (Per Row)
Mỗi `$row` từ file CSV sẽ chạy qua Pipeline sau:
1. **Định danh Base Entities:**
- Tìm hoặc tạo mới `Product` bằng `$row['Mã căn hộ']`.
- Tìm hoặc tạo mới `Customer` bằng `$row['Họ tên KH']`.
2. **Khởi tạo Hợp đồng (Contracts) & Bàn giao (Handovers):**
- Đọc các cột liên quan đến Bàn Giao, nếu có -> Insert/Update `handovers`.
- Đọc các cột HĐ BCC, HĐ THUÊ, nếu có -> Insert `contracts`.
3. **Xử lý Feedback & Interactions (Tách dòng lịch sử):**
- Lấy chuỗi text tại cột `Nội dung` (hoặc `Lịch Sử khách hàng`).
- Sử dụng `explode("\n", $text)` để tách thành mảng các interactions. Loại bỏ các chuỗi rỗng.
- Tìm hợp đồng `Active` gần nhất của Product này để lấy `$contract_id` (nếu có).
- `firstOrCreate` một `Feedback` (Ticket) gắn với `Product`, `Customer`, và `Contract` vừa tìm được. (Tiêu đề mặc định: "Ticket từ dữ liệu lịch sử").
- Lặp qua mảng interactions vừa tách, tạo các record trong `feedback_interactions` nối với Ticket trên.
## Lưu ý cho AI:
- Viết code có cấu trúc rõ ràng, tách các khối logic (Process Product, Process Contract, Process Interactions) thành các private methods trong Command class để dễ bảo trì.