MerchantHistoryModel.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. <?php
  2. declare (strict_types = 1);
  3. namespace app\model;
  4. use think\Model;
  5. use think\facade\Db;
  6. /**
  7. * 商户历史数据统计模型 - 基于tp_game_bet_order表统计所有历史数据
  8. */
  9. class MerchantHistoryModel extends Model
  10. {
  11. // 连接到fortue_tiger数据库
  12. protected $connection = 'fortue_tiger';
  13. /**
  14. * 获取商户历史数据统计
  15. * @param int $merchantId 商户ID
  16. * @param array $filters 过滤条件
  17. */
  18. public static function getMerchantHistoryStatistics($merchantId, $filters = [])
  19. {
  20. // 基础查询条件
  21. $where = [
  22. ['app_id', '=', $merchantId],
  23. ['status', '=', 1] // 只统计有效订单
  24. ];
  25. // 日期范围过滤
  26. if (!empty($filters['start_date'])) {
  27. $startTime = strtotime($filters['start_date'] . ' 00:00:00');
  28. $where[] = ['create_time', '>=', $startTime];
  29. }
  30. if (!empty($filters['end_date'])) {
  31. $endTime = strtotime($filters['end_date'] . ' 23:59:59');
  32. $where[] = ['create_time', '<=', $endTime];
  33. }
  34. // 获取汇总统计数据
  35. $stats = Db::connect('fortue_tiger')
  36. ->name('game_bet_order')
  37. ->where($where)
  38. ->field([
  39. 'COUNT(id) as total_orders', // 注单数
  40. 'SUM(bet) as total_bet', // 注单金额(分)
  41. 'SUM(amount) as total_profit', // 游戏输赢(金额变化)
  42. 'SUM(total_win_amount) as total_win', // 总赢得金额
  43. 'COUNT(DISTINCT uname) as bet_users', // 投注用户数
  44. 'COUNT(DISTINCT CASE WHEN action_type = 5 THEN id END) as free_game_count' // 购买免费游戏次数
  45. ])
  46. ->find();
  47. // 计算RTP(Return to Player)
  48. $rtp = 0;
  49. if ($stats['total_bet'] > 0) {
  50. // RTP = (返还给玩家的金额 / 投注总额) * 100
  51. $rtp = round(($stats['total_win'] / $stats['total_bet']) * 100, 2);
  52. }
  53. // 获取注册用户数(根据时间范围)
  54. $registerQuery = Db::connect('fortue_tiger')
  55. ->name('merchants_user')
  56. ->where('app_id', $merchantId);
  57. if (!empty($filters['start_date'])) {
  58. $registerQuery->where('create_time', '>=', strtotime($filters['start_date'] . ' 00:00:00'));
  59. }
  60. if (!empty($filters['end_date'])) {
  61. $registerQuery->where('create_time', '<=', strtotime($filters['end_date'] . ' 23:59:59'));
  62. }
  63. $registerUsers = $registerQuery->count();
  64. // 获取登录用户数(根据时间范围)
  65. $loginQuery = Db::connect('fortue_tiger')
  66. ->name('merchants_user')
  67. ->where('app_id', $merchantId);
  68. if (!empty($filters['start_date'])) {
  69. $loginQuery->where('login_time', '>=', strtotime($filters['start_date'] . ' 00:00:00'));
  70. }
  71. if (!empty($filters['end_date'])) {
  72. $loginQuery->where('login_time', '<=', strtotime($filters['end_date'] . ' 23:59:59'));
  73. }
  74. $loginUsers = $loginQuery->where('login_time', '>', 0)->count();
  75. // 假设汇率(可以从配置或其他表获取)
  76. $thbToUsdtRate = 0.028; // 1 THB = 0.028 USDT (示例汇率)
  77. // 计算抽水额度(平台盈利 = 下注金额 - 赢得金额)
  78. $commission = ($stats['total_bet'] ?? 0) - ($stats['total_win'] ?? 0);
  79. // 组装返回数据
  80. $result = [
  81. 'rtp' => $rtp . '%', // RTP百分比
  82. 'total_orders' => number_format($stats['total_orders'] ?? 0), // 注单数
  83. 'total_bet_thb' => number_format(($stats['total_bet'] ?? 0) / 100, 2) . ' THB', // 注单金额(THB)
  84. 'game_profit_thb' => number_format(abs($stats['total_profit'] ?? 0) / 100, 2) . ' THB', // 游戏输赢(THB)
  85. 'total_bet_usdt' => number_format(($stats['total_bet'] ?? 0) / 100 * $thbToUsdtRate, 4) . ' USDT', // 注单金额(USDT)
  86. 'game_profit_usdt' => number_format(abs($stats['total_profit'] ?? 0) / 100 * $thbToUsdtRate, 4) . ' USDT', // 游戏输赢(USDT)
  87. 'login_users' => $loginUsers, // 登录用户
  88. 'register_users' => $registerUsers, // 注册用户
  89. 'bet_users' => $stats['bet_users'] ?? 0, // 投注用户
  90. 'commission_usdt' => number_format($commission / 100 * $thbToUsdtRate, 4) . ' USDT', // 抽水额度(USDT)
  91. 'free_game_count' => $stats['free_game_count'] ?? 0, // 购买免费游戏次数
  92. // 原始数据(不带格式化)
  93. 'raw_data' => [
  94. 'rtp' => $rtp,
  95. 'total_orders' => $stats['total_orders'] ?? 0,
  96. 'total_bet' => ($stats['total_bet'] ?? 0) / 100,
  97. 'game_profit' => abs($stats['total_profit'] ?? 0) / 100,
  98. 'total_win' => ($stats['total_win'] ?? 0) / 100,
  99. 'commission' => $commission / 100,
  100. 'thb_to_usdt_rate' => $thbToUsdtRate
  101. ]
  102. ];
  103. return $result;
  104. }
  105. /**
  106. * 获取商户历史数据列表(按月份或按天统计)
  107. */
  108. public static function getMerchantHistoryList($merchantId, $groupBy = 'month', $page = 1, $limit = 10, $filters = [])
  109. {
  110. // 日期格式
  111. $dateFormat = $groupBy === 'month' ? '%Y-%m' : '%Y-%m-%d';
  112. // 基础SQL
  113. $sql = "SELECT
  114. DATE_FORMAT(FROM_UNIXTIME(create_time), '{$dateFormat}') as period,
  115. COUNT(id) as total_orders,
  116. SUM(bet) as total_bet,
  117. SUM(amount) as game_profit,
  118. SUM(total_win_amount) as total_win,
  119. COUNT(DISTINCT uname) as bet_users,
  120. COUNT(DISTINCT CASE WHEN action_type = 5 THEN id END) as free_game_count
  121. FROM tp_game_bet_order
  122. WHERE app_id = ? AND status = 1";
  123. $params = [$merchantId];
  124. // 日期范围
  125. if (!empty($filters['start_date'])) {
  126. $sql .= " AND create_time >= ?";
  127. $params[] = strtotime($filters['start_date'] . ' 00:00:00');
  128. }
  129. if (!empty($filters['end_date'])) {
  130. $sql .= " AND create_time <= ?";
  131. $params[] = strtotime($filters['end_date'] . ' 23:59:59');
  132. }
  133. $sql .= " GROUP BY period ORDER BY period DESC";
  134. // 获取总数
  135. $countSql = "SELECT COUNT(DISTINCT DATE_FORMAT(FROM_UNIXTIME(create_time), '{$dateFormat}')) as total
  136. FROM tp_game_bet_order
  137. WHERE app_id = ? AND status = 1";
  138. $countParams = [$merchantId];
  139. if (!empty($filters['start_date'])) {
  140. $countSql .= " AND create_time >= ?";
  141. $countParams[] = strtotime($filters['start_date'] . ' 00:00:00');
  142. }
  143. if (!empty($filters['end_date'])) {
  144. $countSql .= " AND create_time <= ?";
  145. $countParams[] = strtotime($filters['end_date'] . ' 23:59:59');
  146. }
  147. $total = Db::connect('fortue_tiger')->query($countSql, $countParams)[0]['total'] ?? 0;
  148. // 分页
  149. $sql .= " LIMIT " . (($page - 1) * $limit) . ", " . $limit;
  150. $list = Db::connect('fortue_tiger')->query($sql, $params);
  151. // 假设汇率
  152. $thbToUsdtRate = 0.028;
  153. // 处理每条记录
  154. foreach ($list as &$item) {
  155. // 计算RTP
  156. $item['rtp'] = 0;
  157. if ($item['total_bet'] > 0) {
  158. $item['rtp'] = round(($item['total_win'] / $item['total_bet']) * 100, 2);
  159. }
  160. // 获取该时期的注册和登录用户
  161. if ($groupBy === 'month') {
  162. $periodStart = strtotime($item['period'] . '-01 00:00:00');
  163. $periodEnd = strtotime(date('Y-m-t', $periodStart) . ' 23:59:59');
  164. } else {
  165. $periodStart = strtotime($item['period'] . ' 00:00:00');
  166. $periodEnd = strtotime($item['period'] . ' 23:59:59');
  167. }
  168. $item['register_users'] = Db::connect('fortue_tiger')
  169. ->name('merchants_user')
  170. ->where('app_id', $merchantId)
  171. ->where('create_time', '>=', $periodStart)
  172. ->where('create_time', '<=', $periodEnd)
  173. ->count();
  174. $item['login_users'] = Db::connect('fortue_tiger')
  175. ->name('merchants_user')
  176. ->where('app_id', $merchantId)
  177. ->where('login_time', '>=', $periodStart)
  178. ->where('login_time', '<=', $periodEnd)
  179. ->count();
  180. // 计算抽水
  181. $commission = ($item['total_bet'] - $item['total_win']);
  182. // 格式化数据
  183. $item['commission_usdt'] = $commission / 100 * $thbToUsdtRate;
  184. $item['total_bet_thb'] = $item['total_bet'] / 100;
  185. $item['total_bet_usdt'] = $item['total_bet'] / 100 * $thbToUsdtRate;
  186. $item['game_profit_thb'] = abs($item['game_profit']) / 100;
  187. $item['game_profit_usdt'] = abs($item['game_profit']) / 100 * $thbToUsdtRate;
  188. // 移除原始字段
  189. unset($item['total_bet']);
  190. unset($item['game_profit']);
  191. unset($item['total_win']);
  192. }
  193. return [
  194. 'list' => $list,
  195. 'total' => $total,
  196. 'page' => $page,
  197. 'limit' => $limit
  198. ];
  199. }
  200. }