From: marina Date: Thu, 5 Jun 2025 21:30:59 +0000 (+0300) Subject: ERP-360 Сборка страницы автопм X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=282532307a2eabb3aa8f369608202b14e2f45693;p=erp24_rep%2Fyii-erp24%2F.git ERP-360 Сборка страницы автопм --- diff --git a/erp24/controllers/AutoPlannogrammaController.php b/erp24/controllers/AutoPlannogrammaController.php index 38f87910..eab7c55b 100644 --- a/erp24/controllers/AutoPlannogrammaController.php +++ b/erp24/controllers/AutoPlannogrammaController.php @@ -8,6 +8,7 @@ use yii\db\Expression; use yii\db\Query; use yii\helpers\ArrayHelper; use yii_app\records\CityStore; +use yii_app\records\CityStoreParams; use yii_app\services\AutoPlannogrammaService; class AutoPlannogrammaController extends BaseController @@ -34,21 +35,21 @@ class AutoPlannogrammaController extends BaseController new Expression(" CASE WHEN category ILIKE 'срезка' THEN 'Срезка' - WHEN category ILIKE 'горшечные растения' THEN 'Горшечные растения' + WHEN category ILIKE 'горшечные_растения' THEN 'Горшечные растения' WHEN category ILIKE 'сухоцветы' THEN 'Сухоцветы' ELSE 'Остальные категории' END AS category "), 'subcategory', - new Expression('json_agg(name) AS products'), ]) + ->andWhere(['is not', 'subcategory', null]) ->from('products_1c_nomenclature') ->groupBy(['category', 'subcategory']) ->orderBy([ new Expression(" CASE WHEN category ILIKE 'срезка' THEN 1 - WHEN category ILIKE 'горшечные растения' THEN 2 + WHEN category ILIKE 'горшечные_растения' THEN 2 WHEN category ILIKE 'сухоцветы' THEN 3 ELSE 4 END @@ -69,142 +70,73 @@ class AutoPlannogrammaController extends BaseController ]); } - public function actionCalculating() + public function actionGetProducts(string $category, string $subcategory): array { - $request = Yii::$app->request; - $filters = [ - 'category' => $request->get('category'), - 'subcategory' => $request->get('subcategory'), - 'product_name' => $request->get('product_name'), - 'store_id' => $request->get('store_id'), - 'plan_date' => $request->get('plan_date'), - 'type' => $request->get('type'), - ]; - $dataProvider = new ArrayDataProvider([ - 'allModels' => [], - 'pagination' => ['pageSize' => 100], - ]); + Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; - if (!empty($filters['plan_date'])) { - $service = new AutoPlannogrammaService(); - $dataProvider = new ArrayDataProvider([ - 'allModels' => $service->calculateFullGoalChain($filters), - 'pagination' => ['pageSize' => 100], - ]); - } - - return $this->render('calculating', [ - 'dataProvider' => $dataProvider, - 'filters' => $filters, - ]); + return [ + [ + 'name' => 'Роза Эквадор 60', + 'guid' => '74876785y85', + 'values' => [ + ['count' => 42, + 'store_id' => 1, + ], + [ + 'count' => 13, + 'store_id' => 2, + ], + ] + ], + [ + 'name' => 'Роза Эквадор 50', + 'guid' => '74876e785y85', + 'values' => [ + ['count' => 2, + 'store_id' => 1, + ], + [ + 'count' => 1, + 'store_id' => 2, + ], + ] + ], + ]; } - public function actionControl() + public function actionGetVisibleStores() { - $filters = Yii::$app->request->get(); - $params = []; - $conditions = []; + Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; - if (!empty($filters['product_name'])) { - $conditions[] = 'p1n.name LIKE :product_name'; - $params[':product_name'] = '%' . $filters['product_name'] . '%'; - } - - if (!empty($filters['category'])) { - $conditions[] = 'p1n.category = :category'; - $params[':category'] = $filters['category']; - } - - if (!empty($filters['subcategory'])) { - $conditions[] = 'p1n.subcategory = :subcategory'; - $params[':subcategory'] = $filters['subcategory']; - } - - if (!empty($filters['city_name'])) { - $conditions[] = 'c.name LIKE :city_name'; - $params[':city_name'] = '%' . $filters['city_name'] . '%'; - } + $filters = Yii::$app->request->get(); - if (!empty($filters['plan_date'])) { - $date = \DateTime::createFromFormat('d-m-Y', $filters['plan_date']); - if ($date) { - $startDate = $date->format('Y-m-d'); - $endDate = $date->modify('+1 month')->format('Y-m-d'); - - if ($filters['type'] === 'writeOffs') { - $conditions[] = 'DATE(w.date) >= :start_date'; - $conditions[] = 'DATE(w.date) < :end_date'; - } else { - $conditions[] = 'DATE(s.date) >= :start_date'; - $conditions[] = 'DATE(s.date) < :end_date'; - } + $query = CityStoreParams::find() + ->alias('p') + ->joinWith(['store s']) + ->select('p.store_id') + ->where(['s.visible' => CityStore::IS_VISIBLE]); + + $fields = [ + 'city' => 's.city_id', + 'storeType' => 's.type_id', + 'territorialManager' => 's.territorial_manager_id', + 'region' => 's.region_id', + 'district' => 's.district_id', + 'bushChefFlorist' => 's.bush_chef_florist_id', + ]; - $params[':start_date'] = $startDate; - $params[':end_date'] = $endDate; + foreach ($fields as $param => $column) { + if (!empty($filters[$param])) { + $query->andWhere([$column => $filters[$param]]); } } - $where = !empty($conditions) ? 'WHERE ' . implode(' AND ', $conditions) : ''; - - if (isset($filters['type']) && $filters['type'] === 'writeOffs') { - $query = Yii::$app->db->createCommand(" - SELECT - c.name AS city_name, - p1n.category, - p1n.subcategory, - item ->> 'product_id' AS product_id, - p1n.name AS product_name, - SUM(CAST(item ->> 'quantity' AS NUMERIC)) AS count, - SUM(CAST(item ->> 'summ' AS NUMERIC)) AS sum - FROM write_offs w - JOIN export_import_table ex ON ex.export_val = w.store_id - JOIN city_store c ON c.id = ex.entity_id - JOIN LATERAL jsonb_array_elements(w.items::jsonb) AS item ON true - LEFT JOIN products_1c_nomenclature p1n ON p1n.id = item ->> 'product_id' - $where - GROUP BY w.store_id, c.name, p1n.category, p1n.subcategory, product_id, p1n.name - ORDER BY w.store_id, p1n.category, p1n.subcategory, p1n.name - ")->bindValues($params)->queryAll(); - } else { - $query = Yii::$app->db->createCommand(" - SELECT - c.name AS city_name, - p1n.name AS product_name, - p1n.category, - p1n.subcategory, - SUM(CASE - WHEN s.operation = 'Продажа' THEN sp.quantity - WHEN s.operation = 'Возврат' THEN -sp.quantity - ELSE 0 - END) AS count, - SUM(CASE - WHEN s.operation = 'Продажа' THEN sp.summ - WHEN s.operation = 'Возврат' THEN -sp.summ - ELSE 0 - END) AS sum - FROM sales s - LEFT JOIN sales_products sp ON sp.check_id = s.id - LEFT JOIN products_1c_nomenclature p1n ON p1n.id = sp.product_id - LEFT JOIN export_import_table ex ON ex.export_val = store_id_1c - LEFT JOIN city_store c ON c.id = entity_id - $where - GROUP BY p1n.name, p1n.category, p1n.subcategory, c.name, c.id - ORDER BY c.id DESC, category, subcategory, p1n.name - ")->bindValues($params)->queryAll(); - } + return ['store_ids' => $query->column()]; + } - $dataProvider = new ArrayDataProvider([ - 'allModels' => $query, - 'pagination' => ['pageSize' => 20], - ]); - return $this->render('control', [ - 'dataProvider' => $dataProvider, - 'filters' => $filters, - ]); - } public function action1() { @@ -223,7 +155,6 @@ class AutoPlannogrammaController extends BaseController 'pagination' => ['pageSize' => 100], ]); - // Обработка даты на год и месяц if (!empty($filters['year']) && !empty($filters['month'])) { $filters['plan_date'] = $filters['year'] . '-' . str_pad($filters['month'], 2, '0', STR_PAD_LEFT) . '-01'; diff --git a/erp24/migrations/m250605_201027_create_autoplannagramma_table.php b/erp24/migrations/m250605_201027_create_autoplannagramma_table.php new file mode 100644 index 00000000..34a46167 --- /dev/null +++ b/erp24/migrations/m250605_201027_create_autoplannagramma_table.php @@ -0,0 +1,38 @@ +createTable('{{%autoplannogramma}}', [ + 'id' => $this->primaryKey(), + 'week' => $this->integer()->comment('Неделя'), + 'year' => $this->integer()->comment('Год'), + 'product_id' => $this->string()->comment('GUID продукта'), + 'store_id' => $this->integer()->comment('ID магазина'), + 'capacity_type' => $this->integer()->comment('Тип планограммы'), + 'auto_forecast' => $this->boolean()->comment('Прогнозированное значение'), + 'quantity' => $this->integer()->comment('Количество'), + 'created_at' => $this->dateTime()->comment('Дата создания'), + 'updated_at' => $this->dateTime()->comment('Дата обновления'), + 'created_by' => $this->integer()->comment('Автор создания'), + 'updated_by' => $this->integer()->comment('Автор обновления'), + ]); + } + + /** + * {@inheritdoc} + */ + public function safeDown() + { + $this->dropTable('{{%autoplannogramma}}'); + } +} diff --git a/erp24/views/auto-plannogramma/calculating.php b/erp24/views/auto-plannogramma/calculating.php deleted file mode 100644 index d267d77b..00000000 --- a/erp24/views/auto-plannogramma/calculating.php +++ /dev/null @@ -1,109 +0,0 @@ - - -
- 'get']); ?> -
-
- field(new \yii\base\DynamicModel(['category' => $filters['category'] ?? '']), 'category')->widget(Select2::class, [ - 'data' => ArrayHelper::map( - Products1cNomenclature::find()->select('category')->distinct()->asArray()->all(), - 'category', - 'category' - ), - 'options' => ['placeholder' => 'Категория', 'name' => 'category'], - 'pluginOptions' => ['allowClear' => true], - ])->label('Категория') ?> -
-
- field(new \yii\base\DynamicModel(['subcategory' => $filters['subcategory'] ?? '']), 'subcategory')->widget(Select2::class, [ - 'data' => ArrayHelper::map( - Products1cNomenclature::find()->select('subcategory')->distinct()->asArray()->all(), - 'subcategory', - 'subcategory' - ), - 'options' => ['placeholder' => 'Подкатегория', 'name' => 'subcategory'], - 'pluginOptions' => ['allowClear' => true], - ])->label('Подкатегория') ?> -
-
- field(new \yii\base\DynamicModel(['product_name' => $filters['product_name'] ?? '']), 'product_name')->widget(Select2::class, [ - 'data' => ArrayHelper::map( - Products1cNomenclature::find()->select('name')->distinct()->asArray()->all(), - 'name', - 'name' - ), - 'options' => ['placeholder' => 'Название товара', 'name' => 'product_name'], - 'pluginOptions' => ['allowClear' => true], - ])->label('Товар') ?> -
-
- field(new \yii\base\DynamicModel(['store_id' => $filters['store_id'] ?? '']), 'store_id')->widget(Select2::class, [ - 'data' => ArrayHelper::map( - CityStore::findAll(['visible' => CityStore::IS_VISIBLE]), - 'id', - 'name' - ), - 'options' => ['placeholder' => 'Магазин', 'name' => 'store_id'], - 'pluginOptions' => ['allowClear' => true], - ])->label('Магазин') ?> -
-
- field(new \yii\base\DynamicModel(['plan_date' => $filters['plan_date'] ?? '']), 'plan_date')->widget(DatePicker::class, [ - 'pluginOptions' => [ - 'autoclose' => true, - 'format' => 'dd-mm-yyyy', - ], - 'options' => [ - 'class' => 'form-control', - 'placeholder' => 'Плановая дата', - 'name' => 'plan_date', - ], - ])->label('Плановая дата') ?> -
-
- field(new \yii\base\DynamicModel(['type' => $filters['type'] ?? '']), 'type')->widget(Select2::class, [ - 'data' => [ - 'writeOffs' => 'Списания', - 'sales' => 'Продажи' - ], - 'options' => ['placeholder' => 'Тип', 'name' => 'type'], - 'pluginOptions' => ['allowClear' => true], - ])->label('По дефолту продажи!') ?> -
-
- 'btn btn-primary']) ?> -
-
- 'btn btn-default']) ?> -
-
- - -
- - $dataProvider, - 'columns' => [ - 'category', - 'subcategory', - 'product_name', - 'store_id', - 'store_name', - [ - 'attribute' => 'goal', - 'label' => 'План закупок (RUB)', - ], - ], -]); ?> diff --git a/erp24/views/auto-plannogramma/control.php b/erp24/views/auto-plannogramma/control.php deleted file mode 100644 index 67e46474..00000000 --- a/erp24/views/auto-plannogramma/control.php +++ /dev/null @@ -1,118 +0,0 @@ -
- 'get']); ?> -
-
- 'category', - 'value' => $filters['category'] ?? '', - 'data' => ArrayHelper::map( - Products1cNomenclature::find()->select('category')->distinct()->orderBy('category')->asArray()->all(), - 'category', - 'category' - ), - 'options' => ['placeholder' => 'Категория'], - 'pluginOptions' => ['allowClear' => true], - ]) ?> -
- -
- 'subcategory', - 'value' => $filters['subcategory'] ?? '', - 'data' => ArrayHelper::map( - Products1cNomenclature::find()->select('subcategory')->distinct()->orderBy('subcategory')->asArray()->all(), - 'subcategory', - 'subcategory' - ), - 'options' => ['placeholder' => 'Подкатегория'], - 'pluginOptions' => ['allowClear' => true], - ]) ?> -
-
- 'product_name', - 'value' => $filters['product_name'] ?? '', - 'data' => ArrayHelper::map( - Products1cNomenclature::find()->select('name')->distinct()->orderBy('name')->asArray()->all(), - 'name', - 'name' - ), - 'options' => ['placeholder' => 'Товар'], - 'pluginOptions' => ['allowClear' => true], - ]) ?> -
- - -
- 'city_name', - 'value' => $filters['city_name'] ?? '', - 'data' => ArrayHelper::map( - CityStore::find()->select(['name'])->distinct()->orderBy('name')->asArray()->all(), - 'name', - 'name' - ), - 'options' => ['placeholder' => 'Магазин'], - 'pluginOptions' => ['allowClear' => true], - ]) ?> -
- -
- 'plan_date', - 'value' => $filters['plan_date'] ?? '', - 'pluginOptions' => [ - 'autoclose' => true, - 'format' => 'dd-mm-yyyy', - ], - 'options' => [ - 'class' => 'form-control', - 'placeholder' => 'Плановая дата', - ], - ]) ?> -
- -
- 'type', - 'value' => $filters['type'] ?? '', - 'data' => [ - 'writeOffs' => 'Списания', - 'sales' => 'Продажи' - ], - 'options' => ['placeholder' => 'Тип'], - 'pluginOptions' => ['allowClear' => true], - ]) ?> -
- - -
- 'btn btn-primary']) ?> -
-
- 'btn btn-default']) ?> -
-
- -
- - $dataProvider, - 'columns' => [ - 'category', - 'subcategory', - ['attribute' => 'product_name', 'label' => 'Товар'], - ['attribute' => 'city_name', 'label' => 'Магазин'], - ['attribute' => 'count', 'label' => 'Кол-во'], - ['attribute' => 'sum', 'label' => 'Сумма'], - ], -]) ?> diff --git a/erp24/views/auto-plannogramma/index.php b/erp24/views/auto-plannogramma/index.php index 7201c532..daf2cd11 100644 --- a/erp24/views/auto-plannogramma/index.php +++ b/erp24/views/auto-plannogramma/index.php @@ -4,6 +4,7 @@ use kartik\grid\GridView; use kartik\select2\Select2; use yii\helpers\ArrayHelper; use yii\helpers\Html; +use yii\web\View; use yii_app\helpers\DateHelper; use yii_app\records\Admin; use yii_app\records\AdminGroup; @@ -18,7 +19,9 @@ use yii\jui\Accordion; use yii\data\ArrayDataProvider; -$tooltipText = "Оффлайн: 50 Флаумак (off-line): 20 Флаумак (on-line): 10 Флаумак (market): 10 Изумительная (off-line): 30 Списания: 20"; ?> +$tooltipText = "Оффлайн: 50 Флаумак (off-line): 20 Флаумак (on-line): 10 Флаумак (market): 10 Изумительная (off-line): 30 Списания: 20"; +$this->registerJsFile('/js/autoplannogramma/autoplannogramma.js', ['position' => View::POS_END]); +?>

@@ -114,7 +117,9 @@ $tooltipText = "Оффлайн: 50 Флаумак (off-line): 20 Фла
-
+
+ 'btn btn-reset btn-warning', 'style' => 'width:100%']); ?> +
@@ -167,130 +172,56 @@ $tooltipText = "Оффлайн: 50 Флаумак (off-line): 20 Фла
- + 'writing-mode: sideways-lr; text-align: center; white-space: nowrap; - font-weight: bold; transform-origin: left bottom; padding-right: 7%;' + font-weight: bold; transform-origin: left bottom; padding-right: 7%;' ]) ?> - + - + - foreach ($groupedCategories as $category => $subcategories): ?> + $subcategories): ?> ▲ + $storeName): ?> + + - $products): ?> + - + ▶ + $storeName): ?> + + - - - - - - - - - - - -
- 'btn btn-primary input', - 'data-bs-toggle' => 'tooltip', - 'data-bs-placement' => 'top', - 'title' => $tooltipText, - ]) ?> - -
- - - -
-