isSuperAdmin()) { return null; } $agentId = $admin->primaryAgentNodeId(); if ($agentId === null) { return null; } return AgentNode::query()->find($agentId); } public static function nodeVisibleTo(AdminUser $admin, AgentNode $node): bool { if ($admin->isSuperAdmin()) { return true; } $actor = self::primaryAgentNode($admin); if ($actor === null) { return false; } return $node->isSameOrDescendantOf($actor); } public static function playerAccessible(AdminUser $admin, Player $player): bool { if ($admin->isSuperAdmin()) { return true; } $actor = self::primaryAgentNode($admin); if ($actor === null) { return true; } if ($player->agent_node_id === null) { return false; } $playerAgent = AgentNode::query()->find((int) $player->agent_node_id); if ($playerAgent === null) { return false; } return $playerAgent->isSameOrDescendantOf($actor); } public static function nodeManageableBy(AdminUser $admin, AgentNode $node): bool { if ($admin->isSuperAdmin()) { return true; } if (! $admin->hasPermissionCode('agent.node.manage')) { return false; } return self::nodeVisibleTo($admin, $node); } /** * @return Builder */ public static function visibleNodesQuery(AdminUser $admin, int $adminSiteId): Builder { $query = AgentNode::query() ->where('admin_site_id', $adminSiteId) ->orderBy('path'); if ($admin->isSuperAdmin()) { return $query; } $actor = self::primaryAgentNode($admin); if ($actor === null || (int) $actor->admin_site_id !== $adminSiteId) { return $query->whereRaw('0 = 1'); } return $query->where('path', 'like', $actor->path.'%'); } /** * 玩家必须落在当前代理子树(agent_node_id 必填,由迁移回填根代理)。 * * @param Builder $query */ public static function applyToPlayerQuery(Builder $query, AdminUser $admin): void { if ($admin->isSuperAdmin()) { return; } $actor = self::primaryAgentNode($admin); if ($actor === null) { $query->whereRaw('0 = 1'); return; } if (! \Illuminate\Support\Facades\Schema::hasColumn('players', 'agent_node_id')) { return; } $subtreeIds = AgentNode::query() ->where('path', 'like', $actor->path.'%') ->pluck('id') ->all(); if ($subtreeIds === []) { $query->whereRaw('0 = 1'); return; } $query->whereIn('agent_node_id', $subtreeIds); } /** * 在已有站点/代理范围上,再按指定节点子树收窄(超管筛选用)。 * * @param Builder $query */ public static function applyRequestedAgentNodeFilter(Builder $query, AdminUser $admin, int $agentNodeId): void { $node = AgentNode::query()->find($agentNodeId); if ($node === null || ! self::nodeVisibleTo($admin, $node)) { $query->whereRaw('0 = 1'); return; } if (! \Illuminate\Support\Facades\Schema::hasColumn('players', 'agent_node_id')) { return; } $subtreeIds = AgentNode::query() ->where('path', 'like', $node->path.'%') ->pluck('id') ->all(); if ($subtreeIds === []) { $query->whereRaw('0 = 1'); return; } $query->whereIn('agent_node_id', $subtreeIds); } }