AgentMemberService.php 7.2 KB

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