Merge branch 'feature/admin_arpu' of wmtx/platform into release

后台ARPU优化
master
廖金灵 4 years ago committed by Gogs
commit a30ff6aece

@ -434,7 +434,6 @@ class ConsoleController extends Think {
$start = I('start', date('Y-m-d'));
$end = I('end', date('Y-m-d'));
$gameIds = I('game_ids', '');
$startTime = strtotime($start . ' 00:00:00');
$endTime = strtotime($end . ' 23:59:59');
$gameIdRows = explode(',', $gameIds);

@ -147,7 +147,8 @@ class StatController extends ThinkController
$start = I('start', date('Y-m-d',strtotime('-7 day')));
$end = empty(I('end')) ? time_format(time(),'Y-m-d') : I('end');
$dataOrder = I('data_order', '');
$gameId = I('game_id', 0);
$baseGameId = I('game_id', 0);
$deviceType = I('device_type', '');
$promoteId = I('promote_id', 0);
$orderType = 'asc';
@ -162,10 +163,14 @@ class StatController extends ThinkController
$status = true;
$data = false;
$error = '';
if ($gameId == 0) {
if ($baseGameId == 0) {
$error = '请选择游戏!';
$status = false;
}
if ($deviceType == '') {
$error = '请选择设备类型!';
$status = false;
}
$startTime = strtotime($start . ' 00:00:00');
$endTime = strtotime($end . ' 23:59:59') + 1;
if ((($endTime - $startTime)/(24*3600)) > 31) {
@ -173,6 +178,10 @@ class StatController extends ThinkController
$status = false;
}
if ($status) {
$baseGame = M('base_game', 'tab_')->where(['id' => $baseGameId])->find();
$gameId = $deviceType == 'android' ? $baseGame['android_game_id'] : $baseGame['ios_game_id'];
$client = new Client([
'base_uri' => C('TASK_URL'),
'timeout' => 10.0,
@ -218,6 +227,9 @@ class StatController extends ThinkController
$this->assign('error', $error);
}
$baseGames = M('base_game', 'tab_')->select();
$this->assign('baseGames', $baseGames);
$this->checkListOrCountAuthRestMap($map,[]);
$this->assign('data', $data);
@ -676,6 +688,165 @@ AND UNIX_TIMESTAMP(
}
public function userarpu($p=0)
{
$start = I('start', date('Y-m-d'));
$end = I('end', date('Y-m-d'));
$baseGameIds = I('game_ids', '');
$promoteId = I('promote_id', 0);
$dataOrder = I('data_order', '');
$deviceType = I('device_type', '');
$containBindCoins = I('contain_bind_coins', 0);
$orderType = '';
$order = 0;
if ($dataOrder != '') {
$dataOrderRow = explode(',', $dataOrder);
$order = $dataOrderRow[0];
$orderType = $dataOrderRow[1];
}
$promoteIds = [];
if ($promoteId > 0) {
$promote = M('promote', 'tab_')->field(['id', 'chain'])->where(['id' => $promoteId])->find();
$promoteIds = M('promote', 'tab_')->where(['chain' => ['like', $promote['chain'] . $promote['id'] . '/%']])->getField('id', true);
$promoteIds[] = $promote['id'];
}
$startTime = strtotime($start . ' 00:00:00');
$endTime = strtotime($end . ' 23:59:59');
$baseGameIdRows = $baseGameIds ? explode(',', $baseGameIds) : [];
$baseGames = M('base_game', 'tab_')->select();
$gameIds = null;
$conditions = [];
if (count($baseGameIdRows)) {
$tmpBaseGames = M('base_game', 'tab_')->where(['id' => ['in', $baseGameIdRows]])->select();
$gameIds = array_merge(array_column($tmpBaseGames, 'android_game_id'), array_column($tmpBaseGames, 'ios_game_id'));
}
if (count($promoteIds)) {
$conditions['promote_id'] = ['in', $promoteIds];
}
if ($deviceType != '') {
if ($gameIds) {
$gameIds = (
$deviceType == 'android' ?
array_intersect($gameIds, array_column($baseGames, 'android_game_id')) :
array_intersect($gameIds, array_column($baseGames, 'ios_game_id'))
);
} else {
$gameIds = (
$deviceType == 'android' ?
array_column($baseGames, 'android_game_id') :
array_column($baseGames, 'ios_game_id')
);
}
}
if ($gameIds && count($gameIds)) {
if (count($gameIds)) {
$conditions['game_id'] = ['in', $gameIds];
} else {
$conditions['game_id'] = ['in', 0];
}
}
// 新增用户
/* M('user', 'tab_')
->field('count(*) count, FROM_UNIXTIME(register_time, "%Y-%m-%d") date')
->where([
'game_id' => ['in', $gameIdRows],
'register_time' => ['between', [$startTime, $endTime]]
])
->group('date')
->select(); */
$newUsers = M('user_play', 'tab_')
->field('count(DISTINCT user_id) count, FROM_UNIXTIME(create_time, "%Y-%m-%d") date')
->where(array_merge($conditions, ['create_time' => ['between', [$startTime, $endTime]]]))
->group('date')
->select();
$newUsers = index_by_column('date', $newUsers);
// 活跃用户
$loginUsers = M('login_daily_record', 'tab_')
->field('count(DISTINCT user_id) count, FROM_UNIXTIME(create_time, "%Y-%m-%d") date')
->where(array_merge($conditions, ['create_time' => ['between', [$startTime, $endTime]]]))
->group('date')
->select();
$loginUsers = index_by_column('date', $loginUsers);
$spendConditions = array_merge($conditions, [
'pay_time' => ['between', [$startTime, $endTime]],
'pay_status' => 1,
]);
if ($containBindCoins == 0) {
$spendConditions['pay_way'] = ['gt', -1];
}
// 付费玩家,付费金额
$payLogs = M('spend', 'tab_')
->field('count(DISTINCT user_id) count, sum(pay_amount) amount, FROM_UNIXTIME(pay_time, "%Y-%m-%d") date')
->where($spendConditions)
->group('date')
->select();
$payLogs = index_by_column('date', $payLogs);
$rows = [];
for ($time = $startTime; $time < $endTime; $time = $time + 24*3600) {
$date = date('Y-m-d', $time);
$newUser = isset($newUsers[$date]) ? $newUsers[$date]['count'] : 0;
$loginUser = isset($loginUsers[$date]) ? $loginUsers[$date]['count'] : 0;
$payAmount = isset($payLogs[$date]) ? $payLogs[$date]['amount'] : 0;
$payUser = isset($payLogs[$date]) ? $payLogs[$date]['count'] : 0;
$rows[] = [
'date' => $date,
'new_user' => $newUser,
'login_user' => $loginUser,
'pay_amount' => $payAmount,
'pay_user' => $payUser,
'pay_rate' => $loginUser > 0 ? (round($payUser / $loginUser * 100, 2)) : '0',
'arpu' => $loginUser > 0 ? (round($payAmount / $loginUser, 2)) : '0.00',
'arppu' => $payUser > 0 ? (round($payAmount / $payUser, 2)) : '0.00',
];
}
if (I('export', 0) == 1) {
$fields = [
'date' => '日期',
'new_user' => '新增玩家',
'login_user' => '活跃玩家',
'pay_account' => '充值金额',
'pay_user' => '付费玩家',
'pay_rate' => '付费率',
'arpu' => 'ARPU',
'arppu' => 'ARPPU',
];
foreach ($rows as &$item) {
$item['pay_rate'] = $item['pay_rate'] . '%';
}
addOperationLog(['op_type'=>3,'key'=>getNowDate(),'op_name'=>'ARPU分析','url'=>U('Stat/userarpu'),'menu'=>'统计-数据分析-ARPU分析']);
data2csv($rows, '数据分析_ARPU分析', $fields);
exit;
}
if ($dataOrder) {
$sort = $order == 3 ? SORT_DESC : SORT_ASC;
$orderColumn = array_column($rows, $orderType);
array_multisort($orderColumn, $sort, SORT_REGULAR, $rows);
}
$this->meta_title = 'ARPU统计';
$this->assign('baseGames', $baseGames);
$this->assign('records', $rows);
$this->assign('order', $order);
$this->assign('orderType', $orderType);
$this->display();
}
public function userarpu_old($p=0)
{
$request=$_REQUEST;
$page = intval($p);

@ -48,18 +48,18 @@
<span class="">活跃玩家</span>
<span class="">当天登录的玩家总数</span>
</li>
<li class="keywords_list">
<!-- <li class="keywords_list">
<span class="">1日留存</span>
<span class="">注册第二天的登录率</span>
</li>
</li> -->
<li class="keywords_list">
<span class="">付费玩家</span>
<span class="">当天付费的玩家数量</span>
</li>
<li class="keywords_list">
<!-- <li class="keywords_list">
<span class="">新付费玩家</span>
<span class="">当天付费玩家中第一次付费的玩家数</span>
</li>
</li> -->
<li class="keywords_list">
<span class="">付费率</span>
<span class="">付费玩家/活跃玩家</span>
@ -83,12 +83,12 @@
<div class="bindcoinsbox">
参与统计设置:
<label class="radio radio-primary">
<input type="radio" class="coins" value="0" name="hasbindcoins">
<span>排除绑币</span>
</label>
<label class="radio radio-primary">
<input type="radio" class="coins" value="1" name="hasbindcoins">
<input type="radio" class="coins" value="1" name="contain_bind_coins" checked>
<span>包含绑币</span>
</label>
<label class="radio radio-primary">
<input type="radio" class="coins" value="0" name="contain_bind_coins">
<span>排除绑币</span>
</label>
</div>
</div>
@ -103,11 +103,18 @@
<input type="text" id="time-end" name="end" class="" value="{:I('end',date('Y-m-d',time()))}" placeholder="选择结束时间" />
</div>
<div class="input-list input-list-game search_label_rehab">
<select id="game_id" name="game_id" class="select_gallery">
<select id="game_ids" name="game_ids" class="select_gallery">
<option value="">请选择游戏</option>
<volist name=":get_game_list()" id="vo">
<option game-id="{$vo.game_name}" value="{$vo.id}">{$vo.game_name}</option>
</volist>
<?php foreach($baseGames as $baseGame):?>
<option game-id="<?= $baseGame['id'] ?>" value="<?= $baseGame['id'] ?>"><?= $baseGame['name'] ?></option>
<?php endforeach;?>
</select>
</div>
<div class="input-list input-list-game search_label_rehab">
<select id="device_type" name="device_type" class="select_gallery">
<option value="">请选择设备类型</option>
<option value="android" <?php if(I('device_type', '') == 'android'):?>selected<?php endif;?>>安卓</option>
<option value="ios" <?php if(I('device_type', '') == 'ios'):?>selected<?php endif;?>>IOS</option>
</select>
</div>
<div class="input-list input-list-promote search_label_rehab">
@ -132,63 +139,35 @@
<!-- 表头 -->
<thead>
<tr>
<th ><a class="paixu" data-order='time'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'time'">日期▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'time'"/>日期▼<else />日期<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<if condition="$game_name neq ''">
<th>游戏名称</th>
</if>
<if condition="$promote_name neq ''">
<th>渠道名称</th>
</if>
<th ><a class="paixu" data-order='date'><if condition="$order eq 4 and $orderType eq 'date'">日期▲<elseif condition="$order eq 3 and $orderType eq 'date'"/>日期▼<else />日期<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='register_num'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'register_num'">新增玩家▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'register_num'"/>新增玩家▼<else />新增玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='new_user'><if condition="$order eq 4 and $orderType eq 'new_user'">新增玩家▲<elseif condition="$order eq 3 and $orderType eq 'new_user'"/>新增玩家▼<else />新增玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='act_user'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'act_user'">活跃玩家▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'act_user'"/>活跃玩家▼<else />活跃玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='login_user'><if condition="$order eq 4 and $orderType eq 'login_user'">活跃玩家▲<elseif condition="$order eq 3 and $orderType eq 'login_user'"/>活跃玩家▼<else />活跃玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='keep_num'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'keep_num'">1日留存▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'keep_num'"/>1日留存▼<else />1日留存<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='pay_amount'><if condition="$order eq 4 and $orderType eq 'pay_amount'">充值金额▲<elseif condition="$order eq 3 and $orderType eq 'pay_amount'"/>充值金额▼<else />充值金额<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='spend'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'spend'">充值▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'spend'"/>充值▼<else />充值<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='pay_user'><if condition="$order eq 4 and $orderType eq 'pay_user'">付费玩家▲<elseif condition="$order eq 3 and $orderType eq 'pay_user'"/>付费玩家▼<else />付费玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='spend_people'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'spend_people'">付费玩家▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'spend_people'"/>付费玩家▼<else />付费玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='pay_rate'><if condition="$order eq 4 and $orderType eq 'pay_rate'">付费率▲<elseif condition="$order eq 3 and $orderType eq 'pay_rate'"/>付费率▼<else />付费率<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='new_pop'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'new_pop'">新付费玩家▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'new_pop'"/>新付费玩家▼<else />新付费玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='spend_rate'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'spend_rate'">付费率▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'spend_rate'"/>付费率▼<else />付费率<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='ARPU'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'ARPU'">ARPU▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'ARPU'"/>ARPU▼<else />ARPU<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='arpu'><if condition="$order eq 4 and $orderType eq 'arpu'">ARPU▲<elseif condition="$order eq 3 and $orderType eq 'arpu'"/>ARPU▼<else />ARPU<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='ARPPU'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'ARPPU'">ARPPU▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'ARPPU'"/>ARPPU▼<else />ARPPU<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='pop_num'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'pop_num'">累计付费玩家▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'pop_num'"/>累计付费玩家▼<else />累计付费玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<if condition="$game_name eq ''">
<if condition="$game_name eq ''">
<th>详情</th>
</if>
<th ><a class="paixu" data-order='arppu'><if condition="$order eq 4 and $orderType eq 'arppu'">ARPPU▲<elseif condition="$order eq 3 and $orderType eq 'arppu'"/>ARPPU▼<else />ARPPU<img src="__IMG__/up-down.png" width="13px"></if></a></th>
</tr>
</thead>
<!-- 列表 -->
<tbody>
<volist name="data" id="vo">
<volist name="records" id="vo">
<tr>
<td>{$vo.time}</td>
<if condition="$game_name neq ''">
<td>{$game_name}</td>
</if>
<if condition="$promote_name neq ''">
<td>{$promote_name}</td>
</if>
<td>{$vo.register_num}</td>
<td>{$vo.act_user}</td>
<td>{$vo.keep_num}%</td>
<td>{$vo.spend}</td>
<td>{$vo.spend_people}</td>
<td>{$vo.new_pop}</td>
<td>{$vo.spend_rate}%</td>
<td>{$vo.ARPU}</td>
<td>{$vo.ARPPU}</td>
<td>{$vo.pop_num}</td>
<if condition="$game_name eq ''">
<td><a style="cursor:pointer;width:100%;text-align:center" class="chakan" timetitle="{$vo['time']}" ptitle="{$promote_name}" href-url="{:U('stat/cha_userarpu',array('time'=>$vo['time'],'hasbindcoins'=>I('hasbindcoins'),'promote_name'=>$promote_name,'promote_id'=>$_REQUEST['promote_id']))}">查看</td>
</if>
<td>{$vo.date}</td>
<td>{$vo.new_user}</td>
<td>{$vo.login_user}</td>
<td>{$vo.pay_amount}</td>
<td>{$vo.pay_user}</td>
<td>{$vo.pay_rate}%</td>
<td>{$vo.arpu}</td>
<td>{$vo.arppu}</td>
</tr>
</volist>
</tbody>
@ -197,13 +176,14 @@
</div>
<div class="page">
<if condition="$role_export_check eq true ">
<a class="sch-btn" href="{:U('Export/userarpuExport',array(
'start'=>$_GET['start'],
'end'=>$_GET['end'],
'game_id'=>$_GET['game_id'],
'promote_id'=>$_GET['promote_id'],
'xlsname'=>'数据分析_ARPU分析',
),false)}">导出</a>
<a class="sch-btn" href="{:U('Stat/userarpu',array(
'start'=>$_GET['start'],
'end'=>$_GET['end'],
'game_ids'=>$_GET['game_ids'],
'promote_id'=>$_GET['promote_id'],
'device_type'=>$_GET['device_type'],
'export'=>1,
),false)}">导出</a>
</if>
{$_page|default=''}
</div>
@ -212,11 +192,12 @@
<block name="script">
<script>
Think.setValue('hasbindcoins',{$Think.get.hasbindcoins|default=0});
Think.setValue('contain_bind_coins',{$Think.get.contain_bind_coins|default=0});
Think.setValue('start',"{$Think.get.start|default=''}");
Think.setValue('end',"{$Think.get.end|default=''}");
Think.setValue('promote_id',{$Think.get.promote_id|default='""'});
Think.setValue('game_id',{$Think.get.game_id|default='""'});
Think.setValue('game_ids',{$Think.get.game_ids|default='""'});
Think.setValue('device_type',{$Think.get.device_type|default='""'});
Think.setValue('row',{$Think.get.row|default=10});
$(".select_gallery").select2();
</script>
@ -251,8 +232,8 @@ $(function(){
if(interval < 0 || start == ''){
layer.msg('请选择搜索时间');
return false;
}else if(interval>90){
layer.msg('请选择90日内的时间段');
}else if(interval>31){
layer.msg('请选择31日内的时间段');
return false;
}
@ -285,8 +266,8 @@ $(function(){
$(".paixu").click(function(){
var that=$(this);
$data_order=that.attr('data-order');
$order_type='{$userarpu_order}';
if($order_type==''||$order_type=='4'){
$order_type='{$order}';
if($order_type==0||$order_type=='4'){
$(".sortBy").attr('name','data_order');
val='3,'+$data_order;
$(".sortBy").attr('value',val);

@ -0,0 +1,407 @@
<extend name="Public/base"/>
<block name="css">
<link rel="stylesheet" href="__CSS__/select2.min.css" type="text/css" />
<style>
.select2-container--default .select2-selection--single {
color: #000;
resize: none;
border-width: 1px;
border-style: solid;
border-color: #a7b5bc #ced9df #ced9df #a7b5bc;
box-shadow: 0px 3px 3px #F7F8F9 inset;height:35px;
height:28px;border-radius:3px;font-size:12px;
}
.select2-container--default .select2-selection--single .select2-selection__rendered {
line-height:35px;
line-height:28px;
}
.select2-container--default .select2-selection--single .select2-selection__arrow {
height:26px;
}
.select2-container--default .select2-search--dropdown .select2-search__field {
height:26px;line-height:26px;font-size:12px;
}
.select2-results__option[aria-selected] {font-size:12px;}
.bindcoinsbox {height:33px;line-height:37px;}
.bindcoinsbox .radio {cursor:pointer;}
.bindcoinsbox .radio input {cursor:pointer;}
</style>
</block>
<block name="body">
<style>.button_list2 {
margin: 9px 0;
margin: 5px 0 32px;
margin-right: 15px;
}</style>
<script type="text/javascript" src="__JS__/bootstrap.min.js"></script>
<script type="text/javascript" src="__JS__/select2.min.js"></script>
<div class="cf main-place top_nav_list navtab_list">
<h3 class="page_title">ARPU分析</h3>
<p class="description_text">说明根据日期游戏推广员分析ARPU等相关数据信息</p>
<div class="keywords_information">
<i class="keywords_mark"><span>关键词说明</span></i>
<ul class="keywords_content">
<li class="keywords_title">关键词说明<a href="javascript:;" class="keywords_close">X</a></li>
<li class="keywords_list">
<span class="">活跃玩家</span>
<span class="">当天登录的玩家总数</span>
</li>
<li class="keywords_list">
<span class="">1日留存</span>
<span class="">注册第二天的登录率</span>
</li>
<li class="keywords_list">
<span class="">付费玩家</span>
<span class="">当天付费的玩家数量</span>
</li>
<li class="keywords_list">
<span class="">新付费玩家</span>
<span class="">当天付费玩家中第一次付费的玩家数</span>
</li>
<li class="keywords_list">
<span class="">付费率</span>
<span class="">付费玩家/活跃玩家</span>
</li>
<li class="keywords_list">
<span class="">ARPU(每用户平均付费)</span>
<span class="">当日总充值数/活跃玩家数</span>
</li>
<li class="keywords_list">
<span class="">ARPPU(付费用户的平均付费)</span>
<span class="">当日总充值/付费玩家数</span>
</li>
</ul>
</div>
</div>
<div class="cf jssearch top_nav_list">
<div class="fl button_list2">
<div class="bindcoinsbox">
参与统计设置:
<label class="radio radio-primary">
<input type="radio" class="coins" value="0" name="hasbindcoins">
<span>排除绑币</span>
</label>
<label class="radio radio-primary">
<input type="radio" class="coins" value="1" name="hasbindcoins">
<span>包含绑币</span>
</label>
</div>
</div>
<!-- 高级搜索 -->
<div class=" fl cf search_list">
<div class="input-list search-title-box">
<label>搜索:</label>
</div>
<div class="input-list">
<input type="text" id="time-start" name="start" class="" value="{:I('start',date('Y-m-d',strtotime('-7 day')))}" placeholder="选择开始时间" />
&nbsp;-&nbsp;
<input type="text" id="time-end" name="end" class="" value="{:I('end',date('Y-m-d',time()))}" placeholder="选择结束时间" />
</div>
<div class="input-list input-list-game search_label_rehab">
<select id="game_id" name="game_id" class="select_gallery">
<option value="">请选择游戏</option>
<volist name=":get_game_list()" id="vo">
<option game-id="{$vo.game_name}" value="{$vo.id}">{$vo.game_name}</option>
</volist>
</select>
</div>
<div class="input-list input-list-promote search_label_rehab">
<select id="promote_id" name="promote_id" class="select_gallery" >
<option value="">推广员账号</option>
<volist name=":get_promote_list(1)" id="vo">
<option promote-id="{$vo.account}" value="{$vo.id}">{$vo.account}</option>
</volist>
</select>
</div>
<input type="hidden" name="" value="" class="sortBy">
<div class="input-list">
<a class="sch-btn" href="javascript:;" id="search" url="{:U('stat/userarpu','model='.$model['name'].'&row='.I('row'),false)}">搜索</a>
</div>
</div>
</div>
<!-- 数据列表 -->
<div class="data_list">
<div class="">
<table>
<!-- 表头 -->
<thead>
<tr>
<th ><a class="paixu" data-order='time'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'time'">日期▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'time'"/>日期▼<else />日期<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<if condition="$game_name neq ''">
<th>游戏名称</th>
</if>
<if condition="$promote_name neq ''">
<th>渠道名称</th>
</if>
<th ><a class="paixu" data-order='register_num'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'register_num'">新增玩家▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'register_num'"/>新增玩家▼<else />新增玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='act_user'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'act_user'">活跃玩家▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'act_user'"/>活跃玩家▼<else />活跃玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='keep_num'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'keep_num'">1日留存▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'keep_num'"/>1日留存▼<else />1日留存<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='spend'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'spend'">充值▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'spend'"/>充值▼<else />充值<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='spend_people'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'spend_people'">付费玩家▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'spend_people'"/>付费玩家▼<else />付费玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='new_pop'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'new_pop'">新付费玩家▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'new_pop'"/>新付费玩家▼<else />新付费玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='spend_rate'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'spend_rate'">付费率▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'spend_rate'"/>付费率▼<else />付费率<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='ARPU'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'ARPU'">ARPU▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'ARPU'"/>ARPU▼<else />ARPU<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='ARPPU'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'ARPPU'">ARPPU▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'ARPPU'"/>ARPPU▼<else />ARPPU<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<th ><a class="paixu" data-order='pop_num'><if condition="$userarpu_order eq 4 and $userarpu_order_type eq 'pop_num'">累计付费玩家▲<elseif condition="$userarpu_order eq 3 and $userarpu_order_type eq 'pop_num'"/>累计付费玩家▼<else />累计付费玩家<img src="__IMG__/up-down.png" width="13px"></if></a></th>
<if condition="$game_name eq ''">
<if condition="$game_name eq ''">
<th>详情</th>
</if>
</tr>
</thead>
<!-- 列表 -->
<tbody>
<volist name="data" id="vo">
<tr>
<td>{$vo.time}</td>
<if condition="$game_name neq ''">
<td>{$game_name}</td>
</if>
<if condition="$promote_name neq ''">
<td>{$promote_name}</td>
</if>
<td>{$vo.register_num}</td>
<td>{$vo.act_user}</td>
<td>{$vo.keep_num}%</td>
<td>{$vo.spend}</td>
<td>{$vo.spend_people}</td>
<td>{$vo.new_pop}</td>
<td>{$vo.spend_rate}%</td>
<td>{$vo.ARPU}</td>
<td>{$vo.ARPPU}</td>
<td>{$vo.pop_num}</td>
<if condition="$game_name eq ''">
<td><a style="cursor:pointer;width:100%;text-align:center" class="chakan" timetitle="{$vo['time']}" ptitle="{$promote_name}" href-url="{:U('stat/cha_userarpu',array('time'=>$vo['time'],'hasbindcoins'=>I('hasbindcoins'),'promote_name'=>$promote_name,'promote_id'=>$_REQUEST['promote_id']))}">查看</td>
</if>
</tr>
</volist>
</tbody>
</table>
</div>
</div>
<div class="page">
<a class="sch-btn" href="{:U('Export/userarpuExport',array(
'start'=>$_GET['start'],
'end'=>$_GET['end'],
'game_id'=>$_GET['game_id'],
'promote_id'=>$_GET['promote_id'],
'xlsname'=>'数据分析_ARPU分析',
),false)}">导出</a>
{$_page|default=''}
</div>
</block>
<block name="script">
<script>
Think.setValue('hasbindcoins',{$Think.get.hasbindcoins|default=0});
Think.setValue('start',"{$Think.get.start|default=''}");
Think.setValue('end',"{$Think.get.end|default=''}");
Think.setValue('promote_id',{$Think.get.promote_id|default='""'});
Think.setValue('game_id',{$Think.get.game_id|default='""'});
Think.setValue('row',{$Think.get.row|default=10});
$(".select_gallery").select2();
</script>
<link href="__STATIC__/datetimepicker/css/datetimepicker.css" rel="stylesheet" type="text/css">
<php>if(C('COLOR_STYLE')=='blue_color') echo '<link href="__STATIC__/datetimepicker/css/datetimepicker_blue.css" rel="stylesheet" type="text/css">';</php>
<link href="__STATIC__/datetimepicker/css/dropdown.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="__STATIC__/datetimepicker/js/bootstrap-datetimepicker.min.js"></script>
<script type="text/javascript" src="__STATIC__/datetimepicker/js/locales/bootstrap-datetimepicker.zh-CN.js" charset="UTF-8"></script>
<script src="__STATIC__/layer/layer.js" type="text/javascript"></script>
<script type="text/javascript">
//导航高亮
highlight_subnav('{:U('stat/userarpu')}');
$(function(){
//计算天数差的函数,通用
function GetDateDiff(startDate,endDate)
{
var startTime = new Date(Date.parse(startDate.replace(/-/g, "/"))).getTime();
var endTime = new Date(Date.parse(endDate.replace(/-/g, "/"))).getTime();
var dates = Math.abs((startTime - endTime))/(1000*60*60*24);
return dates;
}
//搜索功能
$("#search").click(function(){
var start = $("#time-start").val();
start = start.substring(0,19);
var end = ($("#time-end").val() == "") ? "{:date('Y-m-d')}" : $("#time-end").val();
end = end.substring(0,19);
var interval = GetDateDiff(start,end);
if(interval < 0 || start == ''){
layer.msg('请选择搜索时间');
return false;
}else if(interval>90){
layer.msg('请选择90日内的时间段');
return false;
}
var url = $(this).attr('url');
var query = $('.jssearch').find('input').serialize();
query += "&"+$('.jssearch').find('select').serialize();
query = query.replace(/(&|^)(\w*?\d*?\-*?_*?)*?=?((?=&)|(?=$))/g,'');
query = query.replace(/^&/g,'');
if( url.indexOf('?')>0 ){
url += '&' + query;
}else{
url += '?' + query;
}
var start = $("#time-start").val();
var end = $("#time-end").val();
if (start !='' && end != ''){
if (Date.parse(start) > Date.parse(end)){
layer.msg('开始时间必须小于等于结束时间');
return false;
}
}
window.location.href = url;
});
$('input[name="hasbindcoins"]').click(function() {
$("#search").click();
});
$(".paixu").click(function(){
var that=$(this);
$data_order=that.attr('data-order');
$order_type='{$userarpu_order}';
if($order_type==''||$order_type=='4'){
$(".sortBy").attr('name','data_order');
val='3,'+$data_order;
$(".sortBy").attr('value',val);
$("#search").click();
}else if($order_type=='3'){
$(".sortBy").attr('name','data_order');
val='4,'+$data_order;
$(".sortBy").attr('value',val);
$("#search").click();
}
});
//回车自动提交
$('.jssearch').find('input').keyup(function(event){
if(event.keyCode===13){
$("#search").click();
}
});
$('#time-start').datetimepicker({
format: 'yyyy-mm-dd',
language:"zh-CN",
minView:2,
autoclose:1,
});
$('#time-end').datetimepicker({
format: 'yyyy-mm-dd',
language:"zh-CN",
minView:2,
autoclose:1,
pickerPosition:'bottom-right'
});
$(".chakan").click(function () {
that = $(this);
url = that.attr('href-url');
timetitle = that.attr('timetitle');
ptitle = ' ' + that.attr('ptitle') + ' ';
layer.open({
type: 2,
title: false,
closeBtn: 0, //不显示关闭按钮
shade: [0],
area: ['1px', '1px'],
offset: 'rb', //右下角弹出
time: 1, // 秒后自动关闭 这里设置成1ms 不显示过度页面
anim: 2,
content: ['', 'no'], //iframe的urlno代表不显示滚动条
end: function () { //
layer.open({
type: 2,
title: timetitle + ptitle + '游戏数据',
shadeClose: true,
shade: false,
maxmin: true, //开启最大化最小化按钮
area: ['50%', '45%'],
content: url//iframe的url
});
}
});
});
$("#game").on('click',function(event) {
var navlist = $(this).find('.i_list_li');
if (navlist.hasClass('hidden')) {
navlist.removeClass('hidden');
$(this).find('#i_list_id').focus().val('');
} else {
navlist.addClass('hidden');
}
$(document).one("click", function(){
navlist.addClass('hidden');
});
event.stopPropagation();
});
$('#game #i_list_id').on('keyup',function(event) {
var val = $.trim($(this).val()).toLowerCase();
$(this).closest('.drop-down').find('#i_list_idh').val(val);
});
$("#game #i_list_li").find("a").each(function(){
$(this).click(function(){
var text = $.trim($(this).text()).toLowerCase();
var val = $.trim($(this).attr('value'));
$(this).closest('.drop-down').find("#i_list_id").val(text);
$(this).closest('.drop-down').find('#i_list_idh').val(val);
})
});
$("#promote").on('click',function(event) {
var navlist = $(this).find('.i_list_li');
if (navlist.hasClass('hidden')) {
navlist.removeClass('hidden');
$(this).find('#i_list_id').focus().val('');
} else {
navlist.addClass('hidden');
}
$(document).one("click", function(){
navlist.addClass('hidden');
});
event.stopPropagation();
});
$('#promote #i_list_id').on('keyup',function(event) {
$(this).closest('.drop-down').find('#i_list_idh').val(-1);
});
$("#promote #i_list_li").find("a").each(function(){
$(this).click(function(){
var text = $.trim($(this).text()).toLowerCase();
$(this).closest('.drop-down').find("#i_list_id").val(text);
$(this).closest('.drop-down').find('#i_list_idh').val($(this).attr('value'));
})
});
paramnum="{:count(I('get.'))}";
if(paramnum==0){
$("#search").click();
}
})
</script>
</block>

@ -47,10 +47,17 @@
<div class="input-list search_label_rehab">
<select id="game_id" name="game_id" class="select_gallery">
<option value="">请选择游戏</option>
<volist name=":get_game_list()" id="vo">
<option game-id="{$vo.id}" value="{$vo.id}">{$vo.game_name}</option>
</volist>
</select>
<?php foreach($baseGames as $baseGame):?>
<option game-id="<?= $baseGame['id'] ?>" value="<?= $baseGame['id'] ?>"><?= $baseGame['name'] ?></option>
<?php endforeach;?>
</select>
</div>
<div class="input-list search_label_rehab">
<select id="device_type" name="device_type" class="select_gallery">
<option value="">请选择设备类型</option>
<option value="android" <?php if(I('device_type', '') == 'android'):?>selected<?php endif;?>>安卓</option>
<option value="ios" <?php if(I('device_type', '') == 'ios'):?>selected<?php endif;?>>IOS</option>
</select>
</div>
<div class="input-list input-list-promote search_label_rehab">
<select id="promote_id" name="promote_id" class="select_gallery" >

Loading…
Cancel
Save