|
|
@@ -0,0 +1,124 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Model;
|
|
|
+
|
|
|
+use App\Service\RangeService;
|
|
|
+use Illuminate\Database\Eloquent\Model;
|
|
|
+
|
|
|
+class UseScopeBaseNewModel extends Model
|
|
|
+{
|
|
|
+ const range_function = '';
|
|
|
+ const is_check_function = '';
|
|
|
+
|
|
|
+ public function scopeClear($query, $user, $search)
|
|
|
+ {
|
|
|
+ $is_all_depart = $user['is_all_depart'] ?? 0;
|
|
|
+ $depart_range = $user['depart_range'] ?? [];
|
|
|
+ $is_see = ! empty($search['is_see']);
|
|
|
+ $is_check = ! empty($search['is_check']);
|
|
|
+ $auth_type = $this->getQx($search, $user);
|
|
|
+
|
|
|
+ $model = $query->getModel();
|
|
|
+ $className = get_class($model);
|
|
|
+
|
|
|
+ // 1. 获取可见范围子查询 (不再是数组)
|
|
|
+ $range_function = "";
|
|
|
+ if (defined($className . '::range_function')) $range_function = $className::range_function;
|
|
|
+ $idSubQuery = null;
|
|
|
+ if ($range_function && $this->hasMethod(new RangeService(), $range_function)) {
|
|
|
+ $idSubQuery = RangeService::$range_function($user, $search);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 确定顶级部门 ID
|
|
|
+ $search_depart_id = $search['top_depart_id'] ?? 0;
|
|
|
+ $my_top_depart_id = $user['depart_top'][0]['depart_id'] ?? 0;
|
|
|
+ $top_depart_id = ($is_all_depart && !empty($search_depart_id)) ? $search_depart_id : $my_top_depart_id;
|
|
|
+
|
|
|
+ // 3. 审核状态过滤 (whereRaw)
|
|
|
+ $check_search = "";
|
|
|
+ $is_check_function = defined($className . '::is_check_function') ? $className::is_check_function : "";
|
|
|
+ if ($is_check && $is_check_function && $this->hasMethod(new RangeService(), $is_check_function)) {
|
|
|
+ $check_search = RangeService::$is_check_function($user, $search);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 执行路由过滤
|
|
|
+ if ($is_see) {
|
|
|
+ $query->whereIn('id', $idSubQuery);
|
|
|
+ } elseif ($is_all_depart) {
|
|
|
+ $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idSubQuery, $check_search);
|
|
|
+ } else {
|
|
|
+ $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $idSubQuery, $check_search);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!empty($search['get_my_top_depart_data'])) {
|
|
|
+ $query->where('top_depart_id', $my_top_depart_id);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private function allDepart(&$query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idSubQuery, $check_search)
|
|
|
+ {
|
|
|
+ $query->where(function ($q) use ($auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idSubQuery) {
|
|
|
+ $q->where(function ($inner) use ($auth_type, $user, $depart_range, $search_depart_id, $top_depart_id) {
|
|
|
+ // 如果指定了 top_depart_id,则必须满足该条件
|
|
|
+ if (!empty($search_depart_id)) {
|
|
|
+ $inner->where('top_depart_id', $top_depart_id);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 基础权限过滤
|
|
|
+ if ($auth_type == 1) {
|
|
|
+ $inner->where('crt_id', $user['id']);
|
|
|
+ } elseif ($auth_type == 2 || $auth_type == 3) {
|
|
|
+ $inner->whereIn('depart_id', $depart_range);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 加上可见范围 (OR 关系)
|
|
|
+ if ($idSubQuery) {
|
|
|
+ $q->orWhereIn('id', $idSubQuery);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if ($is_check && !empty($check_search)) {
|
|
|
+ $query->whereRaw($check_search);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $idSubQuery, $check_search)
|
|
|
+ {
|
|
|
+ $query->where(function ($q) use ($auth_type, $user, $depart_range, $top_depart_id, $idSubQuery) {
|
|
|
+ $q->where(function ($inner) use ($auth_type, $user, $depart_range, $top_depart_id) {
|
|
|
+ // 非全权限模式下,top_depart_id 是强制的
|
|
|
+ $inner->where('top_depart_id', $top_depart_id);
|
|
|
+
|
|
|
+ if ($auth_type == 1) {
|
|
|
+ $inner->where('crt_id', $user['id']);
|
|
|
+ } elseif ($auth_type == 2) {
|
|
|
+ $inner->whereIn('depart_id', $depart_range);
|
|
|
+ }
|
|
|
+ // auth_type 为 0 或 3 时,仅保留 top_depart_id 过滤
|
|
|
+ });
|
|
|
+
|
|
|
+ if ($idSubQuery) {
|
|
|
+ $q->orWhereIn('id', $idSubQuery);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if ($is_check && !empty($check_search)) {
|
|
|
+ $query->whereRaw($check_search);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public function getQx($data, $user)
|
|
|
+ {
|
|
|
+ if (empty($data['menu_id'])) return 0;
|
|
|
+ // 假设 Employee 常量在此可用,若不可用请自行调整
|
|
|
+ if ($user['id'] == 1) return 0; // 这里的1代表超级管理员ID
|
|
|
+ return $user['role_authority'][$data['menu_id']] ?? 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ function hasMethod($class, $methodName)
|
|
|
+ {
|
|
|
+ if (empty($methodName)) return false;
|
|
|
+ return method_exists($class, $methodName);
|
|
|
+ }
|
|
|
+}
|