| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- <?php
- namespace Tests\Integration;
- use App\Http\Controllers\admin\Agent as AdminAgent;
- use App\Models\Agent\Agent;
- use App\Models\Agent\AgentSetting;
- use App\Services\Agent\AgentDomainService;
- use App\Services\Agent\AgentEquityService;
- use App\Services\Agent\AgentPeriodReportService;
- use App\Services\Agent\AgentReportService;
- use App\Services\Agent\AgentWalletService;
- use App\Services\MemberDailyReportService;
- use App\Support\StatsScope;
- use Illuminate\Database\Schema\Blueprint;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Schema;
- use PHPUnit\Framework\TestCase;
- use Tests\Support\AgentTestEnvironment;
- /** 测试代理:名下会员和自身资金不进统计;测试代理自己的后台照常显示;切换后跟随代理当前设置。今天 2026-09-07。 */
- class TestAgentStatsTest extends TestCase
- {
- use AgentTestEnvironment;
- private Agent $real;
- private Agent $test;
- private Agent $shareholder;
- private function seed(): void
- {
- if (!Schema::hasColumn('users', 'from')) Schema::table('users', fn (Blueprint $t) => $t->integer('from')->nullable());
- $this->real = $this->agent();
- $this->test = $this->agents->create(['username' => 'testagent', 'password' => 'secret1', 'type' => Agent::TYPE_JOINT, 'is_test' => 1]);
- $this->shareholder = $this->agent(Agent::TYPE_EQUITY);
- foreach (['r1' => $this->real->id, 't1' => $this->test->id, 'free' => null] as $memberId => $agentId) {
- $id = DB::table('users')->insertGetId(['member_id' => $memberId, 'username' => $memberId, 'agent_id' => $agentId, 'from' => 1, 'created_at' => '2026-09-07 08:00:00']);
- DB::table('recharges')->insert(['member_id' => $memberId, 'status' => 1, 'amount' => 100, 'created_at' => '2026-09-07 09:00:00']);
- DB::table('member_daily_reports')->insert(['report_date' => '2026-09-07', 'user_id' => $id, 'member_id' => $memberId, 'agent_id' => $agentId,
- 'deposit_amount' => 100, 'bet_count' => 1, 'bet_amount' => 10, 'categories' => '{}', 'created_at' => now(), 'updated_at' => now()]);
- }
- }
- public function test_admin_creates_edits_and_filters_test_agents(): void
- {
- $this->seed();
- $this->assertSame(1, $this->test->fresh()->is_test);
- $this->assertSame(0, $this->real->fresh()->is_test);
- $this->agents->update($this->real, ['is_test' => 1]);
- $this->assertSame(1, $this->real->fresh()->is_test);
- $this->agents->update($this->real, ['is_test' => 0, 'status' => 1]);
- $request = Request::create('/admin/agent', 'GET', ['is_test' => 1]);
- $request->user = (object) ['id' => 1];
- $this->app->instance('request', $request);
- $list = (new AdminAgent())->index($request, new AgentDomainService())->getData(true)['data']['list'];
- $this->assertSame(['testagent'], array_column($list, 'username'));
- $this->assertSame(1, $list[0]['is_test']);
- }
- public function test_admin_and_shareholder_stats_skip_test_members_but_test_agent_sees_its_own(): void
- {
- $this->seed();
- $reports = new AgentReportService();
- // 入股股东的全平台统计:不含测试会员
- $platform = $reports->dashboard($this->shareholder, '2026-09-07', '2026-09-07');
- $this->assertSame([2, '200.0000'], [$platform['member_count'], $platform['deposit_amount']]);
- $period = (new AgentPeriodReportService())->report($this->shareholder, ['period' => 'day', 'start_date' => '2026-09-07', 'end_date' => '2026-09-07']);
- $this->assertSame(['200.0000', 2], [$period['totals']['deposit_amount'], $period['totals']['new_members']]);
- // 测试代理自己的后台照常显示
- $own = $reports->dashboard($this->test, '2026-09-07', '2026-09-07');
- $this->assertSame([1, '100.0000'], [$own['member_count'], $own['deposit_amount']]);
- $this->assertSame(1, (new MemberDailyReportService())->paginate(['start_date' => '2026-09-07', 'end_date' => '2026-09-07'], $this->test)['total']);
- // 总后台:会员盈亏日报、代理报表不含测试数据
- $daily = (new MemberDailyReportService())->paginate(['start_date' => '2026-09-07', 'end_date' => '2026-09-07']);
- $this->assertSame(['free', 'r1'], collect($daily['list'])->pluck('member_id')->sort()->values()->all());
- $this->assertSame('200.0000', $daily['totals']['deposit_amount']);
- $agentRows = array_column($reports->reportRows(null, ['start_date' => '2026-09-07'])['list'], 'username');
- $this->assertNotContains('testagent', $agentRows);
- $this->assertContains($this->real->username, $agentRows);
- $this->assertSame(['testagent'], array_column($reports->reportRows($this->test, ['start_date' => '2026-09-07'])['list'], 'username'), 'test agent still sees its own report');
- // 按会员 / 按代理的资金表
- $this->assertSame(200.0, (float) StatsScope::excludeTestMembers(DB::table('recharges'))->sum('amount'));
- DB::table('agent_withdrawals')->insert([
- ['order_no' => 'AW1', 'request_key' => 'k1', 'agent_id' => $this->test->id, 'account_snapshot' => '{}', 'amount' => 50, 'actual_amount' => 50, 'status' => 'paid'],
- ['order_no' => 'AW2', 'request_key' => 'k2', 'agent_id' => $this->real->id, 'account_snapshot' => '{}', 'amount' => 30, 'actual_amount' => 30, 'status' => 'paid'],
- ]);
- $this->assertSame(30.0, (float) StatsScope::excludeTestAgents(DB::table('agent_withdrawals'))->sum('amount'), 'test agent own money is left out');
- }
- public function test_switching_the_flag_moves_history_in_and_out(): void
- {
- $this->seed();
- $reports = new AgentReportService();
- $this->assertSame('200.0000', $reports->dashboard($this->shareholder, '2026-09-07', '2026-09-07')['deposit_amount']);
- $this->agents->update($this->real, ['is_test' => 1]);
- $this->assertSame('100.0000', $reports->dashboard($this->shareholder, '2026-09-07', '2026-09-07')['deposit_amount'], 'existing members follow the agent');
- $this->agents->update($this->real, ['is_test' => 0]);
- $this->agents->update($this->test, ['is_test' => 0]);
- $this->assertSame('300.0000', $reports->dashboard($this->shareholder, '2026-09-07', '2026-09-07')['deposit_amount']);
- }
- public function test_equity_summary_skips_test_shareholders(): void
- {
- $this->seed();
- AgentSetting::current()->update(['equity_enabled' => 1, 'equity_price_per_percent' => 1000, 'equity_min_percent' => 0.1, 'equity_max_percent' => 1]);
- $equity = new AgentEquityService(new AgentWalletService());
- $testShareholder = $this->agents->create(['username' => 'testholder', 'password' => 'secret1', 'type' => Agent::TYPE_EQUITY, 'is_test' => 1]);
- foreach ([$this->shareholder, $testShareholder] as $holder) {
- Agent::query()->whereKey($holder->id)->update(['balance' => 1000, 'realtime_balance' => 1000]);
- $equity->order($holder->fresh(), '0.5');
- }
- $page = $equity->paginate([]);
- $this->assertSame(2, $page['total'], 'list still shows both');
- $this->assertSame(['0.5000', '500.0000', '0.5000'], [$page['summary']['completed_percent'], $page['summary']['completed_amount'], $page['summary']['total_equity_percent']]);
- $this->assertSame(1, collect($page['list'])->firstWhere('agent_id', $testShareholder->id)->agent->is_test);
- }
- }
|