37 lines
1.9 KiB
Markdown
37 lines
1.9 KiB
Markdown
# 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ì.
|