From: fomichev Date: Tue, 27 May 2025 10:51:02 +0000 (+0300) Subject: Просмотр товаров по магазину учтенных в расчетах X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=fdcffe0cf6ea61709ed1a1195d8ae210553dc56a;p=erp24_rep%2Fyii-erp24%2F.git Просмотр товаров по магазину учтенных в расчетах --- diff --git a/erp24/controllers/AutoPlannogrammaController.php b/erp24/controllers/AutoPlannogrammaController.php index 19530b0e..e33f8b8f 100644 --- a/erp24/controllers/AutoPlannogrammaController.php +++ b/erp24/controllers/AutoPlannogrammaController.php @@ -9,6 +9,7 @@ use yii\db\Query; use yii\helpers\ArrayHelper; use yii_app\records\CityStore; use yii_app\records\MatrixBouquetForecast; +use yii_app\records\Products1c; use yii_app\services\AutoPlannogrammaService; use yii_app\services\StorePlanService; @@ -318,6 +319,130 @@ class AutoPlannogrammaController extends BaseController ]); } + public function action1_2() + { + $request = Yii::$app->request; + + $filters = [ + 'category' => $request->get('category'), + 'store_id' => $request->get('store_id'), + 'year' => $request->get('year'), + 'month' => $request->get('month'), + 'type' => $request->get('type'), + ]; + + $categoriesProvider = new ArrayDataProvider([ + 'allModels' => [], + 'pagination' => ['pageSize' => 50], + ]); + $productsProvider = new ArrayDataProvider([ + 'allModels' => [], + 'pagination' => ['pageSize' => 100], + ]); + + if (!empty($filters['year']) && !empty($filters['month'])) { + $filters['plan_date'] = sprintf( + '%04d-%02d-01', + $filters['year'], + $filters['month'] + ); + + $service = new AutoPlannogrammaService(); + $data = $service->getMonthCategoryShareOrWriteOff( + $filters['plan_date'], + $filters, + $filters['type'] + ); + // var_dump($data);die(); + $categoryRows = []; + $allProdIds = []; + + foreach ($data as $storeId => $categories) { + $storeName = CityStore::findOne($storeId)->name ?? null; + foreach ($categories as $row) { + $prodIds = array_filter( + array_map('trim', explode(',', $row['products_list'] ?? '')), + fn($v) => $v !== '' + ); + $prodCompIds = array_filter( + array_map('trim', explode(',', $row['products_components_list'] ?? '')), + fn($v) => $v !== '' + ); + $allProdIds = array_merge($allProdIds, $prodIds, $prodCompIds); + + $categoryRows[] = [ + 'store_id' => (string)$storeId, + 'store_name' => $storeName, + 'category' => $row['category'], + 'base_total_store' => $row['base_total_store'], + 'new_total_store' => $row['new_total_store'], + 'total_sum' => $row['total_sum'], + 'percent' => $row['percent'], + 'product_ids' => $allProdIds, + ]; + } + } + + $allProdIds = array_values(array_unique($allProdIds)); + // var_dump($allProdIds);die(); + if (!empty($allProdIds)) { + $products = Products1c::find() + ->select(['id', 'name', 'type', 'components']) + ->andWhere(['id' => $allProdIds]) + ->asArray() + ->indexBy('id') + ->all(); + } else { + $products = []; + } + //var_dump($products);die(); + $productsRows = []; + foreach ($categoryRows as &$row) { + $rowProducts = []; + foreach ($row['product_ids'] as $pid) { + if (isset($products[$pid])) { + $prod = $products[$pid]; + + $prod['category'] = $row['category']; + $rowProducts[] = $prod; + $productsRows[$pid] = $prod; + } + } + $row['products'] = $rowProducts; + unset($row['product_ids']); + } + unset($row); + + $categoryRows = array_filter($categoryRows, function($row) use ($filters) { + foreach ($filters as $key => $value) { + if (!$value || !isset($row[$key])) { + continue; + } + if (stripos((string)$row[$key], (string)$value) === false) { + return false; + } + } + return true; + }); + + + $categoriesProvider = new ArrayDataProvider([ + 'allModels' => array_values($categoryRows), + 'pagination' => ['pageSize' => 50], + ]); + $productsProvider = new ArrayDataProvider([ + 'allModels' => array_values($productsRows), + 'pagination' => ['pageSize' => 500], + ]); + } + + return $this->render('1_2', [ + 'categoriesProvider' => $categoriesProvider, + 'productsProvider' => $productsProvider, + 'filters' => $filters, + ]); + } + public function action2() { $request = Yii::$app->request; @@ -737,6 +862,7 @@ class AutoPlannogrammaController extends BaseController //var_dump($filters); die(); $service = new AutoPlannogrammaService(); $monthCategoryShare = $service->getMonthCategoryShareOrWriteOff($filters['plan_date'], $filters); + var_dump($monthCategoryShare);die(); $monthCategoryGoal = $service->getMonthCategoryGoal($monthCategoryShare, $filters['plan_date']); $monthSubcategoryShare = $service->getMonthSubcategoryShareOrWriteOff($filters['plan_date'], $filters); $monthSubcategoryGoal = $service->getMonthSubcategoryGoal($monthSubcategoryShare, $monthCategoryGoal); diff --git a/erp24/services/AutoPlannogrammaService.php b/erp24/services/AutoPlannogrammaService.php index 92eaf457..e5b28702 100644 --- a/erp24/services/AutoPlannogrammaService.php +++ b/erp24/services/AutoPlannogrammaService.php @@ -117,7 +117,8 @@ class AutoPlannogrammaService 'total_sum' => 'main.total_sum', 'percent' => new Expression('ROUND(CAST(main.total_sum AS DECIMAL) / NULLIF(totals.total, 0), 4)'), 'type' => new Expression(':type', ['type' => $type]), - 'totals_total' => 'totals.total' + 'totals_total' => 'totals.total', + 'products_list'=> 'main.products_list', ]) ->from([ 'main' => (new Query()) @@ -125,6 +126,7 @@ class AutoPlannogrammaService 'ex_entity_id' => 'ex.entity_id', 'category' => 'p1c.category', 'total_sum' => $weightedSumExpression, + 'products_list' => new Expression("string_agg(DISTINCT {$productAlias}.product_id::text, ',')"), ]) ->from($fromTable) ->leftJoin($productTableJoin, $productTableJoinCondition) @@ -163,7 +165,7 @@ class AutoPlannogrammaService $componentAdds = []; $componentAddsSumAll = []; - + $allComponentsProductIds = []; foreach ($storeIds as $storeId) { foreach ($months as $m => $weight) { [$year, $mon] = explode('-', $m); @@ -173,8 +175,11 @@ class AutoPlannogrammaService (int)$year, $type ); + foreach ($items as $it) { + $allComponentsProductIds[$storeId][] = $it['product_id']; + } $sums = $this->sumUnmarkedProductsComponentsByCategory($items, $type); - + $allComponentsProductIds[$storeId] = array_values(array_unique($allComponentsProductIds[$storeId])); foreach ($sums as $sumRow) { $sid = $sumRow['store_id']; $cat = $sumRow['category']; @@ -186,6 +191,8 @@ class AutoPlannogrammaService } } + + // var_dump($allComponentsProductIds); die(); $result = []; foreach ($rows as $r) { $sid = $r['store_id']; @@ -205,7 +212,9 @@ class AutoPlannogrammaService 'percent' => $percent, 'type' => $r['type'], 'new_total_store' => $newDenominator, - 'base_total_store' => $baseTotal + 'base_total_store' => $baseTotal, + 'products_list' => $r['products_list'], + 'products_components_list' => implode(',',$allComponentsProductIds[$sid]), ]; } diff --git a/erp24/views/auto-plannogramma/1_2.php b/erp24/views/auto-plannogramma/1_2.php new file mode 100644 index 00000000..49f5cf43 --- /dev/null +++ b/erp24/views/auto-plannogramma/1_2.php @@ -0,0 +1,117 @@ +
+ +

+ '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(['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(['month' => $filters['month'] ?? '']), 'month')->dropDownList(\yii_app\helpers\DateHelper::MONTH_NUMBER_NAMES, [ + 'prompt' => 'Месяц', + 'name' => 'month', + ])->label('Плановый месяц') ?> +
+ +
+ field(new \yii\base\DynamicModel(['year' => $filters['year'] ?? '']), 'year')->dropDownList(['2025' => 2025, '2026' => 2026], [ + 'prompt' => 'Год', + 'name' => 'year', + ])->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']) ?> +
+
+ + +
+ +

Категории и показатели

+ $categoriesProvider, + 'columns' => [ + [ + 'attribute'=>'store_name', + 'label'=>'Магазин', + ], + [ + 'attribute'=>'category', + 'label'=>'Категория', + ], + [ + 'attribute'=>'base_total_store', + 'label'=>'Базовая сумма', + 'format'=>['decimal',2], + ], + [ + 'attribute'=>'new_total_store', + 'label'=>'Новая сумма', + 'format'=>['decimal',2], + ], + [ + 'attribute'=>'total_sum', + 'label'=>'Сумма категории', + 'format'=>['decimal',2], + ], + [ + 'attribute'=>'percent', + 'label'=>'Доля', + 'format'=>['percent',2], + ], + ], +]); ?> + + +

Список товаров по категориям

+ $productsProvider, + 'columns' => [ + ['class' => 'yii\grid\SerialColumn'], + ['attribute'=>'id', 'label'=>'ID товара'], + ['attribute'=>'name', 'label'=>'Название'], + ['attribute'=>'components', 'label'=>'Components'], + ['attribute'=>'type', 'label'=>'Type'], + ['attribute'=>'category', 'label'=>'Категория'], + ], +]); ?> +