/
v.bolshakov
/
AIEcosystem-Testing
Обзор
Документация
Войти
/
v.bolshakov
/
AIEcosystem-Testing
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
dev
common/widgets/ReportExportWidget.php
210 строк
5 KB
Developer
Initial commit
03 авг 2026, 17:43
03 авг 2026, 17:43
7433917
Код
Авторство
О чём код?
<?php namespace common\widgets; use common\crud\filter\project\ProjectFilterCrud; use common\crud\filter\project\ProjectSearchNameCrud; use common\crud\report\ReportExportCrud; use common\generator\project\ProjectGenerator; use common\helpers\DateHelper; use common\models\Project; use common\models\report\Report; use common\models\report\ReportColumn; use common\models\report\ReportKategory; use common\models\report\UserReport; use common\models\report\UserReportSetting; use Yii; use yii\helpers\FileHelper; use yii\helpers\Url; /** * Виджет - создание отчета по параметрам * * @author Dmitry E. Semenov <sde.tomsk@gmail.com> * @copyright Self (c) 2020 */ class ReportExportWidget extends BasePanelWidget { /** * @inheritdoc */ public $icon = 'icon-file-check'; /** * @inheritdoc */ public $title = 'Generate a report according to the specified parameters'; /** * @inheritdoc */ public $viewName = 'report_export.twig'; /** * Отчёт для экспорта * @var null */ public $report_id = null; /** * Идентификатор клиента * @var null */ public $client_id = null; /** * Строка запроса для фильтрации проектов * @var */ public $query; /** * Идентификатор отчёта * @var null */ protected $user_report_id = null; /** * @inheritdoc */ public function doRun() { /** @var Report $report */ $report = Report::findOne($this->report_id); $info_list = []; if ($report) { $info_list[Yii::t('app', 'Report name')] = Yii::t('app', $report->title); } $kategory = ReportKategory::find() ->select(['title', 'order_number']) ->andWhere([ 'report_id' => $report->id ]) ->orderByNumber() ->indexBy('order_number') ->column(); $column_list = ReportColumn::find() ->prepareSort($report->id) ->all(); $matrix = []; foreach ($column_list as $column) { $matrix[$column['order_number']][] = [ 'id' => $column['id'], 'label' => $column['title'] ]; } $checked = UserReportSetting::find() ->select('column_id') ->andWhere([ 'user_id' => Yii::$app->user->id, 'report_id' => Report::PROJECT, ]) ->indexBy('column_id') ->column(); $crud = new ReportExportCrud(); $model = $crud->createModel(); $model->report_id = $report->id; $model->client_id = $this->client_id; return [ 'matrix' => $matrix, 'kategory' => $kategory, 'checked' => $checked, 'crud' => $crud, 'model' => $model, 'info' => [ 'type' => 'info', 'list' => $info_list, ], ]; } /** * Сохранение данных */ public function doSave() { $parametr = Yii::$app->request->post('parametr'); $user_id = Yii::$app->user->id; UserReportSetting::deleteAll([ 'user_id' => $user_id, 'report_id' => Report::PROJECT, ]); foreach ($parametr as $the_parametr => $_) { $urp = new UserReportSetting([ 'user_id' => $user_id, 'report_id' => Report::PROJECT, 'column_id' => $the_parametr ]); $urp->save(); } $query = Project::find() ->andWhere([ 'client_id' => $this->client_id ]); parse_str($this->query, $query_array); $filter_crud = new ProjectFilterCrud(); $filter_model = $filter_crud->createModel(); $filter_model->load($query_array); $start_date = DateHelper::rangeToInterval($filter_model->start_date); $filter_model->setQuery($query); $filter_model->execute(); $fio_crud = new ProjectSearchNameCrud(); $fio_model = $fio_crud->createModel(); $fio_model->load($query_array); $fio_model->setQuery($query); $fio_model->execute(); $g = new ProjectGenerator(); $g->query = $query; if ($g->execute()) { $tmp = $g->getOutput(); $data = DateHelper::toArray(DateHelper::now()); $dir = implode('/', [$data['year'], $data['month'], $data['day'], '']); $path = Yii::getAlias('@common/runtime/report/') . $dir . time() . '.xlsx'; FileHelper::createDirectory(dirname($path)); if (rename($tmp, $path)) { $er = new UserReport([ 'report_id' => Report::PROJECT, 'report_name' => UserReport::getName($start_date), 'tmp_path' => $path ]); $er->save(); $this->user_report_id = $er->id; } return true; } else { return false; } } /** * Получить данные * @return array|null[] */ public function getData() { return [ 'url' => Url::to(['report/get', 'id' => $this->user_report_id]), 'user_report_id' => $this->user_report_id ]; } }