From: marina Date: Tue, 4 Mar 2025 13:47:47 +0000 (+0300) Subject: ERP-329 Новый интерфейс для работы с заказами мп и амо X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=eb9271740f48da8091d8a77db8b143114fb70e67;p=erp24_rep%2Fyii-erp24%2F.git ERP-329 Новый интерфейс для работы с заказами мп и амо --- diff --git a/erp24/controllers/MarketplaceOrdersController.php b/erp24/controllers/MarketplaceOrdersController.php index abc78491..06d36f02 100644 --- a/erp24/controllers/MarketplaceOrdersController.php +++ b/erp24/controllers/MarketplaceOrdersController.php @@ -237,17 +237,10 @@ class MarketplaceOrdersController extends Controller public function actionAllOrders() { - $data = OrdersUnion::getOrders(); - - $dataProvider = new ArrayDataProvider([ - 'allModels' => $data, - 'pagination' => [ - 'pageSize' => 20, - ], - ]); + $data = OrdersUnion::getOrders(Yii::$app->request->get()); return $this->render('all-orders', [ - 'dataProvider' => $dataProvider, + 'dataProvider' => $data, ]); } } diff --git a/erp24/records/OrdersUnion.php b/erp24/records/OrdersUnion.php index b1187127..f59b2e38 100644 --- a/erp24/records/OrdersUnion.php +++ b/erp24/records/OrdersUnion.php @@ -17,7 +17,7 @@ class OrdersUnion extends ActiveRecord return ['id']; } - public static function getOrders() + public static function getOrders($params = []) { $queryAmo = (new Query()) ->select([ @@ -30,28 +30,27 @@ 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', + '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 + ") ]) ->from('orders_amo o'); - $queryMarketplace = (new Query()) ->select([ new \yii\db\Expression("'marketplace' AS source"), @@ -59,48 +58,67 @@ class OrdersUnion extends ActiveRecord 'mod.delivery_end AS delivery_date', 'mo.status_id', 'mo.store_id', - 'mo.payment_method', - 'mo.total', + 'mo.payment_method AS payment_type_id', + 'mo.total AS price', 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, -- Берём сумму всех количеств из components - 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, + '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") ]) ->from(['mo' => 'marketplace_orders']) ->leftJoin(['mod' => 'marketplace_order_delivery'], 'mo.id = mod.order_id'); + $query = (new Query()) + ->from(['orders' => $queryAmo->union($queryMarketplace, true)]); + + // Фильтрация данных + if (!empty($params['source'])) { + $query->andWhere(['orders.source' => $params['source']]); + } + + if (!empty($params['delivery_date'])) { + $query->andWhere(['orders.delivery_date' => $params['delivery_date']]); + } + + if (!empty($params['store_id'])) { + $query->andWhere(['orders.store_id' => (int) $params['store_id']]); + } - return (new Query()) - ->limit(20) - ->where(['!=', 'source', 'amo']) - ->from(['orders' => $queryAmo->union($queryMarketplace, true)]) - ->all(); + return new \yii\data\ArrayDataProvider([ + 'allModels' => $query->all(), + 'pagination' => [ + 'pageSize' => 20, + ], + 'sort' => [ + 'attributes' => ['id', 'delivery_date', 'store_id', 'price'], + ], + ]); } public function attributes() diff --git a/erp24/views/marketplace-orders/all-orders.php b/erp24/views/marketplace-orders/all-orders.php index 32b9396b..8308ea59 100644 --- a/erp24/views/marketplace-orders/all-orders.php +++ b/erp24/views/marketplace-orders/all-orders.php @@ -1,18 +1,61 @@ title = 'Все заказы'; ?>

title) ?>

+
+ 'get', + 'action' => ['all-orders'], + + ]); ?> + +
+ 'source', + 'value' => Yii::$app->request->get('source'), + 'data' => ['amo' => 'Amo', 'marketplace' => 'Marketplace'], + 'options' => ['placeholder' => 'Выберите источник'], + 'pluginOptions' => ['allowClear' => true], + ]); ?> + + 'delivery_date', + 'value' => Yii::$app->request->get('delivery_date'), + 'options' => ['placeholder' => 'Выберите дату'], + 'pluginOptions' => [ + 'format' => 'yyyy-mm-dd', + 'autoclose' => true, + ], + ]); ?> + + 'store_id', + 'value' => Yii::$app->request->get('store_id'), + 'data' => [1 => 'Магазин 1', 2 => 'Магазин 2', 3 => 'Магазин 3'], // Должны быть реальные магазины + 'options' => ['placeholder' => 'Выберите магазин'], + 'pluginOptions' => ['allowClear' => true], + ]); ?> + +
+ 'btn btn-primary']) ?> + 'btn btn-default']) ?> +
+
+ + +
+ $dataProvider, - 'filterModel' => null, 'columns' => [ 'id', [ @@ -48,41 +91,20 @@ $this->title = 'Все заказы'; 'label' => 'Состав', 'format' => 'raw', 'value' => function ($model) { - $products = \yii\helpers\Json::decode($model['products_json']); // Декодируем JSON - if (empty($products) || !is_array($products)) { + $products = json_decode($model['products_json'], true); + if (empty($products)) { return '(Нет данных)'; } $output = ''; - foreach ($products as $product) { - $name = htmlspecialchars($product['name'] ?? 'Без названия'); - $output .= "

{$name}

"; // Название букета заголовком - - $output .= ''; - $output .= ' - - - - '; - - if (!empty($product['items']) && is_array($product['items'])) { - foreach ($product['items'] as $item) { - $itemName = htmlspecialchars($item['name'] ?? 'Без названия'); - $itemQuantity = htmlspecialchars($item['quantity'] ?? '0'); - $itemPrice = htmlspecialchars($item['price'] ?? '0'); - - $output .= " - - - - "; - } + $output .= "

{$product['name']}

"; + $output .= '
НазваниеКол-воЦена
{$itemName}{$itemQuantity}{$itemPrice} ₽
'; + foreach ($product['items'] as $item) { + $output .= ""; } - $output .= '
НазваниеКол-воЦена
{$item['name']}{$item['quantity']}{$item['price']} ₽
'; } - return $output; } ],