1.9 KiB
1.9 KiB
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-excelvớ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ó
ProgressBarcủ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:
-
Định danh Base Entities:
- Tìm hoặc tạo mới
Productbằng$row['Mã căn hộ']. - Tìm hoặc tạo mới
Customerbằng$row['Họ tên KH'].
- Tìm hoặc tạo mới
-
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.
- Đọc các cột liên quan đến Bàn Giao, nếu có -> Insert/Update
-
Xử lý Feedback & Interactions (Tách dòng lịch sử):
- Lấy chuỗi text tại cột
Nội dung(hoặcLị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
Activegần nhất của Product này để lấy$contract_id(nếu có). firstOrCreatemộtFeedback(Ticket) gắn vớiProduct,Customer, vàContractvừ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_interactionsnối với Ticket trên.
- Lấy chuỗi text tại cột
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ì.