\App\Http\HelpersDataScopeService

数据范围过滤(公用静态算法)

职责:数据可见性由「岗位范围 ∪ 个人范围 ∪ 负责人部门」决定—— 豁免(is_super 或任一启用角色 is_exempt=1,或任职超级管理员岗位 code=super)→ 全见; 可见部门集 = 任职岗位范围行展开(仅启用岗位)∪ 个人范围行展开 ∪ is_leader=1 的任职部门子树; 停用部门从范围剔除,组织/部门变更自动失效 user_scope 缓存。 任职(user_dept)本身不再自动赋予数据可见性(分配部门仅归属), 可见性完全由岗位范围与个人范围决定。

┌────────────────── 分区导航(按此顺序阅读)──────────────────┐ 分区 1 · 豁免判定 isSuper / isExempt 分区 2 · 可见范围计算 visibleDeptIds / orgUserIds / deptIdsForMemberships / deptIdsForUserScopes 分区 3 · 查询过滤 apply 分区 4 · 内部展开与过滤 computeOrgUserIds / expandMembershipDeptIds / expandUserScopeDeptIds expandUserScopeItems / expandScopeRows / expandCompanyDeptIds / activeDeptIds └────────────────────────────────────────────────────────────┘

Summary

Methods
Properties
Constants
isSuper()
isExempt()
visibleDeptIds()
orgUserIds()
deptIdsForMemberships()
deptIdsForUserScopes()
apply()
No public properties found
No constants found
No protected methods found
No protected properties found
N/A
computeOrgUserIds()
expandMembershipDeptIds()
expandUserScopeDeptIds()
expandUserScopeItems()
expandScopeRows()
expandCompanyDeptIds()
activeDeptIds()
No private properties found
N/A

Methods

isSuper()

isSuper(?\App\Models\SysUser  $user) : bool

操作者是否为超级管理员(auth('api') 当前用户),角色/用户服务共用

Parameters

?\App\Models\SysUser $user

Returns

bool —

isExempt()

isExempt(?\App\Models\SysUser  $user) : bool

用户是否数据豁免(超管,或任一启用角色 is_exempt=1,或任职超级管理员岗位)。 豁免来源 = 直授角色(user_role)∪ 超级管理员岗位(user_dept.post_id)。

走 user:user:scope 缓存(user 层,依赖 user_role/role/user_dept/post 表,变更自动失效)。

Parameters

?\App\Models\SysUser $user

Returns

bool —

visibleDeptIds()

visibleDeptIds(\App\Models\SysUser  $user) : int[]

用户可见部门 id 集(读多写少:走 user_scope 缓存,8h TTL; 岗位/个人范围、任职、角色、部门/组织变更自动失效)。

Parameters

\App\Models\SysUser $user

Returns

int[] —

orgUserIds()

orgUserIds(\App\Models\SysUser  $user) : array

组织轴:用户可见的归属人 id 集(本人 + 可见部门下的任职用户)。

请求级 memo(once):操作者单请求不变,多次目标可见性/批量校验 只算一次任职用户集,替代每次全量 whereIn 查询。

Parameters

\App\Models\SysUser $user

Returns

array —

deptIdsForMemberships()

deptIdsForMemberships(\App\Models\SysUser  $user, array  $items) : int[]

按给定任职项(已通过校验的提交 items)计算可见部门集。 用于"调整任职不得扩大自身数据范围"的前置校验(UserConfigService::syncMemberships), 与 visibleDeptIds 语义一致(activeDeptIds 过滤停用),不缓存。 比对部门集而非用户集:加一个无人任职的部门用户集不变、但部门集扩大—— 业务数据按部门集过滤,只有部门集 diff 才能真正防"借任职自扩数据范围"。

Parameters

\App\Models\SysUser $user
array $items

任职项 [{dept_id, post_id, is_leader, ...}]

Returns

int[] —

deptIdsForUserScopes()

deptIdsForUserScopes(\App\Models\SysUser  $user, array  $items) : int[]

按给定个人范围项(已通过校验的提交 items)计算可见部门集。 用于"调整个人范围不得扩大自身数据范围"的前置校验(UserConfigService::syncUserScopes), 与 deptIdsForMemberships 同规:比对部门集而非用户集。

Parameters

\App\Models\SysUser $user
array $items

个人范围项 [{company_id, dept_id}]

Returns

int[] —

apply()

apply(\Illuminate\Database\Eloquent\Builder  $query, \App\Models\SysUser|null  $currentUser, string  $ownerColumn = 'id') : void

为查询追加数据范围过滤(组织轴)。

Parameters

\Illuminate\Database\Eloquent\Builder $query
\App\Models\SysUser|null $currentUser

当前登录用户

string $ownerColumn

数据归属人字段(用户表为 id,业务表一般为 user_id)

computeOrgUserIds()

computeOrgUserIds(\App\Models\SysUser  $user) : array

计算组织轴可见用户 id 集(本人 + 可见部门下的任职用户)

Parameters

\App\Models\SysUser $user

Returns

array —

expandMembershipDeptIds()

expandMembershipDeptIds(iterable  $memberships) : array

任职项 → 展开的部门 id 集(岗位范围行 + 负责人部门;未剔停用,去重统一在 activeDeptIds)。 兼容模型对象(SysUserDept)与请求数组(dept_id/post_id/is_leader)。

Parameters

iterable $memberships

Returns

array —

expandUserScopeDeptIds()

expandUserScopeDeptIds(int  $userId) : array

个人范围 → 展开的部门 id 集(显式组织全量 / 部门子树)。

Parameters

int $userId

Returns

array —

expandUserScopeItems()

expandUserScopeItems(array  $items) : array

个人范围项([{company_id, dept_id}])→ 展开的部门 id 集。 dept_id=0 → 组织全量启用部门(公司停用不展开);否则该部门子树。

Parameters

array $items

Returns

array —

expandScopeRows()

expandScopeRows(iterable  $rows) : array

岗位范围行 → 展开的部门 id 集(MODE_ORG 显式组织全量 / MODE_DEPT 显式末级部门)。

Parameters

iterable $rows

Returns

array —

expandCompanyDeptIds()

expandCompanyDeptIds(int  $companyId) : array

显式组织 → 该公司全部启用部门;公司停用/不存在 → 空(停用即回收范围)。

Parameters

int $companyId

Returns

array —

activeDeptIds()

activeDeptIds(int[]  $deptIds) : int[]

部门集去重 + 剔除停用部门(subtreeIds 前缀区间不区分启用状态,统一在这里过滤)。

Parameters

int[] $deptIds

Returns

int[] —