SearchService.php 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879
  1. <?php
  2. namespace App\Services\Common;
  3. use App\Exceptions\ResponseException;
  4. use App\Models\Resume;
  5. use App\Models\Jobs;
  6. use App\Models\Company;
  7. use App\Models\MemberShuobo;
  8. use App\Models\PersonShieldCompany;
  9. use App\Repositories\PersonalJobsApplyRepository;
  10. use App\Search\Builders\SubBuilder;
  11. use App\Services\Company\JobsService;
  12. use App\Services\Company\CompanyService;
  13. use App\Services\Person\ResumeService;
  14. use Illuminate\Support\Facades\Cache;
  15. /**
  16. * 职位、简历、企业搜索
  17. * Class SearchService
  18. * @package App\Services\Common
  19. */
  20. class SearchService
  21. {
  22. protected $personalJobsApplyRepository;
  23. protected $jobsService;
  24. protected $companyService;
  25. protected $resumeService;
  26. /**
  27. * SearchService constructor.
  28. * @param $personalJobsApplyRepository
  29. * @param $jobsService
  30. * @param $companyService
  31. * @param $resumeService
  32. */
  33. public function __construct(PersonalJobsApplyRepository $personalJobsApplyRepository, JobsService $jobsService, CompanyService $companyService, ResumeService $resumeService)
  34. {
  35. $this->personalJobsApplyRepository = $personalJobsApplyRepository;
  36. $this->jobsService = $jobsService;
  37. $this->companyService = $companyService;
  38. $this->resumeService = $resumeService;
  39. }
  40. //首页知名企业
  41. public function searchSeatmealCompanies($params, $type = '')
  42. {
  43. $list = array();
  44. $where = array(
  45. array('utype', '=', 1),
  46. array('user_status', '=', 1)
  47. );
  48. if ($type == '') {
  49. $where[] = array('job_audit_num','>',0);
  50. if (config('aix.companyset.comset.show_set.jobs_display')==1) {
  51. $where[] = array('audit','=',1);
  52. //$where[] = array('job_audit_num','>',0);
  53. } else {
  54. $where[] = array('audit','<>',3);
  55. //$where[] = array('job_sum_num','>',0);
  56. }
  57. }
  58. if (array_has($params, 'seatmeal')) {
  59. $where[] = array('setmeal_id','>',$params['seatmeal']);
  60. $where[] = array('members_setmeal.expire','=',0);
  61. }
  62. $where[] = array('subsite_ids','=',get_subsite_id());
  63. if (array_has($params, 'id')) {
  64. $where[] = array('id','in',$params['id']);
  65. }
  66. $order_by = array('job_new_refresh'=>'desc');
  67. $limit = '';
  68. if (array_has($params, 'size')) {
  69. $limit = $params['size'];
  70. }
  71. $callback = function ($query) {
  72. $query->with(['job'=>function ($query) {
  73. $job_count_map = array(array('valid','=',1),array('display','=',1));
  74. if (config('aix.companyset.comset.show_set.jobs_display')==1) {
  75. $job_count_map[] = array('audit','=','1');
  76. } else {
  77. $job_count_map[] = array('audit','<>','3');
  78. }
  79. $query->where($job_count_map)->whereHas('subsites', function ($query) { $query->where('subsite_id', get_subsite_id());})->orderBy('refresh_time', 'DESC');
  80. }]);
  81. };
  82. $recommend_job_lists = $this->search('Company', $where, $order_by, '', $limit, '', $callback, true);
  83. if ($recommend_job_lists->total()>0) {
  84. $list = $this->companyService->dealSetmealCompany($recommend_job_lists->items(), $params);
  85. }
  86. return $list;
  87. }
  88. //紧急招聘
  89. public function searchEmergencyJobs($limit = 10)
  90. {
  91. $emergency_jobs = array();
  92. $emergency_where = array(
  93. array('valid','=','1'),
  94. array('emergency','=','1'),
  95. array('display','=',1),
  96. array('subsite_ids', '=', get_subsite_id())
  97. );
  98. if (config('aix.companyset.comset.show_set.jobs_display')==1) {
  99. $emergency_where[] = array('audit','=',1);
  100. } else {
  101. $emergency_where[] = array('audit','<>',3);
  102. }
  103. $emergency_job_list = $this->search('Job', $emergency_where, 'stime', '', $limit, 1);
  104. if ($emergency_job_list->total()>0) {
  105. $emergency_jobs = $this->jobsService->dealjobList($emergency_job_list->items(), $limit);
  106. }
  107. return $emergency_jobs;
  108. }
  109. //推荐职位
  110. public function searchRecommendJobs($limit = 10, $user = array(), $type = '')
  111. {
  112. $recommend_job_items = array();
  113. $recommend_where = $this->jobsService->getRecommendWhere($user);
  114. $recommend_order = $this->jobsService->getRecommendOrder($user);
  115. if (!$user || ($user && $user->utype == 1)) {
  116. $recommend_order = array('stime'=>'desc','refresh_time'=> 'desc');
  117. }
  118. if ($recommend_where) {
  119. if ($type == '') {
  120. $recommend_job_lists = $this->getRecommends($user, 'Job', $recommend_where, $recommend_order, '', $limit, 1);
  121. } else {
  122. $recommend_job_lists = $this->getRecommends($user, 'Job', $recommend_where, $recommend_order, '', $limit);
  123. }
  124. } else {
  125. $recommend_job_lists = null;
  126. }
  127. if ($type == 'show_other') {
  128. //判断职位数量是否足够页面需求,不满足时已击量很高、置顶、刷新靠前的职位补足(职位不能重复)
  129. if ($recommend_job_lists && $recommend_job_lists->total() >= $limit) {
  130. $recommend_job_items = $this->jobsService->dealjobFilelds($recommend_job_lists->items(), array(), $limit);
  131. } else {
  132. $jids = array();
  133. if ($recommend_job_lists) {
  134. $jids = $recommend_job_lists->pluck('id')->toArray();
  135. }
  136. $click_jobs_rst = $this->getClickJobs($limit);
  137. if ($click_jobs_rst->total()>0) {
  138. $click_jobs = $click_jobs_rst->items();
  139. } else {
  140. $click_jobs = array();
  141. }
  142. if ($click_jobs && $jids) {
  143. foreach ($click_jobs as $k => $v) {
  144. if (in_array($v->id, $jids)) {
  145. unset($click_jobs[$k]);
  146. }
  147. }
  148. }
  149. $recommend_jobs = $recommend_job_lists?$recommend_job_lists->items():array();
  150. $recommend_total = $recommend_job_lists?$recommend_job_lists->total():0;
  151. $need_jobs = array_slice($click_jobs, 0, $limit - $recommend_total);
  152. $all_jobs = array_merge($recommend_jobs, $need_jobs);
  153. $recommend_job_items = array_slice($all_jobs, 0, $limit);
  154. $recommend_job_items = $this->jobsService->dealjobFilelds($recommend_job_items);
  155. }
  156. } elseif ($type == 'show_page') {
  157. return $recommend_job_lists;
  158. } else {
  159. if ($recommend_job_lists && $recommend_job_lists->total()>0) {
  160. $recommend_job_items = $this->jobsService->dealjobFilelds($recommend_job_lists->items(), array(), $limit);
  161. }
  162. }
  163. return $recommend_job_items;
  164. }
  165. //获取点击量高的职位
  166. public function getClickJobs($limit = 50)
  167. {
  168. $where[] = array('valid','=',1);
  169. $where[] = array('display','=',1);
  170. if (config('aix.companyset.comset.show_set.jobs_display')==1) {
  171. $where[] = array('audit','=',1);
  172. } else {
  173. $where[] = array('audit','<>',3);
  174. }
  175. $where[] = array('subsite_ids','=',get_subsite_id());
  176. $order = array('click'=>'desc','stime'=>'desc','refresh_time'=> 'desc');
  177. return $this->search('Job', $where, $order, '', $limit);
  178. }
  179. //获取点击量高的简历
  180. public function getClickResumes($order_by, $job = array(), $need_limit = 50)
  181. {
  182. $click_where = $this->companyService->getRecommendResumeWhere($job);
  183. $click_resumes = $this->search('Resume', $click_where, $order_by, '', $need_limit);
  184. $click_resumes = $click_resumes->items();
  185. return $click_resumes;
  186. }
  187. //照片简历
  188. public function searchPhotoResumes($limit = 10, $user = array())
  189. {
  190. $list = array();
  191. $order_by = array('stime'=>'desc','click'=>'desc', 'updated_at'=>'desc');
  192. //获取点击量高的简历
  193. $click_where = $this->companyService->getRecommendResumeWhere(array());
  194. //添加照片过滤
  195. $click_where[] = array('photo', '=',1);
  196. $click_where[] = array('member_infos.display_images', '=',1);
  197. if (config('aix.personal_set.per_set.show_set.resume_img_display')==1) {
  198. $click_where[] = array('photo_audit', '=',2);
  199. } else {
  200. $click_where[] = array('photo_audit', '<>',0);
  201. }
  202. $click_rst = $this->search('Resume', $click_where, $order_by, '', $limit);
  203. $click_resumes = $click_rst->items();
  204. //企业用户 - 匹配置顶、刷新靠前的职位
  205. if ($user && $user->utype == 1) {
  206. //判断是否有可以匹配的职位
  207. $where = $this->companyService->getRecommendWhere($user);
  208. if ($where) {
  209. $where['and'][] = array('photo', '=',1);
  210. if (config('aix.personal_set.per_set.show_set.resume_img_display')==1) {
  211. $where['and'][] = array('photo_audit', '=',2);
  212. } else {
  213. $where['and'][] = array('photo_audit', '<>',0);
  214. }
  215. $where['and'][] = array('member_infos.display_images', '=',1);
  216. $recommend_resume_lists = $this->getRecommends($user, 'Resume', $where, $order_by, '', $limit);
  217. $rids = $recommend_resume_lists->pluck('id')->toArray();
  218. if ($recommend_resume_lists->total() >= $limit) {
  219. $list = array_slice($recommend_resume_lists->items(), 0, $limit);
  220. } else {
  221. //去除已有简历
  222. if ($click_resumes && $rids) {
  223. foreach ($click_resumes as $k => $v) {
  224. if (in_array($v->id, $rids)) {
  225. unset($click_resumes[$k]);
  226. }
  227. }
  228. }
  229. $recommend_resumes = $recommend_resume_lists->items();
  230. $recommend_total = $recommend_resume_lists->total();
  231. $need_resumes = array_slice($click_resumes, 0, $limit - $recommend_total);
  232. $all_resumes = array_merge($recommend_resumes, $need_resumes);
  233. $list = array_slice($all_resumes, 0, $limit);
  234. }
  235. } else {
  236. $list = array_slice($click_resumes, 0, $limit);
  237. }
  238. } else {
  239. $list = array_slice($click_resumes, 0, $limit);
  240. }
  241. //处理查询数据
  242. if ($list) {
  243. $photo_resumes = $this->resumeService->dealResumeFields($list);
  244. } else {
  245. $photo_resumes = array();
  246. }
  247. return $photo_resumes;
  248. }
  249. //最新简历
  250. public function searchNewResumes($limit = 10, $user = array())
  251. {
  252. $new_resumes = array();
  253. $where = array();
  254. $where[] = array('display','=',1);
  255. if (config('aix.personal_set.per_set.show_set.resume_display')=='1') {
  256. $where[] = array('audit','=','2');
  257. } else {
  258. $where[] = array('audit','<>','0');
  259. }
  260. $where[] = array('subsite_ids','=',get_subsite_id());
  261. $order_by = array('stick'=>'desc','updated_at'=>'desc');
  262. $list = $this->search('Resume', $where, $order_by, '', $limit);
  263. if ($list->total()>0) {
  264. $new_resumes = $this->resumeService->dealResumeFields($list->items());
  265. }
  266. return $new_resumes;
  267. }
  268. //同行业职位
  269. public function searchCateJobs($job, $limit = 10, $user = array())
  270. {
  271. $cate_jobs = array();
  272. $cate_job_where[] = array('intention_jobs_id','=',$job->jobcategory_id);
  273. $cate_job_where[] = array('id','<>',$job->id);
  274. if (config('aix.companyset.comset.show_set.jobs_display')==1) {
  275. $cate_job_where[] = array('audit','=',1);
  276. } else {
  277. $cate_job_where[] = array('audit','<>',3);
  278. }
  279. $cate_job_where[] = array('display','=',1);
  280. $cate_job_where[] = array('valid','=',1);
  281. $cate_job_where[] = array('subsite_ids','=',get_subsite_id());
  282. $cate_job_list = $this->search('Job', $cate_job_where, 'stime', '');
  283. if ($cate_job_list->total()>0) {
  284. $cate_jobs = $this->jobsService->dealjobList($cate_job_list->items(), 6);
  285. }
  286. return $cate_jobs;
  287. }
  288. //最新招聘职位
  289. public function searchNewJobs($limit = 20, $page = '')
  290. {
  291. $where[] = array('valid','=',1);
  292. $where[] = array('display','=',1);
  293. if (config('aix.companyset.comset.show_set.jobs_display')==1) {
  294. $where[] = array('audit','=',1);
  295. } else {
  296. $where[] = array('audit','<>',3);
  297. }
  298. $where[] = array('subsite_ids','=',get_subsite_id());
  299. $order = array('refresh_time'=>'desc');
  300. $new_job_lists = $this->search('Job', $where, $order, '', $limit, $page);
  301. $list = array();
  302. if ($new_job_lists->total()>0) {
  303. $list = $this->jobsService->dealjobFilelds($new_job_lists->items(), array(), $limit);
  304. }
  305. return $list;
  306. }
  307. public function getRecommends($user, $model, $where, $order_by, $search_key = '', $limit = 10, $page = '', $callback = null)
  308. {
  309. if ($model == 'Resume') {
  310. $list=Resume::search($search_key);
  311. if ($callback) {
  312. $list->query($callback);
  313. }
  314. if ($where) {
  315. $and_where = array();
  316. $or_where = array();
  317. if (array_has($where, 'or')) {
  318. $or_where = $where['or'];
  319. }
  320. if (array_has($where, 'and')) {
  321. $and_where = $where['and'];
  322. }
  323. if ($and_where) {
  324. $wage_max = 0;
  325. $wage_min=0;
  326. foreach ($and_where as $k => $v) {
  327. if ($v[1] !='=') {
  328. if ($v[0] == 'birthdate') {
  329. if ($v[1] == '>=') {
  330. $list->whereRange('birthdate', $v[2], null);
  331. } elseif ($v[1] == '<=') {
  332. $list->whereRange('birthdate', null, $v[2]);
  333. }
  334. } elseif ($v[0] == 'updated_at') {
  335. if ($v[1] == '>=') {
  336. $list->whereRange('updated_at', $v[2], null);
  337. } elseif ($v[1] == '<=') {
  338. $list->whereRange('updated_at', null, $v[2]);
  339. } elseif ($v[1] == '>') {
  340. $list->whereRange('updated_at', $v[2], null, false);
  341. } elseif ($v[1] == '<') {
  342. $list->whereRange('updated_at', null, $v[2], false);
  343. }
  344. } elseif ($v[0] == 'audit') {
  345. $list->whereNot('audit', $v[2]);
  346. } elseif ($v[0] == 'wage_max') {
  347. $wage_max = $v[2]?$v[2]:null;
  348. } elseif ($v[0] == 'wage_min') {
  349. $wage_min = $v[2]?$v[2]:null;
  350. } else {
  351. if ($v[1] == '<>') {
  352. $list->whereNot($v[0], $v[2]);
  353. }
  354. }
  355. } else {
  356. $list->where($v[0], $v[2]);
  357. }
  358. }
  359. }
  360. if ($or_where) {
  361. $list->where(function (SubBuilder $subBuilder) use ($or_where) {
  362. foreach ($or_where as $key => $val) {
  363. $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($val) {
  364. $wage_min = null;
  365. $wage_max = null;
  366. foreach ($val as $k => $v) {
  367. if ($v[1] !='=') {
  368. if ($v[0] == 'birthdate') {
  369. if ($v[1] == '>=') {
  370. $subBuilder->whereRange('birthdate', $v[2], null);
  371. } elseif ($v[1] == '<=') {
  372. $subBuilder->whereRange('birthdate', null, $v[2]);
  373. }
  374. } elseif ($v[0] == 'updated_at') {
  375. $subBuilder->whereRange('updated_at', $v[2], null, false);
  376. } elseif ($v[0] == 'audit') {
  377. $subBuilder->whereNot('audit', $v[2]);
  378. } elseif ($v[0] == 'wage_max') {
  379. $wage_max = $v[2]?$v[2]:null;
  380. } elseif ($v[0] == 'wage_min') {
  381. $wage_min = $v[2]?$v[2]:null;
  382. } else {
  383. if ($v[1] == '<>') {
  384. $subBuilder->whereNot($v[0], $v[2]);
  385. }
  386. }
  387. } else {
  388. $subBuilder->where($v[0], $v[2]);
  389. }
  390. }
  391. if ($wage_max && $wage_min) {
  392. $subBuilder->where(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {
  393. $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {
  394. $subBuilder->whereRange('wage_min', $wage_min, null)
  395. ->whereRange('wage_max', null, $wage_max)
  396. ->whereRange('wage_max', 0, null, false);
  397. });
  398. $subBuilder->whereOr('wage', -1);
  399. });
  400. } elseif ($wage_min) {
  401. $subBuilder->where(function (SubBuilder $subBuilder) use ($wage_min) {
  402. $subBuilder->whereOrRange('wage_min', $wage_min, null);
  403. $subBuilder->whereOr('wage', -1);
  404. });
  405. } elseif ($wage_max) {
  406. $subBuilder->where(function (SubBuilder $subBuilder) use ($wage_max) {
  407. $subBuilder->whereOrRange('wage_max', null, $wage_max);
  408. $subBuilder->whereOr('wage', -1);
  409. });
  410. }
  411. });
  412. }
  413. });
  414. }
  415. }
  416. //添加过期时间过滤
  417. $list->where(function (SubBuilder $subBuilder) {
  418. $subBuilder->whereOr('expires', 0)->whereOrRange('expires', time(), null);
  419. });
  420. if ($user && $user->utype==1) {
  421. $list->whereNotIn('person_shield_companys', array($user->id));
  422. }
  423. if (is_array($order_by)) {
  424. foreach ($order_by as $k => $v) {
  425. $list->orderBy($k, $v);
  426. }
  427. } else {
  428. $list->orderBy($order_by, 'desc');
  429. }
  430. if ($page) {
  431. return $list->paginate($limit, 'page', $page);
  432. } else {
  433. return $list->paginate($limit);
  434. }
  435. } elseif ($model == 'Job') {
  436. $list=Jobs::search($search_key);
  437. if ($callback) {
  438. $list->query($callback);
  439. }
  440. if ($where) {
  441. $and_where = array();
  442. $or_where = array();
  443. if (array_has($where, 'or')) {
  444. $or_where = $where['or'];
  445. }
  446. if (array_has($where, 'and')) {
  447. $and_where = $where['and'];
  448. }
  449. if ($and_where) {
  450. foreach ($and_where as $k => $v) {
  451. if ($v[1] !='=') {
  452. if ($v[0] == 'audit') {
  453. $list->whereNot('audit', $v[2]);
  454. } elseif ($v[0] == 'setmeal_id') {
  455. if ($v[1] == '>') {
  456. $list->whereRange('setmeal_id', $v[2], null, false);
  457. } elseif ($v[1] == '<') {
  458. $list->whereRange('setmeal_id', null, $v[2], false);
  459. }
  460. } elseif ($v[0] == 'updated_at') {
  461. $list->whereRange('updated_at', $v[2], null, false);
  462. } else {
  463. if ($v[1] == 'in') {
  464. $list->whereIn($v[0], $v[2]);
  465. } elseif ($v[1] == '>=') {
  466. $list->whereRange($v[0], $v[2], null);
  467. } elseif ($v[1] == '<=') {
  468. $list->whereRange($v[0], null, $v[2]);
  469. } elseif ($v[1] == '<>') {
  470. $list->whereNot($v[0], $v[2]);
  471. } elseif ($v[1] == '>') {
  472. $list->whereRange($v[0], $v[2], null, false);
  473. } elseif ($v[1] == '<') {
  474. $list->whereRange($v[0], null, $v[2], false);
  475. }
  476. }
  477. } else {
  478. $list->where($v[0], $v[2]);
  479. }
  480. }
  481. }
  482. if ($or_where) {
  483. $list->where(function (SubBuilder $subBuilder) use ($or_where) {
  484. foreach ($or_where as $key => $val) {
  485. $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($val) {
  486. $wage_min = null;
  487. $wage_max = null;
  488. foreach ($val as $k => $v) {
  489. if ($v[1] !='=') {
  490. if ($v[0] == 'audit') {
  491. $subBuilder->whereNot('audit', $v[2]);
  492. } elseif ($v[0] == 'setmeal_id') {
  493. if ($v[1] == '>') {
  494. $subBuilder->whereRange('setmeal_id', $v[2], null, false);
  495. } elseif ($v[1] == '<') {
  496. $subBuilder->whereRange('setmeal_id', null, $v[2], false);
  497. }
  498. } elseif ($v[0] == 'updated_at') {
  499. $subBuilder->whereRange('updated_at', $v[2], null, false);
  500. } elseif ($v[0] == 'wage_max') {
  501. $wage_max = $v[2]?$v[2]:null;
  502. } elseif ($v[0] == 'wage_min') {
  503. $wage_min = $v[2]?$v[2]:null;
  504. } else {
  505. if ($v[1] == 'in') {
  506. $subBuilder->whereIn($v[0], $v[2]);
  507. } elseif ($v[1] == '>=') {
  508. $subBuilder->whereRange($v[0], $v[2], null);
  509. } elseif ($v[1] == '<=') {
  510. $subBuilder->whereRange($v[0], null, $v[2]);
  511. } elseif ($v[1] == '<>') {
  512. $subBuilder->whereNot($v[0], $v[2]);
  513. } elseif ($v[1] == '>') {
  514. $subBuilder->whereRange($v[0], $v[2], null, false);
  515. } elseif ($v[1] == '<') {
  516. $subBuilder->whereRange($v[0], null, $v[2], false);
  517. }
  518. }
  519. } else {
  520. $subBuilder->where($v[0], $v[2]);
  521. }
  522. }
  523. if ($wage_max && $wage_min) {
  524. $subBuilder->where(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {
  525. $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {
  526. $subBuilder->whereRange('wage_min', $wage_min, null)
  527. ->whereRange('wage_max', null, $wage_max)
  528. ->whereRange('wage_max', 0, null, false);
  529. });
  530. $subBuilder->whereOr('wage', -1);
  531. });
  532. } elseif ($wage_min) {
  533. $subBuilder->where(function (SubBuilder $subBuilder) use ($wage_min) {
  534. $subBuilder->whereOrRange('wage_min', $wage_min, null);
  535. $subBuilder->whereOr('wage', -1);
  536. });
  537. } elseif ($wage_max) {
  538. $subBuilder->where(function (SubBuilder $subBuilder) use ($wage_max) {
  539. $subBuilder->whereOrRange('wage_max', null, $wage_max);
  540. $subBuilder->whereOr('wage', -1);
  541. });
  542. }
  543. });
  544. }
  545. });
  546. }
  547. }
  548. if ($order_by) {
  549. if (is_array($order_by)) {
  550. foreach ($order_by as $k => $v) {
  551. $list->orderBy($k, $v);
  552. }
  553. } else {
  554. $list->orderBy($order_by, 'desc');
  555. }
  556. } else {
  557. $list->orderBy('refresh_time', 'desc');
  558. }
  559. if ($page) {
  560. return $list->paginate($limit, 'page', $page);
  561. } else {
  562. return $list->paginate($limit);
  563. }
  564. }
  565. }
  566. public function search($model, $where, $order_by, $search_key = '', $limit = 10, $page = '', $callback = null, $compan_order =false)
  567. {
  568. if ($model == 'Resume') {
  569. $list=Resume::search($search_key);
  570. if ($callback) {
  571. $list->query($callback);
  572. }
  573. if ($where) {
  574. $wage_min = null;
  575. $wage_max = null;
  576. foreach ($where as $k => $v) {
  577. if ($v[1] !='=') {
  578. if ($v[0] == 'birthdate') {
  579. if ($v[1] == '>=') {
  580. $list->whereRange('birthdate', $v[2], null);
  581. } elseif ($v[1] == '<=') {
  582. $list->whereRange('birthdate', null, $v[2]);
  583. }
  584. } elseif ($v[0] == 'updated_at') {
  585. $list->whereRange('updated_at', $v[2], null, false);
  586. } elseif ($v[0] == 'audit') {
  587. $list->whereNot('audit', $v[2]);
  588. } elseif ($v[0] == 'wage_max') {
  589. $wage_max = $v[2]?$v[2]:null;
  590. } elseif ($v[0] == 'wage_min') {
  591. $wage_min = $v[2]?$v[2]:null;
  592. } else {
  593. if ($v[1] == 'in') {
  594. $list->whereIn($v[0], $v[2]);
  595. } elseif ($v[1] == '>=') {
  596. $list->whereRange($v[0], $v[2], null);
  597. } elseif ($v[1] == '<=') {
  598. $list->whereRange($v[0], null, $v[2]);
  599. } elseif ($v[1] == '<>') {
  600. $list->whereNot($v[0], $v[2]);
  601. } elseif ($v[1] == 'in') {
  602. $list->whereIn($v[0], $v[2]);
  603. }
  604. }
  605. } else {
  606. $list->where($v[0], $v[2]);
  607. }
  608. }
  609. //期望薪资过滤
  610. if ($wage_max && $wage_min) {
  611. $list->where(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {
  612. $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {
  613. $subBuilder->whereRange('wage_min', $wage_min, null)
  614. ->whereRange('wage_max', null, $wage_max)
  615. ->whereRange('wage_max', 0, null, false);
  616. });
  617. $subBuilder->whereOr('wage', -1);
  618. });
  619. } elseif ($wage_min) {
  620. $list->where(function (SubBuilder $subBuilder) use ($wage_min) {
  621. $subBuilder->whereOrRange('wage_min', $wage_min, null);
  622. $subBuilder->whereOr('wage', -1);
  623. });
  624. } elseif ($wage_max) {
  625. $list->where(function (SubBuilder $subBuilder) use ($wage_max) {
  626. $subBuilder->whereOrRange('wage_max', null, $wage_max);
  627. $subBuilder->whereOr('wage', -1);
  628. });
  629. }
  630. }
  631. //添加过期时间过滤
  632. $list->where(function (SubBuilder $subBuilder) {
  633. $subBuilder->whereOr('expires', 0)->whereOrRange('expires', time(), null);
  634. });
  635. if (auth('web-company')->check()) {
  636. $list->whereNotIn('person_shield_companys', array(auth('web-company')->user()->id));
  637. }
  638. if (is_array($order_by)) {
  639. foreach ($order_by as $k => $v) {
  640. $list->orderBy($k, $v);
  641. }
  642. } else {
  643. $list->orderBy($order_by, 'desc');
  644. }
  645. if ($page) {
  646. return $list->paginate($limit, 'page', $page);
  647. } else {
  648. return $list->paginate($limit);
  649. }
  650. } elseif ($model == 'Job') {
  651. $list=Jobs::search($search_key);
  652. if ($callback) {
  653. $list->query($callback);
  654. }
  655. if ($where) {
  656. //申请过滤
  657. if (array_has($where, 'apply')) {
  658. $apply = $where['apply'];
  659. unset($where['apply']);
  660. if ($apply && auth('web-member')->check()) {
  661. //获取当前用户一段时间间隔内所有申请记录
  662. $space_time = (integer)config('aix.personal_set.per_set.per_set.apply_job_space');
  663. if ($space_time >0) {
  664. $stime = date('Y-m-d H:i:s', strtotime(date("Y-m-d", strtotime("-".$space_time." day"))));
  665. $apply_where = array(array('personal_uid','=',auth('web-member')->user()->id),array('created_at','>=',$stime));
  666. } else {
  667. $apply_where = array(array('personal_uid','=',auth('web-member')->user()->id));
  668. }
  669. $rst = $this->personalJobsApplyRepository->getJobsApply($apply_where);
  670. $ids= $rst->pluck('jobs_id');
  671. if ($ids->isNotEmpty()) {
  672. $list->whereNotIn('id', $ids->toArray());
  673. }
  674. }
  675. }
  676. $map_filter = array();
  677. $map_order = array();
  678. $wage_min = null;
  679. $wage_max = null;
  680. foreach ($where as $k => $v) {
  681. if ($v[1] !='=') {
  682. if ($v[0] == 'audit') {
  683. $list->whereNot('audit', $v[2]);
  684. } elseif ($v[0] == 'setmeal_id') {
  685. if ($v[1] == '>') {
  686. $list->whereRange('setmeal_id', $v[2], null, false);
  687. } elseif ($v[1] == '<') {
  688. $list->whereRange('setmeal_id', null, $v[2], false);
  689. }
  690. } elseif ($v[0] == 'updated_at') {
  691. $list->whereRange('updated_at', $v[2], null, false);
  692. } elseif ($v[0] == 'wage_max') {
  693. $wage_max = $v[2]?$v[2]:null;
  694. } elseif ($v[0] == 'wage_min') {
  695. $wage_min = $v[2]?$v[2]:null;
  696. } else {
  697. if ($v[1] == 'in') {
  698. $list->whereIn($v[0], $v[2]);
  699. } elseif ($v[1] == '>=') {
  700. $list->whereRange($v[0], $v[2], null);
  701. } elseif ($v[1] == '<=') {
  702. $list->whereRange($v[0], null, $v[2]);
  703. } elseif ($v[1] == '<>') {
  704. $list->whereNot($v[0], $v[2]);
  705. } elseif ($v[1] == '>') {
  706. $list->whereRange($v[0], $v[2], null, false);
  707. } elseif ($v[1] == '<') {
  708. $list->whereRange($v[0], null, $v[2], false);
  709. }
  710. }
  711. } else {
  712. if ($v[0] == 'lng') {
  713. $map_filter['location']['lon'] = $v[2];
  714. $map_order['lon'] = $v[2];
  715. } elseif ($v[0] == 'lat') {
  716. $map_filter['location']['lat'] = $v[2];
  717. $map_order['lat'] = $v[2];
  718. } elseif ($v[0] == 'range') {
  719. $map_filter['distance'] = $v[2].'km';
  720. } else {
  721. $list->where($v[0], $v[2]);
  722. }
  723. }
  724. }
  725. if ($wage_max && $wage_min) {
  726. $list->where(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {
  727. $subBuilder->whereOr(function (SubBuilder $subBuilder) use ($wage_max, $wage_min) {
  728. $subBuilder->whereRange('wage_min', $wage_min, null)
  729. ->whereRange('wage_max', null, $wage_max)
  730. ->whereRange('wage_max', 0, null, false);
  731. });
  732. $subBuilder->whereOr('wage', -1);
  733. });
  734. } elseif ($wage_min) {
  735. $list->where(function (SubBuilder $subBuilder) use ($wage_min) {
  736. $subBuilder->whereOrRange('wage_min', $wage_min, null);
  737. $subBuilder->whereOr('wage', -1);
  738. });
  739. } elseif ($wage_max) {
  740. $list->where(function (SubBuilder $subBuilder) use ($wage_max) {
  741. $subBuilder->whereOrRange('wage_max', null, $wage_max);
  742. $subBuilder->whereOr('wage', -1);
  743. });
  744. }
  745. if ($map_filter) {
  746. if ($map_filter && !array_has($map_filter, 'distance')) {
  747. $map_filter['distance'] = 1;
  748. }
  749. $list->whereLocation('location', $map_filter['location']['lat'], $map_filter['location']['lon'], $map_filter['distance']);
  750. }
  751. if ($map_order) {
  752. $list->orderBy(['location'=>$map_order, 'order'=>'asc', 'unit'=>'km']);
  753. }
  754. }
  755. $list->where(function (SubBuilder $subBuilder) {
  756. $subBuilder->where('company.user_status', 1);
  757. });
  758. //过滤企业审核状态
  759. $list->where(function (SubBuilder $subBuilder) {
  760. $subBuilder->where('company.audit', 1);
  761. });
  762. if ($order_by) {
  763. if (is_array($order_by)) {
  764. foreach ($order_by as $k => $v) {
  765. $list->orderBy($k, $v);
  766. }
  767. } else {
  768. $list->orderBy($order_by, 'desc');
  769. }
  770. } else {
  771. $list->orderBy('refresh_time', 'desc');
  772. }
  773. if ($page) {
  774. return $list->paginate($limit, 'page', $page);
  775. } else {
  776. return $list->paginate($limit);
  777. }
  778. } elseif ($model == 'Company') {
  779. $list=Company::search($search_key);
  780. if ($callback) {
  781. $list->query($callback);
  782. }
  783. if ($where) {
  784. foreach ($where as $k => $v) {
  785. if ($v[1] !='=') {
  786. if ($v[1] == '>') {
  787. $list->whereRange($v[0], $v[2], null, false);
  788. } elseif ($v[1] == '>=') {
  789. $list->whereRange($v[0], $v[2], null);
  790. } elseif ($v[1] == '<') {
  791. $list->whereRange($v[0], null, $v[2], false);
  792. } elseif ($v[1] == '<=') {
  793. $list->whereRange($v[0], null, $v[2]);
  794. } elseif ($v[1] == 'in') {
  795. $list->whereIn($v[0], $v[2]);
  796. }
  797. } else {
  798. $list->where($v[0], $v[2]);
  799. }
  800. }
  801. }
  802. $list->where(function (SubBuilder $subBuilder) {
  803. $subBuilder->where('audit', 1);
  804. });
  805. if ($compan_order) {
  806. if (is_array($order_by)) {
  807. foreach ($order_by as $k => $v) {
  808. $list->orderBy($k, $v);
  809. }
  810. } else {
  811. $list->orderBy($order_by, 'desc');
  812. }
  813. }
  814. if ($page) {
  815. return $list->paginate($limit, 'page', $page);
  816. } else {
  817. return $list->paginate($limit);
  818. }
  819. } elseif ($model == 'Shuobo') {
  820. $list=MemberShuobo::search($search_key);
  821. if ($order_by) {
  822. if (is_array($order_by)) {
  823. foreach ($order_by as $k => $v) {
  824. $list->orderBy($k, $v);
  825. }
  826. } else {
  827. $list->orderBy($order_by, 'desc');
  828. }
  829. } else {
  830. $list->orderBy('refresh_time', 'desc');
  831. }
  832. if ($page) {
  833. return $list->paginate($limit, 'page', $page);
  834. } else {
  835. return $list->paginate($limit);
  836. }
  837. }
  838. }
  839. }