selectRaw('member_id, COALESCE(SUM(available_balance),0) available_balance, COALESCE(SUM(frozen_balance),0) frozen_balance')->groupBy('member_id'); $query = User::query()->leftJoinSub($wallets, 'wallets', 'wallets.member_id', '=', 'users.member_id') ->whereIn('users.agent_id', $this->reports->visibleAgentIds($root)); if (!empty($params['keyword'])) { $keyword = '%' . $params['keyword'] . '%'; $query->where(function ($query) use ($keyword) { $query->where('users.username', 'like', $keyword) ->orWhere('users.first_name', 'like', $keyword) ->orWhere('users.member_id', 'like', $keyword); }); } if (!empty($params['agent_id'])) { $query->where('users.agent_id', (int) $params['agent_id']); } if (isset($params['status']) && $params['status'] !== '') { $query->where('users.status', (int) $params['status']); } if (!empty($params['start_date'])) { $query->where('users.created_at', '>=', Carbon::parse($params['start_date'])->startOfDay()); } if (!empty($params['end_date'])) { $query->where('users.created_at', '<=', Carbon::parse($params['end_date'])->endOfDay()); } $total = (clone $query)->count('users.id'); $list = $query->leftJoin('agents', 'agents.id', '=', 'users.agent_id') ->select([ 'users.id', 'users.member_id', 'users.username', 'users.first_name', 'users.status', 'users.agent_id', 'users.register_ip', 'users.register_domain', 'users.created_at', 'wallets.available_balance', 'wallets.frozen_balance', 'agents.username as agent_username', ])->orderByDesc('users.id')->forPage($page, $limit)->get(); return compact('total', 'page', 'limit', 'list'); } public function finance(Agent $root, array $params): array { $listParams = $params; unset($listParams['start_date'], $listParams['end_date']); $listParams['limit'] = min(20, max(1, (int) ($params['limit'] ?? 10))); $result = $this->paginate($root, $listParams); $start = Carbon::parse($params['start_date'] ?? now()->toDateString())->startOfDay(); $end = Carbon::parse($params['end_date'] ?? now()->toDateString())->endOfDay(); $result['list'] = collect($result['list'])->map(function ($member) use ($start, $end) { $memberId = $member->member_id; $summary = $this->reports->summaryForMemberIds([$memberId], $start->toDateString(), $end->toDateString()); foreach ([ 'recharge_amount' => 'deposit_amount', 'withdraw_amount' => 'withdraw_amount', 'manual_credit' => 'manual_credit', 'manual_debit' => 'manual_debit', 'bonus_amount' => 'bonus_amount', 'rebate_amount' => 'rebate_amount', 'bet_count' => 'bet_count', 'bet_amount' => 'bet_amount', 'valid_bet_amount' => 'valid_bet_amount', 'win_loss' => 'win_loss', ] as $target => $source) { $member->{$target} = $summary[$source]; } $member->recharge_count = DB::table('recharges')->where('member_id', $memberId)->where('status', 1)->whereBetween('created_at', [$start, $end])->count(); $member->withdraw_count = DB::table('withdraws')->where('member_id', $memberId)->where('status', 1)->whereBetween('created_at', [$start, $end])->count(); return $member; })->all(); return $result; } public function bets(Agent $root, array $params): array { $source = (string) ($params['source'] ?? 'third'); $definitions = [ 'pc28' => ['table' => 'bets', 'status' => 'status', 'time' => 'created_at', 'member' => 'member_id'], 'sport' => ['table' => 'sport_game_order', 'status' => 'status', 'time' => 'created_at', 'member' => 'member_id'], 'jisu' => ['table' => 'jisu_game_order', 'status' => 'status', 'time' => 'created_at', 'member' => 'member_id'], 'lhc' => ['table' => 'lhc_order', 'status' => 'lottery_status', 'time' => 'created_at', 'member' => 'member_id'], 'third' => ['table' => 'third_game_orders', 'status' => 'status', 'time' => 'last_update_time', 'member' => 'member_id'], ]; if (!isset($definitions[$source])) { throw new \InvalidArgumentException('投注来源错误'); } $definition = $definitions[$source]; $page = max(1, (int) ($params['page'] ?? 1)); $limit = min(100, max(1, (int) ($params['limit'] ?? 20))); $query = DB::table($definition['table']) ->join('users', 'users.member_id', '=', $definition['table'] . '.' . $definition['member']) ->whereIn('users.agent_id', $this->reports->visibleAgentIds($root)); if (!empty($params['member_id'])) { $query->where('users.member_id', (string) $params['member_id']); } if (!empty($params['username'])) { $query->where('users.username', 'like', '%' . $params['username'] . '%'); } if (isset($params['status']) && $params['status'] !== '') { $query->where($definition['table'] . '.' . $definition['status'], (int) $params['status']); } if (!empty($params['start_date'])) { $start = Carbon::parse($params['start_date'])->startOfDay(); $query->where($definition['table'] . '.' . $definition['time'], '>=', $source === 'lhc' ? $start->timestamp : $start); } if (!empty($params['end_date'])) { $end = Carbon::parse($params['end_date'])->endOfDay(); $query->where($definition['table'] . '.' . $definition['time'], '<=', $source === 'lhc' ? $end->timestamp : $end); } $total = (clone $query)->count($definition['table'] . '.id'); $list = $query->select($definition['table'] . '.*', 'users.username', 'users.first_name', 'users.agent_id') ->orderByDesc($definition['table'] . '.id')->forPage($page, $limit)->get(); return compact('source', 'total', 'page', 'limit', 'list'); } }