month(request('month')); $month = $requestedMonth ?: now()->format('Y-m'); $filters = [ 'month' => $month, 'shop_name' => $this->text(request('shop_name')), 'account' => $this->text(request('account')), ]; $tab = in_array($tab, ['jd', 'douyin', 'dewu', 'vip'], true) ? $tab : 'jd'; try { if ($requestedMonth === '') { $month = $this->repository->latestMonth() ?: $month; $filters['month'] = $month; } $data = $this->repository->dashboard($filters, 5000); return [ 'view' => 'business.pages.billing-transactions.platform-promotion-accounts', 'filters' => $filters, 'data' => $data, 'platform' => $tab, 'rows' => $this->paginateRows($data, $tab), 'error' => null, ]; } catch (ServiceUnavailableHttpException $exception) { return [ 'view' => 'business.pages.billing-transactions.platform-promotion-accounts', 'filters' => $filters, 'data' => [], 'platform' => $tab, 'rows' => $this->emptyPaginator(), 'error' => $exception->getMessage(), ]; } catch (Throwable $exception) { report($exception); return [ 'view' => 'business.pages.billing-transactions.platform-promotion-accounts', 'filters' => $filters, 'data' => [], 'platform' => $tab, 'rows' => $this->emptyPaginator(), 'error' => '推广账户数据暂时无法读取,请稍后重试。', ]; } } private function paginateRows(array $data, string $tab): LengthAwarePaginator { $key = ['jd' => 'jd', 'douyin' => 'dy', 'dewu' => 'dw', 'vip' => 'vipSales'][$tab]; $rows = $tab === 'vip' ? array_merge($data['vipSales'] ?? [], $data['vipTax'] ?? [], $data['vipMarketing'] ?? []) : ($data[$key] ?? []); $page = max((int) request('page', 1), 1); $perPage = 50; return new LengthAwarePaginator( Collection::make($rows)->forPage($page, $perPage)->values(), count($rows), $perPage, $page, ['path' => request()->url(), 'query' => request()->except('page')], ); } private function emptyPaginator(): LengthAwarePaginator { return new LengthAwarePaginator([], 0, 50, 1, [ 'path' => request()->url(), 'query' => request()->query(), ]); } private function text(mixed $value): string { return mb_substr(trim((string) $value), 0, 100); } private function month(mixed $value): string { $value = trim((string) $value); if (preg_match('/^(\d{4})-(\d{2})$/', $value, $matches) !== 1 || (int) $matches[2] < 1 || (int) $matches[2] > 12) { return ''; } return $value; } }