| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | <?phpnamespace App\Scopes;use App\Service\RangeService;use Illuminate\Database\Eloquent\Builder;use Illuminate\Database\Eloquent\Model;use Illuminate\Database\Eloquent\Scope;//判断所属部门和顶级部门class DepartmentScope implements Scope{    public $user = [];    public $search = [];    public function __construct($user = [], $search = [])    {        $this->user = $user;        $this->search = $search;    }    public function apply(Builder $builder, Model $model)    {        //是否所有部门        $is_all_depart = $this->user['is_all_depart'] ?? 0;        //权限范围内的部门        $depart_range = $this->user['depart_range'] ?? [];        //我可见的        $is_see = $this->search['is_see'] ?? 0;        //可见范围方法        $range_function = $this->user['range_function'] ?? "";        $is_function_range = $this->hasMethod(new RangeService(),$range_function);        //顶级部门        $search_depart_id = $this->search['top_depart_id'] ?? 0; //顶级公司        if(empty($search_depart_id)){            //默认进来 自身顶级公司            $top_depart_id = $this->user['depart_top'][0] ?? [];            $top_depart_id = $top_depart_id['depart_id'] ?? 0;        }else{            //查询 顶级公司            $top_depart_id = $search_depart_id;        }        $id = [];        //可见范围 以及单据里面填写人员        if($is_function_range) $id = RangeService::$range_function($this->user,$this->search);        if($is_all_depart){            //所有部门            if(empty($search_depart_id)){                if(! $is_see){                    //全部                    $builder->whereIn('depart_id', $depart_range);                }else{                    $builder->whereIn('id', $id);                }            }else{                if(! $is_see){                    //某个分社                    $builder->where('top_depart_id', $top_depart_id)                        ->whereIn('depart_id', $depart_range);                }else{                    $builder->whereIn('id', $id);                }            }        }else{            if(! $is_see){                //某个分社                $builder->where('top_depart_id', $top_depart_id)                    ->whereIn('depart_id', $depart_range)                    ->orWhereIn('id', $id);            }else{                $builder->whereIn('id', $id);            }        }        if(! empty($this->user['is_search_main'])) $builder->orWhere('is_main', '>',0);    }    function hasMethod($class, $methodName)    {        $reflection = new \ReflectionClass($class);        return $reflection->hasMethod($methodName);    }}
 |