]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Заменяем логику команды очистки со сложной на простую
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 25 Nov 2025 07:47:36 +0000 (10:47 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Tue, 25 Nov 2025 07:47:36 +0000 (10:47 +0300)
erp24/commands/AdminController.php

index 508d7e768b9d089ea6d7898f4c9f42f00cfc2968..a6c37530148c4710a26b447eab4760b35881eb80 100644 (file)
@@ -52,31 +52,20 @@ class AdminController extends Controller {
     }
 
     /**
-     * Ð\9eÑ\87иÑ\81Ñ\82ка group_name Ð¾Ñ\82 Ð¿Ð¾Ð´Ñ\81Ñ\82Ñ\80ок "ноÑ\87Ñ\8c" Ð¸ "денÑ\8c" Ð´Ð»Ñ\8f записей с заполненным employee_position_id
+     * Ð\97амена group_name Ð½Ð° AdminGroup->name Ð´Ð»Ñ\8f Ð²Ñ\81еÑ\85 записей с заполненным 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("=== Ð\9dаÑ\87ало Ð¾Ñ\87иÑ\81Ñ\82ки group_name Ð¾Ñ\82 Ð¿Ð¾Ð´Ñ\81Ñ\82Ñ\80ок 'ноÑ\87Ñ\8c' Ð¸ 'денÑ\8c' ===\n", \yii\helpers\Console::FG_CYAN);
+        $this->stdout("=== Ð\97амена 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");