arguments = func_get_args(); return ['rows' => [], 'total' => 0]; } }; $refresher = $this->refresher(alibaba: $alibaba); $status = $refresher->refresh([ 'scope' => 'marketing-account-bills.alibaba.list', 'parameters' => [ 'filters' => [ 'shop_name' => '测试店铺', 'product_type' => '全站投放', 'from' => '2026-06-30', 'to' => '2026-07-01', ], 'page' => 3, 'limit' => 50, ], ]); $this->assertSame('fresh', $status); $this->assertSame( ['测试店铺', '全站投放', '2026-06-30', '2026-07-01', 3, 50], $alibaba->arguments, ); } public function test_pinduoduo_flow_filter_is_preserved_during_background_refresh(): void { $pinduoduo = new class extends PinduoduoSpreadBillRepository { public array $arguments = []; public function __construct() { } public function paginate( ?string $storeName = null, ?string $fromDate = null, ?string $toDate = null, ?string $flowType = null, int $page = 1, int $pageSize = 25 ): array { $this->arguments = func_get_args(); return ['rows' => [], 'total' => 0]; } }; $refresher = $this->refresher(pinduoduo: $pinduoduo); $status = $refresher->refresh([ 'scope' => 'pinduoduo-bills.list', 'parameters' => [ 'filters' => [ 'store_name' => '测试店铺', 'from' => '2026-07-01', 'to' => '2026-07-23', 'flow_type' => 'expense', ], 'page' => 3, 'limit' => 50, ], ]); $this->assertSame('fresh', $status); $this->assertSame( ['测试店铺', '2026-07-01', '2026-07-23', 'expense', 3, 50], $pinduoduo->arguments ); } public function test_pinduoduo_monthly_balance_view_is_preserved_during_background_refresh(): void { $pinduoduo = new class extends PinduoduoSpreadBillRepository { public array $arguments = []; public function __construct() {} public function paginateMonthlyBalances( ?string $storeName = null, ?string $month = null, int $page = 1, int $pageSize = 25 ): array { $this->arguments = func_get_args(); return ['rows' => [], 'total' => 0]; } }; $status = $this->refresher(pinduoduo: $pinduoduo)->refresh([ 'scope' => 'pinduoduo-bills.list', 'parameters' => [ 'view' => 'monthly-balances', 'filters' => ['store_name' => '测试店铺', 'month' => '2026-06'], 'page' => 2, 'limit' => 50, ], ]); $this->assertSame('fresh', $status); $this->assertSame(['测试店铺', '2026-06', 2, 50], $pinduoduo->arguments); } public function test_taobao_alipay_filters_are_preserved_during_background_refresh(): void { $taobaoAlipay = new class extends TmallTaobaoSpreadBillRepository { public array $arguments = []; public function __construct() { } public function paginate( ?string $storeName = null, ?string $fromDate = null, ?string $toDate = null, ?string $flowType = null, int $page = 1, int $pageSize = 25 ): array { $this->arguments = func_get_args(); return ['rows' => [], 'total' => 0]; } }; $refresher = $this->refresher(taobaoAlipay: $taobaoAlipay); $status = $refresher->refresh([ 'scope' => 'taobao-alipay-bills.list', 'parameters' => [ 'filters' => [ 'store_name' => '测试店铺', 'from' => '2026-07-01', 'to' => '2026-07-23', 'flow_type' => 'income', ], 'page' => 2, 'limit' => 25, ], ]); $this->assertSame('fresh', $status); $this->assertSame( ['测试店铺', '2026-07-01', '2026-07-23', 'income', 2, 25], $taobaoAlipay->arguments ); } public function test_taobao_monthly_balance_view_is_preserved_during_background_refresh(): void { $taobao = new class extends TmallTaobaoSpreadBillRepository { public array $arguments = []; public function __construct() {} public function paginateMonthlyBalances( ?string $storeName = null, ?string $month = null, int $page = 1, int $pageSize = 25 ): array { $this->arguments = func_get_args(); return ['rows' => [], 'total' => 0]; } }; $status = $this->refresher(taobaoAlipay: $taobao)->refresh([ 'scope' => 'taobao-alipay-bills.list', 'parameters' => [ 'view' => 'monthly-balances', 'filters' => ['store_name' => '淘系店铺', 'month' => '2026-06'], 'page' => 3, 'limit' => 25, ], ]); $this->assertSame('fresh', $status); $this->assertSame(['淘系店铺', '2026-06', 3, 25], $taobao->arguments); } public function test_inventory_scope_is_available_to_background_refresh(): void { $inventory = new class extends InventoryRepository { public array $arguments = []; public function __construct() { } public function boardInventoryDetails(array $filters, int $page, int $limit): array { $this->arguments = func_get_args(); return ['data' => [], 'total' => 0, 'totals' => []]; } }; $refresher = $this->refresher(inventory: $inventory); $status = $refresher->refresh([ 'scope' => 'inventory.board-details', 'parameters' => [ 'filters' => ['manufacturer' => '测试厂'], 'page' => 2, 'limit' => 50, ], ]); $this->assertSame('fresh', $status); $this->assertSame([['manufacturer' => '测试厂'], 2, 50], $inventory->arguments); } public function test_raw_board_reconciliation_scope_is_available_to_background_refresh(): void { $rawBoardPayables = new class extends RawBoardPayablesRepository { public array $arguments = []; public function __construct() { } public function reconciliations(array $filters, int $page, int $limit): array { $this->arguments = func_get_args(); return ['data' => [], 'total' => 0, 'totals' => []]; } }; $refresher = $this->refresher(rawBoardPayables: $rawBoardPayables); $status = $refresher->refresh([ 'scope' => 'raw-board.reconciliations', 'parameters' => [ 'filters' => ['supplier' => '测试厂'], 'page' => 2, 'limit' => 50, ], ]); $this->assertSame('fresh', $status); $this->assertSame([['supplier' => '测试厂'], 2, 50], $rawBoardPayables->arguments); } public function test_jd_wallet_scopes_are_available_to_background_refresh(): void { $jdWallet = new class extends JdWalletBillRepository { public array $calls = []; public function __construct() { } public function paginateConsumption( ?string $shopName = null, ?string $fromDate = null, ?string $toDate = null, int $page = 1, int $pageSize = 25, ): array { $this->calls['consumption.list'] = func_get_args(); return ['rows' => [], 'total' => 0]; } public function paginateRecharge( ?string $shopName = null, ?string $fromDate = null, ?string $toDate = null, int $page = 1, int $pageSize = 25, ): array { $this->calls['recharge.list'] = func_get_args(); return ['rows' => [], 'total' => 0]; } public function summaryConsumption( ?string $shopName = null, ?string $fromDate = null, ?string $toDate = null, ): array { $this->calls['consumption.summary'] = func_get_args(); return ['amount_total' => 0, 'balance_total' => 0, 'count' => 0]; } public function summaryRecharge( ?string $shopName = null, ?string $fromDate = null, ?string $toDate = null, ): array { $this->calls['recharge.summary'] = func_get_args(); return ['amount_total' => 0, 'balance_total' => 0, 'count' => 0]; } public function shopOptions(): array { $this->calls['options'] = []; return ['测试京东店铺']; } }; $refresher = $this->refresher(jdWallet: $jdWallet); $rechargeStatus = $refresher->refresh([ 'scope' => 'jd-wallet-bills.recharge.list', 'parameters' => [ 'filters' => [ 'store_name' => '测试京东店铺', 'from' => '2026-08-01', 'to' => '2026-08-10', ], 'page' => 2, 'limit' => 50, ], ]); $consumptionSummaryStatus = $refresher->refresh([ 'scope' => 'jd-wallet-bills.consumption.summary', 'parameters' => [ 'filters' => [ 'store_name' => '测试京东店铺', 'from' => '2026-08-01', 'to' => '2026-08-10', ], ], ]); $rechargeSummaryStatus = $refresher->refresh([ 'scope' => 'jd-wallet-bills.recharge.summary', 'parameters' => [ 'filters' => [ 'store_name' => '测试京东店铺', 'from' => '2026-08-01', 'to' => '2026-08-10', ], ], ]); $consumptionListStatus = $refresher->refresh([ 'scope' => 'jd-wallet-bills.consumption.list', 'parameters' => [ 'filters' => [ 'store_name' => '测试京东店铺', 'from' => '2026-08-01', 'to' => '2026-08-10', ], 'page' => 3, 'limit' => 25, ], ]); $optionsStatus = $refresher->refresh([ 'scope' => 'jd-wallet-bills.options', 'parameters' => [], ]); $this->assertSame('fresh', $rechargeStatus); $this->assertSame('fresh', $consumptionSummaryStatus); $this->assertSame('fresh', $rechargeSummaryStatus); $this->assertSame('fresh', $consumptionListStatus); $this->assertSame('fresh', $optionsStatus); $this->assertSame( ['测试京东店铺', '2026-08-01', '2026-08-10', 2, 50], $jdWallet->calls['recharge.list'], ); $this->assertSame( ['测试京东店铺', '2026-08-01', '2026-08-10'], $jdWallet->calls['consumption.summary'], ); $this->assertSame( ['测试京东店铺', '2026-08-01', '2026-08-10'], $jdWallet->calls['recharge.summary'], ); $this->assertSame( ['测试京东店铺', '2026-08-01', '2026-08-10', 3, 25], $jdWallet->calls['consumption.list'], ); $this->assertSame([], $jdWallet->calls['options']); } private function refresher( ?InventoryRepository $inventory = null, ?AlibabaBillRepository $alibaba = null, ?PinduoduoSpreadBillRepository $pinduoduo = null, ?RawBoardPayablesRepository $rawBoardPayables = null, ?TmallTaobaoSpreadBillRepository $taobaoAlipay = null, ?SupplierPayableReportRepository $supplierPayableReports = null, ?JdWalletBillRepository $jdWallet = null, ): JianSunSnapshotRefresher { return new JianSunSnapshotRefresher( new class extends JianSunQueryCache { public mixed $value = null; public function __construct() { } public function refresh(string $scope, array $parameters, Closure $resolver): string { $this->value = $resolver(); return 'fresh'; } }, $this->placeholder(EdgeBandingRepository::class), $this->placeholder(GoodsReconciliationRepository::class), $inventory ?? $this->placeholder(InventoryRepository::class), $alibaba ?? $this->placeholder(AlibabaBillRepository::class), $pinduoduo ?? $this->placeholder(PinduoduoSpreadBillRepository::class), $rawBoardPayables ?? $this->placeholder(RawBoardPayablesRepository::class), $taobaoAlipay ?? $this->placeholder(TmallTaobaoSpreadBillRepository::class), $this->placeholder(SupplierPayableRepository::class), $supplierPayableReports ?? $this->placeholder(SupplierPayableReportRepository::class), $jdWallet ?? $this->placeholder(JdWalletBillRepository::class), ); } private function placeholder(string $class): object { return (new ReflectionClass($class))->newInstanceWithoutConstructor(); } }