|
@@ -11,140 +11,62 @@ use think\facade\Db;
|
|
|
*/
|
|
*/
|
|
|
class GameStatisModel extends Model
|
|
class GameStatisModel extends Model
|
|
|
{
|
|
{
|
|
|
|
|
+ protected $name = 'game_bet_game';
|
|
|
|
|
+
|
|
|
// 连接到fortue_tiger数据库
|
|
// 连接到fortue_tiger数据库
|
|
|
protected $connection = 'fortue_tiger';
|
|
protected $connection = 'fortue_tiger';
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 获取游戏每日数据列表
|
|
* 获取游戏每日数据列表
|
|
|
*/
|
|
*/
|
|
|
- public static function getGameDailyList($filters = [], $page = 1, $limit = 10)
|
|
|
|
|
|
|
+ public static function getGameDailyList($merchantId, $page = 1, $limit = 20, $filters = [])
|
|
|
{
|
|
{
|
|
|
- $query = Db::connect('fortue_tiger')->name('game_bet_order');
|
|
|
|
|
-
|
|
|
|
|
- // 应用过滤条件
|
|
|
|
|
- if (!empty($filters['merchant_id'])) {
|
|
|
|
|
- $query->where('app_id', $filters['merchant_id']);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 日期范围
|
|
|
|
|
- $startDate = $filters['start_date'] ?? date('Y-m-d', strtotime('-7 days'));
|
|
|
|
|
- $endDate = $filters['end_date'] ?? date('Y-m-d');
|
|
|
|
|
- $startTime = strtotime($startDate . ' 00:00:00');
|
|
|
|
|
- $endTime = strtotime($endDate . ' 23:59:59');
|
|
|
|
|
-
|
|
|
|
|
- $query->where('create_time', '>=', $startTime)
|
|
|
|
|
- ->where('create_time', '<=', $endTime)
|
|
|
|
|
- ->where('status', 1); // 只统计有效订单
|
|
|
|
|
|
|
+ $where = [
|
|
|
|
|
+ ['app_id', '=', $merchantId]
|
|
|
|
|
+ ];
|
|
|
|
|
|
|
|
- // 游戏ID或名称过滤
|
|
|
|
|
- if (!empty($filters['game_id'])) {
|
|
|
|
|
- $query->where('game_id', $filters['game_id']);
|
|
|
|
|
|
|
+ // 时间筛选
|
|
|
|
|
+ if (!empty($filters['start_time'])) {
|
|
|
|
|
+ $startTime = strtotime($filters['start_time']);
|
|
|
|
|
+ $where[] = ['create_time', '>=', $startTime];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (!empty($filters['game_name'])) {
|
|
|
|
|
- // 如果有游戏名称表,可以关联查询
|
|
|
|
|
- $query->where('game_id', 'like', '%' . $filters['game_name'] . '%');
|
|
|
|
|
|
|
+ if (!empty($filters['end_time'])) {
|
|
|
|
|
+ $endTime = strtotime($filters['end_time']);
|
|
|
|
|
+ $where[] = ['create_time', '<=', $endTime];
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- // 按游戏和日期分组统计
|
|
|
|
|
- $sql = "SELECT
|
|
|
|
|
- DATE_FORMAT(FROM_UNIXTIME(create_time), '%Y-%m-%d') as date,
|
|
|
|
|
- game_id,
|
|
|
|
|
- COUNT(DISTINCT uname) as bet_users,
|
|
|
|
|
- COUNT(id) as bet_count,
|
|
|
|
|
- SUM(bet) as bet_amount,
|
|
|
|
|
- SUM(amount) as game_profit,
|
|
|
|
|
- SUM(total_win_amount) as total_win,
|
|
|
|
|
- COUNT(DISTINCT CASE WHEN action_type = 5 THEN id END) as free_game_count
|
|
|
|
|
- FROM tp_game_bet_order
|
|
|
|
|
- WHERE app_id = ?
|
|
|
|
|
- AND create_time >= ?
|
|
|
|
|
- AND create_time <= ?
|
|
|
|
|
- AND status = 1";
|
|
|
|
|
-
|
|
|
|
|
- $params = [$filters['merchant_id'] ?? 0, $startTime, $endTime];
|
|
|
|
|
-
|
|
|
|
|
- if (!empty($filters['game_id'])) {
|
|
|
|
|
- $sql .= " AND game_id = ?";
|
|
|
|
|
- $params[] = $filters['game_id'];
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- $sql .= " GROUP BY date, game_id
|
|
|
|
|
- ORDER BY date DESC, game_id ASC";
|
|
|
|
|
-
|
|
|
|
|
- // 获取总数(用于分页)
|
|
|
|
|
- $countSql = "SELECT COUNT(DISTINCT CONCAT(DATE_FORMAT(FROM_UNIXTIME(create_time), '%Y-%m-%d'), '-', game_id)) as total
|
|
|
|
|
- FROM tp_game_bet_order
|
|
|
|
|
- WHERE app_id = ?
|
|
|
|
|
- AND create_time >= ?
|
|
|
|
|
- AND create_time <= ?
|
|
|
|
|
- AND status = 1";
|
|
|
|
|
-
|
|
|
|
|
- $countParams = [$filters['merchant_id'] ?? 0, $startTime, $endTime];
|
|
|
|
|
|
|
+
|
|
|
if (!empty($filters['game_id'])) {
|
|
if (!empty($filters['game_id'])) {
|
|
|
- $countSql .= " AND game_id = ?";
|
|
|
|
|
- $countParams[] = $filters['game_id'];
|
|
|
|
|
|
|
+ $gameId = is_array($filters['game_id']) ? $filters['game_id'] : explode(',', $filters['game_id']);
|
|
|
|
|
+ $where[] = ['game_id', 'in', $gameId];
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- $total = Db::connect('fortue_tiger')->query($countSql, $countParams)[0]['total'] ?? 0;
|
|
|
|
|
-
|
|
|
|
|
- // 添加分页
|
|
|
|
|
- $sql .= " LIMIT " . (($page - 1) * $limit) . ", " . $limit;
|
|
|
|
|
-
|
|
|
|
|
- $list = Db::connect('fortue_tiger')->query($sql, $params);
|
|
|
|
|
|
|
+ $query = self::where($where);
|
|
|
|
|
+ // 统计总数
|
|
|
|
|
+ $total = $query->count();
|
|
|
|
|
+ // 获取列表数据
|
|
|
|
|
+ $list = $query->field([
|
|
|
|
|
+ "FROM_UNIXTIME(create_time, '%Y-%m-%d') as date", // 日期
|
|
|
|
|
+ 'game_id', //游戏id
|
|
|
|
|
+ 'AVG(rtp) AS rtp', // 平均RTP
|
|
|
|
|
+ 'COUNT(DISTINCT uname) as bet_users', // 投注用户数
|
|
|
|
|
+ 'COUNT(id) as bet_count', // 注单数
|
|
|
|
|
+ 'SUM(bet) as bet_amount', // 注单金额(下注分数)
|
|
|
|
|
+ 'SUM(total_win_amount) as game_profit', // 游戏输赢(金额变化)
|
|
|
|
|
+ ])
|
|
|
|
|
+ ->order('date', 'desc')
|
|
|
|
|
+ ->group('date, game_id')
|
|
|
|
|
+ ->page($page, $limit)
|
|
|
|
|
+ ->select()
|
|
|
|
|
+ ->toArray();
|
|
|
|
|
+
|
|
|
|
|
+ // 获取登录用户、注册用户
|
|
|
|
|
+ $merchantsUserStatic = MerchantsUserModel::getPlayerStatistics($merchantId, $filters);
|
|
|
|
|
|
|
|
- // 处理每条记录
|
|
|
|
|
- foreach ($list as &$item) {
|
|
|
|
|
- // 计算RTP
|
|
|
|
|
- $item['game_rtp'] = 0;
|
|
|
|
|
- if ($item['bet_amount'] > 0) {
|
|
|
|
|
- $item['game_rtp'] = round(($item['total_win'] / $item['bet_amount']) * 100, 2);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 获取该游戏该天的注册用户(新用户首次玩该游戏)
|
|
|
|
|
- $dayStart = strtotime($item['date'] . ' 00:00:00');
|
|
|
|
|
- $dayEnd = strtotime($item['date'] . ' 23:59:59');
|
|
|
|
|
-
|
|
|
|
|
- $registerUsers = Db::connect('fortue_tiger')
|
|
|
|
|
- ->name('game_bet_order')
|
|
|
|
|
- ->alias('gbo')
|
|
|
|
|
- ->join('tp_merchants_user mu', 'gbo.uname = mu.uname', 'INNER')
|
|
|
|
|
- ->where('gbo.app_id', $filters['merchant_id'] ?? 0)
|
|
|
|
|
- ->where('gbo.game_id', $item['game_id'])
|
|
|
|
|
- ->where('gbo.create_time', '>=', $dayStart)
|
|
|
|
|
- ->where('gbo.create_time', '<=', $dayEnd)
|
|
|
|
|
- ->where('mu.create_time', '>=', $dayStart)
|
|
|
|
|
- ->where('mu.create_time', '<=', $dayEnd)
|
|
|
|
|
- ->count('DISTINCT gbo.uname');
|
|
|
|
|
-
|
|
|
|
|
- // 获取登录用户数
|
|
|
|
|
- $loginUsers = Db::connect('fortue_tiger')
|
|
|
|
|
- ->name('game_bet_order')
|
|
|
|
|
- ->alias('gbo')
|
|
|
|
|
- ->join('tp_merchants_user mu', 'gbo.uname = mu.uname', 'INNER')
|
|
|
|
|
- ->where('gbo.app_id', $filters['merchant_id'] ?? 0)
|
|
|
|
|
- ->where('gbo.game_id', $item['game_id'])
|
|
|
|
|
- ->where('gbo.create_time', '>=', $dayStart)
|
|
|
|
|
- ->where('gbo.create_time', '<=', $dayEnd)
|
|
|
|
|
- ->where('mu.login_time', '>=', $dayStart)
|
|
|
|
|
- ->where('mu.login_time', '<=', $dayEnd)
|
|
|
|
|
- ->count('DISTINCT gbo.uname');
|
|
|
|
|
-
|
|
|
|
|
- // 计算抽水额度
|
|
|
|
|
- $item['commission_amount'] = ($item['bet_amount'] - $item['total_win']) / 100;
|
|
|
|
|
-
|
|
|
|
|
- // 格式化金额字段(转换为元)
|
|
|
|
|
- $item['game_profit'] = abs($item['game_profit']) / 100;
|
|
|
|
|
- $item['bet_amount'] = $item['bet_amount'] / 100;
|
|
|
|
|
- $item['total_win'] = $item['total_win'] / 100;
|
|
|
|
|
-
|
|
|
|
|
- // 添加其他字段
|
|
|
|
|
- $item['game_name'] = '游戏' . $item['game_id']; // 如果有游戏名称表可以关联查询
|
|
|
|
|
- $item['register_users'] = $registerUsers;
|
|
|
|
|
- $item['login_users'] = $loginUsers;
|
|
|
|
|
-
|
|
|
|
|
- // 移除不需要的字段
|
|
|
|
|
- unset($item['total_win']);
|
|
|
|
|
|
|
+ foreach ($list as &$row)
|
|
|
|
|
+ {
|
|
|
|
|
+ $row['login_users'] = $merchantsUserStatic[$row['date']]['login_users'] ?? 0;
|
|
|
|
|
+ $row['register_users'] = $merchantsUserStatic[$row['date']]['register_users'] ?? 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return [
|
|
return [
|