From: marina Date: Tue, 11 Mar 2025 06:32:45 +0000 (+0300) Subject: ERP-329 Новый интерфейс для работы с заказами мп и амо X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=0e5eac89531754b73b6314833a6a38e17183b5f0;p=erp24_rep%2Fyii-erp24%2F.git ERP-329 Новый интерфейс для работы с заказами мп и амо --- diff --git a/erp24/controllers/MarketplaceOrdersController.php b/erp24/controllers/MarketplaceOrdersController.php index 06d36f02..b1a1a8e9 100644 --- a/erp24/controllers/MarketplaceOrdersController.php +++ b/erp24/controllers/MarketplaceOrdersController.php @@ -6,6 +6,8 @@ use app\records\OrdersUnion; use Yii; use yii\base\Exception; use yii\data\ArrayDataProvider; +use yii\db\Expression; +use yii\db\Query; use yii_app\records\MarketplaceOrders; use yii_app\records\MarketplaceOrdersSearch; use yii\web\Controller; @@ -243,4 +245,41 @@ class MarketplaceOrdersController extends Controller 'dataProvider' => $data, ]); } + + public function actionGetBouquetComposition($order_id, $source) + { + if ($source == 'amo') { + $query = (new \yii\db\Query()) + ->select([ + 'guid' => new \yii\db\Expression("item->>'guid'"), + 'name' => new \yii\db\Expression("item->>'name'"), + 'price' => new \yii\db\Expression("(item->>'price')::NUMERIC"), + 'quantity' => new \yii\db\Expression("(item->>'quantity')::NUMERIC") + ]) + ->from(['orders_amo']) + ->leftJoin(['bouquet' => new \yii\db\Expression('jsonb_array_elements(products_json::jsonb)')], 'TRUE') // первый JSON-массив + ->leftJoin(['item' => new \yii\db\Expression('jsonb_array_elements(bouquet->\'items\')')], 'TRUE') // второй JSON-массив в элементе + ->where(['id' => $order_id]) // фильтр по id + ->all(); + } else { + $query = (new Query()) + ->select([ + new Expression("item->>'guid' AS guid"), + new Expression("item->>'name' AS name"), + new Expression("(item->>'price')::NUMERIC AS price"), + new Expression("(item->>'quantity')::NUMERIC AS quantity") + ]) + ->from(new Expression(" + marketplace_order_items moi + LEFT JOIN products_1c p1c ON moi.offer_id = p1c.articule + LEFT JOIN LATERAL jsonb_array_elements( + COALESCE(NULLIF(p1c.components, '')::jsonb, '[]'::jsonb) + ) AS item ON TRUE + ")) + ->where(['moi.order_id' => $order_id]) + ->all(); + } + + return $this->asJson($query); + } } diff --git a/erp24/records/OrdersUnion.php b/erp24/records/OrdersUnion.php index 0bc637e8..6e16f183 100644 --- a/erp24/records/OrdersUnion.php +++ b/erp24/records/OrdersUnion.php @@ -36,24 +36,13 @@ class OrdersUnion extends ActiveRecord 'price', 'delivery_adress as delivery_address', new \yii\db\Expression(" - COALESCE(( - SELECT jsonb_agg(jsonb_build_object( - 'name', bouquet->>'name', - 'price', bouquet->>'price', - 'quantity', bouquet->>'count', - 'items', ( - SELECT jsonb_agg(jsonb_build_object( - 'guid', item->>'guid', - 'name', item->>'name', - 'price', (item->>'price')::NUMERIC, - 'quantity', (item->>'quantity')::NUMERIC - )) - FROM jsonb_array_elements(bouquet->'items') AS item - ) - )) - FROM jsonb_array_elements(COALESCE(NULLIF(o.products_json, '')::jsonb, '[]'::jsonb)) AS bouquet - ), '[]'::jsonb) AS products_json - ") + COALESCE(( + SELECT jsonb_agg(jsonb_build_object( + 'name', bouquet->>'name' + )) + FROM jsonb_array_elements(COALESCE(NULLIF(o.products_json, '')::jsonb, '[]'::jsonb)) AS bouquet + ), '[]'::jsonb) AS products_json + ") ]) ->from('orders_amo o'); @@ -61,11 +50,11 @@ class OrdersUnion extends ActiveRecord $queryMarketplace = (new Query()) ->select([ new \yii\db\Expression(" - CASE - WHEN ms.warehouse_id = 2 THEN 'yandex' - WHEN ms.warehouse_id = 1 THEN 'flowwow' - ELSE 'Marketplace' - END AS source"), + CASE + WHEN ms.warehouse_id = 2 THEN 'yandex' + WHEN ms.warehouse_id = 1 THEN 'flowwow' + ELSE 'Marketplace' + END AS source"), 'mo.id', 'mod.delivery_end AS delivery_date', 'mo.status_id', @@ -74,39 +63,24 @@ class OrdersUnion extends ActiveRecord 'mo.total', new \yii\db\Expression("NULLIF(concat(country, ' ', city, ' ', street, ' ', house, ' ', apartment), '')::TEXT AS delivery_address"), new \yii\db\Expression("( - SELECT jsonb_agg(jsonb_build_object( - 'name', bouquet.name, - 'price', bouquet.price, - 'quantity', bouquet.quantity, - 'items', COALESCE(items_list, '[]'::jsonb) - )) - FROM ( - SELECT - p1c.name, - pd.price, - SUM(items.value::INTEGER) AS quantity, - jsonb_agg(jsonb_build_object( - 'guid', p2c.id::TEXT, - 'name', p2c.name, - 'price', pd.price, - 'quantity', items.value::INTEGER - )) FILTER (WHERE p2c.id IS NOT NULL) AS items_list - FROM erp24.products_1c p1c - JOIN marketplace_order_items moi ON p1c.articule = moi.offer_id - LEFT JOIN LATERAL jsonb_each_text( - COALESCE(NULLIF(p1c.components, '')::jsonb, '{}'::jsonb) - ) AS items ON true - LEFT JOIN erp24.products_1c p2c ON p2c.id::TEXT = items.key - LEFT JOIN prices_dynamic pd ON p2c.id = pd.product_id - WHERE moi.order_id = mo.id - GROUP BY p1c.name, pd.price - ) AS bouquet - ) AS products_json") + SELECT jsonb_agg(jsonb_build_object( + 'name', bouquet.name + )) + FROM ( + SELECT + p1c.name + FROM erp24.products_1c p1c + JOIN marketplace_order_items moi ON p1c.articule = moi.offer_id + WHERE moi.order_id = mo.id + GROUP BY p1c.name + ) AS bouquet + ) AS products_json") ]) ->from(['mo' => 'marketplace_orders']) ->leftJoin(['mod' => 'marketplace_order_delivery'], 'mo.id = mod.order_id') ->leftJoin(['ms' => 'marketplace_store'], 'ms.warehouse_guid::TEXT = mo.warehouse_guid::TEXT'); + $query = (new Query()) ->andFilterWhere(['source' => $params['source'] ?? null]) ->andFilterWhere(['store_id' => $params['store_id'] ?? null]) diff --git a/erp24/views/marketplace-orders/all-orders.php b/erp24/views/marketplace-orders/all-orders.php index 9a4415c2..8d3a342c 100644 --- a/erp24/views/marketplace-orders/all-orders.php +++ b/erp24/views/marketplace-orders/all-orders.php @@ -12,6 +12,9 @@ use yii_app\records\MarketplaceStatus; use yii_app\records\OrdersAmo; $this->title = 'Все заказы'; + +$this->registerJsFile('/js/marketplace-orders/marketplace-orders.js', ['position' => \yii\web\View::POS_END]); +?> ?>

title) ?>

@@ -119,7 +122,7 @@ $this->title = 'Все заказы'; ], [ 'attribute' => 'products_json', - 'label' => 'Состав', + 'label' => 'Букеты', 'format' => 'raw', 'value' => function ($model) { $products = json_decode($model['products_json'], true); @@ -128,18 +131,28 @@ $this->title = 'Все заказы'; return '(Нет данных)'; } - $output = ''; + $output = ''; return $output; } ], + ], ]); ?>
diff --git a/erp24/web/js/marketplace-orders/marketplace-orders.js b/erp24/web/js/marketplace-orders/marketplace-orders.js new file mode 100644 index 00000000..cb371bc4 --- /dev/null +++ b/erp24/web/js/marketplace-orders/marketplace-orders.js @@ -0,0 +1,79 @@ +$(".toggle-composition").on("click", function () { + var button = $(this); + var orderId = button.data("id"); // Получаем ID заказа + var source = button.data("source"); // Получаем источник данных + + // Если уже открыто — скрываем + if (button.next(".composition-content").length) { + button.next(".composition-content").slideUp(300, function () { + $(this).remove(); + button.html("▼"); // Стрелка вниз + }); + return; + } + + $(".composition-content").remove(); + + $.ajax({ + url: "/marketplace-orders/get-bouquet-composition", + type: "GET", + data: { + order_id: orderId, + source: source + }, + beforeSend: function () { + button.html("⌛"); // Значок загрузки + }, + success: function (response) { + // Проверяем, есть ли данные + if (!response || response.length === 0 || response.every(item => !item.guid)) { + button.after(""); + button.next(".composition-content").slideDown(); + button.html("▼"); // Стрелка вниз + return; + } + + // Создаем HTML-таблицу + var tableHtml = ` + + `; + + // Вставляем таблицу после кнопки + button.after(tableHtml); + button.next(".composition-content").slideDown(); + button.html("▲"); // Стрелка вверх + }, + error: function () { + button.after(""); + button.next(".composition-content").slideDown(); + button.html("▼"); // Стрелка вниз + } + }); +});