feat(slik): implementasi sistem import SLIK dengan optimasi memory & timeout handling

- Menambahkan `SlikController.php` dengan method CRUD dan import data SLIK, termasuk logging detail & error handling
- Menambahkan `SlikImport.php` dengan Laravel Excel (ToCollection, WithChunkReading, WithBatchInserts, dll.)
- Optimasi memory dengan chunk processing (50 baris/chunk) dan batch insert (50 record/batch)
- Penanganan timeout menggunakan `set_time_limit` & memory limit configurable via config
- Implementasi queue processing untuk file besar (>5MB) dengan progress tracking
- Validasi file upload & data baris, skip header dari baris ke-5, serta rollback jika error
- Garbage collection otomatis setiap 25 baris, unset variabel tidak terpakai, dan logging usage memory
- Error handling komprehensif dengan try-catch, rollback transaksi, hapus file temp, dan logging stack trace
- Semua parameter (batch size, chunk size, memory limit, timeout, GC, queue threshold) configurable via config
- Diuji pada file besar (>50MB), memory stabil, timeout handling berfungsi, rollback aman, dan progress tracking valid
- Catatan: pastikan queue worker berjalan, monitor log progress, sesuaikan config server, dan backup DB sebelum import
This commit is contained in:
Daeng Deni Mardaeni
2025-09-16 11:54:39 +07:00
parent 81159983cf
commit 20833213b1
11 changed files with 2032 additions and 0 deletions

View File

@@ -6,6 +6,7 @@ use Modules\Lpj\Http\Controllers\SLAController;
use Modules\Lpj\Http\Controllers\KJPPController;
use Modules\Lpj\Http\Controllers\MemoController;
use Modules\Lpj\Http\Controllers\BucokController;
use Modules\Lpj\Http\Controllers\SlikController;
use Modules\Lpj\Http\Controllers\TeamsController;
use Modules\Lpj\Http\Controllers\RegionController;
use Modules\Lpj\Http\Controllers\ResumeController;
@@ -801,6 +802,18 @@ Route::middleware(['auth'])->group(function () {
Route::post('/import', [BucokController::class, 'import'])->name('import');
Route::get('/export', [BucokController::class, 'export'])->name('export');
});
// Route untuk SLIK
Route::prefix('slik')->name('slik.')->group(function () {
Route::get('/', [SlikController::class, 'index'])->name('index');
Route::get('/datatables', [SlikController::class, 'dataForDatatables'])->name('datatables');
Route::get('/{id}', [SlikController::class, 'show'])->name('show');
Route::post('/import', [SlikController::class, 'import'])->name('import');
Route::get('/import-form', [SlikController::class, 'importForm'])->name('import-form');
Route::get('/download-template', [SlikController::class, 'downloadTemplate'])->name('download-template');
Route::get('/export', [SlikController::class, 'export'])->name('export');
Route::post('/truncate', [SlikController::class, 'truncate'])->name('truncate');
});
});
require __DIR__ . '/registrasi.php';