[ 'driver' => 'sqlite', 'database' => ':memory:', 'prefix' => '', ], 'upstream_mirrors.connection' => 'business_mirror', ]); DB::purge('business_mirror'); Schema::connection('business_mirror')->create( 'store_receipt_order_match_rows', function (Blueprint $table): void { $table->date('report_month'); $table->string('row_key'); $table->string('platform'); $table->string('store_name'); $table->decimal('income_amount', 20, 4)->default(0); $table->decimal('discount_amount', 20, 4)->default(0); $table->decimal('offset_amount', 20, 4)->default(0); $table->decimal('refund_amount', 20, 4)->default(0); $table->decimal('default_compensation_amount', 20, 4)->default(0); $table->dateTime('imported_at')->nullable(); $table->primary(['report_month', 'row_key']); }, ); cache()->flush(); } public function test_monthly_income_uses_the_five_component_formula_and_only_requested_stores(): void { $stores = array_values(config('kuka_posting.stores')); $firstStore = $stores[0]; $secondStore = $stores[1]; DB::connection('business_mirror')->table('store_receipt_order_match_rows')->insert([ $this->row('oct-first', '2026-10-01', $firstStore, 100, 10, -5, -20, -1), $this->row('oct-second', '2026-10-01', $secondStore, 50, 0, 0, -10, 2), $this->row('sep-first', '2026-09-01', $firstStore, 1000, 0, 0, 0, 0), $this->row('oct-outside', '2026-10-01', '其他店铺', 999999, 0, 0, 0, 0), $this->row('oct-wallet', '2026-10-01', $firstStore, 888888, 0, 0, 0, 0, '京东网银钱包'), ]); $data = app(KukaPostingPerformancePageData::class)->build( Request::create('/posting-data/kuka-basic-data', 'GET', ['month' => '2026-10']), ); $this->assertSame('2026-10', $data['month']); $this->assertCount(12, $data['stores']); $this->assertSame(2, $data['summary']['row_count']); $this->assertSame(2, $data['summary']['stores_with_data']); $this->assertSame(150.0, $data['summary']['income_amount']); $this->assertSame(10.0, $data['summary']['discount_amount']); $this->assertSame(-5.0, $data['summary']['offset_amount']); $this->assertSame(-30.0, $data['summary']['refund_amount']); $this->assertSame(1.0, $data['summary']['default_compensation_amount']); $this->assertSame(126.0, $data['summary']['total_income']); $this->assertSame([ 'month' => '2026-10', 'label' => '2026年10月', 'total_income' => 126.0, 'row_count' => 2, ], $data['monthly_totals'][0]); $this->assertSame([ 'month' => '2026-09', 'label' => '2026年9月', 'total_income' => 1000.0, 'row_count' => 1, ], $data['monthly_totals'][1]); $first = collect($data['stores'])->firstWhere('store_name', $firstStore); $second = collect($data['stores'])->firstWhere('store_name', $secondStore); $this->assertSame(84.0, $first['total_income']); $this->assertSame(42.0, $second['total_income']); $this->loginAs() ->get(route('business.pages.show', [ 'section' => 'posting-data', 'page' => 'kuka-basic-data', 'submenu' => 'performance', 'month' => '2026-10', ])) ->assertOk() ->assertSeeText('灵珊店铺业绩 · 月度收入') ->assertSeeText('2026年10月合计收入') ->assertSeeText('¥126.00') ->assertSeeText($firstStore) ->assertSeeText($secondStore) ->assertSeeText('退款金额') ->assertSeeText('违约赔付(冲减收入)') ->assertDontSeeText('其他店铺'); } private function row( string $key, string $month, string $store, float $income, float $discount, float $offset, float $refund, float $defaultCompensation, string $platform = '京东账单', ): array { return [ 'report_month' => $month, 'row_key' => $key, 'platform' => $platform, 'store_name' => $store, 'income_amount' => $income, 'discount_amount' => $discount, 'offset_amount' => $offset, 'refund_amount' => $refund, 'default_compensation_amount' => $defaultCompensation, 'imported_at' => '2026-10-31 23:00:00', ]; } }