SuperballController.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Facade\TableName;
  4. use App\Http\helper\NumConfig;
  5. use App\Services\SuperballActivityService;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Facades\DB;
  8. /**
  9. * Superball 活跃活动后台统计(仅查询,无导出)
  10. * - 每日数据(含真实完成人数、真实球数)
  11. * - 用户任务完成情况
  12. * - 用户奖励领取情况
  13. */
  14. class SuperballController extends BaseController
  15. {
  16. /**
  17. * 每日总体数据(含真实用户完成人数、真实球数)
  18. * GET /admin/superball/daily
  19. */
  20. public function daily(Request $request)
  21. {
  22. // 不需要日期筛选,直接按日期倒序分页
  23. $list = DB::table(TableName::agent() . 'superball_daily')
  24. ->orderBy('pool_date', 'desc')
  25. ->paginate(30);
  26. $dates = $list->pluck('pool_date')->all();
  27. $realCompleted = [];
  28. $realBalls = [];
  29. if (!empty($dates)) {
  30. $realCompleted = DB::table(TableName::agent() . 'superball_user_task')
  31. ->whereIn('task_date', $dates)
  32. ->where('status', 1)
  33. ->selectRaw('task_date, COUNT(DISTINCT user_id) as cnt')
  34. ->groupBy('task_date')
  35. ->pluck('cnt', 'task_date')
  36. ->all();
  37. $realBalls = DB::table(TableName::agent() . 'superball_user_balls')
  38. ->whereIn('ball_date', $dates)
  39. ->selectRaw('ball_date, COUNT(*) as cnt')
  40. ->groupBy('ball_date')
  41. ->pluck('cnt', 'ball_date')
  42. ->all();
  43. }
  44. foreach ($list as $row) {
  45. $row->real_user_completed_count = (int)($realCompleted[$row->pool_date] ?? 0);
  46. $row->real_total_balls = (int)($realBalls[$row->pool_date] ?? 0);
  47. $row->pool_amount_display = number_float($row->pool_amount / NumConfig::NUM_VALUE);
  48. $totalBalls = (int)($row->total_balls ?? 0);
  49. $row->base_reward_per_ball_display = $totalBalls > 0
  50. ? number_float($row->pool_amount / NumConfig::NUM_VALUE / $totalBalls)
  51. : '0.00';
  52. // 用户中奖球总数:直接使用 superball_daily.lucky_count 字段
  53. $row->winning_balls_count = (int)($row->lucky_count ?? 0);
  54. // 幸运奖励合计 = 今日中奖球数量 * 每个中奖球奖励(注意是活动配置的中奖奖励,不是基础奖励)
  55. $perLuckyDisplay = SuperballActivityService::LUCKY_REWARD_PER_BALL; // 已是展示单位
  56. if ($row->winning_balls_count > 0 && $perLuckyDisplay > 0) {
  57. $row->total_lucky_reward_display = number_format(
  58. $perLuckyDisplay * $row->winning_balls_count,
  59. 2,
  60. '.',
  61. ''
  62. );
  63. } else {
  64. $row->total_lucky_reward_display = '0.00';
  65. }
  66. }
  67. return view('admin.superball.daily', compact('list'));
  68. }
  69. /**
  70. * 用户任务完成情况(含用户系数、球号码与数量、预计奖励,按更新时间逆序)
  71. * GET /admin/superball/user-tasks
  72. */
  73. public function userTasks(Request $request)
  74. {
  75. $date = $request->input('date');
  76. // 前端输入的是 AccountsInfo 的 GameID,这里按 GameID 反查出 UserID 过滤
  77. $userId = trim((string)$request->input('user_id', ''));
  78. $tier = strtoupper(trim((string)$request->input('tier', '')));
  79. $status = $request->input('status', '');
  80. $query = DB::table(TableName::agent() . 'superball_user_task as t')
  81. ->leftJoin('QPAccountsDB.dbo.AccountsInfo as a', 't.user_id', '=', 'a.UserID')
  82. ->leftJoin(TableName::agent() . 'superball_user_multiplier as m', 't.user_id', '=', 'm.user_id')
  83. ->leftJoin(TableName::agent() . 'superball_tier_config as c', 't.tier', '=', 'c.tier')
  84. ->leftJoin(TableName::agent() . 'superball_daily as d', 't.task_date', '=', 'd.pool_date')
  85. ->selectRaw('t.*, a.GameID as game_id, m.multiplier, c.ball_count as tier_ball_count, d.pool_amount, d.total_balls as daily_total_balls');
  86. if ($date) {
  87. $query->where('t.task_date', $date);
  88. }
  89. if ($userId !== '') {
  90. $query->where('a.GameID', $userId);
  91. }
  92. if ($tier && in_array($tier, ['A', 'B', 'C', 'D', 'E'], true)) {
  93. $query->where('t.tier', $tier);
  94. }
  95. // 仅当明确选择 未领球(0) 或 已领球(1) 时才按状态筛选,避免空值被当成 0
  96. if ($status !== '' && $status !== null && in_array((string)$status, ['0', '1'], true)) {
  97. $query->where('t.status', (int)$status);
  98. }
  99. $query->orderBy('t.updated_at', 'desc');
  100. $list = $query->paginate(20);
  101. $userIds = $list->pluck('user_id')->unique()->values()->all();
  102. $ballsByKey = [];
  103. $taskDates = $list->pluck('task_date')->unique()->values()->all();
  104. if (!empty($userIds) && !empty($taskDates)) {
  105. $balls = DB::table(TableName::agent() . 'superball_user_balls')
  106. ->whereIn('user_id', $userIds)
  107. ->whereIn('ball_date', $taskDates)
  108. ->orderBy('user_id')->orderBy('ball_index')
  109. ->get();
  110. foreach ($balls as $b) {
  111. $k = $b->user_id . '_' . $b->ball_date;
  112. if (!isset($ballsByKey[$k])) {
  113. $ballsByKey[$k] = ['numbers' => [], 'count' => 0];
  114. }
  115. $ballsByKey[$k]['numbers'][] = (int)$b->number;
  116. $ballsByKey[$k]['count']++;
  117. }
  118. }
  119. foreach ($list as $row) {
  120. $row->user_multiplier = $row->multiplier !== null ? (float)$row->multiplier : 1.0;
  121. $k = $row->user_id . '_' . $row->task_date;
  122. $ballInfo = $ballsByKey[$k] ?? ['numbers' => [], 'count' => 0];
  123. $row->ball_numbers_text = implode(',', $ballInfo['numbers']);
  124. $row->ball_count_actual = $ballInfo['count'];
  125. $ballCount = $ballInfo['count'] > 0 ? $ballInfo['count'] : (int)($row->tier_ball_count ?? 0);
  126. $dailyTotal = (int)($row->daily_total_balls ?? 0);
  127. if ($dailyTotal > 0 && $row->pool_amount !== null) {
  128. $basePerBall = (int)$row->pool_amount / $dailyTotal;
  129. $row->estimated_reward_display = number_float(($basePerBall * $ballCount * $row->user_multiplier) / NumConfig::NUM_VALUE);
  130. } else {
  131. $row->estimated_reward_display = '0.00';
  132. }
  133. }
  134. return view('admin.superball.user_tasks', compact('list', 'date', 'userId', 'tier', 'status'));
  135. }
  136. /**
  137. * 用户奖励领取情况
  138. * GET /admin/superball/prizes
  139. */
  140. public function prizes(Request $request)
  141. {
  142. $date = $request->input('date');
  143. $userId = (int)$request->input('user_id', 0);
  144. $query = DB::table(TableName::agent() . 'superball_prize_log as p')
  145. ->leftJoin('QPAccountsDB.dbo.AccountsInfo as a', 'p.user_id', '=', 'a.UserID')
  146. ->selectRaw('p.*, a.GameID, a.NickName')
  147. ->orderBy('p.settle_date', 'desc')
  148. ->orderBy('p.user_id');
  149. if ($date) {
  150. $query->where('p.settle_date', $date);
  151. }
  152. if ($userId > 0) {
  153. $query->where('p.user_id', $userId);
  154. }
  155. $list = $query->paginate(50);
  156. foreach ($list as $row) {
  157. $row->total_amount_display = number_float($row->total_amount / NumConfig::NUM_VALUE);
  158. $row->base_amount_display = number_float($row->base_amount / NumConfig::NUM_VALUE);
  159. $row->lucky_amount_display = number_float($row->lucky_amount / NumConfig::NUM_VALUE);
  160. }
  161. return view('admin.superball.prizes', compact('list', 'date', 'userId'));
  162. }
  163. }