loadMissing([ 'teacher:id,is_partner,name', 'adminUser.roles:id,code', ]); $isAdmin = $user->adminUser && (int) $user->adminUser->status === 1; $teacherPartner = (bool) ($user->teacher?->is_partner ?? false); $identityType = $user->identity_type; if ($isAdmin) { $role = self::ROLE_ADMIN; } elseif ($identityType === self::ROLE_PARTNER || $teacherPartner) { $role = self::ROLE_PARTNER; } elseif ($identityType === self::ROLE_INCUBATION) { $role = self::ROLE_INCUBATION; } else { $role = self::ROLE_NORMAL; } return [ 'role' => $role, 'role_label' => self::roleLabel($role), 'is_admin' => $isAdmin, 'is_partner' => $role === self::ROLE_PARTNER, 'is_incubation' => $role === self::ROLE_INCUBATION, 'can_see_radar' => in_array($role, [self::ROLE_ADMIN, self::ROLE_PARTNER], true), 'can_see_papers' => in_array($role, [self::ROLE_ADMIN, self::ROLE_PARTNER], true), 'can_access_demands' => in_array($role, [self::ROLE_ADMIN, self::ROLE_PARTNER, self::ROLE_INCUBATION], true), 'can_use_crawler' => $role === self::ROLE_ADMIN, ]; } public static function roleLabel(string $role): string { return match ($role) { self::ROLE_ADMIN => '管理员', self::ROLE_PARTNER => '合作伙伴', self::ROLE_INCUBATION => '入孵用户', default => '普通用户', }; } public static function identityTypeLabel(?string $identityType): ?string { return match ($identityType) { self::ROLE_INCUBATION => '入孵用户', self::ROLE_PARTNER => '合作伙伴', default => null, }; } }