]> gitweb.erp-flowers.ru Git - erp24_rep/yii-erp24/.git/commitdiff
Слияние смежных интервалов и коррекции по представлению
authorVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 14 Aug 2025 11:29:04 +0000 (14:29 +0300)
committerVladimir Fomichev <vladimir.fomichev@erp-flowers.ru>
Thu, 14 Aug 2025 11:29:04 +0000 (14:29 +0300)
erp24/controllers/Products1cNomenclatureActualityController.php
erp24/views/products1c-nomenclature-actuality/index.php
erp24/web/js/products1cNomenclatureActuality/index.js

index 6f645f01730d9f3f25cdd9a7224b3b5edead23eb..222cde25c80bcb2a37b56ee2db1be4173a208c09 100644 (file)
@@ -338,11 +338,14 @@ class Products1cNomenclatureActualityController extends Controller
 
             $guid = $row['guid'];
 
+            $fromAdj = (clone $fromDt)->modify('-1 second')->format('Y-m-d H:i:s');
+            $toAdj   = (clone $toDt)->modify('+1 second')->format('Y-m-d H:i:s');
+
             /** @var Products1cNomenclatureActuality[] $hits */
             $hits = Products1cNomenclatureActuality::find()
                 ->where(['guid' => $guid])
-                ->andWhere('date_to   >= :from', [':from' => $from])
-                ->andWhere('date_from <= :to', [':to' => $to])
+                ->andWhere('date_to   >= :fromAdj', [':fromAdj' => $fromAdj])
+                ->andWhere('date_from <= :toAdj',   [':toAdj'   => $toAdj])
                 ->orderBy(['date_from' => SORT_ASC])
                 ->all();
 
@@ -360,10 +363,12 @@ class Products1cNomenclatureActualityController extends Controller
                 continue;
             }
 
-            $allFrom = array_map(fn($r) => $r->date_from, $hits);
-            $allTo = array_map(fn($r) => $r->date_to, $hits);
-            $minFrom = min($from, min($allFrom));
-            $maxTo = max($to, max($allTo));
+            $minFrom = $from;
+            $maxTo   = $to;
+            foreach ($hits as $h) {
+                if ($h->date_from < $minFrom) { $minFrom = $h->date_from; }
+                if ($h->date_to   > $maxTo)   { $maxTo   = $h->date_to;   }
+            }
 
             $master = array_shift($hits);
             $master->date_from = $minFrom;
@@ -378,6 +383,46 @@ class Products1cNomenclatureActualityController extends Controller
             foreach ($hits as $dup) {
                 $dup->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');
+
+                /** @var Products1cNomenclatureActuality[] $neighbors */
+                $neighbors = 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($neighbors)) {
+                    break;
+                }
+
+                foreach ($neighbors 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}: " . json_encode($master->getErrors(), JSON_UNESCAPED_UNICODE));
+                    break;
+                }
+
+                foreach ($neighbors as $nei) {
+                    $nei->delete();
+                }
+            }
         }
     }
 
index b3ed7faa037fe919f7481648b7038f45055f12a4..a8be5ac6e619043d7487d000374b8feba8c1c205 100644 (file)
@@ -57,6 +57,7 @@ foreach ($months as $k => $v) {
 
         <!-- 1-я колонка: основные фильтры -->
         <div class="col-6 ">
+            <div class="mb-2 fw-bold">Номенклатура</div>
             <div class="row mb-3">
                 <div class="col">
                     <div class="d-flex justify-content-between">
@@ -201,7 +202,8 @@ foreach ($months as $k => $v) {
         </div>
 
         <!-- 3-я колонка: поставщик/плантация + кнопка Применить -->
-        <div class="col-3 ps-4" style="border-left: #ccc solid 1px">
+        <div class="col-2 ps-4" style="border-left: #ccc solid 1px">
+            <div class="mb-2 fw-bold">Поставщики</div>
             <div class="mb-3">
 
                 <div class="input-group">
@@ -224,11 +226,13 @@ foreach ($months as $k => $v) {
                     </div>
                 </div>
             </div>
-            <div class="text-end">
-                <?= Html::submitButton('Применить', ['class' => 'btn btn-primary']) ?>
-            </div>
+
         </div>
+        <div class="col-1 ps-4 d-flex justify-content-end align-items-end" >
 
+                <?= Html::submitButton('Применить', ['class' => 'btn btn-primary w-100']) ?>
+
+        </div>
     </div>
 
     <?php ActiveForm::end(); ?>
index 88b227d5501a00a22744a978da3c45e345c36674..ccfb2f43eb030c62852dcc5a1dc9c756292e44e6 100644 (file)
@@ -19,9 +19,9 @@ document.addEventListener("DOMContentLoaded", () => {
         actualIdx++;
 
         const newRow = `
-            <tr>
-                <td>
-                    ${name} (${guid})
+            <tr class="table-info">
+                <td style="min-width:150px;">
+                    <div class="d-flex justify-content-between">${name} (${guid}) <div class="text-danger mx-5">Новая запись. Заполните интервал</div></div>
                 </td>
                 <td>
                     <input type="hidden" name="actuality[${actualIdx}][guid]" value="${guid}">