| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- <?php
- declare(strict_types=1);
- namespace App\Console\Commands;
- use App\Models\User;
- use App\Services\Import\ImportTechnicalDescriptionsService;
- use Illuminate\Console\Command;
- use JsonException;
- class ImportTechnicalDescriptions extends Command
- {
- protected $signature = 'technical-descriptions:import
- {manifest : JSON-файл с данными исходного модуля}
- {--images= : Каталог с исходными изображениями}
- {--user=1 : ID владельца импортированных файлов}
- {--overwrite : Перезаписывать уже заполненные поля}
- {--create-missing : Создавать отсутствующие позиции общего каталога}
- {--apply-to-variants : Применять данные ко всем позициям с повторяющимся артикулом}
- {--dry-run : Только показать результат без изменений}';
- protected $description = 'Обогащает общий каталог техническими описаниями из старого модуля';
- public function handle(ImportTechnicalDescriptionsService $service): int
- {
- $manifest = (string) $this->argument('manifest');
- if (! is_file($manifest) || ! is_readable($manifest)) {
- $this->error("JSON-файл {$manifest} не найден или недоступен для чтения.");
- return self::FAILURE;
- }
- $userId = (int) $this->option('user');
- if (! User::query()->whereKey($userId)->exists()) {
- $this->error("Пользователь #{$userId} не найден.");
- return self::FAILURE;
- }
- try {
- $products = json_decode(
- (string) file_get_contents($manifest),
- true,
- 512,
- JSON_THROW_ON_ERROR,
- );
- } catch (JsonException $exception) {
- $this->error('Некорректный JSON: '.$exception->getMessage());
- return self::FAILURE;
- }
- if (! is_array($products) || ! array_is_list($products)) {
- $this->error('Корень JSON должен быть массивом позиций.');
- return self::FAILURE;
- }
- $stats = $service->handle(
- $products,
- $this->option('images') ? (string) $this->option('images') : null,
- $userId,
- (bool) $this->option('overwrite'),
- (bool) $this->option('create-missing'),
- (bool) $this->option('apply-to-variants'),
- (bool) $this->option('dry-run'),
- );
- $this->table(['Показатель', 'Количество'], [
- ['Источник', $stats['source']],
- ['Сопоставлено', $stats['matched']],
- ['Обновлено', $stats['updated']],
- ['Создано', $stats['created']],
- ['Без изменений', $stats['unchanged']],
- ['Нет в каталоге', $stats['missing']],
- ['Неоднозначный артикул', $stats['ambiguous']],
- ['Перенесено изображений', $stats['images_imported']],
- ['Не найдено изображений', $stats['images_missing']],
- ]);
- if ($stats['missing_articles'] !== []) {
- $this->warn('Нет в каталоге: '.implode(', ', $stats['missing_articles']));
- }
- if ($stats['ambiguous_articles'] !== []) {
- $this->warn('Неоднозначные артикулы: '.implode(', ', $stats['ambiguous_articles']));
- }
- if ($this->option('dry-run')) {
- $this->info('Dry-run завершён: данные не изменены.');
- }
- return self::SUCCESS;
- }
- }
|