SearchService.php 40 KB

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