| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276 |
- <?php
- namespace App\Model;
- use App\Service\RangeService;
- use Illuminate\Database\Eloquent\Model;
- use Illuminate\Support\Facades\DB;
- 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);
- $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)
- {
- 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($tmpTable), function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_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($tmpTable), function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_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($tmpTable), function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_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($tmpTable), function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_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($tmpTable), function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_id = id");
- });
- });
- } elseif ($auth_type == 2 || $auth_type == 3) {
- // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见
- $query->where('top_depart_id', $top_depart_id)
- ->whereIn('depart_id', $depart_range)
- ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_id = id");
- });
- });
- }
- }
- }
- }
- //非所有权限
- private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $tmpTable, $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($tmpTable, function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_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($tmpTable, function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_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($tmpTable, function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_id = id");
- });
- });
- }
- }else{
- if(! $auth_type || $auth_type == 3){
- //指定公司下全部|所有 且加上可见
- $query->where('top_depart_id', $top_depart_id)
- ->when($tmpTable, function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_id = id");
- });
- });
- }elseif($auth_type == 1) {
- //指定公司下 且 我创建的 且加上可见
- $query->where('top_depart_id', $top_depart_id)
- ->where('crt_id',$user['id'])
- ->when($tmpTable, function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_id = id");
- });
- });
- }elseif ($auth_type == 2) {
- //指定公司下 且 自己权限范围内的部门 且加上可见
- $query->where('top_depart_id', $top_depart_id)
- ->whereIn('depart_id', $depart_range)
- ->when($tmpTable, function ($query) use ($tmpTable) {
- return $query->orWhereExists(function ($q) use ($tmpTable) {
- $q->select(DB::raw(1))
- ->from($tmpTable)
- ->whereRaw("{$tmpTable}.range_allowed_id = id");
- });
- });
- }
- }
- }
- 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);
- }
- }
|