ResumeController.php 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. <?php
  2. namespace App\Http\Controllers\Mobile\Content;
  3. use Aix\Pay\Data\PayOrder;
  4. use App\Models\Resume;
  5. use App\Repositories\MemberSetmealRepository;
  6. use App\Repositories\ResumeRepository;
  7. use App\Services\Common\EmailService;
  8. use SimpleSoftwareIO\QrCode\Facades\QrCode;
  9. use App\Http\Controllers\Mobile\MobileBaseController;
  10. use App\Services\Common\CategoryService;
  11. use App\Services\Person\ResumeService;
  12. use App\Services\Content\FeedbackService;
  13. use App\Services\Content\TaskService;
  14. use App\Services\Common\TaskService as CommonTaskService;
  15. use App\Services\Content\ReportService;
  16. use App\Services\Common\MembersSetmealService;
  17. use App\Services\Company\JobsService;
  18. use App\Services\Company\CompanyService;
  19. use App\Services\Company\CompanyDownResumeService;
  20. use App\Services\Common\PaymentService;
  21. use App\Services\Common\SetmealIncrementsService;
  22. use App\Services\Person\MemberPointService;
  23. use App\Services\Person\MemberHandselService;
  24. use App\Services\Company\ServiceService;
  25. use App\Services\Common\OrderService;
  26. use App\Services\Common\PayService;
  27. use App\Services\Common\HotWordService;
  28. use App\Services\Common\SearchService;
  29. use Illuminate\Http\Request;
  30. use App\Exceptions\ResponseException;
  31. use Illuminate\Support\Facades\DB;
  32. class ResumeController extends MobileBaseController
  33. {
  34. protected $categoryService;
  35. protected $resumeService;
  36. protected $feedbackService;
  37. protected $taskService;
  38. protected $commonTaskService;
  39. protected $reportService;
  40. protected $membersSetmealService;
  41. protected $jobsService;
  42. protected $companyService;
  43. protected $companyDownResumeService;
  44. protected $paymentService;
  45. protected $setmealIncrementsService;
  46. protected $memberPointService;
  47. protected $memberHandselService;
  48. protected $serviceService;
  49. protected $orderService;
  50. protected $payService;
  51. protected $hotWordService;
  52. protected $searchService;
  53. protected $memberSetmealRepository;
  54. protected $emailService;
  55. private $resumeRepository;
  56. /**
  57. * ResumeController constructor.
  58. * @param ResumeRepository $resumeRepository
  59. * @param MemberSetmealRepository $memberSetmealRepository
  60. * @param CategoryService $categoryService
  61. * @param ResumeService $resumeService
  62. * @param FeedbackService $feedbackService ;
  63. * @param TaskService $taskService ;
  64. * @param CommonTaskService $commonTaskService ;
  65. * @param ReportService $reportService ;
  66. * @param MembersSetmealService $membersSetmealService ;
  67. * @param JobsService $jobsService ;
  68. * @param CompanyService $companyService
  69. * @param CompanyDownResumeService $companyDownResumeService
  70. * @param PaymentService $paymentService
  71. * @param SetmealIncrementsService $setmealIncrementsService
  72. * @param MemberPointService $memberPointService
  73. * @param MemberHandselService $memberHandselService
  74. * @param ServiceService $serviceService
  75. * @param OrderService $orderService
  76. * @param PayService $payService
  77. * @param HotWordService $hotWordService
  78. * @param SearchService $searchService
  79. * @param EmailService $emailService
  80. */
  81. public function __construct(ResumeRepository $resumeRepository,MemberSetmealRepository $memberSetmealRepository,CategoryService $categoryService, ResumeService $resumeService, FeedbackService $feedbackService, TaskService $taskService, CommonTaskService $commonTaskService, ReportService $reportService, MembersSetmealService $membersSetmealService, JobsService $jobsService, CompanyService $companyService, CompanyDownResumeService $companyDownResumeService, PaymentService $paymentService, SetmealIncrementsService $setmealIncrementsService, MemberPointService $memberPointService, MemberHandselService $memberHandselService, ServiceService $serviceService,OrderService $orderService, PayService $payService, HotWordService $hotWordService, SearchService $searchService, EmailService $emailService)
  82. {
  83. $this->categoryService = $categoryService;
  84. $this->resumeService = $resumeService;
  85. $this->feedbackService = $feedbackService;
  86. $this->taskService = $taskService;
  87. $this->commonTaskService = $commonTaskService;
  88. $this->reportService = $reportService;
  89. $this->membersSetmealService = $membersSetmealService;
  90. $this->jobsService = $jobsService;
  91. $this->companyService = $companyService;
  92. $this->companyDownResumeService = $companyDownResumeService;
  93. $this->paymentService = $paymentService;
  94. $this->setmealIncrementsService = $setmealIncrementsService;
  95. $this->memberPointService = $memberPointService;
  96. $this->memberHandselService = $memberHandselService;
  97. $this->serviceService = $serviceService;
  98. $this->orderService = $orderService;
  99. $this->payService = $payService;
  100. $this->hotWordService = $hotWordService;
  101. $this->searchService = $searchService;
  102. $this->memberSetmealRepository=$memberSetmealRepository;
  103. $this->emailService=$emailService;
  104. $this->resumeRepository=$resumeRepository;
  105. }
  106. public function index(Request $request)
  107. {
  108. $search_type = $request->input('search_type', 'resume');
  109. $citycategory = $request->input('citycategory');
  110. $param_array = array('jobcategory','citycategory','resumetag','experience','sex','age','trade','major','education','nature','wage','settr','key', 'sort', 'photo','mobile_audit');
  111. $params= array();
  112. $hidden_all_result = 0;
  113. $show_login_notice = 0;
  114. $where = array();
  115. if ($request->all()) {
  116. foreach ($request->all() as $k => $v) {
  117. if (in_array($k, $param_array) && $v) {
  118. $params[$k] = $v;
  119. }
  120. }
  121. }
  122. $show_filter = false;
  123. $filter_array = array('sort', 'photo','mobile_audit');
  124. if ($params && (count($params) <= count($filter_array))) {
  125. foreach ($params as $k => $v) {
  126. if (!in_array($k, $filter_array)) {
  127. $show_filter = true;
  128. break;
  129. }
  130. }
  131. } elseif (count($params) > count($filter_array)) {
  132. $show_filter = true;
  133. }
  134. session(['hotword_show_type' => 3]);
  135. $hotWords = $this->hotWordService->getHotWords(array(), 'list_order desc,w_hot desc', '27');
  136. $resume_hotwords = array_slice($hotWords->toArray(), 0, 10);
  137. $district_info = $this->categoryService->getDefaultDistrictInfo(); //获取默认地区信息
  138. $citys = $this->categoryService->getCitys($citycategory); //获取地标地区
  139. //获取分类信息
  140. $filter_where = array(
  141. 'AIX_resumetag' => 100, //简历标签
  142. 'AIX_experience' => 100, //工作经验
  143. 'AIX_age' => 100, //年龄
  144. 'AIX_trade' => 100, //行业类别
  145. 'AIX_education' => 100, //学历
  146. 'AIX_jobs_nature' =>100, //工作性质
  147. 'AIX_wage' => 100, //薪资
  148. );
  149. $categories = $this->categoryService->getCategories($filter_where);
  150. $major_categories = $this->categoryService->getMajorCategory(); //专业分类
  151. $major_info = null;
  152. if ($request->input('major')) {
  153. $major_info = $this->categoryService->getMajorInfo($request->input('major'));
  154. }
  155. $job_category = $this->categoryService->getJobsCategoryInfo(); //职位分类
  156. //组合查询条件
  157. $order_by = array('stime'=>'desc', 'updated_at'=>'desc');
  158. $search_key = '';
  159. $limit = '';
  160. if ($params) {
  161. foreach ($params as $k => $v) {
  162. if ($k == 'citycategory') {
  163. $where[] = array('district','=',$citys['select']['id']);
  164. } elseif ($k == 'jobcategory') {
  165. if ($job_category && $v && array_get($job_category['spell'], $v)) {
  166. $where[] = array('intention_jobs_id','=',$job_category['spell'][$v]['id']);
  167. }
  168. } elseif ($k == 'resumetag') {
  169. $where[] = array('tag', '=',$v);
  170. } elseif ($k =='age') {
  171. $age_info = $this->resumeService->dealAge($v);
  172. if ($age_info) {
  173. if (array_get($age_info, 'min_age')) {
  174. $where[] = array('birthdate', '>=',$age_info['min_age']);
  175. }
  176. if (array_get($age_info, 'max_age')) {
  177. $where[] = array('birthdate', '<=',$age_info['max_age']);
  178. }
  179. }
  180. } elseif ($k =='wage') {
  181. //获取期望薪资最大值和最小值
  182. if ($categories) {
  183. $wage = $categories['AIX_wage'][$params['wage']]['origin_demand'];
  184. if ($wage) {
  185. $wage = format_wage($wage);
  186. }
  187. $wage_arr = explode_wage($wage);
  188. $where[] = $wage_arr[0];
  189. $where[] = $wage_arr[1];
  190. }
  191. } elseif ($k =='settr') {
  192. $update_time = date('Y-m-d H:i:s', strtotime(date('Y-m-d', strtotime('-'.$v.' day'))));
  193. $where[] = array('updated_at', '>=',$update_time);
  194. } elseif ($k =='photo') {
  195. $where[] = array('photo', '=',$v);
  196. $where[] = array('photo_audit', '=',2);
  197. $where[] = array('member_infos.display_images', '=',1);
  198. } elseif ($k !='sort' && $k !='key') {
  199. $where[] = array($k,'=',$v);
  200. }
  201. }
  202. if (array_has($params, 'sort')) {
  203. if ($params['sort'] == 'rtime') {
  204. $order_by = 'updated_at';
  205. } else {
  206. $order_by = $params['sort'];
  207. }
  208. } else {
  209. $order_by = array('stime'=>'desc', 'updated_at'=>'desc');
  210. }
  211. $search_key = array_has($params, 'key')?$params['key']:'';
  212. }
  213. if (config('aix.personal_set.per_set.show_set.resume_display')=='1') {
  214. $where[] = array('audit','=','2');
  215. } else {
  216. $where[] = array('audit','<>','0');
  217. }
  218. $where[] = array('display','=',1);
  219. $where[] = array('subsite_ids','=',get_subsite_id());
  220. if (config('aix.personal_set.serch_set.search_base_set.resume_search_login')==1 && !auth('web-company')->check() && !auth('web-member')->check()) {
  221. $need_login_params = $param_array;
  222. unset($need_login_params[array_search('key', $need_login_params)]);
  223. foreach ($params as $k => $v) {
  224. if (in_array($k, $need_login_params) && $v) {
  225. //跳转到登录页面
  226. return redirect(route('mobile.login'));
  227. $hidden_all_result = 1;
  228. $where[] = array('id','=',0); //设置该条件使查询结果为空
  229. break;
  230. }
  231. }
  232. $limit = config('aix.personal_set.serch_set.search_base_set.resume_search_num_login');
  233. $show_login_notice = 1;
  234. }
  235. $size = 20;
  236. $list = $this->searchService->search('Resume', $where, $order_by, $search_key, $size);
  237. if ($list->total()>0) {
  238. $list_items = $this->resumeService->dealResumeFields($list->items());
  239. } else {
  240. $list_items = array();
  241. }
  242. $mobile_dropload = false;
  243. if ($list->total() > $size) {
  244. $mobile_dropload = true;
  245. }
  246. if ($request->ajax()) {
  247. if ($list->lastPage() < $list->currentPage()) {
  248. return response()->json(['status'=>0]);
  249. }
  250. return response()->json(['status'=>1,'data'=>view('mobile.app.content.resume.ajax_resume_list', ['params'=> $params,'list_items'=> $list_items])->render()]);
  251. }
  252. $return_data = array(
  253. 'search_type' => $search_type,
  254. 'city' => $citys,
  255. 'params' => $params,
  256. 'categories' => $categories,
  257. 'district_info' => $district_info,
  258. 'major_categories' => $major_categories,
  259. 'major_info' => $major_info,
  260. 'job_category' => $job_category,
  261. 'show_login_notice' => $show_login_notice,
  262. 'hidden_all_result' => $hidden_all_result,
  263. 'hotWords' => $hotWords,
  264. 'resume_hotwords' => $resume_hotwords,
  265. 'list_items' => $list_items,
  266. 'list' => $list,
  267. 'limit' => $limit,
  268. 'mobile_dropload' => $mobile_dropload,
  269. 'current_url' => \Illuminate\Support\Facades\Request::getRequestUri(),
  270. 'wap_title' => '招人才',
  271. 'show_filter' => $show_filter
  272. );
  273. return view('mobile.app.content.resume.index', $return_data);
  274. }
  275. public function category()
  276. {
  277. $serch_type = null;
  278. $district_info = $this->categoryService->getDefaultDistrictInfo();
  279. $job_cates = $this->categoryService->getJobsCategories();
  280. $citys = $this->categoryService->getCitys();
  281. session(['hotword_show_type' => 3]);
  282. $resume_hotwords = $this->hotWordService->getHotWords(array('type'=>3), 'list_order desc,w_hot desc', '10');
  283. $return_data = array(
  284. 'search_type' => $serch_type,
  285. 'city' => $citys,
  286. 'district_info' => $district_info,
  287. 'job_cates' => $job_cates,
  288. 'resume_hotwords' => $resume_hotwords
  289. );
  290. return view('app.content.resume.category', $return_data);
  291. }
  292. //简历预览页面
  293. public function show(Request $request)
  294. {
  295. //招聘会收到简历用到,直接显示,不提示下载
  296. $type = $request->type ? $request->type : 0;
  297. $res = $this->resumeService->resumeShow($request->input('id'), $request->input('jobs_id', ''), $this->getUser(),$type);
  298. if (array_has($res, 'status') && $res['status']==0) {
  299. $back_url = \Illuminate\Support\Facades\URL::previous();
  300. return $this->showMessage($res['msg'], $back_url, true, '上一页', '3');
  301. }
  302. $this->putSeoData('resume', $res['resume']);
  303. return view('mobile.app.content.resume.show', ['content'=>$res,'resume'=>$res['resume'],'user'=> $this->getUser(),'type'=>$type,'wap_title'=>'简历主页']);
  304. }
  305. public function getUser()
  306. {
  307. $user = array();
  308. if (auth('web-member')->check()) {
  309. $user = auth('web-member')->user();
  310. } elseif (auth('web-company')->check()) {
  311. $user = auth('web-company')->user();
  312. }
  313. return $user;
  314. }
  315. //增加简历点击量
  316. public function click(Request $request)
  317. {
  318. $id = $request->input('id');
  319. $rst = $this->resumeService->incrementData(array('id'=>$id), 1, 'click');
  320. $data = array('status'=>0);
  321. if ($rst) {
  322. $data = array('status'=>1);
  323. }
  324. return response()->json($data);
  325. }
  326. //导出word简历
  327. public function docExport(Request $request)
  328. {
  329. if (!auth('web-company')->check() && !auth('web-member')->check()) {
  330. if ($request->ajax()) {
  331. //弹出登陆页面
  332. $data = array('status'=>0,'msg'=>'请登录!');
  333. return response()->json($data);
  334. }
  335. return redirect("/auth/login");
  336. }
  337. $resume_id = $request->input('id');
  338. return $this->resumeService->saveDocResume($resume_id);
  339. }
  340. //收藏简历
  341. public function favorResume(Request $request)
  342. {
  343. $resume_id = $request->input('rid');
  344. $return_data = $this->resumeService->favorResume($resume_id, $this->getUser());
  345. return response()->json($return_data);
  346. }
  347. //举报简历
  348. public function reportResume(Request $request)
  349. {
  350. $resume_id = intval($request->input('resume_id', 0));
  351. if (!$resume_id) {
  352. throw new ResponseException('请选择要投诉的简历!');
  353. }
  354. $taskInfo = $this->taskService->getTask('1', 'report_resume'); //举报积分信息
  355. $report_types = $this->reportService->getReportTypes('2');
  356. $page_data = array('type_arr'=>$report_types,'resume_id'=>$resume_id,'taskInfo'=>$taskInfo);
  357. $html = view('app.common.ajax.report_resume', $page_data)->render();
  358. $return_data = array( 'status'=>1, 'html' => $html);
  359. return response()->json($return_data);
  360. }
  361. public function addReportResume(Request $request)
  362. {
  363. $report_type = intval($request->input('report_type', '1'));
  364. $resume_id = intval($request->input('resume_id', 0));
  365. if (!$resume_id) {
  366. throw new ResponseException('请选择要投诉的简历!');
  367. }
  368. $data['resume_id'] = $resume_id;
  369. $data['report_type'] = $report_type;
  370. $report_data = array(
  371. 'utype' => 2,
  372. 'utype_id' => $resume_id,
  373. 'type_id' => $report_type,
  374. 'phone' => '',
  375. 'content' => '',
  376. 'audit' => 1
  377. );
  378. $rst = $this->reportService->addReport($report_data);
  379. if ($rst) {
  380. //添加会员日志
  381. $user_info = array(
  382. 'uid' => auth('web-company')->user()->id,
  383. 'utype' =>1,
  384. 'username' => auth('web-company')->user()->username,
  385. 'ip' => ip2long($request->getClientIp()),
  386. 'log_address'=>'本机地址'
  387. );
  388. $this->feedbackService->addMembersLog($user_info, '1032', $resume_id);
  389. $return_data = array( 'status'=>1, 'msg' => '投诉成功!请等待管理员核实!');
  390. return response()->json($return_data);
  391. } else {
  392. throw new ResponseException('投诉失败!');
  393. }
  394. }
  395. //在线支付简历下载
  396. public function payResume(Request $request)
  397. {
  398. $resume_id = $request->input('resume_id');
  399. if (!$resume_id) {
  400. $back_url = \Illuminate\Support\Facades\URL::previous();
  401. return $this->showMessage('请选择简历!', $back_url, true, '上一页', '3');
  402. }
  403. $resume_id = is_array($resume_id)?$resume_id:explode(",", $resume_id);
  404. $resume_num =count($resume_id);
  405. $user = auth('web-company')->user();
  406. //微信、支付宝在线支付,调起支付接口
  407. $is_deductible = 0;
  408. $deductible = 0;
  409. $increment_info['name'] = '简历下载';
  410. $increment_info = (object)$increment_info;
  411. $params['resume_id'] = $resume_id;
  412. $params['type'] = 'resume_download';
  413. //$params = $params;
  414. $member_setmeal = $this->membersSetmealService->getUserSetmeal($user, '1');
  415. $member_point = $this->companyService->getPoint($user->id, 1);
  416. $payment_name = $request->input('payment_name', '');
  417. $need_cash_resume = config('aix.companyset.comsume.comsume_set.download_resume_price')*$resume_num;
  418. return $this->callCashPay($resume_id, $member_setmeal, $member_point, $increment_info, 14, $payment_name, $need_cash_resume, $is_deductible, $deductible, '', $params);
  419. }
  420. //下载简历增值包
  421. public function downloadResume(Request $request)
  422. {
  423. $resume_id = $request->input('rid');
  424. if (!$resume_id) {
  425. return response()->json(['status'=>0, 'msg'=>'请选择简历!']);
  426. }
  427. $rid = is_array($resume_id)?$resume_id:explode(",", $resume_id);
  428. $resume_num =count($rid);
  429. $user = auth('web-company')->user();
  430. $member_setmeal = $this->membersSetmealService->getUserSetmeal($user, '1');
  431. $member_point = $this->companyService->getPoint($user->id, 1); //获取会员积分
  432. if ($request->method() == 'POST') {
  433. $payment_name = $request->input('payment_name', '');
  434. if ($payment_name) {
  435. /*//微信、支付宝在线支付,调起支付接口
  436. $is_deductible = intval($request->input('is_deductible', 0));
  437. $deductible = intval($request->input('deductible', 0));
  438. $increment_info['name'] = '简历下载';
  439. $increment_info = (object)$increment_info;
  440. $params['resume_id'] = $rid;
  441. $params['type'] = 'resume_download';
  442. $params = $params;
  443. $need_cash_resume = config('aix.companyset.comsume.comsume_set.download_resume_price')*$resume_num;
  444. return $this->callCashPay($resume_id, $member_setmeal, $member_point, $increment_info, 14, $payment_name, $need_cash_resume, $is_deductible, $deductible, '', $params);*/
  445. } else {
  446. $addarr['rid'] = $rid;
  447. $isHas=$this->resumeRepository->getAuditCount(['id'=>$rid]);
  448. if (empty($isHas)){
  449. return response()->json(['status'=>0,'msg'=>'请选择简历!']);
  450. }
  451. $rst = $this->companyDownResumeService->addDownResume($addarr, $user, $member_setmeal);
  452. if (array_get($rst, 'status')==1) {
  453. if ($resume_num == 1) {
  454. if ($member_setmeal->download_resume > 0) {
  455. $this->membersSetmealService->actionUserSetmeal($user->id, 'download_resume', 2); //修改会员套餐信息中的下载简历数量
  456. $log_value = '下载简历【'.array_get($rst, 'msg')->resume_name.'】(简历id:'.$addarr['rid'][0].'),消耗简历下载数:1,套餐剩余:'.($member_setmeal->download_resume-1);
  457. } else {
  458. //修改会员积分
  459. $this->memberPointService->reportDeal($user->id, 1, 2, config('aix.companyset.comsume.comsume_set.download_resume_price')*config('aix.companyset.points.points_set.payment_rate')*$resume_num);
  460. //添加积分操作日志
  461. $stime = date('Y-m-d H:i:s', time());
  462. $handsel['uid'] = $user->id;
  463. $handsel['utype'] = 1;
  464. $handsel['htype'] = 'down_resume';
  465. $handsel['htype_cn'] = '下载简历';
  466. $handsel['operate'] = 2;
  467. $handsel['points'] = config('aix.companyset.comsume.comsume_set.download_resume_price')*config('aix.companyset.points.points_set.payment_rate')*$resume_num;
  468. $handsel['created_at'] = $stime;
  469. $handsel['updated_at'] = $stime;
  470. $this->memberHandselService->createLog($handsel);
  471. $log_value = '下载简历【'.array_get($rst, 'msg')->resume_name.'】(简历id:'.$addarr['rid'][0].'),消耗积分:'.$handsel['points'];
  472. }
  473. //添加会员日志
  474. $member_log = array(
  475. 'uid' =>$user->id,
  476. 'utype' =>1,
  477. 'username' => $user->username,
  478. 'ip' => ip2long($request->getClientIp()),
  479. 'log_address'=>'本机地址'
  480. );
  481. $this->feedbackService->addMembersLog($member_log, '1012', $log_value);
  482. }
  483. }
  484. return response()->json($rst);
  485. }
  486. } else {
  487. //判断是否开通会员服务
  488. if (!$member_setmeal) {
  489. return response()->json(['status'=>0, 'msg'=>'您还没有开通服务,请<a target="_blank" href="'.route('mobile.firm.service.setmeal.add').'">开通</a>!']);
  490. }
  491. //判断服务是否到期
  492. if ($member_setmeal->expire == 1) {
  493. return response()->json(['status'=>0, 'msg'=>'您的服务已经到期,请<a target="_blank" href="'.route('mobile.firm.service.setmeal.add').'">重新开通</a>!']);
  494. }
  495. //后台简历下载设置判断
  496. if (config('aix.personal_set.per_set.resume_download_set.down_resume_limit') == 1) {
  497. //判断企业是否有通过审核的职位(已登录且有发布职位的企业)
  498. $jobs_num = $this->jobsService->getAuditJobsNum($user->id);
  499. if ($jobs_num==0) {
  500. return response()->json(['status'=>0, 'msg'=>'你没有发布职位或职位审核未通过导致无法下载简历!']);
  501. }
  502. } elseif (config('aix.personal_set.per_set.resume_download_set.down_resume_limit') == 3) {
  503. //判断是否是认证企业(已认证企业)
  504. $company_info = $this->companyService->companyInfo($user);
  505. if ($company_info['companyInfo'] && $company_info['companyInfo']->audit != 1) {
  506. return response()->json(['status'=>0, 'msg'=>'你的营业执照未通过认证导致无法下载简历!']);
  507. }
  508. }
  509. if ($member_setmeal->download_resume_max > 0) { //判断当天简历下载数量是否已达上限
  510. $downwhere = array(
  511. array('down_addtime','>=',strtotime('today')),
  512. array('down_addtime','<',strtotime('tomorrow')),
  513. array('company_uid','=',$user->id)
  514. );
  515. $downnum = $this->companyDownResumeService->getCompanyDownResumeNum($downwhere); //获取当天企业已下载简历数
  516. if ($resume_num>1 && $resume_num+$downnum > $member_setmeal->download_resume_max && $downnum < $member_setmeal->download_resume_max) {
  517. return response()->json(['status'=>0, 'msg'=>'您今天剩余的下载简历数量不足,请选择单个简历下载!']);
  518. } elseif ($downnum>= $member_setmeal->download_resume_max) {
  519. return response()->json(['status'=>0, 'msg'=>'您今天已下载 <span class="txt_highlight">'.$downnum.'</span> 份简历,已达到每天下载上限,请先收藏该简历,明天继续下载。']);
  520. }
  521. }
  522. $points = 0;
  523. if ($member_point) {
  524. $points = $member_point->points;
  525. }
  526. $mode = 'setmeal';
  527. if (config('aix.companyset.comsume.comsume_set.resume_download_quick') == 1) { //是否开启简历快捷消费
  528. if ($member_setmeal->download_resume == 0) {
  529. $mode = 'pay';
  530. //判断下载简历是否可使用积分
  531. if (config('aix.companyset.comsume.comsume_set.down_resume_by_points') == 1) {
  532. if ($points >= config('aix.companyset.comsume.comsume_set.download_resume_price')*config('aix.companyset.points.points_set.payment_rate')*$resume_num) { //积分数量不够
  533. $mode = 'points';
  534. }
  535. }
  536. }
  537. } else {
  538. if ($member_setmeal->download_resume == 0) { //套餐中简历下载数已用完
  539. return response()->json(['status'=>0, 'msg'=>'您套餐中剩余的下载简历数量不足,请升级套餐后继续下载!']);
  540. }
  541. }
  542. $free_time = 0;
  543. $need_cash = 0;
  544. $view_data = array();
  545. if ($mode=='setmeal') {
  546. $free_time = $member_setmeal->download_resume;
  547. $view_data['free_time'] = $free_time;
  548. } else if ($mode=='points') {
  549. $need_points = intval(config('aix.companyset.points.points_set.payment_rate')*config('aix.companyset.comsume.comsume_set.download_resume_price'))*$resume_num;
  550. $view_data['need_points'] = $need_points;
  551. } else {
  552. $need_cash = config("aix.companyset.comsume.comsume_set.download_resume_price")*$resume_num;
  553. $view_data['need_cash'] = $need_cash;
  554. }
  555. $view_data['mypoints'] = $points;
  556. $view_data['resume_num'] = $resume_num;
  557. $view_data['resume_id'] = implode(",", $rid);
  558. $view_data['uid'] = $user->id;
  559. $view_data['is_free'] = $member_setmeal->is_free;
  560. $view_data['my_setmeal'] = $member_setmeal;
  561. $view_data['to_detail'] = $request->input('to_detail', '');
  562. $max_discount = $this->setmealIncrementsService->getMaxDiscount('download_resume');
  563. $view_data['max_discount'] = $max_discount?$max_discount:0;
  564. $view_data['mode'] = $mode;
  565. $html = view('mobile.app.content.resume.ajax_resume_download', $view_data)->render();
  566. $return_data = array( 'status'=>1, 'html' => $html,'params'=>$view_data);
  567. return response()->json($return_data);
  568. }
  569. }
  570. //简历下载增值包信息
  571. public function incrementAdd($member_setmeal, $cat = 'download_resume')
  572. {
  573. $where_in = array('alipay', 'wechat');
  574. $payment = $this->paymentService->getPayment($where_in);
  575. if ($payment->toArray()) {
  576. $return_data['payment'] = $payment;
  577. } else {
  578. $return_data['payment'] = array();
  579. }
  580. $return_data['cat'] = $cat;
  581. //企业信息
  582. $max_discount = $this->setmealIncrementsService->getMaxDiscount($cat);
  583. $return_data['max_discount'] = $max_discount?$max_discount:0;
  584. //简历下载增值包:处理增值包不同会员的价格显示(普通会员、VIP会员 按照会员最低折扣率计算)
  585. $increment_arr = $this->setmealIncrementsService->getIncrementArr($member_setmeal, $cat);
  586. $return_data['increment_arr'] = $increment_arr;
  587. $return_data['buy'] = $cat;
  588. $return_data['buy_cn'] = '';
  589. $return_data['payment_rate'] = config('aix.companyset.points.points_set.payment_rate'); //充值比例
  590. return $return_data;
  591. }
  592. //积分兑换简历增值包(添加增值包订单)
  593. public function incrementSave(Request $request)
  594. {
  595. $cat = $request->input('service_type', 'download_resume');
  596. $order_pay_type = 6;
  597. $payment_name = $request->input('payment_name', '');
  598. $pay_type = $request->input('pay_type', 'points');
  599. $project_id = $request->input('project_id', 0);
  600. $is_deductible = $request->input('is_deductible', 0);
  601. $resume_id = $request->input('resume_id', 0);
  602. if ($is_deductible==0) {
  603. $deductible = 0;
  604. } else {
  605. $deductible = floatval($request->input('deductible', ''));
  606. }
  607. $amount = floatval($request->input('amount', ''));
  608. if ($amount==0) {
  609. $pay_type = 'points';
  610. }
  611. if ($project_id==0) {
  612. $return_data = array( 'status'=>0, 'msg' => '请选择增值包套餐!');
  613. return response()->json($return_data);
  614. }
  615. $user = auth('web-company')->user();
  616. $my_setmeal = $this->membersSetmealService->getUserSetmeal($user, '1'); //会员套餐信息
  617. $my_point = $this->companyService->getPoint($user->id, 1); //获取会员积分信息
  618. $increment_info = $this->setmealIncrementsService->getIncrement($project_id); //获取所选简历增值包信息
  619. $my_discount = $this->setmealIncrementsService->getIncrementDiscountByArray($cat, $my_setmeal); //套餐折扣
  620. $service_need_cash = $my_discount > 0 ?round($increment_info->price*$my_discount/10, 2):$increment_info->price; //增值包套餐金额
  621. if ($pay_type=='points') { //积分支付
  622. $service_need_points = round($service_need_cash*config('aix.companyset.points.points_set.payment_rate')); //增值包套餐所需积分
  623. if ($my_point->points < $service_need_points) {
  624. return array( 'status'=>0, 'msg' => '积分不足,请使用其他方式支付!');
  625. }
  626. //操作事务开始
  627. DB::beginTransaction();//检查数据库事务
  628. try {
  629. //会员套餐添加增值包数量
  630. $setmeal_rst = $this->membersSetmealService->actionUserSetmeal(array('uid'=>$user->id, 'utype'=>1), $cat, 1, $increment_info->value);
  631. if (!$setmeal_rst) {
  632. throw new \Exception('修改会员套餐失败!');
  633. }
  634. $description1 = '购买服务:'.$increment_info->name.';积分支付:'.$service_need_points.'积分';
  635. $stime = time();
  636. //添加订单信息
  637. $order = $this->orderService->addOrder($user, $order_pay_type, $service_need_cash, 0, $service_need_points, $increment_info->name, $payment_name, '积分支付', $description1, 2, 0, $project_id, $stime, '', '专享'.$my_discount.'折优惠');
  638. if (!$order) {
  639. throw new \Exception('生成订单失败!');
  640. }
  641. $oid = $this->payService->getTradeNo($order->id);//订单号
  642. if (!$this->serviceService->updateOid($order->id, $oid)) {
  643. throw new \Exception('生成订单号失败!');
  644. }
  645. //会员日志:添加创建增值服务订单日志
  646. $log_rst1 = $this->serviceService->writeMembersLog($user, '9001', array($oid,'积分兑换',''));
  647. //修改会员积分
  648. $p_rst = $this->memberPointService->reportDeal($user->id, 1, 2, $service_need_points);
  649. if ($p_rst === false) {
  650. throw new \Exception('修改会员积分失败!');
  651. }
  652. //会员日志 - 添加支付订单日志、添加开通增值服务日志
  653. $log_rst2 = $this->serviceService->writeMembersLog($user, '9001', array($oid,'积分兑换',''));
  654. $log_rst3 = $this->serviceService->writeMembersLog($user, '9002', array($increment_info->name,'积分兑换',''));
  655. //添加会员积分日志
  656. $stime = date('Y-m-d H:i:s', $stime);
  657. $handsel['uid'] = $user->id;
  658. $handsel['utype'] = 1;
  659. $handsel['htype'] = 'down_resume';
  660. $handsel['htype_cn'] = '下载简历';
  661. $handsel['operate'] = 2;
  662. $handsel['points'] = $service_need_points;
  663. $handsel['created_at'] = $stime;
  664. $handsel['updated_at'] = $stime;
  665. $point_rst = $this->serviceService->writeMemberHandselLog($handsel);
  666. DB::commit();
  667. } catch (\Exception $e) {
  668. DB::rollback();
  669. return array( 'status'=>0, 'msg' => $e->getMessage());
  670. }
  671. return array( 'status'=>1, 'msg' => '积分兑换成功!','data'=>array('oid'=>$oid,'order_id'=>$order->id));
  672. } else {
  673. if ($is_deductible==1 && $my_point->points<$deductible) {
  674. return array( 'status'=>0, 'msg' => '积分不足,请使用其他方式支付!');
  675. }
  676. return $this->callCashPay($resume_id, $my_setmeal, $my_point, $increment_info, $order_pay_type, $payment_name, $service_need_cash, $is_deductible, $deductible, '', '', 0, $project_id, '专享'.$my_discount.'折优惠');
  677. }
  678. }
  679. //现金支付
  680. public function callCashPay($resume_id, $my_setmeal, $my_point, $increment_info, $order_pay_type, $payment_name = '', $amount = '0.0', $is_deductible, $deductible = 0, $description = '', $params = '', $points = 0, $stemeal = 0, $discount = '')
  681. {
  682. $is_weixin = false;
  683. if ($payment_name == 'wechat_official') {
  684. $is_weixin = true;
  685. $payment_name = 'wechat';
  686. }
  687. //获取支付方式
  688. $paymenttpye = $this->paymentService->returnPayment($payment_name);
  689. if (!$paymenttpye) {
  690. return array( 'status'=>0, 'msg' => '支付方式错误!');
  691. }
  692. if ($my_point->points < $deductible) {
  693. return array( 'status'=>0, 'msg' => '积分不足,请使用其他方式支付!');
  694. }
  695. if ($is_deductible==0) {
  696. $deductible = 0;
  697. }
  698. if ($deductible>0) {
  699. $m_amount = $amount- floatval($deductible/config('aix.companyset.points.points_set.payment_rate'));
  700. } else {
  701. $m_amount = $amount;
  702. }
  703. $paysetarr['ordtotal_fee']=$m_amount;
  704. if ($description=='') {
  705. $description = '购买服务:'.$increment_info->name;
  706. }
  707. $description .= ';'.$paymenttpye->name.$paysetarr['ordtotal_fee'].'元';
  708. if ($deductible>0) {
  709. $description .= ';积分支付:'.$deductible.'积分';
  710. }
  711. $stime = time();
  712. $user = auth('web-company')->user();
  713. //生成订单
  714. $order = $this->orderService->addOrder($user, $order_pay_type, $amount, $paysetarr['ordtotal_fee'], $deductible, $increment_info->name, $payment_name, $paymenttpye->name, $description, 1, $deductible, $stemeal, 0, serialize($params), $discount);
  715. $tradeNo = $this->payService->getTradeNo($order->id);
  716. if (!$this->serviceService->updateOid($order->id, $tradeNo)) {
  717. throw new ResponseException('生成订单号失败!');
  718. }
  719. if($user->email){
  720. $this->emailService->sendMail($user->email, EmailService::TEMPLATE_MAIL_ORDER, [], ['oid'=>$tradeNo,'paymenttpye'=>$paymenttpye->name,'amount'=>$amount,'sitedomain'=>route('com.index')]);
  721. }
  722. $type = 'wap';
  723. if ($is_weixin) {
  724. $type = 'official';
  725. }
  726. //跳转路由
  727. $load_url = 'mobile.resumes';
  728. $url_param = array();
  729. $rid = '';
  730. if (is_array($resume_id)) {
  731. if (count($resume_id) == 1) {
  732. $rid = implode(',', $resume_id);
  733. if ($rid) {
  734. $load_url = "mobile.resumes.show";
  735. $url_param = ['id' => $rid];
  736. }
  737. }
  738. }
  739. $payOrder = new PayOrder();
  740. $payOrder->trade_no = $tradeNo;
  741. $payOrder->subject = '购买' . $increment_info->name;
  742. $payOrder->detail = $description;
  743. $payOrder->price = round($m_amount, 2);
  744. $payOrder->callback = "App\Services\Common\OrderService.orderPaid";
  745. if ($is_weixin) {
  746. $payOrder->openid = $this->payService->getPayOpenid();
  747. $payment_name = 'wechat';
  748. $result = $this->payService->pay($payment_name, $type, $payOrder);
  749. return response()->json($result);
  750. } else {
  751. if ($payment_name == 'wechat') {
  752. $payOrder->return_url = route('mobile.common.orderWechat', ['oid'=>$payOrder->trade_no,'type'=>'download_resume','rid'=>$rid]);
  753. } else {
  754. $payOrder->return_url= route($load_url, $url_param);
  755. }
  756. return $this->payService->pay($payment_name, $type, $payOrder);
  757. }
  758. }
  759. //标记简历
  760. public function resumeLabel(Request $request)
  761. {
  762. $rst = $this->resumeService->companyLabelResume($request);
  763. if (array_get($rst, 'status') == 1) {
  764. if (array_get($rst, 'task')) {
  765. //添加任务记录
  766. $user = auth('web-company')->user();
  767. $user->uid = $user->id;
  768. $r = $this->commonTaskService->doUserTask($user, 28);
  769. }
  770. }
  771. return $rst;
  772. }
  773. //面试邀请
  774. public function interview(Request $request)
  775. {
  776. $resume_id = $request->input('id', '');
  777. $back_url = \Illuminate\Support\Facades\URL::previous();
  778. if (!$resume_id) {
  779. return $this->showMessage('请选择简历!', $back_url, true, '上一页', '3');
  780. }
  781. $user = $this->getUser();
  782. if (!$user) {
  783. return redirect()->route('mobile.login.company');
  784. }
  785. //判断是否需要下载简历(已下载或者简历公开)
  786. if (config('aix.personal_set.per_set.contact_set.show_resume_contact_wap') ==1) {
  787. if (!$user) {
  788. return redirect()->route('mobile.login.company');
  789. }
  790. } elseif (config('aix.personal_set.per_set.contact_set.show_resume_contact_wap') ==2) {
  791. //判断是否有下载记录
  792. $down_where = array(
  793. 'resume_id' => $resume_id,
  794. 'company_uid' => $user->id
  795. );
  796. $down_info = $this->companyDownResumeService->getDownResume($down_where);
  797. $mySetmeal=$this->memberSetmealRepository->getSetmealByUid($user->id,$user->utype);
  798. //没下载过,并且我的套餐没有免费查看收到的简历
  799. if (!$down_info && $mySetmeal->show_apply_contact==0) {
  800. return $this->showMessage('请先下载简历!', $back_url, true, '上一页', '3');
  801. }
  802. }
  803. //判断当前用户是否有在招职位
  804. //$company = $this->companyService->companyInfo($user);
  805. //获取企业在招职位
  806. $job_where = array(
  807. array('valid','=',1),
  808. array('display','=',1),
  809. array('company_id','=',$user->id),
  810. );
  811. if (config('aix.companyset.comset.show_set.jobs_display') == 1) {
  812. $job_where[] = array('audit','=',1);
  813. } else {
  814. $job_where[] = array('audit','<>',3);
  815. }
  816. $jobs = $this->jobsService->getAuditJobs($user->id);
  817. if ($jobs->isEmpty()) {
  818. return $this->showMessage('您还没有发布招职位(没有发布职位或者职位未通过审核)!', $back_url, true, '上一页', '3');
  819. }
  820. //获取简历信息
  821. $resume_info = $this->resumeService->getResumeAllInfo($resume_id);
  822. //获取申请记录
  823. $apply = $this->resumeService->getPersonApply(['resume_id'=>$resume_id,'company_id'=>$user->id]);
  824. $is_apply = 0;
  825. $default_jobs = array();
  826. if ($apply->isNotEmpty()) {
  827. $is_apply = 1;
  828. $apply_info = $apply[0];
  829. $default_jobs = array(
  830. 'jobs_id' => $apply_info->jobs_id,
  831. 'jobs_name' => $apply_info->jobs_name
  832. );
  833. }
  834. $return_data = array(
  835. 'resume' => $resume_info,
  836. 'jobs' => $jobs,
  837. 'company' => $user,
  838. 'is_apply' => $is_apply,
  839. 'default_jobs' => $default_jobs,
  840. 'wap_title' => '发送面试邀请',
  841. );
  842. return view('mobile.app.content.resume.interview', $return_data);
  843. }
  844. }