From: marina Date: Fri, 6 Jun 2025 12:16:49 +0000 (+0300) Subject: ERP-360 Сборка страницы автопм X-Git-Url: https://gitweb.erp-flowers.ru/?a=commitdiff_plain;h=9c6934cffb13e35f05cc3afa20714155625ae2ec;p=erp24_rep%2Fyii-erp24%2F.git ERP-360 Сборка страницы автопм --- diff --git a/erp24/controllers/AutoPlannogrammaController.php b/erp24/controllers/AutoPlannogrammaController.php index bfeea6e6..36b69d77 100644 --- a/erp24/controllers/AutoPlannogrammaController.php +++ b/erp24/controllers/AutoPlannogrammaController.php @@ -7,8 +7,10 @@ use yii\data\ArrayDataProvider; use yii\db\Expression; use yii\db\Query; use yii\helpers\ArrayHelper; +use yii_app\records\Autoplannogramma; use yii_app\records\CityStore; use yii_app\records\CityStoreParams; +use yii_app\records\StoreDynamic; use yii_app\services\AutoPlannogrammaService; class AutoPlannogrammaController extends BaseController @@ -70,74 +72,80 @@ class AutoPlannogrammaController extends BaseController ]); } - public function actionGetProducts(string $category, string $subcategory): array + public function actionGetProducts(string $category, string $subcategory, array $filters): array { + Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; + $models = Autoplannogramma::find() + ->joinWith('products p') + ->where(['category' => $category]) + ->andWhere(['subcategory' => $subcategory]) + ->andFilterWhere($filters) + ->select(['p.id', 'p.name', 'store_id', 'quantity']) + ->asArray() + ->all(); - Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; + $result = []; - 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, - ], - ] - ], - ]; + foreach ($models as $model) { + $guid = $model['id']; + $name = $model['name']; + $storeId = $model['store_id']; + $quantity = $model['quantity']; + + if (!isset($result[$guid])) { + $result[$guid] = [ + 'name' => $name, + 'guid' => $guid, + 'values' => [], + ]; + } + + $result[$guid]['values'][] = [ + 'count' => (int) $quantity, + 'store_id' => (int) $storeId, + ]; + } + + return array_values($result); } public function actionGetVisibleStores() { Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; + $f = Yii::$app->request->get(); - $filters = Yii::$app->request->get(); - - $query = CityStoreParams::find() + $q = CityStoreParams::find() ->alias('p') ->joinWith(['store s']) ->select('p.store_id') ->where(['s.visible' => CityStore::IS_VISIBLE]); - $fields = [ - 'city' => 'p.address_city', - 'store_type' => 'p.store_type', - 'territorialManager' => 's.territorial_manager_id', - 'region' => 'p.address_region', - 'district' => 'p.address_district', - 'bushChefFlorist' => 's.bush_chef_florist_id', - ]; + foreach ([ + 'city' => 'p.address_city', + 'storeType' => 'p.store_type', + 'region' => 'p.address_region', + 'district' => 'p.address_district' + ] as $param => $col) { + if (!empty($f[$param])) $q->andWhere([$col => $f[$param]]); + } - foreach ($fields as $param => $column) { - if (!empty($filters[$param])) { - $query->andWhere([$column => $filters[$param]]); + foreach ([ + 'territorialManager' => 3, + 'bushChefFlorist' => 2 + ] as $param => $cat) { + if (!empty($f[$param])) { + $ids = StoreDynamic::find() + ->select('store_id') + ->where(['category' => $cat, 'active' => 1, 'value_int' => $f[$param]]) + ->column(); + $q->andWhere(['p.store_id' => $ids ?: [-1]]); } } - return ['store_ids' => $query->column()]; + return ['store_ids' => $q->column()]; } - - public function action1() { $request = Yii::$app->request; diff --git a/erp24/records/Autoplannogramma.php b/erp24/records/Autoplannogramma.php index 008983c8..f6828288 100644 --- a/erp24/records/Autoplannogramma.php +++ b/erp24/records/Autoplannogramma.php @@ -2,6 +2,7 @@ namespace yii_app\records; +use Product; use Yii; /** @@ -69,4 +70,8 @@ class Autoplannogramma extends \yii\db\ActiveRecord 'updated_by' => 'Автор обновления', ]; } + + public function getProducts() { + return $this->hasOne(Products1cNomenclature::className(), ['id' => 'product_id']); + } } diff --git a/erp24/views/auto-plannogramma/index.php b/erp24/views/auto-plannogramma/index.php index 8039f1ae..00931e17 100644 --- a/erp24/views/auto-plannogramma/index.php +++ b/erp24/views/auto-plannogramma/index.php @@ -157,24 +157,25 @@ $this->registerJsFile('/js/autoplannogramma/autoplannogramma.js', ['position' => -
-
-
-
-
-
-
-
-
+ 'label-year-week']) ?>
+ 'label-month-range']) ?>
+ 'label-capacity-type']) ?>
+ 'label-city']) ?>
+ 'label-region']) ?>
+ 'label-district']) ?>
+ 'label-store-type']) ?>
+ 'label-tu']) ?>
+ 'label-kshf']) ?>
+
- 'btn btn-success ms-1']) ?> - 'btn btn-success ms-1']) ?> + 'btn btn-success ms-1 btn-auto']) ?> + 'btn btn-success ms-1 btn-corrected']) ?>
$storeName): ?> 'writing-mode: sideways-lr; text-align: center; white-space: nowrap; + 'style' => 'text-align: center; white-space: nowrap; font-weight: bold; transform-origin: left bottom; padding-right: 7%;' ]) ?> diff --git a/erp24/web/js/autoplannogramma/autoplannogramma.js b/erp24/web/js/autoplannogramma/autoplannogramma.js index dc1e06d3..79bfe1dc 100644 --- a/erp24/web/js/autoplannogramma/autoplannogramma.js +++ b/erp24/web/js/autoplannogramma/autoplannogramma.js @@ -95,7 +95,7 @@ $('.subcategory-link').on('click', function (e) { $row.find('td[data-store-id]').each(function () { const td = $(this); const storeId = td.data('store-id'); - const val = valuesMap[storeId] ?? { count: '', guid: '' }; + const val = valuesMap[storeId] ?? {count: '', guid: ''}; const newTd = $(` @@ -131,10 +131,9 @@ $('.subcategory-link').on('click', function (e) { }); }); -$('#autoplannogramma').on('change, input', '.input', function () { +$('#autoplannogramma').on('input', '.input', function () { const $input = $(this); const newValue = $input.val(); -console.log(3) const $td = $input.closest('td'); const $svg = $td.find('svg'); @@ -170,32 +169,88 @@ function getFilterData() { }; } -// Применение фильтра магазинов +function getFilterData() { + return { + year: $('#year').val(), + week: $('#week').val(), + city: $('#city').val(), + store_type: $('#store-type').val(), + territorial_manager: $('#territorial-manager').val(), + capacity_type: $('#polnogramma-type').val(), + region: $('#region').val(), + district: $('#district').val(), + bush_chef_florist: $('#bush_chef_florist').val(), + }; +} + function applyStoreFilter() { - $.get('/auto-plannogramma/get-visible-stores', getFilterData(), function (response) { + const data = getFilterData(); + + $.get('/auto-plannogramma/get-visible-stores', data, function (response) { const allowedStoreIds = (response.store_ids || []).map(String); $('td[data-store-id], th[data-store-id]').each(function () { const storeId = String($(this).data('store-id')); $(this).toggle(allowedStoreIds.includes(storeId)); }); + + // Обновляем значения рядом с лейблами, выводим текст, а не id + $('.label-year-week').text(`год: ${data.year || '—'} неделя: ${data.week || '—'}`); + $('.label-month-range').text(getMonthRangeByWeek(data.week)); + + $('.label-capacity-type').text('Тип п-ма: ' + getSelectedText('#polnogramma-type')); + $('.label-city').text('Город: ' + getSelectedText('#city')); + $('.label-region').text('Регион: ' + getSelectedText('#region')); + $('.label-district').text('Район: ' + getSelectedText('#district')); + $('.label-store-type').text('Тип магазина: ' + getSelectedText('#store-type')); + $('.label-tu').text('Тер. Уп.: ' + getSelectedText('#territorial-manager')); + $('.label-kshf').text('КШФ: ' + getSelectedText('#bush_chef_florist')); + }).fail(function (xhr) { console.error('Ошибка при фильтрации магазинов:', xhr.responseText); }); } -// Сброс фильтров и отображение всех ячеек +function getSelectedText(selector) { + const select = $(selector); + const val = select.val(); + const text = select.find(`option[value="${val}"]`).text(); + return text; +} + function resetStoreFilter() { - // Сброс значений фильтров - $('#year, #city, #store-type, #territorial-manger, #polnogramma-type, #week, #region, #bush_chef_florist, #district').val(''); - // Показ всех ячеек + // Сброс обычных инпутов + $('#year, #week').val(''); + + // Сброс всех Select2 + $('#city, #store-type, #territorial-manager, #polnogramma-type, #region, #bush_chef_florist, #district') + .val(null) + .trigger('change'); + + // Показ всех ячеек магазинов $('td[data-store-id], th[data-store-id]').show(); + + // Очистка лейблов + $('.label-year-week').text(''); + $('.label-month-range').text(''); + $('.label-city, .label-store-type, .label-tu, .label-capacity-type, .label-region, .label-district, .label-kshf') + .text('—'); } -// Обработчики событий -$('.btn-apply').on('click', applyStoreFilter); -$('.btn-reset').on('click', resetStoreFilter); +// Привязка событий +$(document).on('click', '.btn-apply', applyStoreFilter); +$(document).on('click', '.btn-reset', resetStoreFilter); +// Дополнительная функция: получить диапазон месяцев по номеру недели (примерная логика) +function getMonthRangeByWeek(week) { + if (!week) return '—'; + const w = parseInt(week, 10); + if (w <= 4) return 'январь'; + if (w <= 8) return 'январь - февраль'; + if (w <= 13) return 'февраль - март'; + // ... можно доработать + return '—'; +}