2026-04-21 16:43:17 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 文件功能:职务权限判断服务
|
|
|
|
|
* 负责把当前用户的在职职务权限转换为统一布尔判断,
|
|
|
|
|
* 供控制器和 Blade 视图复用。
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
namespace App\Services;
|
|
|
|
|
|
|
|
|
|
use App\Models\User;
|
|
|
|
|
use App\Support\PositionPermissionRegistry;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 类功能:统一提供用户职务权限读取与校验方法。
|
|
|
|
|
*/
|
|
|
|
|
class PositionPermissionService
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* 返回当前用户拥有的全部聊天室权限码。
|
|
|
|
|
*
|
2026-04-24 23:09:32 +08:00
|
|
|
* 规则:所有用户都仅按当前在职职务的 permissions 生效。
|
2026-04-21 16:43:17 +08:00
|
|
|
*
|
|
|
|
|
* @return list<string>
|
|
|
|
|
*/
|
|
|
|
|
public function permissionsForUser(?User $user): array
|
|
|
|
|
{
|
|
|
|
|
if (! $user) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$position = $user->activePosition?->position;
|
|
|
|
|
if (! $position) {
|
|
|
|
|
return [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return array_values(array_intersect(
|
|
|
|
|
PositionPermissionRegistry::codes(),
|
|
|
|
|
$position->permissions ?? [],
|
|
|
|
|
));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 返回当前用户全部权限的布尔映射表。
|
|
|
|
|
*
|
|
|
|
|
* @return array<string, bool>
|
|
|
|
|
*/
|
|
|
|
|
public function permissionMapForUser(?User $user): array
|
|
|
|
|
{
|
|
|
|
|
$permissionMap = array_fill_keys(PositionPermissionRegistry::codes(), false);
|
|
|
|
|
|
|
|
|
|
foreach ($this->permissionsForUser($user) as $permission) {
|
|
|
|
|
$permissionMap[$permission] = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $permissionMap;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断用户是否拥有指定权限码。
|
|
|
|
|
*/
|
|
|
|
|
public function hasPermission(?User $user, string $permission): bool
|
|
|
|
|
{
|
|
|
|
|
if (! in_array($permission, PositionPermissionRegistry::codes(), true)) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return in_array($permission, $this->permissionsForUser($user), true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断用户是否至少拥有一项指定权限。
|
|
|
|
|
*
|
|
|
|
|
* @param list<string> $permissions
|
|
|
|
|
*/
|
|
|
|
|
public function hasAnyPermission(?User $user, array $permissions): bool
|
|
|
|
|
{
|
|
|
|
|
foreach ($permissions as $permission) {
|
|
|
|
|
if ($this->hasPermission($user, $permission)) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|