getQx($search,$user); // 获取模型的实例 $model = $query->getModel(); // 获取模型类名 $className = get_class($model); //可见范围方法 $range_function = ""; if (defined($className . '::range_function')) $range_function = $className::range_function; $function_range_bool = $this->hasMethod(new RangeService(),$range_function); //全部 待审 已审 $is_check_function = ""; if (defined($className . '::is_check_function')) $is_check_function = $className::is_check_function; $is_check_function_bool = $this->hasMethod(new RangeService(),$is_check_function); //外部传入的 $search_depart_id = $search['top_depart_id'] ?? 0; //自身的 $my_top_depart_id = $user['depart_top'][0] ?? []; $my_top_depart_id = $my_top_depart_id['depart_id'] ?? 0; if(empty($search_depart_id)){ $top_depart_id = $my_top_depart_id; }else{ if($is_all_depart){ //顶级公司 $top_depart_id = $search_depart_id; }else{ $top_depart_id = $my_top_depart_id; } } $id = []; //可见范围 以及单据里面填写人员 (状态类 是全部时检索) if($function_range_bool) $id = RangeService::$range_function($user,$search); $tmpTable = null; if(! empty($id)){ $tmpTable = RangeService::createTemporaryIdTable($id); } //全部0 待审1 已审2 (状态类 是全部时检索) $check_search = ""; if($is_check_function_bool && $is_check) $check_search = RangeService::$is_check_function($user,$search); if($is_see){ //我可见的 $query->whereIn('id', $id); }elseif($is_all_depart){ //所有权限 $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $id, $check_search); }else{ //非所有权限 $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $id, $check_search); } if(! empty($search['get_my_top_depart_data'])) $query->where('top_depart_id', $my_top_depart_id); } //最高权限 private function allDepart1(&$query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $id, $check_search){ if(empty($search_depart_id)){ if ($is_check){ if(! $auth_type){ //全部 $query->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }); }elseif($auth_type == 1){ //我创建的 且加上可见 $query->where('crt_id',$user['id']) ->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); }elseif ($auth_type == 2 || $auth_type == 3){ //自己权限范围内的部门 或 所有 $query->whereIn('depart_id', $depart_range) ->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }); } }else{ if($auth_type == 1) { //我创建的 且加上可见 $query->where('crt_id',$user['id']) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); }elseif ($auth_type == 2 || $auth_type == 3){ //自己权限范围内的部门 或 所有 $query->whereIn('depart_id', $depart_range); } } }else{ if ($is_check){ if(! $auth_type){ //查看指定公司 $query->where('top_depart_id', $top_depart_id) ->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }); }elseif($auth_type == 1) { //指定公司下 且 我创建的 且加上可见 $query->where('top_depart_id', $top_depart_id) ->where('crt_id',$user['id']) ->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); }elseif ($auth_type == 2 || $auth_type == 3){ // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见 $query->where('top_depart_id', $top_depart_id) ->whereIn('depart_id', $depart_range) ->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); } }else{ if(! $auth_type){ //查看指定公司 $query->where('top_depart_id', $top_depart_id); }elseif($auth_type == 1) { //指定公司下 且 我创建的 且加上可见 $query->where('top_depart_id', $top_depart_id) ->where('crt_id',$user['id']) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); }elseif ($auth_type == 2 || $auth_type == 3){ // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见 $query->where('top_depart_id', $top_depart_id) ->whereIn('depart_id', $depart_range) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); } } } } //非所有权限 private function notAllDepart1(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $id, $check_search){ if ($is_check){ if(! $auth_type || $auth_type == 3){ //指定公司下全部 且加上可见 $query->where('top_depart_id', $top_depart_id) ->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); }else if($auth_type == 1) { //指定公司下 且 我创建的 且加上可见 $query->where('top_depart_id', $top_depart_id) ->where('crt_id',$user['id']) ->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); }elseif ($auth_type == 2) { //指定公司下 且 自己权限范围内的部门 且加上可见 $query->where('top_depart_id', $top_depart_id) ->whereIn('depart_id', $depart_range) ->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); } }else{ if(! $auth_type || $auth_type == 3){ //指定公司下全部|所有 且加上可见 $query->where('top_depart_id', $top_depart_id) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); }elseif($auth_type == 1) { //指定公司下 且 我创建的 且加上可见 $query->where('top_depart_id', $top_depart_id) ->where('crt_id',$user['id']) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); }elseif ($auth_type == 2) { //指定公司下 且 自己权限范围内的部门 且加上可见 $query->where('top_depart_id', $top_depart_id) ->whereIn('depart_id', $depart_range) ->when(! empty($id), function ($query) use ($id) { return $query->orWhereIn('id', $id); }); } } } 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); $range_function = ""; if (defined($className . '::range_function')) $range_function = $className::range_function; $function_range_bool = $this->hasMethod(new RangeService(), $range_function); $is_check_function = ""; if (defined($className . '::is_check_function')) $is_check_function = $className::is_check_function; $is_check_function_bool = $this->hasMethod(new RangeService(), $is_check_function); $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; // --- 核心修改:处理临时表 --- $id = []; $tmpTable = null; if ($function_range_bool) { $id = RangeService::$range_function($user, $search); if (!empty($id)) { // 调用你已经实现的创建临时表方法 $tmpTable = RangeService::createTemporaryIdTable($id, $user['id']); } } $check_search = ""; if ($is_check_function_bool && $is_check) $check_search = RangeService::$is_check_function($user, $search); if ($is_see) { // 如果是“我可见的”,直接关联临时表或 whereIn if ($tmpTable) { $query->whereExists(function ($q) use ($tmpTable) { $q->select(DB::raw(1))->from($tmpTable)->whereRaw("{$tmpTable}.range_allowed_id = id"); }); } else { $query->whereIn('id', $id); } } elseif ($is_all_depart) { // 传递 $tmpTable 代替 $id $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $tmpTable, $check_search); } else { $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $tmpTable, $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, $tmpTable, $check_search) { $query->where(function ($q) use ($search_depart_id, $top_depart_id, $is_check, $auth_type, $user, $depart_range, $check_search, $tmpTable) { // 1. 设置顶级部门基础过滤 if (!empty($search_depart_id)) { $q->where('top_depart_id', $top_depart_id); } // 2. 权限与可见范围(OR 关系) $q->where(function ($sub) use ($auth_type, $user, $depart_range, $tmpTable) { if ($auth_type == 1) { $sub->where('crt_id', $user['id']); } elseif ($auth_type == 2 || $auth_type == 3) { $sub->whereIn('depart_id', $depart_range); } // 关键:合并可见范围临时表 if ($tmpTable) { $sub->orWhereExists(function ($exists) use ($tmpTable) { $exists->select(DB::raw(1)) ->from($tmpTable) ->whereRaw("{$tmpTable}.range_allowed_id = id"); }); } }); // 3. 审核过滤 if ($is_check && !empty($check_search)) { $q->whereRaw($check_search); } }); } private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $tmpTable, $check_search) { $query->where(function ($q) use ($top_depart_id, $auth_type, $user, $depart_range, $is_check, $check_search, $tmpTable) { $q->where('top_depart_id', $top_depart_id); $q->where(function ($sub) use ($auth_type, $user, $depart_range, $tmpTable) { if ($auth_type == 1) { $sub->where('crt_id', $user['id']); } elseif ($auth_type == 2) { $sub->whereIn('depart_id', $depart_range); } // 关键:合并可见范围临时表 if ($tmpTable) { $sub->orWhereExists(function ($exists) use ($tmpTable) { $exists->select(DB::raw(1)) ->from($tmpTable) ->whereRaw("{$tmpTable}.range_allowed_id = id"); }); } }); if ($is_check && !empty($check_search)) { $q->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); } }