SearchService.php 39 KB

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