1, 'message' => '无操作权限', 'data' => null, ], 403)); } } public static function requireAny(array $authUser, array $keys): void { if (!self::hasAny($authUser, $keys)) { throw new \think\exception\HttpResponseException(json([ 'code' => 1, 'message' => '无操作权限', 'data' => null, ], 403)); } } /** * @return int[]|null null 表示可见全部用户 */ public static function visibleUserIds(array $authUser): ?array { if (self::hasPermission($authUser, 'btn:conv:view_all') || self::hasPermission($authUser, 'can_view_all_conversations')) { return null; } if (self::hasPermission($authUser, 'btn:conv:view_subordinate') || self::hasPermission($authUser, 'can_view_subordinate_conversations')) { $departmentId = (int) ($authUser['department_id'] ?? 0); if ($departmentId <= 0) { return [(int) $authUser['id']]; } $deptIds = DeptSvc::descendantIds($departmentId); $userIds = DeptSvc::userIdsInDepartments($deptIds); return array_values(array_unique(array_map('intval', $userIds))); } if (($authUser['role'] ?? '') === 'admin') { return null; } return [(int) $authUser['id']]; } public static function canViewUser(array $authUser, int $targetUserId): bool { $visible = self::visibleUserIds($authUser); if ($visible === null) { return true; } return in_array($targetUserId, $visible, true); } public static function canViewConversation(array $authUser, int $conversationUserId): bool { return self::canViewUser($authUser, $conversationUserId); } public static function applyUserScope($query, array $authUser, string $alias = 'u') { $visible = self::visibleUserIds($authUser); if ($visible !== null) { $query->whereIn("{$alias}.id", $visible ?: [0]); } return $query; } public static function applyConversationScope($query, array $authUser, string $conversationAlias = 'c') { $visible = self::visibleUserIds($authUser); if ($visible !== null) { $query->whereIn("{$conversationAlias}.user_id", $visible ?: [0]); } return $query; } public static function syncLegacyRoleField(int $userId, ?int $roleId): void { if (!$roleId) { return; } $role = Role::find($roleId); if (!$role) { return; } $permissions = PermissionCatalog::normalize($role->permissions ?? []); $legacyRole = !empty($permissions['can_access_admin']) ? 'admin' : 'user'; User::where('id', $userId)->update(['role' => $legacyRole]); } }