AgentMemberService.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. <?php
  2. namespace App\Services\Agent;
  3. use App\Models\Agent\Agent;
  4. use App\Models\User;
  5. use Carbon\Carbon;
  6. use Illuminate\Support\Facades\DB;
  7. class AgentMemberService
  8. {
  9. public function __construct(private AgentReportService $reports)
  10. {
  11. }
  12. public function paginate(Agent $root, array $params): array
  13. {
  14. $page = max(1, (int) ($params['page'] ?? 1));
  15. $limit = min(100, max(1, (int) ($params['limit'] ?? 20)));
  16. $wallets = DB::table('wallets')->selectRaw('member_id, COALESCE(SUM(available_balance),0) available_balance, COALESCE(SUM(frozen_balance),0) frozen_balance')->groupBy('member_id');
  17. $query = User::query()->leftJoinSub($wallets, 'wallets', 'wallets.member_id', '=', 'users.member_id')
  18. ->whereIn('users.agent_id', $this->reports->visibleAgentIds($root));
  19. if (!empty($params['keyword'])) {
  20. $keyword = '%' . $params['keyword'] . '%';
  21. $query->where(function ($query) use ($keyword) {
  22. $query->where('users.username', 'like', $keyword)
  23. ->orWhere('users.first_name', 'like', $keyword)
  24. ->orWhere('users.member_id', 'like', $keyword);
  25. });
  26. }
  27. if (!empty($params['agent_id'])) {
  28. $query->where('users.agent_id', (int) $params['agent_id']);
  29. }
  30. if (isset($params['status']) && $params['status'] !== '') {
  31. $query->where('users.status', (int) $params['status']);
  32. }
  33. if (!empty($params['start_date'])) {
  34. $query->where('users.created_at', '>=', Carbon::parse($params['start_date'])->startOfDay());
  35. }
  36. if (!empty($params['end_date'])) {
  37. $query->where('users.created_at', '<=', Carbon::parse($params['end_date'])->endOfDay());
  38. }
  39. $total = (clone $query)->count('users.id');
  40. $list = $query->leftJoin('agents', 'agents.id', '=', 'users.agent_id')
  41. ->select([
  42. 'users.id', 'users.member_id', 'users.username', 'users.first_name', 'users.status',
  43. 'users.agent_id', 'users.register_ip', 'users.register_domain', 'users.created_at',
  44. 'wallets.available_balance', 'wallets.frozen_balance', 'agents.username as agent_username',
  45. ])->orderByDesc('users.id')->forPage($page, $limit)->get();
  46. return compact('total', 'page', 'limit', 'list');
  47. }
  48. public function finance(Agent $root, array $params): array
  49. {
  50. $listParams = $params;
  51. unset($listParams['start_date'], $listParams['end_date']);
  52. $listParams['limit'] = min(20, max(1, (int) ($params['limit'] ?? 10)));
  53. $result = $this->paginate($root, $listParams);
  54. $start = Carbon::parse($params['start_date'] ?? now()->toDateString())->startOfDay();
  55. $end = Carbon::parse($params['end_date'] ?? now()->toDateString())->endOfDay();
  56. $result['list'] = collect($result['list'])->map(function ($member) use ($start, $end) {
  57. $memberId = $member->member_id;
  58. $summary = $this->reports->summaryForMemberIds([$memberId], $start->toDateString(), $end->toDateString());
  59. foreach ([
  60. 'recharge_amount' => 'deposit_amount', 'withdraw_amount' => 'withdraw_amount',
  61. 'manual_credit' => 'manual_credit', 'manual_debit' => 'manual_debit',
  62. 'bonus_amount' => 'bonus_amount', 'rebate_amount' => 'rebate_amount',
  63. 'bet_count' => 'bet_count', 'bet_amount' => 'bet_amount',
  64. 'valid_bet_amount' => 'valid_bet_amount', 'win_loss' => 'win_loss',
  65. ] as $target => $source) {
  66. $member->{$target} = $summary[$source];
  67. }
  68. $member->recharge_count = DB::table('recharges')->where('member_id', $memberId)->where('status', 1)->whereBetween('created_at', [$start, $end])->count();
  69. $member->withdraw_count = DB::table('withdraws')->where('member_id', $memberId)->where('status', 1)->whereBetween('created_at', [$start, $end])->count();
  70. return $member;
  71. })->all();
  72. return $result;
  73. }
  74. public function bets(Agent $root, array $params): array
  75. {
  76. $source = (string) ($params['source'] ?? 'third');
  77. $definitions = [
  78. 'pc28' => ['table' => 'bets', 'status' => 'status', 'time' => 'created_at', 'member' => 'member_id'],
  79. 'sport' => ['table' => 'sport_game_order', 'status' => 'status', 'time' => 'created_at', 'member' => 'member_id'],
  80. 'jisu' => ['table' => 'jisu_game_order', 'status' => 'status', 'time' => 'created_at', 'member' => 'member_id'],
  81. 'lhc' => ['table' => 'lhc_order', 'status' => 'lottery_status', 'time' => 'created_at', 'member' => 'member_id'],
  82. 'third' => ['table' => 'third_game_orders', 'status' => 'status', 'time' => 'last_update_time', 'member' => 'member_id'],
  83. ];
  84. if (!isset($definitions[$source])) {
  85. throw new \InvalidArgumentException('投注来源错误');
  86. }
  87. $definition = $definitions[$source];
  88. $page = max(1, (int) ($params['page'] ?? 1));
  89. $limit = min(100, max(1, (int) ($params['limit'] ?? 20)));
  90. $query = DB::table($definition['table'])
  91. ->join('users', 'users.member_id', '=', $definition['table'] . '.' . $definition['member'])
  92. ->whereIn('users.agent_id', $this->reports->visibleAgentIds($root));
  93. if (!empty($params['member_id'])) {
  94. $query->where('users.member_id', (string) $params['member_id']);
  95. }
  96. if (!empty($params['username'])) {
  97. $query->where('users.username', 'like', '%' . $params['username'] . '%');
  98. }
  99. if (isset($params['status']) && $params['status'] !== '') {
  100. $query->where($definition['table'] . '.' . $definition['status'], (int) $params['status']);
  101. }
  102. if (!empty($params['start_date'])) {
  103. $start = Carbon::parse($params['start_date'])->startOfDay();
  104. $query->where($definition['table'] . '.' . $definition['time'], '>=', $source === 'lhc' ? $start->timestamp : $start);
  105. }
  106. if (!empty($params['end_date'])) {
  107. $end = Carbon::parse($params['end_date'])->endOfDay();
  108. $query->where($definition['table'] . '.' . $definition['time'], '<=', $source === 'lhc' ? $end->timestamp : $end);
  109. }
  110. $total = (clone $query)->count($definition['table'] . '.id');
  111. $list = $query->select($definition['table'] . '.*', 'users.username', 'users.first_name', 'users.agent_id')
  112. ->orderByDesc($definition['table'] . '.id')->forPage($page, $limit)->get();
  113. return compact('source', 'total', 'page', 'limit', 'list');
  114. }
  115. }