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; if(empty($search_depart_id)){ $top_depart_id = $my_top_depart_id; }else{ $top_depart_id = $is_all_depart ? $search_depart_id : $my_top_depart_id; } // 注入 EXISTS 条件闭包 (EXISTS 不需要外层 distinct) $idCondition = null; if($function_range_bool) { $idCondition = RangeService::attachRangeJoin($query, $user, $search); } $check_search = ""; if($is_check_function_bool && $is_check) { $check_search = RangeService::$is_check_function($user, $search); } if($is_see){ $query->where($idCondition); }elseif($is_all_depart){ $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idCondition, $check_search); }else{ $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $idCondition, $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, $idCondition, $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($idCondition, function ($query) use ($idCondition) { return $query->orWhere($idCondition); }); }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($idCondition, function ($query) use ($idCondition) { return $query->orWhere($idCondition); }); }elseif ($auth_type == 2 || $auth_type == 3){ $query->whereIn('depart_id', $depart_range); } } }else{ // 指定公司逻辑 $query->where('top_depart_id', $top_depart_id); if ($is_check){ $query->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }); } if($auth_type == 1) { $query->where('crt_id', $user['id']) ->when($idCondition, function ($query) use ($idCondition) { return $query->orWhere($idCondition); }); }elseif ($auth_type == 2 || $auth_type == 3){ $query->whereIn('depart_id', $depart_range) ->when($idCondition, function ($query) use ($idCondition) { return $query->orWhere($idCondition); }); } } } private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $idCondition, $check_search) { $query->where('top_depart_id', $top_depart_id); if ($is_check){ $query->when(! empty($check_search), function ($query) use ($check_search) { return $query->whereRaw($check_search); }); } if(! $auth_type || $auth_type == 3){ $query->when($idCondition, function ($query) use ($idCondition) { return $query->orWhere($idCondition); }); }else if($auth_type == 1) { $query->where('crt_id', $user['id']) ->when($idCondition, function ($query) use ($idCondition) { return $query->orWhere($idCondition); }); }elseif ($auth_type == 2) { $query->whereIn('depart_id', $depart_range) ->when($idCondition, function ($query) use ($idCondition) { return $query->orWhere($idCondition); }); } } 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); } }