['label' => '待处理', 'statuses' => [CourierOnboarding::STATUS_SUBMITTED, CourierOnboarding::STATUS_FIRST_APPROVED, CourierOnboarding::STATUS_APPROVED]], 'filling' => ['label' => '待快递填写', 'statuses' => [CourierOnboarding::STATUS_INVITED, CourierOnboarding::STATUS_RETURNED]], 'activated' => ['label' => '已开通', 'statuses' => [CourierOnboarding::STATUS_ACTIVATED]], 'closed' => ['label' => '已关闭', 'statuses' => [CourierOnboarding::STATUS_REJECTED, CourierOnboarding::STATUS_CANCELLED]], 'all' => ['label' => '全部', 'statuses' => []], ]; public function __construct(private readonly CourierOnboardingService $service) { } public function page(): array { $group = (string) request()->query('group', 'pending'); $group = array_key_exists($group, self::STATUS_GROUPS) ? $group : 'pending'; $search = trim((string) request()->query('search', '')); $limit = min(max((int) setting('default.list_limit', 25), 1), 100); $data = [ 'view' => 'business.pages.courier-payables.courier-onboarding', 'onboardingReady' => $this->service->ready(), 'onboardingGroup' => $group, 'onboardingSearch' => $search, 'onboardingGroups' => self::STATUS_GROUPS, 'onboardingCounts' => [], 'onboardingRows' => new LengthAwarePaginator([], 0, $limit), ]; if (! $data['onboardingReady']) { return $data; } $counts = $this->service->statusCounts(); $data['onboardingCounts'] = collect(self::STATUS_GROUPS) ->map(static fn (array $config): int => $config['statuses'] === [] ? array_sum($counts) : array_sum(array_intersect_key($counts, array_flip($config['statuses'])))) ->all(); $query = CourierOnboarding::query()->withCount('files'); $statuses = self::STATUS_GROUPS[$group]['statuses']; if ($statuses !== []) { $query->whereIn('status', $statuses); } if ($search !== '') { $like = '%' . addcslashes($search, '%_\\') . '%'; $query->where(static function ($builder) use ($like): void { foreach (['number', 'invite_label', 'company_full_name', 'network_name', 'courier_name', 'contact_name', 'contact_phone'] as $column) { $builder->orWhere($column, 'like', $like); } }); } $data['onboardingRows'] = $query->latest('updated_at')->latest('id') ->paginate($limit) ->withQueryString(); return $data; } /** * 快递资料页「入驻快递」页签:已开通的入驻快递,作为新快递的主数据。 */ public function activated(int $page, int $limit): LengthAwarePaginator { if (! $this->service->ready()) { return new LengthAwarePaginator([], 0, $limit, $page); } $search = trim((string) request()->query('search', '')); $query = CourierOnboarding::query()->where('status', CourierOnboarding::STATUS_ACTIVATED); if ($search !== '') { $like = '%' . addcslashes($search, '%_\\') . '%'; $query->where(static function ($builder) use ($like): void { foreach (['courier_name', 'company_full_name', 'network_name', 'contact_name'] as $column) { $builder->orWhere($column, 'like', $like); } }); } return $query->latest('activated_at')->paginate($limit, ['*'], 'page', $page)->withQueryString(); } }