|
|
@@ -6,6 +6,7 @@ namespace app\v1\logic\gameLog;
|
|
|
|
|
|
use app\v1\logic\tool\ToolLogic;
|
|
|
use plugin\saiadmin\basic\BaseLogic;
|
|
|
+use plugin\saiadmin\exception\ApiException;
|
|
|
use support\think\Db;
|
|
|
|
|
|
class AnalyseLogic extends BaseLogic
|
|
|
@@ -478,7 +479,8 @@ class AnalyseLogic extends BaseLogic
|
|
|
$totalRow['pay_increase_week'] = $totalRow['pay_total'] - $totalRow['week_pay_total']; // 7天增长
|
|
|
|
|
|
foreach($data as &$row){
|
|
|
- $data['pay_ratio'] = ToolLogic::getPercent($row['pay_total'],$allTotal); // 今日充值占比
|
|
|
+
|
|
|
+ $row['pay_ratio'] = ToolLogic::getPercent($row['pay_total'],$allTotal); // 今日充值占比
|
|
|
$row['pay_increase_yestoday'] = $row['pay_total'] - $row['yestoday_pay_total']; // 昨日增长
|
|
|
$row['pay_increase_week'] = $row['pay_total'] - $row['week_pay_total']; // 7天增长
|
|
|
}
|
|
|
@@ -490,6 +492,132 @@ class AnalyseLogic extends BaseLogic
|
|
|
];
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 付费留存
|
|
|
+ * 1. 登录日志表:sdk_login_log_, 查找符合注册时间的用户, 获取用户id
|
|
|
+ *
|
|
|
+ * inner join ON login.uid = order.uid,
|
|
|
+ *
|
|
|
+ * 2. 根据用户id,去订单表,筛选出,次留、2留的日期为充值日期, 从而获取充值人数
|
|
|
+ * 3. 根据注册时间,获取总的pay_num
|
|
|
+ */
|
|
|
+ public function getPayRetention($where){
|
|
|
+ $params = $this->searchByAuth($where);
|
|
|
+ // $whereSql = $this->generateWhereSql($params);
|
|
|
+ // 判断不能超过90天查询
|
|
|
+ $days = ToolLogic::getDays($where['reg_date'][0],$where['reg_date'][1]);
|
|
|
+ if($days > 90){
|
|
|
+ throw new ApiException('时间查询范围请勿超过90天');
|
|
|
+ }
|
|
|
+ $whereRaw = '1=1';
|
|
|
+ if(!empty($params['game_id'])){
|
|
|
+ $whereRaw .= " AND game_id IN(".implode(',',$params['game_id']).")";
|
|
|
+ }
|
|
|
+ if(!empty($params['media_id'])){
|
|
|
+ $whereRaw .= " AND media_id = ({$params['media_id']})";
|
|
|
+ }
|
|
|
+ if(!empty($params['agent_id'])){
|
|
|
+ $whereRaw .= " AND agent_id IN(".implode(',',$params['agent_id']).")";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 1. 根据注册时间,获取注册付费人数
|
|
|
+ $payData = Db::connect('db_game_log')->query("
|
|
|
+ SELECT
|
|
|
+ SUBSTRING(reg_date,1,10) as dimension, -- 注册日期
|
|
|
+ COUNT(DISTINCT uid) as pay_num -- 注册付费人数
|
|
|
+ FROM sdk_order_success
|
|
|
+ WHERE {$whereRaw} AND reg_date BETWEEN '{$params['reg_date'][0]} 00:00:00' AND '{$params['reg_date'][1]} 23:59:59'
|
|
|
+ GROUP BY
|
|
|
+ dimension
|
|
|
+ ");
|
|
|
+ $payDataMap = array_column($payData,null,'dimension');
|
|
|
+
|
|
|
+ // 2. 计算留存付费的人数
|
|
|
+ $sqlArr = [];
|
|
|
+ $medate = date("Y-m-d", strtotime( "+ 60 day", strtotime($params['reg_date'][1])));
|
|
|
+ $tableNames = ToolLogic::getMonthlyTableNames('sdk_login_log_', $params['reg_date'][0], $medate);
|
|
|
+ foreach($tableNames as $tableName){
|
|
|
+ $sqlArr[] = "
|
|
|
+ SELECT
|
|
|
+ CONCAT(FROM_UNIXTIME(reg_time, '%Y-%m-%d'), '|', TIMESTAMPDIFF(DAY, FROM_UNIXTIME(reg_time), FROM_UNIXTIME(login_time))) AS dimension, -- 注册日期|留存天数
|
|
|
+ FROM_UNIXTIME(reg_time, '%Y-%m-%d') AS reg_date, -- 注册日期
|
|
|
+ TIMESTAMPDIFF(DAY, FROM_UNIXTIME(reg_time), FROM_UNIXTIME(login_time)) AS day_num, -- 留存天数
|
|
|
+ COUNT(DISTINCT a.user_name) AS remain_num -- 留存人数
|
|
|
+ FROM {$tableName} AS a
|
|
|
+ INNER JOIN (
|
|
|
+ SELECT
|
|
|
+ DISTINCT user_name
|
|
|
+ FROM sdk_order_success
|
|
|
+ WHERE
|
|
|
+ {$whereRaw} AND reg_date BETWEEN '{$params['reg_date'][0]} 00:00:00' AND '{$params['reg_date'][1]} 23:59:59'
|
|
|
+ ) AS b ON a.user_name = b.user_name
|
|
|
+ WHERE
|
|
|
+ {$whereRaw} AND reg_time BETWEEN ".strtotime($params['reg_date'][0]." 00:00:00")." AND ".strtotime($params['reg_date'][1]." 23:59:59")."
|
|
|
+ GROUP BY dimension
|
|
|
+ ";
|
|
|
+ }
|
|
|
+
|
|
|
+ $sql = implode(" UNION ALL ", $sqlArr);
|
|
|
+
|
|
|
+
|
|
|
+ $remainData = Db::connect('db_game_log')->query($sql);
|
|
|
+ $remainData = $remainData ? array_column($remainData, null, "dimension") : [];
|
|
|
+
|
|
|
+ $regDateRange = ToolLogic::getDatesBetween($params['reg_date'][0],$params['reg_date'][1]);
|
|
|
+ $remainRange = [];
|
|
|
+ for ($i=2; $i<=30; $i++){
|
|
|
+ $remainRange[] = $i;
|
|
|
+ }
|
|
|
+ $remainRange = array_merge($remainRange, [35,40,45,50,55,60]);
|
|
|
+ $data = [];
|
|
|
+ foreach ($regDateRange as $regDate){
|
|
|
+ $row['reg_date'] = $regDate;
|
|
|
+ $row['reg_pay_num'] = $payDataMap[$regDate]['pay_num'] ?? 0;
|
|
|
+ foreach ($remainRange as $remainNum){
|
|
|
+ $dimension = $regDate . "|" . ($remainNum-1);
|
|
|
+ $row['remain_' . $remainNum] = $remainData[$dimension]['remain_num'] ?? 0;
|
|
|
+ }
|
|
|
+ $data[] = $row;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 合计
|
|
|
+ $totalRow = [
|
|
|
+ 'reg_date' => '合计',
|
|
|
+ ];
|
|
|
+
|
|
|
+ // 计算合计
|
|
|
+ if($data) foreach ($data as $item){
|
|
|
+
|
|
|
+ $totalRow['reg_pay_num'] = $totalRow['reg_pay_num'] ?? 0;
|
|
|
+ $totalRow['reg_pay_num'] += $item['reg_pay_num'];
|
|
|
+
|
|
|
+ foreach ($remainRange as $remainNum){
|
|
|
+ $key = 'remain_'.$remainNum;
|
|
|
+
|
|
|
+ $totalRow[$key] = $totalRow[$key] ?? 0;
|
|
|
+ $totalRow[$key] += $item[$key];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算比率
|
|
|
+ if ($params['show_type'] == 'rate') {
|
|
|
+ if($data) foreach ($remainRange as $remainNum) {
|
|
|
+ $key = 'remain_' . $remainNum;
|
|
|
+ $totalRow[$key] = ToolLogic::getPercent($totalRow[$key], $totalRow['reg_pay_num']);
|
|
|
+ foreach ($data as &$val) {
|
|
|
+ $val[$key] = ToolLogic::getPercent($val[$key], $val['reg_pay_num']);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return [
|
|
|
+ 'data' => $data,
|
|
|
+ 'totalRow' => $totalRow
|
|
|
+ ];
|
|
|
+ }
|
|
|
+
|
|
|
// 生成基础日统计表的联合查询列表
|
|
|
public function generateYearUnionList($namePrefix, $regDate,$whereSql='',$field='*',$group=null){
|
|
|
|