From 46ed0872396b042a8dcd736bcc7338492e2c8b24 Mon Sep 17 00:00:00 2001 From: Vladimir Fomichev Date: Wed, 10 Sep 2025 17:58:54 +0300 Subject: [PATCH] =?utf8?q?=D0=A1=D0=B6=D0=B0=D1=82=D0=B8=D0=B5=20=D0=B8?= =?utf8?q?=D0=BD=D1=82=D0=B5=D1=80=D0=B2=D0=B0=D0=BB=D0=B0=20=D0=B0=D0=BA?= =?utf8?q?=D1=82=D1=83=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20?= =?utf8?q?=D0=B4=D0=BB=D1=8F=20=D1=82=D0=BE=D0=B2=D0=B0=D1=80=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- ...ducts1cNomenclatureActualityController.php | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/erp24/controllers/Products1cNomenclatureActualityController.php b/erp24/controllers/Products1cNomenclatureActualityController.php index 89d7caa8..ec1a43d0 100644 --- a/erp24/controllers/Products1cNomenclatureActualityController.php +++ b/erp24/controllers/Products1cNomenclatureActualityController.php @@ -381,11 +381,96 @@ class Products1cNomenclatureActualityController extends Controller continue; } + $id = $row['id'] ?? null; $guid = $row['guid']; $fromAdj = (clone $fromDate)->modify('-1 second')->format('Y-m-d H:i:s'); $toAdj = (clone $toDate)->modify('+1 second')->format('Y-m-d H:i:s'); + if ($id) { + /** @var Products1cNomenclatureActuality|null $master */ + $master = Products1cNomenclatureActuality::find() + ->where(['id' => $id, 'guid' => $guid]) + ->one(); + + if (!$master) { + Yii::warning("GUID {$guid}: запись id={$id} не найдена, пропуск"); + continue; + } + + $master->date_from = $from; + $master->date_to = $to; + $master->updated_at = $now; + $master->updated_by = $userId; + + if (!$master->save()) { + Yii::error("Ошибка обновления GUID={$guid}, id={$id}: " . json_encode($master->getErrors(), JSON_UNESCAPED_UNICODE)); + continue; + } + + /** @var Products1cNomenclatureActuality[] $neighbors */ + $neighbors = Products1cNomenclatureActuality::find() + ->where(['guid' => $guid]) + ->andWhere(['<>', 'id', $master->id]) + ->andWhere('date_to >= :fromAdj', [':fromAdj' => $fromAdj]) + ->andWhere('date_from <= :toAdj', [':toAdj' => $toAdj]) + ->orderBy(['date_from' => SORT_ASC]) + ->all(); + + if (empty($neighbors)) { + continue; + } + + $minFrom = $master->date_from; + $maxTo = $master->date_to; + + foreach ($neighbors as $nei) { + if ($nei->date_from < $minFrom) $minFrom = $nei->date_from; + if ($nei->date_to > $maxTo) $maxTo = $nei->date_to; + } + + $master->date_from = $minFrom; + $master->date_to = $maxTo; + $master->updated_at = $now; + $master->updated_by = $userId; + + if (!$master->save()) { + Yii::error("Ошибка объединения GUID={$guid}, id={$id}: " . json_encode($master->getErrors(), JSON_UNESCAPED_UNICODE)); + continue; + } + + foreach ($neighbors as $nei) { $nei->delete(); } + + while (true) { + $leftBound = (new \DateTime($master->date_from))->modify('-1 second')->format('Y-m-d H:i:s'); + $rightBound = (new \DateTime($master->date_to))->modify('+1 second')->format('Y-m-d H:i:s'); + + $more = Products1cNomenclatureActuality::find() + ->where(['guid' => $guid]) + ->andWhere(['<>', 'id', $master->id]) + ->andWhere('date_to >= :leftBound', [':leftBound' => $leftBound]) + ->andWhere('date_from <= :rightBound', [':rightBound' => $rightBound]) + ->orderBy(['date_from' => SORT_ASC]) + ->all(); + + if (empty($more)) break; + + foreach ($more as $nei) { + if ($nei->date_from < $master->date_from) $master->date_from = $nei->date_from; + if ($nei->date_to > $master->date_to) $master->date_to = $nei->date_to; + } + $master->updated_at = $now; + $master->updated_by = $userId; + if (!$master->save()) { + Yii::error("Ошибка повторного объединения GUID={$guid}, id={$id}: " . json_encode($master->getErrors(), JSON_UNESCAPED_UNICODE)); + break; + } + foreach ($more as $nei) { $nei->delete(); } + } + + continue; + } + /** @var Products1cNomenclatureActuality[] $hits */ $hits = Products1cNomenclatureActuality::find() ->where(['guid' => $guid]) -- 2.39.5