| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- <?php
- namespace App\Services\Agent;
- use App\Models\Agent\Agent;
- use App\Models\User;
- use Carbon\Carbon;
- use Illuminate\Support\Facades\DB;
- class AgentMemberService
- {
- public function __construct(private AgentReportService $reports)
- {
- }
- public function paginate(Agent $root, array $params): array
- {
- $page = max(1, (int) ($params['page'] ?? 1));
- $limit = min(100, max(1, (int) ($params['limit'] ?? 20)));
- $wallets = DB::table('wallets')->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');
- }
- }
|