From: Vladimir Fomichev Date: Tue, 25 Nov 2025 07:47:36 +0000 (+0300) Subject: Заменяем логику команды очистки со сложной на простую X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=daa871a2f890efc9a0774abb36e631483223c817;p=erp24_rep%2Fyii-erp24%2F.git Заменяем логику команды очистки со сложной на простую --- diff --git a/erp24/commands/AdminController.php b/erp24/commands/AdminController.php index 508d7e76..a6c37530 100644 --- a/erp24/commands/AdminController.php +++ b/erp24/commands/AdminController.php @@ -52,31 +52,20 @@ class AdminController extends Controller { } /** - * Очистка group_name от подстрок "ночь" и "день" для записей с заполненным employee_position_id + * Замена group_name на AdminGroup->name для всех записей с заполненным employee_position_id * * Команда выполняет: - * 1. Выборку Admin записей с заполненным employee_position_id и наличием "ночь"/"день" в group_name - * 2. Сравнение group_name с AdminGroup->name - * 3. Очистку group_name от "ночь"/"день" при необходимости - * - * Примеры работы: - * - "Старший флорист ночь" + группа "Старший флорист" → "Старший флорист" - * - "Администратор день" + группа "Администратор" → "Администратор" - * - "Новичок ночь" + группа "Помощник флориста" → "Новичок" + * 1. Выборку Admin записей с заполненным employee_position_id + * 2. Замену group_name на AdminGroup->name для каждой записи */ public function actionCleanGroupNameFromShift() { - $this->stdout("=== Начало очистки group_name от подстрок 'ночь' и 'день' ===\n", \yii\helpers\Console::FG_CYAN); + $this->stdout("=== Замена group_name на AdminGroup->name ===\n", \yii\helpers\Console::FG_CYAN); $this->stdout("Дата запуска: " . date('Y-m-d H:i:s') . "\n\n"); - // Выборка записей с заполненным employee_position_id и наличием "ночь" или "день" в group_name + // Выборка записей с заполненным employee_position_id $admins = Admin::find() ->where(['IS NOT', 'employee_position_id', null]) ->andWhere(['!=', 'employee_position_id', 0]) - ->andWhere([ - 'OR', - ['ILIKE', 'group_name', 'ночь'], - ['ILIKE', 'group_name', 'день'] - ]) ->all(); $totalCount = count($admins); @@ -87,16 +76,12 @@ class AdminController extends Controller { return; } - // Оптимизация: собираем все уникальные group_id и employee_position_id и загружаем одним запросом + // Оптимизация: собираем все уникальные group_id и загружаем одним запросом $groupIds = []; - $positionIds = []; foreach ($admins as $admin) { if ($admin->group_id && !in_array($admin->group_id, $groupIds)) { $groupIds[] = $admin->group_id; } - if ($admin->employee_position_id && !in_array($admin->employee_position_id, $positionIds)) { - $positionIds[] = $admin->employee_position_id; - } } // Загружаем все нужные группы одним запросом @@ -105,28 +90,20 @@ class AdminController extends Controller { ->indexBy('id') ->all(); - // Загружаем все нужные должности одним запросом - $employeePositions = EmployeePosition::find() - ->where(['id' => $positionIds]) - ->indexBy('id') - ->all(); - - $this->stdout("Загружено групп для обработки: " . count($adminGroups) . "\n", \yii\helpers\Console::FG_CYAN); - $this->stdout("Загружено должностей для обработки: " . count($employeePositions) . "\n\n", \yii\helpers\Console::FG_CYAN); + $this->stdout("Загружено групп для обработки: " . count($adminGroups) . "\n\n", \yii\helpers\Console::FG_CYAN); $processedCount = 0; $skippedCount = 0; $updatedCount = 0; $errors = []; - foreach ($admins as $index => $admin) { + foreach ($admins as $admin) { $processedCount++; $this->stdout("--- Обработка записи {$processedCount}/{$totalCount} ---\n", \yii\helpers\Console::FG_CYAN); $this->stdout("ID: {$admin->id}\n"); $this->stdout("Имя: {$admin->name}\n"); $this->stdout("Текущий group_name: '{$admin->group_name}'\n"); $this->stdout("group_id: {$admin->group_id}\n"); - $this->stdout("employee_position_id: {$admin->employee_position_id}\n"); // Получаем группу администратора из словаря $adminGroup = $adminGroups[$admin->group_id] ?? null; @@ -143,102 +120,38 @@ class AdminController extends Controller { continue; } - $groupName = $adminGroup->name; - $this->stdout("Название группы (AdminGroup->name): '{$groupName}'\n"); - - // Сравниваем group_name и AdminGroup->name + $groupName = trim($adminGroup->name); $currentGroupName = trim($admin->group_name); - $targetGroupName = trim($groupName); + + $this->stdout("Название группы (AdminGroup->name): '{$groupName}'\n"); // Если значения одинаковые - пропускаем - if ($currentGroupName === $targetGroupName) { + if ($currentGroupName === $groupName) { $this->stdout("✓ Значения идентичны, пропускаем\n", \yii\helpers\Console::FG_GREEN); $skippedCount++; $this->stdout("\n"); continue; } - // Определяем, есть ли в текущем group_name подстроки "ночь" или "день" - $hasNight = mb_stripos($currentGroupName, 'ночь') !== false; - $hasDay = mb_stripos($currentGroupName, 'день') !== false; - - if (!$hasNight && !$hasDay) { - $this->stdout("⚠ В group_name нет подстрок 'ночь' или 'день', но значения различаются\n", \yii\helpers\Console::FG_YELLOW); - $this->stdout("Текущее: '{$currentGroupName}'\n"); - $this->stdout("Ожидаемое: '{$targetGroupName}'\n"); - $skippedCount++; - $this->stdout("\n"); - continue; - } - - // Убираем "ночь" или "день" с пробелом (в любом месте строки) - $cleanedName = $currentGroupName; + // Заменяем group_name на AdminGroup->name + $oldValue = $admin->group_name; + $admin->group_name = $groupName; - // Убираем " ночь" или " ночь" (с пробелом до и/или после) - $cleanedName = preg_replace('/\s*ночь\s*/iu', ' ', $cleanedName); - - // Убираем " день" или " день" (с пробелом до и/или после) - $cleanedName = preg_replace('/\s*день\s*/iu', ' ', $cleanedName); - - // Убираем лишние пробелы и обрезаем - $cleanedName = trim(preg_replace('/\s+/', ' ', $cleanedName)); - - $this->stdout("Очищенное group_name: '{$cleanedName}'\n"); - - // Проверяем, совпадает ли очищенное имя с названием группы - if ($cleanedName === $targetGroupName) { - // Если совпадает - используем название группы - $newGroupName = $targetGroupName; - $this->stdout("✓ Очищенное имя совпадает с названием группы\n", \yii\helpers\Console::FG_GREEN); + if ($admin->save(false)) { + $this->stdout("✓ УСПЕШНО ОБНОВЛЕНО:\n", \yii\helpers\Console::FG_GREEN); + $this->stdout(" Было: '{$oldValue}'\n"); + $this->stdout(" Стало: '{$groupName}'\n"); + $updatedCount++; } else { - // Если полное несовпадение - проверяем название грейда по employee_position_id - $employeePosition = $employeePositions[$admin->employee_position_id] ?? null; - - if ($employeePosition) { - $positionName = trim($employeePosition->name); - $this->stdout("Название грейда (EmployeePosition->name): '{$positionName}'\n"); - - // Сравниваем EmployeePosition->name с AdminGroup->name - if ($positionName === $targetGroupName) { - // Если совпадают - ставим AdminGroup->name - $newGroupName = $targetGroupName; - $this->stdout("✓ Название грейда совпадает с названием группы, используем группу\n", \yii\helpers\Console::FG_GREEN); - } else { - // Если не совпадают - ставим EmployeePosition->name (название грейда) - $newGroupName = $positionName; - $this->stdout("⚠ Название грейда не совпадает с группой, используем название грейда\n", \yii\helpers\Console::FG_YELLOW); - } - } else { - // Если должность не найдена - оставляем очищенное имя - $newGroupName = $cleanedName; - $this->stdout("⚠ Должность не найдена, оставляем очищенное имя\n", \yii\helpers\Console::FG_YELLOW); - } - } - - // Сохраняем изменения только если значение изменилось - if ($newGroupName !== $currentGroupName) { - $oldValue = $admin->group_name; - $admin->group_name = $newGroupName; - - if ($admin->save(false)) { - $this->stdout("✓ УСПЕШНО ОБНОВЛЕНО:\n", \yii\helpers\Console::FG_GREEN); - $this->stdout(" Было: '{$oldValue}'\n"); - $this->stdout(" Стало: '{$newGroupName}'\n"); - $updatedCount++; - } else { - $errorMsg = "Ошибка при сохранении: " . implode(', ', $admin->getFirstErrors()); - $this->stdout("✗ ОШИБКА СОХРАНЕНИЯ: {$errorMsg}\n", \yii\helpers\Console::FG_RED); - $errors[] = [ - 'admin_id' => $admin->id, - 'admin_name' => $admin->name, - 'old_value' => $oldValue, - 'new_value' => $newGroupName, - 'error' => $errorMsg - ]; - } - } else { - $this->stdout("⚠ Значение не изменилось, пропускаем\n", \yii\helpers\Console::FG_YELLOW); - $skippedCount++; + $errorMsg = "Ошибка при сохранении: " . implode(', ', $admin->getFirstErrors()); + $this->stdout("✗ ОШИБКА СОХРАНЕНИЯ: {$errorMsg}\n", \yii\helpers\Console::FG_RED); + $errors[] = [ + 'admin_id' => $admin->id, + 'admin_name' => $admin->name, + 'old_value' => $oldValue, + 'new_value' => $groupName, + 'error' => $errorMsg + ]; } $this->stdout("\n");