]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
[ERP-40] Создание истории каталога и разментки фокусных групп
authorAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Mon, 26 Jan 2026 07:58:45 +0000 (10:58 +0300)
committerAleksey Filippov <Aleksey.Filippov@erp-flowers.ru>
Mon, 26 Jan 2026 07:58:45 +0000 (10:58 +0300)
erp24/commands/Products1cClassDynamicController.php
erp24/config/db.php
erp24/records/Products1cClassDynamic.php

index bed4400cced440dd5e7c8247c519832ddf850c3c..ff1f6bd25faae826c599f2c06cd2529f81356561 100644 (file)
@@ -203,14 +203,18 @@ class Products1cClassDynamicController extends Controller
             $transaction = Yii::$app->db->beginTransaction(Transaction::SERIALIZABLE);
 
             try {
-                // SELECT FOR UPDATE: блокируем строку, перечитываем актуальные данные
-                $activeRecord = Products1cClassDynamic::find()
-                    ->where([
-                        'product_id' => $productData['product_id'],
-                        'active' => Products1cClassDynamic::ACTIVE,
-                    ])
-                    ->forUpdate()
-                    ->one();
+                // SELECT FOR UPDATE через raw SQL (Yii2 не имеет встроенного forUpdate())
+                // Блокируем строку до конца транзакции
+                $sql = "SELECT id FROM {{%products_1c_class_dynamic}}
+                        WHERE product_id = :product_id AND active = :active
+                        FOR UPDATE";
+                $lockedRow = Yii::$app->db->createCommand($sql, [
+                    ':product_id' => $productData['product_id'],
+                    ':active' => Products1cClassDynamic::ACTIVE,
+                ])->queryOne();
+
+                // Получаем ActiveRecord по заблокированному ID
+                $activeRecord = $lockedRow ? Products1cClassDynamic::findOne($lockedRow['id']) : null;
 
                 // Проверяем, не обработал ли кто-то эту запись параллельно
                 if ($activeRecord === null) {
@@ -230,14 +234,14 @@ class Products1cClassDynamicController extends Controller
                 // Определяем какие поля изменились
                 $changes = $activeRecord->detectChanges($productData);
 
-                // Закрываем старую запись
-                $activeRecord->disableRecord();
+                // Закрываем старую запись С указанием причины (changes)
+                $activeRecord->disableRecord($changes);
                 if (!$activeRecord->save()) {
                     throw new \Exception('Ошибка закрытия записи: ' . implode(', ', $activeRecord->getFirstErrors()));
                 }
 
-                // Создаём новую запись с указанием изменённых полей
-                $newRecord = Products1cClassDynamic::createFromData($productData, $changes);
+                // Создаём новую запись БЕЗ changes (это текущее актуальное состояние)
+                $newRecord = Products1cClassDynamic::createFromData($productData, null);
                 if (!$newRecord->save()) {
                     throw new \Exception('Ошибка создания записи: ' . implode(', ', $newRecord->getFirstErrors()));
                 }
index d3f6e658d68a89a11cd5d22edf7993b53c00822c..86ca03c4615d3cd3e14fbff7e00831c6279ad9b3 100644 (file)
@@ -15,7 +15,7 @@ return 1 == 1 ? [
             'defaultSchema' => 'erp24' //specify your schema here, public is the default schema
         ]
     ],
-//    'on afterOpen' => function($event) { $event->sender->createCommand("SET search_path TO public, erp24;")->execute(); },
+    'on afterOpen' => function($event) { $event->sender->createCommand("SET search_path TO erp24, public;")->execute(); },
     // PostgreSQL
     'charset' => 'utf8',
     'enableSchemaCache' => true,
index ddb4d9c97dd161becc66dbaeadee6cd74c62fc7f..db5785b178c922ec557da9b4a43b58440b7c6cf7 100644 (file)
@@ -153,18 +153,21 @@ class Products1cClassDynamic extends \yii\db\ActiveRecord
     }
 
     /**
-     * Закрытие текущей активной записи
-     *
-     * Устанавливает:
-     * - date_to = текущая дата
-     * - active = 0
+     * Закрытие записи (деактивация)
      *
+     * @param array|null $changes Список изменённых полей, из-за которых закрывается запись
      * @return self
      */
-    public function disableRecord(): self
+    public function disableRecord(?array $changes = null): self
     {
         $this->date_to = date('Y-m-d');
         $this->active = self::NOT_ACTIVE;
+        $this->updated_at = date('Y-m-d H:i:s');
+
+        // changes записывается в закрываемую запись — причина закрытия
+        if ($changes !== null) {
+            $this->changes = json_encode($changes, JSON_UNESCAPED_UNICODE);
+        }
 
         return $this;
     }