From 567b2d183e3d1e8d59e1dc8d11bb91b4ed1cd1fd Mon Sep 17 00:00:00 2001 From: Alexander Smirnov Date: Mon, 9 Dec 2024 16:48:10 +0300 Subject: [PATCH] =?utf8?q?[ERP-257]=20=D1=81=D0=B8=D1=81=D1=82=D0=B5=D0=BC?= =?utf8?q?=D0=B0=20=D0=BE=D1=82=D1=81=D0=BB=D0=B5=D0=B6=D0=B8=D0=B2=D0=B0?= =?utf8?q?=D0=BD=D0=B8=D1=8F=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../TrackEventMonitorController.php | 45 ++++++++ ...241206_134922_create_table_track_event.php | 34 ++++++ erp24/records/TrackEvent.php | 66 +++++++++++ erp24/services/TrackEventService.php | 49 ++++++++ erp24/views/track-event-monitor/index.php | 105 ++++++++++++++++++ 5 files changed, 299 insertions(+) create mode 100644 erp24/controllers/TrackEventMonitorController.php create mode 100755 erp24/migrations/m241206_134922_create_table_track_event.php create mode 100644 erp24/records/TrackEvent.php create mode 100644 erp24/services/TrackEventService.php create mode 100644 erp24/views/track-event-monitor/index.php diff --git a/erp24/controllers/TrackEventMonitorController.php b/erp24/controllers/TrackEventMonitorController.php new file mode 100644 index 00000000..00360b92 --- /dev/null +++ b/erp24/controllers/TrackEventMonitorController.php @@ -0,0 +1,45 @@ + date('Y-m-d H:i:s', strtotime('-1 month', time())), + 'date_to' => date('Y-m-d H:i:s'), + 'tags' => null, + ], [ + [['date_from', 'date_to', 'tags'], 'safe'], + ]); + + $model->load(Yii::$app->request->get()); + + $id = TrackEventService::create('track_event_monitor_index_hit', TrackEvent::STATE_CREATED, null, ['response' => 'ok']); + + $tags = array_unique(TrackEvent::find()->select(['tag'])->column()); + + $tagsSelected = array_filter($tags, function($el, $ind) use($model) { return in_array('' . $ind, empty($model->tags) ? [] : $model->tags); }, ARRAY_FILTER_USE_BOTH); + + $dataProvider = new ActiveDataProvider(['query' => TrackEvent::find()->select([ + 'COUNT(*) as total', + 'sum(CASE WHEN state=\''. TrackEvent::STATE_CREATED . '\' THEN 1 ELSE 0 END) as created', + 'sum(CASE WHEN state=\''. TrackEvent::STATE_REALISED . '\' THEN 1 ELSE 0 END) as realised', + 'sum(CASE WHEN state=\''. TrackEvent::STATE_NOT_REALISED . '\' THEN 1 ELSE 0 END) as not_realised', + 'user_id' + ])->where(['tag' => $tagsSelected])->andWhere(['BETWEEN', 'created_at', $model->date_from, $model->date_to]) + ->orderBy(['user_id' => SORT_ASC])->groupBy(['user_id'])]); + + TrackEventService::success($id); + + return $this->render('index', compact('model', 'tags', 'dataProvider')); + } +} \ No newline at end of file diff --git a/erp24/migrations/m241206_134922_create_table_track_event.php b/erp24/migrations/m241206_134922_create_table_track_event.php new file mode 100755 index 00000000..cefda40b --- /dev/null +++ b/erp24/migrations/m241206_134922_create_table_track_event.php @@ -0,0 +1,34 @@ +createTable(self::TABLE_NAME, [ + 'id' => $this->primaryKey(), + 'tag' => $this->string(1000)->notNull()->comment('для фильтра'), + 'user_id' => $this->integer()->null()->comment('пользователь, которому направлено событие'), + 'state' => $this->tinyInteger()->notNull()->defaultValue(1)->comment('1 - создан, 2 - реализован, 3 - не реализован'), + 'details' => $this->text()->null()->comment('Детали события описанные в формате json'), + 'created_at' => $this->dateTime()->notNull()->comment('Время создания события'), + 'updated_at' => $this->dateTime()->null()->comment('Время обновления события'), + ]); + } + + /** + * {@inheritdoc} + */ + public function safeDown() + { + $this->dropTable(self::TABLE_NAME); + } +} diff --git a/erp24/records/TrackEvent.php b/erp24/records/TrackEvent.php new file mode 100644 index 00000000..44bd7add --- /dev/null +++ b/erp24/records/TrackEvent.php @@ -0,0 +1,66 @@ + null], + [['user_id', 'state'], 'integer'], + [['details'], 'string'], + [['created_at', 'updated_at'], 'safe'], + [['tag'], 'string', 'max' => 1000], + ]; + } + + /** + * {@inheritdoc} + */ + public function attributeLabels() + { + return [ + 'id' => 'ID', + 'tag' => 'Tag', + 'user_id' => 'пользователь', + 'state' => 'State', + 'details' => 'Details', + 'created_at' => 'Created At', + ]; + } +} diff --git a/erp24/services/TrackEventService.php b/erp24/services/TrackEventService.php new file mode 100644 index 00000000..217159c6 --- /dev/null +++ b/erp24/services/TrackEventService.php @@ -0,0 +1,49 @@ +tag = $tag; + $event->created_at = date('Y-m-d H:i:s'); + $event->state = $state; + if ($details) { + $event->details = Json::encode($details); + } + if ($userId) { + $event->user_id = $userId; + } + $event->save(); + + return $event->id; + } + + public static function success($id, $details = null) { + $te = TrackEvent::findOne($id); + if ($te) { + $te->state = TrackEvent::STATE_REALISED; + if ($details) { + $te->details = Json::encode($details); + } + $te->updated_at = date('Y-m-d H:i:s'); + $te->save(); + } + } + + public static function fail($id, $details = null) { + $te = TrackEvent::findOne($id); + if ($te) { + $te->state = TrackEvent::STATE_NOT_REALISED; + if ($details) { + $te->details = Json::encode($details); + } + $te->updated_at = date('Y-m-d H:i:s'); + $te->save(); + } + } +} \ No newline at end of file diff --git a/erp24/views/track-event-monitor/index.php b/erp24/views/track-event-monitor/index.php new file mode 100644 index 00000000..77a4fdbe --- /dev/null +++ b/erp24/views/track-event-monitor/index.php @@ -0,0 +1,105 @@ + + +
+ + 'btn btn-link']) ?> + + '/track-event-monitor/index', + 'method' => 'GET' + ]) ?> + +
+
+ field($model, 'date_from')->widget(DateTimePicker::class, [ + 'language' => 'ru', + 'template' => '{input}', + 'clientOptions' => [ + 'autoclose' => true, + 'format' => 'Y-m-d H:i:s', + 'todayBtn' => true + ], + ])->label(false) ?> +
+
+ field($model, 'date_to')->widget(DateTimePicker::class, [ + 'language' => 'ru', + 'template' => '{input}', + 'clientOptions' => [ + 'autoclose' => true, + 'format' => 'Y-m-d H:i:s', + 'todayBtn' => true + ], + ])->label(false) ?> +
+
+
+
+ field($model, 'tags')->widget(Select2::class, [ + 'data' => $tags, + 'language' => 'ru', + 'options' => ['placeholder' => 'Tags...'], + 'pluginOptions' => [ + 'allowClear' => true, + 'multiple' => true, + ] + ])->label(false) ?> +
+
+ +
+ 'btn btn-success']) ?> +
+ + + +
+
+ $dataProvider, + 'columns' => [ + ['class' => 'yii\grid\SerialColumn'], + 'user_id', + [ + 'attribute' => 'created', + 'label' => 'Созданных', + 'pageSummary' => true, + ], + [ + 'attribute' => 'realised', + 'label' => 'Реализованных', + 'pageSummary' => true, + ], + [ + 'attribute' => 'not_realised', + 'label' => 'Не реализованных', + 'pageSummary' => true, + ], + [ + 'attribute' => 'total', + 'label' => 'Всего', + 'pageSummary' => true, + ], + ], + 'showPageSummary' => true, + 'layout' => '{items}', + ]) ?> +
+
+ +
-- 2.39.5