From 4f898bf796c0ccd3abf03bd481fb1a51ff254c73 Mon Sep 17 00:00:00 2001 From: Arsen Mirzaev Tatyano-Muradovich Date: Mon, 7 Jun 2021 05:53:14 +1000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mirzaev/skillparts/system/models/Order.php | 80 ++++++++++++++----- .../skillparts/system/views/cart/index.php | 16 +++- 2 files changed, 74 insertions(+), 22 deletions(-) diff --git a/mirzaev/skillparts/system/models/Order.php b/mirzaev/skillparts/system/models/Order.php index 0385aee..ff430e8 100644 --- a/mirzaev/skillparts/system/models/Order.php +++ b/mirzaev/skillparts/system/models/Order.php @@ -296,6 +296,7 @@ class Order extends Document implements DocumentInterface * Поиск содержимого заказа * * @todo В будущем возможно заказ не только поставок реализовать + * Переписать реестр и проверку на дубликаты, не понимаю как они работают */ public function content(int $limit = 1, int $page = 1): Supply|array|null { @@ -320,13 +321,58 @@ class Order extends Document implements DocumentInterface select: '{supply, order_edge_supply}' ); + // Рекурсивная фильтрации соединений + recursive_connections_filtration: + + // Инициализация статуса об изменении списка поставок + $changed = false; + + // Инициализация глобального буфера поставок + $buffer_global = []; // Разделение поставок по типам доставки - // foreach ($connections as $key => &$connection) { - // // Перебор поставок + foreach ($connections as &$connection) { + // Перебор поставок - // $connection - // } + if (count($connection['order_edge_supply'] ?? []) > 1) { + // Поставок более чем одна + + // Инициализация (выбор значения для фильтрации) + $target_dlvr_type = reset($connection['order_edge_supply'])['dlvr']['type'] ?? 'auto'; + + // Инициализация буфера поставок + $buffer = $connection; + unset($buffer['order_edge_supply']); + + foreach ($connection['order_edge_supply'] as $key => &$order_edge_supply) { + // Перебор рёбер: ЗАКАЗ -> ПОСТАВКА + + // if ((empty($order_edge_supply['dlvr']['type']) && $target_dlvr_type === 'auto') + // || (isset($order_edge_supply['dlvr']['type']) && $order_edge_supply['dlvr']['type'] !== $target_dlvr_type) + // ) { + if ((isset($order_edge_supply['dlvr']['type']) && $order_edge_supply['dlvr']['type'] === $target_dlvr_type) + || (empty($order_edge_supply['dlvr']['type']) && $target_dlvr_type === 'auto')) { + // Тип доставки для одной поставки отличается + + // Запись в буфер + $buffer['order_edge_supply'][$key] = $order_edge_supply; + + // Удаление из списка + unset($connection['order_edge_supply'][$key]); + + // Перезапись статуса + $changed = true; + } + } + + // Запись из буфера в глобальный буфер + $buffer_global[] = $buffer; + } + } + + $connections = array_merge($connections, $buffer_global); + + // if ($changed) goto recursive_connections_filtration; // Инициализация реестра дубликатов $registry = []; @@ -337,7 +383,7 @@ class Order extends Document implements DocumentInterface if (in_array([ 'catn' => $connection['supply']['catn'], - 'type' => $connection['order_edge_supply'][0]['dlvr']['type'] ?? 'auto' + 'type' => $type = reset($connection['order_edge_supply'])['dlvr']['type'] ?? 'auto' ], $registry)) { // Если данная поставка найдена в реестре @@ -348,29 +394,23 @@ class Order extends Document implements DocumentInterface continue; } - // Инициализация - $amount = 0; - // Повторный перебор для поиска дубликатов foreach ($connections as &$connection_for_check) { if ($connection == $connection_for_check) { // Найден дубликат - - // Постинкрементация счётчика - $amount++; - // Запись в реестр - $registry[] = [ + $registry[$key] = [ 'catn' => $connection_for_check['supply']['catn'], - 'type' => $connection['order_edge_supply'][0]['dlvr']['type'] ?? 'auto' + 'type' => $type ]; } } - // Запись количества для заказа - $connection['amount'] = $amount; + // Запись количества заказанных поставок + $connection['amount'] = count($connection['order_edge_supply']); } + // Инициализация дополнительных данных foreach ($connections as $key => &$connection) { // Перебор поставок @@ -397,7 +437,7 @@ class Order extends Document implements DocumentInterface // Поиск привязанного товара $connection['product'] = Product::searchBySupplyId($connection['supply']['_id']); - if (empty($connection['order_edge_supply']['dlvr']) || $connection['order_edge_supply']['dlvr']['type'] === 'auto') { + if (empty(reset($connection['order_edge_supply'])['dlvr']['type']) || reset($connection['order_edge_supply'])['dlvr']['type'] === 'auto') { // Доставка автоматическая try { @@ -428,7 +468,7 @@ class Order extends Document implements DocumentInterface try { // Инициализация доставки Dellin (самолётом) - $connection['delivery']['avia'] = Dellin::calcDeliveryAdvanced( + $connection['delivery'] = Dellin::calcDeliveryAdvanced( $connection['account']['opts']['delivery_from_terminal'], yii::$app->user->identity->opts['delivery_to_terminal'], (int) ($connection['product']['wght'] ?? 0), @@ -439,7 +479,7 @@ class Order extends Document implements DocumentInterface avia: true ); } catch (Exception $e) { - $connection['delivery']['avia']['error'] = true; + $connection['delivery']['error'] = true; // var_dump($e->getMessage()); // var_dump($e->getTrace()); @@ -449,7 +489,7 @@ class Order extends Document implements DocumentInterface } // Запись цены (цена поставки + цена доставки + наша наценка) - $connection['cost']['avia'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['avia']['price']['all'] ?? $connection['delivery']['avia']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0; + $connection['cost'] = ($cost['ЦенаЗаЕдиницу'] ?? $connection['supply']->onec['Цены']['Цена']['ЦенаЗаЕдиницу']) + ($connection['delivery']['price']['all'] ?? $connection['delivery']['price']['one'] ?? 0) + ($settings['increase'] ?? 0) ?? 0; } // Запись валюты diff --git a/mirzaev/skillparts/system/views/cart/index.php b/mirzaev/skillparts/system/views/cart/index.php index 86de859..0030a80 100644 --- a/mirzaev/skillparts/system/views/cart/index.php +++ b/mirzaev/skillparts/system/views/cart/index.php @@ -43,6 +43,9 @@ use DateTime; if (isset($connection['delivery']['error'])) { // Не удалось рассчитать доставку + // Инициализация индикатора + $delivery_icon = ''; + // Инициализация времени $delivery = '?'; @@ -51,10 +54,19 @@ use DateTime; } else { // Удалось рассчитать доставку + // Инициализация типа доставки + $delivery_type = reset($connection['order_edge_supply'])['dlvr']['type'] ?? 'auto'; + + // Инициализация индикатора + $delivery_icon = match ($delivery_type) { + 'avia' => '', + default => '' + }; + // Инициализация времени try { $delivery_converted = DateTime::createFromFormat('Y-m-d H:i:s', $connection['delivery']['orderDates']['giveoutFromOspReceiver'])->getTimestamp(); - } catch(Exception $e) { + } catch (Exception $e) { $delivery_converted = DateTime::createFromFormat('Y-m-d', $connection['delivery']['orderDates']['arrivalToOspReceiver'])->getTimestamp(); } $delivery = ceil(($delivery_converted - time()) / 60 / 60 / 24) + 1; @@ -83,7 +95,7 @@ use DateTime;
- $delivery дн +

$delivery_icon $delivery дн

$cost