| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879 | <?phpnamespace App\Services\Common;use App\Exceptions\ResponseException;use App\Models\Resume;use App\Models\Jobs;use App\Models\Company;use App\Models\MemberShuobo;use App\Models\PersonShieldCompany;use App\Repositories\PersonalJobsApplyRepository;use App\Search\Builders\SubBuilder;use App\Services\Company\JobsService;use App\Services\Company\CompanyService;use App\Services\Person\ResumeService;use Illuminate\Support\Facades\Cache;/** * 职位、简历、企业搜索 * Class SearchService * @package App\Services\Common */class SearchService{    protected $personalJobsApplyRepository;    protected $jobsService;    protected $companyService;    protected $resumeService;    /**     * SearchService constructor.     * @param $personalJobsApplyRepository     * @param $jobsService     * @param $companyService     * @param $resumeService     */    public function __construct(PersonalJobsApplyRepository $personalJobsApplyRepository, JobsService $jobsService, CompanyService $companyService, ResumeService $resumeService)    {        $this->personalJobsApplyRepository = $personalJobsApplyRepository;        $this->jobsService                 = $jobsService;        $this->companyService              = $companyService;        $this->resumeService               = $resumeService;    }    //首页知名企业    public function searchSeatmealCompanies($params, $type = '')    {        $list = array();        $where = array(            array('utype', '=', 1),            array('user_status', '=', 1)        );        if ($type == '') {            $where[] = array('job_audit_num','>',0);            if (config('aix.companyset.comset.show_set.jobs_display')==1) {                $where[] = array('audit','=',1);                //$where[] = array('job_audit_num','>',0);            } else {                $where[] = array('audit','<>',3);                //$where[] = array('job_sum_num','>',0);            }        }        if (array_has($params, 'seatmeal')) {            $where[] = array('setmeal_id','>',$params['seatmeal']);            $where[] = array('members_setmeal.expire','=',0);        }        $where[] = array('subsite_ids','=',get_subsite_id());        if (array_has($params, 'id')) {            $where[] = array('id','in',$params['id']);        }        $order_by = array('job_new_refresh'=>'desc');        $limit = '';        if (array_has($params, 'size')) {            $limit = $params['size'];        }        $callback = function ($query) {            $query->with(['job'=>function ($query) {                $job_count_map = array(array('valid','=',1),array('display','=',1));                if (config('aix.companyset.comset.show_set.jobs_display')==1) {                    $job_count_map[] = array('audit','=','1');                } else {                    $job_count_map[] = array('audit','<>','3');                }                $query->where($job_count_map)->whereHas('subsites', function ($query) { $query->where('subsite_id', get_subsite_id());})->orderBy('refresh_time', 'DESC');            }]);        };        $recommend_job_lists = $this->search('Company', $where, $order_by, '', $limit, '', $callback, true);        if ($recommend_job_lists->total()>0) {            $list = $this->companyService->dealSetmealCompany($recommend_job_lists->items(), $params);        }        return $list;    }    //紧急招聘    public function searchEmergencyJobs($limit = 10)    {        $emergency_jobs = array();        $emergency_where = array(            array('valid','=','1'),            array('emergency','=','1'),            array('display','=',1),            array('subsite_ids', '=', get_subsite_id())        );        if (config('aix.companyset.comset.show_set.jobs_display')==1) {            $emergency_where[] = array('audit','=',1);        } else {            $emergency_where[] = array('audit','<>',3);        }        $emergency_job_list = $this->search('Job', $emergency_where, 'stime', '', $limit, 1);        if ($emergency_job_list->total()>0) {            $emergency_jobs = $this->jobsService->dealjobList($emergency_job_list->items(), $limit);        }        return $emergency_jobs;    }    //推荐职位    public function searchRecommendJobs($limit = 10, $user = array(), $type = '')    {        $recommend_job_items = array();        $recommend_where = $this->jobsService->getRecommendWhere($user);        $recommend_order = $this->jobsService->getRecommendOrder($user);        if (!$user || ($user && $user->utype == 1)) {            $recommend_order = array('stime'=>'desc','refresh_time'=> 'desc');        }        if ($recommend_where) {            if ($type == '') {                $recommend_job_lists = $this->getRecommends($user, 'Job', $recommend_where, $recommend_order, '', $limit, 1);            } else {                $recommend_job_lists = $this->getRecommends($user, 'Job', $recommend_where, $recommend_order, '', $limit);            }        } else {            $recommend_job_lists = null;        }        if ($type == 'show_other') {            //判断职位数量是否足够页面需求,不满足时已击量很高、置顶、刷新靠前的职位补足(职位不能重复)            if ($recommend_job_lists && $recommend_job_lists->total() >= $limit) {                $recommend_job_items = $this->jobsService->dealjobFilelds($recommend_job_lists->items(), array(), $limit);            } else {                $jids = array();                if ($recommend_job_lists) {                    $jids = $recommend_job_lists->pluck('id')->toArray();                }                $click_jobs_rst = $this->getClickJobs($limit);                if ($click_jobs_rst->total()>0) {                    $click_jobs = $click_jobs_rst->items();                } else {                    $click_jobs = array();                }                if ($click_jobs && $jids) {                    foreach ($click_jobs as $k => $v) {                        if (in_array($v->id, $jids)) {                            unset($click_jobs[$k]);                        }                    }                }                $recommend_jobs = $recommend_job_lists?$recommend_job_lists->items():array();                $recommend_total = $recommend_job_lists?$recommend_job_lists->total():0;                $need_jobs = array_slice($click_jobs, 0, $limit - $recommend_total);                $all_jobs = array_merge($recommend_jobs, $need_jobs);                $recommend_job_items = array_slice($all_jobs, 0, $limit);                $recommend_job_items = $this->jobsService->dealjobFilelds($recommend_job_items);            }        } elseif ($type == 'show_page') {            return $recommend_job_lists;        } else {            if ($recommend_job_lists && $recommend_job_lists->total()>0) {                $recommend_job_items = $this->jobsService->dealjobFilelds($recommend_job_lists->items(), array(), $limit);            }        }        return $recommend_job_items;    }    //获取点击量高的职位    public function getClickJobs($limit = 50)    {        $where[] = array('valid','=',1);        $where[] = array('display','=',1);        if (config('aix.companyset.comset.show_set.jobs_display')==1) {            $where[] = array('audit','=',1);        } else {            $where[] = array('audit','<>',3);        }        $where[] = array('subsite_ids','=',get_subsite_id());        $order = array('click'=>'desc','stime'=>'desc','refresh_time'=> 'desc');        return $this->search('Job', $where, $order, '', $limit);    }    //获取点击量高的简历    public function getClickResumes($order_by, $job = array(), $need_limit = 50)    {        $click_where = $this->companyService->getRecommendResumeWhere($job);        $click_resumes = $this->search('Resume', $click_where, $order_by, '', $need_limit);        $click_resumes = $click_resumes->items();        return $click_resumes;    }    //照片简历    public function searchPhotoResumes($limit = 10, $user = array())    {        $list = array();        $order_by = array('stime'=>'desc','click'=>'desc', 'updated_at'=>'desc');        //获取点击量高的简历        $click_where = $this->companyService->getRecommendResumeWhere(array());        //添加照片过滤        $click_where[] = array('photo', '=',1);        $click_where[] = array('member_infos.display_images', '=',1);        if (config('aix.personal_set.per_set.show_set.resume_img_display')==1) {            $click_where[] = array('photo_audit', '=',2);        } else {            $click_where[] = array('photo_audit', '<>',0);        }        $click_rst = $this->search('Resume', $click_where, $order_by, '', $limit);        $click_resumes = $click_rst->items();        //企业用户 - 匹配置顶、刷新靠前的职位        if ($user && $user->utype == 1) {            //判断是否有可以匹配的职位            $where = $this->companyService->getRecommendWhere($user);            if ($where) {                $where['and'][] = array('photo', '=',1);                if (config('aix.personal_set.per_set.show_set.resume_img_display')==1) {                    $where['and'][] = array('photo_audit', '=',2);                } else {                    $where['and'][] = array('photo_audit', '<>',0);                }                $where['and'][] = array('member_infos.display_images', '=',1);                $recommend_resume_lists = $this->getRecommends($user, 'Resume', $where, $order_by, '', $limit);                $rids = $recommend_resume_lists->pluck('id')->toArray();                if ($recommend_resume_lists->total() >= $limit) {                    $list = array_slice($recommend_resume_lists->items(), 0, $limit);                } else {                    //去除已有简历                    if ($click_resumes && $rids) {                        foreach ($click_resumes as $k => $v) {                            if (in_array($v->id, $rids)) {                                unset($click_resumes[$k]);                            }                        }                    }                    $recommend_resumes = $recommend_resume_lists->items();                    $recommend_total = $recommend_resume_lists->total();                    $need_resumes = array_slice($click_resumes, 0, $limit - $recommend_total);                    $all_resumes = array_merge($recommend_resumes, $need_resumes);                    $list = array_slice($all_resumes, 0, $limit);                }            } else {                $list = array_slice($click_resumes, 0, $limit);            }        } else {            $list = array_slice($click_resumes, 0, $limit);        }        //处理查询数据        if ($list) {            $photo_resumes = $this->resumeService->dealResumeFields($list);        } else {            $photo_resumes = array();        }        return $photo_resumes;    }    //最新简历    public function searchNewResumes($limit = 10, $user = array())    {        $new_resumes = array();        $where = array();        $where[] = array('display','=',1);        if (config('aix.personal_set.per_set.show_set.resume_display')=='1') {            $where[] = array('audit','=','2');        } else {            $where[] = array('audit','<>','0');        }        $where[] = array('subsite_ids','=',get_subsite_id());        $order_by = array('stick'=>'desc','updated_at'=>'desc');        $list = $this->search('Resume', $where, $order_by, '', $limit);        if ($list->total()>0) {            $new_resumes = $this->resumeService->dealResumeFields($list->items());        }        return $new_resumes;    }    //同行业职位    public function searchCateJobs($job, $limit = 10, $user = array())    {        $cate_jobs = array();        $cate_job_where[] = array('intention_jobs_id','=',$job->jobcategory_id);        $cate_job_where[] = array('id','<>',$job->id);        if (config('aix.companyset.comset.show_set.jobs_display')==1) {            $cate_job_where[] = array('audit','=',1);        } else {            $cate_job_where[] = array('audit','<>',3);        }        $cate_job_where[] = array('display','=',1);        $cate_job_where[] = array('valid','=',1);        $cate_job_where[] = array('subsite_ids','=',get_subsite_id());        $cate_job_list = $this->search('Job', $cate_job_where, 'stime', '');        if ($cate_job_list->total()>0) {            $cate_jobs = $this->jobsService->dealjobList($cate_job_list->items(), 6);        }        return $cate_jobs;    }    //最新招聘职位    public function searchNewJobs($limit = 20, $page = '')    {        $where[] = array('valid','=',1);        $where[] = array('display','=',1);        if (config('aix.companyset.comset.show_set.jobs_display')==1) {            $where[] = array('audit','=',1);        } else {            $where[] = array('audit','<>',3);        }        $where[] = array('subsite_ids','=',get_subsite_id());        $order = array('refresh_time'=>'desc');        $new_job_lists = $this->search('Job', $where, $order, '', $limit, $page);        $list = array();        if ($new_job_lists->total()>0) {            $list = $this->jobsService->dealjobFilelds($new_job_lists->items(), array(), $limit);        }        return $list;    }    public function  getRecommends($user, $model, $where, $order_by, $search_key = '', $limit = 10, $page = '', $callback = null)    {        if ($model == 'Resume') {            $list=Resume::search($search_key);            if ($callback) {                $list->query($callback);            }            if ($where) {                $and_where = array();                $or_where  = array();                if (array_has($where, 'or')) {                    $or_where = $where['or'];                }                if (array_has($where, 'and')) {                    $and_where = $where['and'];                }                if ($and_where) {                    $wage_max = 0;                    $wage_min=0;                    foreach ($and_where as $k => $v) {                        if ($v[1] !='=') {                            if ($v[0] == 'birthdate') {                                if ($v[1] == '>=') {                                    $list->whereRange('birthdate', $v[2], null);                                } elseif ($v[1] == '<=') {                                    $list->whereRange('birthdate', null, $v[2]);                                }                            } elseif ($v[0] == 'updated_at') {                                if ($v[1] == '>=') {                                    $list->whereRange('updated_at', $v[2], null);                                } elseif ($v[1] == '<=') {                                    $list->whereRange('updated_at', null, $v[2]);                                } elseif ($v[1] == '>') {                                    $list->whereRange('updated_at', $v[2], null, false);                                } elseif ($v[1] == '<') {                                    $list->whereRange('updated_at', null, $v[2], false);                                }                            } elseif ($v[0] == 'audit') {                                $list->whereNot('audit', $v[2]);                            } elseif ($v[0] == 'wage_max') {                                $wage_max = $v[2]?$v[2]:null;                            } elseif ($v[0] == 'wage_min') {                                $wage_min = $v[2]?$v[2]:null;                            } else {                                if ($v[1] == '<>') {                                    $list->whereNot($v[0], $v[2]);                                }                            }                        } else {                            $list->where($v[0], $v[2]);                        }                    }                }                if ($or_where) {                    $list->where(function (SubBuilder $subBuilder) use ($or_where) {                        foreach ($or_where as $key => $val) {                            $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($val) {                                $wage_min = null;                                $wage_max = null;                                foreach ($val as $k => $v) {                                    if ($v[1] !='=') {                                        if ($v[0] == 'birthdate') {                                            if ($v[1] == '>=') {                                                $subBuilder->whereRange('birthdate', $v[2], null);                                            } elseif ($v[1] == '<=') {                                                $subBuilder->whereRange('birthdate', null, $v[2]);                                            }                                        } elseif ($v[0] == 'updated_at') {                                            $subBuilder->whereRange('updated_at', $v[2], null, false);                                        } elseif ($v[0] == 'audit') {                                            $subBuilder->whereNot('audit', $v[2]);                                        } elseif ($v[0] == 'wage_max') {                                            $wage_max = $v[2]?$v[2]:null;                                        } elseif ($v[0] == 'wage_min') {                                            $wage_min = $v[2]?$v[2]:null;                                        } else {                                            if ($v[1] == '<>') {                                                $subBuilder->whereNot($v[0], $v[2]);                                            }                                        }                                    } else {                                        $subBuilder->where($v[0], $v[2]);                                    }                                }                                if ($wage_max && $wage_min) {                                    $subBuilder->where(function (SubBuilder  $subBuilder) use ($wage_max, $wage_min) {                                        $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {                                            $subBuilder->whereRange('wage_min', $wage_min, null)                                                ->whereRange('wage_max', null, $wage_max)                                                ->whereRange('wage_max', 0, null, false);                                        });                                        $subBuilder->whereOr('wage', -1);                                    });                                } elseif ($wage_min) {                                    $subBuilder->where(function (SubBuilder  $subBuilder) use ($wage_min) {                                        $subBuilder->whereOrRange('wage_min', $wage_min, null);                                        $subBuilder->whereOr('wage', -1);                                    });                                } elseif ($wage_max) {                                    $subBuilder->where(function (SubBuilder  $subBuilder) use ($wage_max) {                                        $subBuilder->whereOrRange('wage_max', null, $wage_max);                                        $subBuilder->whereOr('wage', -1);                                    });                                }                            });                        }                    });                }            }            //添加过期时间过滤            $list->where(function (SubBuilder  $subBuilder) {                $subBuilder->whereOr('expires', 0)->whereOrRange('expires', time(), null);            });            if ($user && $user->utype==1) {                $list->whereNotIn('person_shield_companys', array($user->id));            }            if (is_array($order_by)) {                foreach ($order_by as $k => $v) {                    $list->orderBy($k, $v);                }            } else {                $list->orderBy($order_by, 'desc');            }            if ($page) {                return $list->paginate($limit, 'page', $page);            } else {                return $list->paginate($limit);            }        } elseif ($model == 'Job') {            $list=Jobs::search($search_key);            if ($callback) {                $list->query($callback);            }            if ($where) {                $and_where = array();                $or_where  = array();                if (array_has($where, 'or')) {                    $or_where = $where['or'];                }                if (array_has($where, 'and')) {                    $and_where = $where['and'];                }                if ($and_where) {                    foreach ($and_where as $k => $v) {                        if ($v[1] !='=') {                            if ($v[0] == 'audit') {                                $list->whereNot('audit', $v[2]);                            } elseif ($v[0] == 'setmeal_id') {                                if ($v[1] == '>') {                                    $list->whereRange('setmeal_id', $v[2], null, false);                                } elseif ($v[1] == '<') {                                    $list->whereRange('setmeal_id', null, $v[2], false);                                }                            } elseif ($v[0] == 'updated_at') {                                $list->whereRange('updated_at', $v[2], null, false);                            } else {                                if ($v[1] == 'in') {                                    $list->whereIn($v[0], $v[2]);                                } elseif ($v[1] == '>=') {                                    $list->whereRange($v[0], $v[2], null);                                } elseif ($v[1] == '<=') {                                    $list->whereRange($v[0], null, $v[2]);                                } elseif ($v[1] == '<>') {                                    $list->whereNot($v[0], $v[2]);                                } elseif ($v[1] == '>') {                                    $list->whereRange($v[0], $v[2], null, false);                                } elseif ($v[1] == '<') {                                    $list->whereRange($v[0], null, $v[2], false);                                }                            }                        } else {                            $list->where($v[0], $v[2]);                        }                    }                }                if ($or_where) {                    $list->where(function (SubBuilder $subBuilder) use ($or_where) {                        foreach ($or_where as $key => $val) {                            $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($val) {                                $wage_min = null;                                $wage_max = null;                                foreach ($val as $k => $v) {                                    if ($v[1] !='=') {                                        if ($v[0] == 'audit') {                                            $subBuilder->whereNot('audit', $v[2]);                                        } elseif ($v[0] == 'setmeal_id') {                                            if ($v[1] == '>') {                                                $subBuilder->whereRange('setmeal_id', $v[2], null, false);                                            } elseif ($v[1] == '<') {                                                $subBuilder->whereRange('setmeal_id', null, $v[2], false);                                            }                                        } elseif ($v[0] == 'updated_at') {                                            $subBuilder->whereRange('updated_at', $v[2], null, false);                                        } elseif ($v[0] == 'wage_max') {                                            $wage_max = $v[2]?$v[2]:null;                                        } elseif ($v[0] == 'wage_min') {                                            $wage_min = $v[2]?$v[2]:null;                                        } else {                                            if ($v[1] == 'in') {                                                $subBuilder->whereIn($v[0], $v[2]);                                            } elseif ($v[1] == '>=') {                                                $subBuilder->whereRange($v[0], $v[2], null);                                            } elseif ($v[1] == '<=') {                                                $subBuilder->whereRange($v[0], null, $v[2]);                                            } elseif ($v[1] == '<>') {                                                $subBuilder->whereNot($v[0], $v[2]);                                            } elseif ($v[1] == '>') {                                                $subBuilder->whereRange($v[0], $v[2], null, false);                                            } elseif ($v[1] == '<') {                                                $subBuilder->whereRange($v[0], null, $v[2], false);                                            }                                        }                                    } else {                                        $subBuilder->where($v[0], $v[2]);                                    }                                }                                if ($wage_max && $wage_min) {                                    $subBuilder->where(function (SubBuilder  $subBuilder) use ($wage_max, $wage_min) {                                        $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {                                            $subBuilder->whereRange('wage_min', $wage_min, null)                                                ->whereRange('wage_max', null, $wage_max)                                                ->whereRange('wage_max', 0, null, false);                                        });                                        $subBuilder->whereOr('wage', -1);                                    });                                } elseif ($wage_min) {                                    $subBuilder->where(function (SubBuilder  $subBuilder) use ($wage_min) {                                        $subBuilder->whereOrRange('wage_min', $wage_min, null);                                        $subBuilder->whereOr('wage', -1);                                    });                                } elseif ($wage_max) {                                    $subBuilder->where(function (SubBuilder  $subBuilder) use ($wage_max) {                                        $subBuilder->whereOrRange('wage_max', null, $wage_max);                                        $subBuilder->whereOr('wage', -1);                                    });                                }                            });                        }                    });                }            }            if ($order_by) {                if (is_array($order_by)) {                    foreach ($order_by as $k => $v) {                        $list->orderBy($k, $v);                    }                } else {                    $list->orderBy($order_by, 'desc');                }            } else {                $list->orderBy('refresh_time', 'desc');            }            if ($page) {                return $list->paginate($limit, 'page', $page);            } else {                return $list->paginate($limit);            }        }    }    public function search($model, $where, $order_by, $search_key = '', $limit = 10, $page = '', $callback = null, $compan_order =false)    {        if ($model == 'Resume') {            $list=Resume::search($search_key);            if ($callback) {                $list->query($callback);            }            if ($where) {                $wage_min = null;                $wage_max = null;                foreach ($where as $k => $v) {                    if ($v[1] !='=') {                        if ($v[0] == 'birthdate') {                            if ($v[1] == '>=') {                                $list->whereRange('birthdate', $v[2], null);                            } elseif ($v[1] == '<=') {                                $list->whereRange('birthdate', null, $v[2]);                            }                        } elseif ($v[0] == 'updated_at') {                            $list->whereRange('updated_at', $v[2], null, false);                        } elseif ($v[0] == 'audit') {                            $list->whereNot('audit', $v[2]);                        } elseif ($v[0] == 'wage_max') {                            $wage_max = $v[2]?$v[2]:null;                        } elseif ($v[0] == 'wage_min') {                            $wage_min = $v[2]?$v[2]:null;                        } else {                            if ($v[1] == 'in') {                                $list->whereIn($v[0], $v[2]);                            } elseif ($v[1] == '>=') {                                $list->whereRange($v[0], $v[2], null);                            } elseif ($v[1] == '<=') {                                $list->whereRange($v[0], null, $v[2]);                            } elseif ($v[1] == '<>') {                                $list->whereNot($v[0], $v[2]);                            } elseif ($v[1] == 'in') {                                $list->whereIn($v[0], $v[2]);                            }                        }                    } else {                        $list->where($v[0], $v[2]);                    }                }                //期望薪资过滤                if ($wage_max && $wage_min) {                    $list->where(function (SubBuilder  $subBuilder) use ($wage_max, $wage_min) {                        $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {                            $subBuilder->whereRange('wage_min', $wage_min, null)                                ->whereRange('wage_max', null, $wage_max)                                ->whereRange('wage_max', 0, null, false);                        });                        $subBuilder->whereOr('wage', -1);                    });                } elseif ($wage_min) {                    $list->where(function (SubBuilder  $subBuilder) use ($wage_min) {                        $subBuilder->whereOrRange('wage_min', $wage_min, null);                        $subBuilder->whereOr('wage', -1);                    });                } elseif ($wage_max) {                    $list->where(function (SubBuilder  $subBuilder) use ($wage_max) {                        $subBuilder->whereOrRange('wage_max', null, $wage_max);                        $subBuilder->whereOr('wage', -1);                    });                }            }            //添加过期时间过滤            $list->where(function (SubBuilder  $subBuilder) {                $subBuilder->whereOr('expires', 0)->whereOrRange('expires', time(), null);            });            if (auth('web-company')->check()) {                $list->whereNotIn('person_shield_companys', array(auth('web-company')->user()->id));            }            if (is_array($order_by)) {                foreach ($order_by as $k => $v) {                    $list->orderBy($k, $v);                }            } else {                $list->orderBy($order_by, 'desc');            }            if ($page) {                return $list->paginate($limit, 'page', $page);            } else {                return $list->paginate($limit);            }        } elseif ($model == 'Job') {            $list=Jobs::search($search_key);            if ($callback) {                $list->query($callback);            }            if ($where) {                //申请过滤                if (array_has($where, 'apply')) {                    $apply = $where['apply'];                    unset($where['apply']);                    if ($apply && auth('web-member')->check()) {                        //获取当前用户一段时间间隔内所有申请记录                        $space_time = (integer)config('aix.personal_set.per_set.per_set.apply_job_space');                        if ($space_time >0) {                            $stime = date('Y-m-d H:i:s', strtotime(date("Y-m-d", strtotime("-".$space_time." day"))));                            $apply_where = array(array('personal_uid','=',auth('web-member')->user()->id),array('created_at','>=',$stime));                        } else {                            $apply_where = array(array('personal_uid','=',auth('web-member')->user()->id));                        }                        $rst = $this->personalJobsApplyRepository->getJobsApply($apply_where);                        $ids= $rst->pluck('jobs_id');                        if ($ids->isNotEmpty()) {                            $list->whereNotIn('id', $ids->toArray());                        }                    }                }                $map_filter = array();                $map_order  = array();                $wage_min = null;                $wage_max = null;                foreach ($where as $k => $v) {                    if ($v[1] !='=') {                        if ($v[0] == 'audit') {                            $list->whereNot('audit', $v[2]);                        } elseif ($v[0] == 'setmeal_id') {                            if ($v[1] == '>') {                                $list->whereRange('setmeal_id', $v[2], null, false);                            } elseif ($v[1] == '<') {                                $list->whereRange('setmeal_id', null, $v[2], false);                            }                        } elseif ($v[0] == 'updated_at') {                            $list->whereRange('updated_at', $v[2], null, false);                        } elseif ($v[0] == 'wage_max') {                            $wage_max = $v[2]?$v[2]:null;                        } elseif ($v[0] == 'wage_min') {                            $wage_min = $v[2]?$v[2]:null;                        } else {                            if ($v[1] == 'in') {                                $list->whereIn($v[0], $v[2]);                            } elseif ($v[1] == '>=') {                                $list->whereRange($v[0], $v[2], null);                            } elseif ($v[1] == '<=') {                                $list->whereRange($v[0], null, $v[2]);                            } elseif ($v[1] == '<>') {                                $list->whereNot($v[0], $v[2]);                            } elseif ($v[1] == '>') {                                $list->whereRange($v[0], $v[2], null, false);                            } elseif ($v[1] == '<') {                                $list->whereRange($v[0], null, $v[2], false);                            }                        }                    } else {                        if ($v[0] == 'lng') {                            $map_filter['location']['lon'] = $v[2];                            $map_order['lon'] = $v[2];                        } elseif ($v[0] == 'lat') {                            $map_filter['location']['lat'] = $v[2];                            $map_order['lat'] = $v[2];                        } elseif ($v[0] == 'range') {                            $map_filter['distance'] = $v[2].'km';                        } else {                            $list->where($v[0], $v[2]);                        }                    }                }                if ($wage_max && $wage_min) {                    $list->where(function (SubBuilder  $subBuilder) use ($wage_max, $wage_min) {                        $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {                            $subBuilder->whereRange('wage_min', $wage_min, null)                                ->whereRange('wage_max', null, $wage_max)                                ->whereRange('wage_max', 0, null, false);                        });                        $subBuilder->whereOr('wage', -1);                    });                } elseif ($wage_min) {                    $list->where(function (SubBuilder  $subBuilder) use ($wage_min) {                        $subBuilder->whereOrRange('wage_min', $wage_min, null);                        $subBuilder->whereOr('wage', -1);                    });                } elseif ($wage_max) {                    $list->where(function (SubBuilder  $subBuilder) use ($wage_max) {                        $subBuilder->whereOrRange('wage_max', null, $wage_max);                        $subBuilder->whereOr('wage', -1);                    });                }                if ($map_filter) {                    if ($map_filter && !array_has($map_filter, 'distance')) {                        $map_filter['distance'] = 1;                    }                    $list->whereLocation('location', $map_filter['location']['lat'], $map_filter['location']['lon'], $map_filter['distance']);                }                if ($map_order) {                    $list->orderBy(['location'=>$map_order, 'order'=>'asc', 'unit'=>'km']);                }            }            $list->where(function (SubBuilder  $subBuilder) {                $subBuilder->where('company.user_status', 1);            });            //过滤企业审核状态            $list->where(function (SubBuilder  $subBuilder) {                $subBuilder->where('company.audit', 1);            });            if ($order_by) {                if (is_array($order_by)) {                    foreach ($order_by as $k => $v) {                        $list->orderBy($k, $v);                    }                } else {                    $list->orderBy($order_by, 'desc');                }            } else {                $list->orderBy('refresh_time', 'desc');            }            if ($page) {                return $list->paginate($limit, 'page', $page);            } else {                return $list->paginate($limit);            }        } elseif ($model == 'Company') {            $list=Company::search($search_key);            if ($callback) {                $list->query($callback);            }            if ($where) {                foreach ($where as $k => $v) {                    if ($v[1] !='=') {                        if ($v[1] == '>') {                            $list->whereRange($v[0], $v[2], null, false);                        } elseif ($v[1] == '>=') {                            $list->whereRange($v[0], $v[2], null);                        } elseif ($v[1] == '<') {                            $list->whereRange($v[0], null, $v[2], false);                        } elseif ($v[1] == '<=') {                            $list->whereRange($v[0], null, $v[2]);                        } elseif ($v[1] == 'in') {                            $list->whereIn($v[0], $v[2]);                        }                    } else {                        $list->where($v[0], $v[2]);                    }                }            }            $list->where(function (SubBuilder  $subBuilder) {                $subBuilder->where('audit', 1);            });            if ($compan_order) {                if (is_array($order_by)) {                    foreach ($order_by as $k => $v) {                        $list->orderBy($k, $v);                    }                } else {                    $list->orderBy($order_by, 'desc');                }            }            if ($page) {                return $list->paginate($limit, 'page', $page);            } else {                return $list->paginate($limit);            }        } elseif ($model == 'Shuobo') {            $list=MemberShuobo::search($search_key);            if ($order_by) {                if (is_array($order_by)) {                    foreach ($order_by as $k => $v) {                        $list->orderBy($k, $v);                    }                } else {                    $list->orderBy($order_by, 'desc');                }            } else {                $list->orderBy('refresh_time', 'desc');            }            if ($page) {                return $list->paginate($limit, 'page', $page);            } else {                return $list->paginate($limit);            }        }    }}
 |