Обработка запроса для статистики кампании по дням, форматирование данных для контроллера

parent 64b85017
...@@ -730,6 +730,10 @@ footer { ...@@ -730,6 +730,10 @@ footer {
min-width: 1024px; min-width: 1024px;
} }
.b-clear {
clear: both;
}
/* HEADER */ /* HEADER */
header { header {
position: fixed; position: fixed;
......
...@@ -467,3 +467,22 @@ table.campaign-banners tbody tr td { ...@@ -467,3 +467,22 @@ table.campaign-banners tbody tr td {
float: right; float: right;
} }
#campaign-stat
{
display: none;
}
.chart-graph-stat-info,
.chart-graph-stat-error
{
display: none;
padding-top: 160px;
height: 370px;
text-align: center;
}
#graph-stat
{
height: 370px;
}
\ No newline at end of file
...@@ -64,5 +64,72 @@ $(document).ready(function () { ...@@ -64,5 +64,72 @@ $(document).ready(function () {
})(); })();
// Статистика по кампании:
(function(){
var
dataStat,
$statWrap = $('.campaign-stat'),
$statInfo = $('.chart-graph-stat-info', $statWrap),
$statError = $('.chart-graph-stat-error', $statWrap),
$statChart = $('.chart-graph-stat-error', $statWrap),
$statTable = $('.chart-graph-stat-error', $statWrap),
targetActionValue = $('input[name=target_action]:checked').val(),
activeLine;
// Форматирование даты
function formatDate(date)
{
return date.getFullYear() +'-'+ pad(date.getMonth()+1) +'-'+ pad(date.getDate());
}
// Получение данных для отрисовки графика Stat при старте:
if ($('#campaign-stat').val()) {
dataStat = JSON.parse($('#campaign-stat').val());
console.log('AAA dataStat = ', dataStat);
} else {
$statError.show();
}
switch(targetActionValue) {
case 'load':
activeLine = 'views';
break;
case 'view':
activeLine = 'views';
break;
case 'click':
activeLine = 'clicks';
break;
}
function renderChart() {
console.log('AAA renderChart');
var
dataPeriod = dataStat['period'],
dataValue = dataStat[activeLine],
titleFormat = formatDate,
formatTimeX = '%m-%d';
};
function renderTable() {
console.log('AAA renderTable');
};
if (dataStat) {
renderChart();
renderTable();
} else {
$statChart.hide();
$statTable.hide();
}
})();
}); });
...@@ -28,9 +28,6 @@ namespace App\Action\User; ...@@ -28,9 +28,6 @@ namespace App\Action\User;
use App\Action\Common; use App\Action\Common;
use App\Authentication\UserService; use App\Authentication\UserService;
use App\Model\Users; use App\Model\Users;
//use App\Model\AmSystem\Campaigns;
//use App\Entity\AmSystem\Campaign;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Zend\Diactoros\Response\HtmlResponse; use Zend\Diactoros\Response\HtmlResponse;
...@@ -38,14 +35,6 @@ use Zend\Diactoros\Response\JsonResponse; ...@@ -38,14 +35,6 @@ use Zend\Diactoros\Response\JsonResponse;
use Zend\Diactoros\Response\RedirectResponse; use Zend\Diactoros\Response\RedirectResponse;
use Zend\Hydrator\DelegatingHydrator; use Zend\Hydrator\DelegatingHydrator;
/*
use App\Entity\User;
use App\Entity\AmSystem\Banner;
use App\Model\Statistics;
*/
/** /**
* Class CabinetAmSystem * Class CabinetAmSystem
* @package App\Action\User * @package App\Action\User
...@@ -103,26 +92,9 @@ class CabinetAmSystem extends Common ...@@ -103,26 +92,9 @@ class CabinetAmSystem extends Common
foreach ($campaigns as $campaign_item) { foreach ($campaigns as $campaign_item) {
$campaign_id = $campaign_item['id']; $campaign_id = $campaign_item['id'];
$campaigns_stat[$campaign_id] = $stats->getCampaignsStat([$campaign_id], null); $campaigns_stat[$campaign_id] = $stats->getCampaignsStat([$campaign_id], $campaign_item['target_action'], null);
if ($campaign_item['target_action'] == 'load') {
$campaigns_stat[$campaign_id]['views'] = $campaigns_stat[$campaign_id]['loads'];
$campaigns_stat[$campaign_id]['reach'] = $campaigns_stat[$campaign_id]['reach_load'];
} else {
$campaigns_stat[$campaign_id]['reach'] = $campaigns_stat[$campaign_id]['reach_view'];
} }
$views = $campaigns_stat[$campaign_id]['views'];
$money = $campaigns_stat[$campaign_id]['money'];
$clicks = $campaigns_stat[$campaign_id]['clicks'];
$campaigns_stat[$campaign_id]['ctr'] = ($views != 0) ? round(($clicks/$views)*100, 2) : 0;
$campaigns_stat[$campaign_id]['cpm'] = ($views != 0) ? round(($money/$views)*1000, 3) : 0;
$campaigns_stat[$campaign_id]['cpc'] = ($clicks != 0) ? round(($money/$clicks)*100, 1) : 0;
$campaigns_stat[$campaign_id]['money'] = round($campaigns_stat[$campaign_id]['money'], 2);
}
$data['campaigns'] = $campaigns; $data['campaigns'] = $campaigns;
$data['stats'] = $campaigns_stat; $data['stats'] = $campaigns_stat;
...@@ -166,6 +138,13 @@ class CabinetAmSystem extends Common ...@@ -166,6 +138,13 @@ class CabinetAmSystem extends Common
$campaignsModel = $this->container->get(\App\Model\AmSystem\Campaigns::class); $campaignsModel = $this->container->get(\App\Model\AmSystem\Campaigns::class);
$campaign = $campaignsModel->findOne(['id' => $campaign_id]); $campaign = $campaignsModel->findOne(['id' => $campaign_id]);
/** @var \App\Model\Statistics $stats */
$stats = $this->container->get(\App\Model\Statistics::class);
$date_begin = $campaign->getDateBegin();
$date_end = $campaign->getDateEnd() ? : date("Y-m-d");
$dates = [$date_begin, $date_end];
$campaign_stat = $stats->getCampaignsStat([(int)$campaign_id], $campaign->getTargetAction(), $dates);
$campaign_banners_id = $campaign->getBanners(); $campaign_banners_id = $campaign->getBanners();
if ($campaign_banners_id) { if ($campaign_banners_id) {
$banners_id = json_decode($campaign_banners_id); $banners_id = json_decode($campaign_banners_id);
...@@ -206,6 +185,7 @@ class CabinetAmSystem extends Common ...@@ -206,6 +185,7 @@ class CabinetAmSystem extends Common
$data['cities'] = $cities; $data['cities'] = $cities;
$data['banners'] = $banners; $data['banners'] = $banners;
$data['banners_stats'] = $banners_stats; $data['banners_stats'] = $banners_stats;
$data['campaign_stat'] = $campaign_stat;
} else { } else {
$data['error'] = _t('Извините, данная кампания закреплена за другим пользователем'); $data['error'] = _t('Извините, данная кампания закреплена за другим пользователем');
......
...@@ -346,18 +346,19 @@ class Statistics ...@@ -346,18 +346,19 @@ class Statistics
} }
// Данные по статистике для кампании (баннеры) // Данные по статистике для кампании (баннеры)
public function getCampaignsStat($campaigns_id_list, $dates) public function getCampaignsStat($id_list, $taget_action, $dates)
{ {
$dataRequest = array( $dataRequest = array(
'method' => ($dates) ? 'camp_day' : 'camp_total', 'method' => ($dates) ? 'camp_day' : 'camp_total',
'data' => array( 'data' => array(
'ids' => $campaigns_id_list, 'ids' => $id_list,
) )
); );
if ($dates) { if ($dates) {
$dataRequest['data']['start_date'] = $dates[0]; $dataRequest['data']['start_date'] = $dates[0];
$dataRequest['data']['end_date'] = $dates[1]; $dataRequest['data']['end_date'] = $dates[1];
$dataRequest['data']['by_days'] = true;
} }
//return $dataRequest; //return $dataRequest;
...@@ -366,7 +367,96 @@ class Statistics ...@@ -366,7 +367,96 @@ class Statistics
} catch (\Exception $e) { } catch (\Exception $e) {
$stats['status'] = 'Error'; $stats['status'] = 'Error';
} }
return $stats; //return $stats;
if ($stats) {
// Добавляем спец. поля
function AddSpecialFields(&$stats)
{
if ($taget_action == 'load') {
$stats['views'] = $stats['loads'];
$stats['reach'] = $stats['reach_load'];
} else {
$stats['reach'] = $stats['reach_view'];
}
$views = $stats['views'];
$money = $stats['money'];
$clicks = $stats['clicks'];
$stats['ctr'] = ($views != 0) ? round(($clicks/$views)*100, 2) : 0;
$stats['cpm'] = ($views != 0) ? round(($money/$views)*1000, 3) : 0;
$stats['cpc'] = ($clicks != 0) ? round(($money/$clicks)*100, 1) : 0;
$stats['money'] = round($stats['money'], 2);
}
if (!$dates)
{
AddSpecialFields($stats);
$dataStats = $stats;
}
else
{
foreach ($stats as $day => $stat) {
AddSpecialFields($stats[$day]);
}
// Формируем данные для временного промежутка
function AddDataStats(&$data_stats, $data)
{
foreach ($data as $cat=>$value) {
$data_stats[$cat][] = $value;
}
}
// Формируем пустые данные для временного промежутка
function AddDataStatsNull(&$data_stats, $cats)
{
foreach ($cats as $cat) {
$data_stats[$cat][] = 0;
}
}
// Спискок всех дат из запроса стастистики:
$all_period = array();
$begin = new DateTime($dates[0]);
$end = new DateTime($dates[1]);
for($i = $begin; $i <= $end; $i->modify('+1 day')){
$all_period[] = $i->format("Y-m-d");
}
// Список дат, полученных в статистике:
$stat_days = array_keys($stats);
// Список категорий в данных статистики:
$stat_cats = array_keys($stats[$stat_days[0]]);
$dataStats = [];
foreach ($all_period as $day_item) {
$item = new DateTime($day_item);
$stat_from = new DateTime($stat_days[0]);
$stat_to = new DateTime($stat_days[count($stat_days)-1]);
//if (($item >= $stat_from) && ($item <= $stat_to)) {
//if (($item >= $stat_from)) {
if (($item <= $stat_to)) {
$period[] = $day_item;
if ($stats[$day_item]) {
AddDataStats($dataStats, $stats[$day_item]);
} else {
AddDataStatsNull($dataStats, $stat_cats);
}
}
}
$dataStats['period'] = $period;
}
}
return $dataStats;
} }
// Данные по статистике для баннеров // Данные по статистике для баннеров
......
...@@ -62,6 +62,8 @@ if (!$error) { ...@@ -62,6 +62,8 @@ if (!$error) {
$campaign_tracking_pixels = json_decode($campaign->getTrackingPixels(), true); $campaign_tracking_pixels = json_decode($campaign->getTrackingPixels(), true);
$campaign_geo = json_decode($campaign->getTargeting(), true)['geo']; $campaign_geo = json_decode($campaign->getTargeting(), true)['geo'];
$banners = $this->banners; $banners = $this->banners;
$banners_stats = $this->banners_stats;
$campaign_stat = $this->campaign_stat;
$target_class = ($campaign_target_action == 'load') ? 'load-target' : ''; $target_class = ($campaign_target_action == 'load') ? 'load-target' : '';
...@@ -332,8 +334,27 @@ if (!$error) { ...@@ -332,8 +334,27 @@ if (!$error) {
<div class="b-clear"></div> <div class="b-clear"></div>
<div class="campaign-stat">
<textarea id="campaign-stat"><?= ($campaign_stat ? json_encode($campaign_stat) : '')?></textarea>
<div class="chart-graph-stat-info">
<h2>По заданным параметрам статистика отсутствует</h2>
</div>
<div class="chart-graph-stat-error">
<h2>Ошибка в статистике</h2>
<div class="message"></div>
</div>
<div id="chart-graph-stat"></div>
<div id="table-stat"></div>
</div>
</div> </div>
</div> </div>
</fieldset> </fieldset>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment