SearchService.php 40 KB

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