ResumeController.php 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841
  1. <?php
  2. namespace App\Admin\Controllers\Person;
  3. use App\Admin\Exports\Person\ResumeExport;
  4. use App\Admin\Extensions\Form\ValueForm;
  5. use App\Http\Controllers\Controller;
  6. use App\Models\AuditReason;
  7. use App\Models\Company;
  8. use App\Models\Member;
  9. use App\Models\Pms;
  10. use App\Models\Resume;
  11. use App\Models\SmsRule;
  12. use App\Models\SmsTemplate;
  13. use App\Models\Subsite;
  14. use App\Services\Common\EmailService;
  15. use App\Services\Common\SmsService;
  16. use App\Validators\Rules\MobileRule;
  17. use Encore\Admin\Controllers\HasResourceActions;
  18. use Encore\Admin\Facades\Admin;
  19. use Encore\Admin\Form;
  20. use Encore\Admin\Grid;
  21. use Encore\Admin\Layout\Content;
  22. use Encore\Admin\Show;
  23. use Encore\Admin\Widgets\Tab;
  24. use Encore\Admin\Widgets\Table;
  25. use Illuminate\Http\Request;
  26. use phpDocumentor\Reflection\Types\Context;
  27. class ResumeController extends Controller
  28. {
  29. use HasResourceActions;
  30. protected $smsService;
  31. protected $emailService;
  32. protected $resume;
  33. /**
  34. * AjaxController constructor.
  35. * @param $smsService
  36. */
  37. public function __construct(SmsService $smsService, EmailService $emailService, Resume $resume)
  38. {
  39. $this->smsService = $smsService;
  40. $this->emailService = $emailService;
  41. $this->resume = $resume;
  42. }
  43. /**
  44. * Index interface.
  45. *
  46. * @param Content $content
  47. * @return Content
  48. */
  49. public function index(Content $content)
  50. {
  51. $grid = $this->grid()->render();
  52. return $content
  53. ->header('简历列表')
  54. ->description('')
  55. ->body(view('admin.resume.resume')->with(['grid'=>$grid]));
  56. }
  57. /**
  58. * Show interface.
  59. *
  60. * @param mixed $id
  61. * @param Content $content
  62. * @return Content
  63. */
  64. public function show($id, Content $content)
  65. {
  66. return $content
  67. ->header('简历详情')
  68. ->description()
  69. ->body($this->detail($id));
  70. }
  71. /**
  72. * Edit interface.
  73. *
  74. * @param mixed $id
  75. * @param Content $content
  76. * @return Content
  77. */
  78. public function edit($id, Content $content)
  79. {
  80. return $content
  81. ->header('简历列表')
  82. ->description('编辑')
  83. ->body($this->form()->edit($id));
  84. }
  85. /**
  86. * Create interface.
  87. *
  88. * @param Content $content
  89. * @return Content
  90. */
  91. public function create(Content $content)
  92. {
  93. return $content
  94. ->header('简历列表')
  95. ->description('创建')
  96. ->body($this->form());
  97. }
  98. /**
  99. * Make a grid builder.
  100. *
  101. * @return Grid
  102. */
  103. protected function grid()
  104. {
  105. $grid = new Grid(new Resume);
  106. $grid->model()
  107. /*->when(get_subsite_id()>0, function ($query) {
  108. $query->where('subsite_id', get_subsite_id());
  109. $query->whereHas('subsite',function ($query){
  110. $query->where('effective', 1);
  111. });
  112. })*/
  113. ->orderByRaw("FIELD(audit, 1,2,0)")->orderBy('updated_at', 'desc');
  114. $grid->id('ID');
  115. $grid->column('memberInfos.images', '姓名')->display(function ($images) {
  116. $expires = '';
  117. $style = 'color:#3c8dbc';
  118. if($this->expires && $this->expires<time()){
  119. $expires = '[已过期]';
  120. $style = 'color:#CCCCCC';
  121. }
  122. if ($images) {
  123. return '<span class="vtip" title="<img src='.upload_asset($images).' width=120 height=120>">
  124. <img class="avatar small" src="'.upload_asset($images).'" align="absmiddle" style="width: 36px;height: 36px;">
  125. </span>&nbsp;&nbsp;&nbsp;'.'<span style="'.$style.'">'.htmlspecialchars($this->fullname).'&nbsp;&nbsp;'.$expires.'</span>';
  126. } else {
  127. return '<span class="vtip" ></span>&nbsp;&nbsp;&nbsp;'. '<span style="'.$style.'">'.$this->fullname.'&nbsp;&nbsp;'.$expires.'</span>';
  128. }
  129. })->width(200);
  130. $grid->title('简历名称')->display(function ($title) {
  131. return '<a href="/content/resumes/show?id='.$this->id.'&token=1" target="_blank">'.$title.'</a>';
  132. })->width(150);
  133. $grid->complete_percent('简历完整度')->display(function ($complete_percent) {
  134. return $complete_percent.'%';
  135. })->label();
  136. $grid->audit('审核状态')->display(function ($audit) {
  137. if ($audit==0) {
  138. return'<span style="color:#666666">审核未通过</span><a style="margin-left: 5px;" ls="'.$this->id.'" class="audit_log"><i class="fa fa-eye"></i></a>';
  139. } elseif ($audit==2) {
  140. return'<span style="color: #009900">审核通过</span><a style="margin-left: 5px;" ls="'.$this->id.'" class="audit_log"><i class="fa fa-eye"></i></a>';
  141. } else {
  142. return'<span style="color:#FF6600">等待审核</span><a style="margin-left: 5px;" ls="'.$this->id.'" class="audit_log"><i class="fa fa-eye"></i></a>';
  143. }
  144. });
  145. $grid->display('公开')->display(function ($display) {
  146. return $display ? '公开' : '保密';
  147. });
  148. $grid->entrust('委托状态')->display(function ($entrust) {
  149. $value = $entrust - time();
  150. if ($value < 0) {
  151. return'<span style="color:#666666">无</span>';
  152. } elseif ($value >= 0 && $value < 59) {
  153. return'<span style="color:#009900">'.$value.'秒</span>';
  154. } elseif ($value >= 60 && $value < 3600) {
  155. $min = intval($value / 60);
  156. return'<span style="color:#009900">'.$min.'分钟</span>';
  157. } elseif ($value >=3600 && $value < 86400) {
  158. $h = intval($value / 3600);
  159. return'<span style="color:#009900">'.$h.'小时</span>';
  160. } elseif ($value >= 86400 && $value < 86400*30) {
  161. $d = intval($value / 86400);
  162. return'<span style="color:#009900">'.intval($d).'天</span>';
  163. } elseif ($value >= 86400*30 && $value < 86400*30*12) {
  164. $mon = intval($value / (86400*30));
  165. return'<span style="color:#009900">'.$mon.'月</span>';
  166. return $mon."月";
  167. } else {
  168. $y = intval($value / (86400*30*12));
  169. return'<span style="color:#009900">'.$y.'年</span>';
  170. }
  171. });
  172. if(get_subsite_open()){
  173. $grid->column('members.subsite_id', '所属分站')->display(function ($subsite_id) {
  174. if ($subsite_id) {
  175. $Subsite = Subsite::find($subsite_id);
  176. return isset($Subsite->sitename) ? $Subsite->sitename : '未知';
  177. }
  178. return '总站';
  179. })->width(150);
  180. }
  181. $grid->created_at('添加时间')->sortable();
  182. $grid->updated_at('更新时间')->sortable();
  183. $grid->actions(function ($actions) use ($grid) {
  184. $actions->disableView(false);
  185. if (Admin::user()->can('person_resume_audit')) {
  186. $actions->append("<button class='btn btn-primary btn-xs jobaudit' data-code=".$actions->row['id'].">审核</button>");
  187. }
  188. if (Admin::user()->can('perosn_business')) {
  189. $actions->append('<button class="btn btn-primary btn-xs business" ls="'.$actions->row['uid'].'" ld="'. htmlspecialchars($actions->row['fullname']) .'" title="业务" >业务</button>');
  190. }
  191. if (Admin::user()->can('person_resume_matching')) {
  192. if (!empty($actions->row['entrust']) && $actions->row['entrust']>time()) {
  193. $actions->append('<button class="btn btn-primary btn-xs piPei" ls="'.$actions->row['id'].'" ld="'.$actions->row['uid'].'" title="匹配" >匹配</button>');
  194. }
  195. }
  196. if (Admin::user()->can('person_resume_delete')) {
  197. $actions->disableDelete(false);
  198. }
  199. });
  200. if (Admin::user()->can('person_resume_delete')) {
  201. $grid->tools(function ($tools) {
  202. $tools->batch(function ($batch) {
  203. $batch->disableDelete(false);
  204. });
  205. });
  206. $grid->disableRowSelector(false);
  207. }
  208. $grid->tools(function ($tools) {
  209. if (Admin::user()->can('person_resume_audit')) {
  210. $but = <<<EOT
  211. <div class="btn-group" data-toggle="buttons">
  212. <label class="btn btn-google btn-sm" id="audit_resume" title="审核简历">
  213. <i class="fa fa-audio-description"></i>
  214. <input type="radio" class="user-gender">审核简历
  215. </label>
  216. </div>
  217. EOT;
  218. $tools->append($but);
  219. }
  220. });
  221. if (Admin::user()->can('person_resume_export')) {
  222. $grid->disableExport(false); //显示导出按钮
  223. $grid->exporter(new ResumeExport()); //传入自己在第1步创建的导出类
  224. }
  225. $grid->filter(function ($filter) {
  226. // 去掉默认的id过滤器
  227. // $filter->disableIdFilter();
  228. $filter->column(1/2, function ($filter) {
  229. $filter->equal('display', '可见状态')->select([
  230. 0=>'不可见',
  231. 1=>'可见'
  232. ]);
  233. $filter->equal('audit', '审核状态')->select([
  234. 0=>'审核未通过',
  235. 1=>'等待审核',
  236. 2=>'审核通过',
  237. ]);
  238. $filter->equal('photo', '简历照片')->select([
  239. 0=>'无',
  240. 1=>'有',
  241. ]);
  242. $filter->where(function ($query) {
  243. switch ($this->input) {
  244. case 3:
  245. $query->whereRaw("entrust > ".time()." and entrust<=".strtotime('3 day'));
  246. break;
  247. case 7:
  248. $query->whereRaw("entrust > ".time()." and entrust<=".strtotime('7 day'));
  249. break;
  250. case 14:
  251. $query->whereRaw("entrust > ".time()." and entrust<=".strtotime('14 day'));
  252. break;
  253. case 30:
  254. $query->whereRaw("entrust > ".time()." and entrust<=".strtotime('30 day'));
  255. break;
  256. }
  257. }, '是否委托', 'entrust')->select([
  258. 3=>'三天内',
  259. 7=>'一周内',
  260. 14=>'二周内',
  261. 30=>'一月内',
  262. ]);
  263. if(get_subsite_id()==0 && get_subsite_open()){
  264. $filter->equal('subsite_id', '所属分站')->select(array_column(get_all_subsite(), 'sitename', 'id'));
  265. }
  266. });
  267. $filter->column(1/2, function ($filter) {
  268. $filter->equal('uid', '会员ID');
  269. $filter->like('fullname', '姓名');
  270. $filter->like('memberInfos.id_card', '身份证');
  271. $filter->like('memberInfos.phone', '手机号');
  272. $filter->between('created_at', '创建时间')->datetime();
  273. $filter->between('updated_at', '刷新时间')->datetime();
  274. /*$filter->where(function ($query) {
  275. switch ($this->input) {
  276. case 3:
  277. $query->whereRaw("created_at>='".date('Y-m-d H:i:s', strtotime('-3 day'))."'");
  278. break;
  279. case 7:
  280. $query->whereRaw("created_at>='".date('Y-m-d H:i:s', strtotime('-7 day'))."'");
  281. break;
  282. case 30:
  283. $query->whereRaw("created_at>='".date('Y-m-d H:i:s', strtotime('-30 day'))."'");
  284. break;
  285. }
  286. }, '创建时间', 'created_at')->select([
  287. 3=>'三天内',
  288. 7=>'一周内',
  289. 30=>'一月内',
  290. ]);
  291. $filter->where(function ($query) {
  292. switch ($this->input) {
  293. case 3:
  294. $query->whereRaw("updated_at>='".date('Y-m-d H:i:s', strtotime('-3 day'))."'");
  295. break;
  296. case 7:
  297. $query->whereRaw("updated_at>='".date('Y-m-d H:i:s', strtotime('-7 day'))."'");
  298. break;
  299. case 30:
  300. $query->whereRaw("updated_at>='".date('Y-m-d H:i:s', strtotime('-30 day'))."'");
  301. break;
  302. }
  303. }, '刷新时间', 'updated_at')->select([
  304. 3=>'三天内',
  305. 7=>'一周内',
  306. 30=>'一月内',
  307. ]);*/
  308. });
  309. });
  310. return $grid;
  311. }
  312. /**
  313. * Make a show builder.
  314. *
  315. * @param mixed $id
  316. * @return Show
  317. */
  318. protected function detail($id)
  319. {
  320. $result = Resume::find($id)->getResumeAllInfo();
  321. if(isset($result->memberInfos->display_images)){
  322. if($result->memberInfos->display_images==1){
  323. $display_images = '公开';
  324. } elseif ($result->memberInfos->display_images==2){
  325. $display_images = '不公开';
  326. }else{
  327. $display_images = '未上传照片';
  328. }
  329. }else{
  330. $display_images = '未上传照片';
  331. }
  332. if(isset($result->memberInfos->images)){
  333. if($result->memberInfos->images){
  334. $imk = upload_asset($result->memberInfos->images);
  335. $images = '<img border="0" src="'.$imk.'">';
  336. } else{
  337. $images = '';
  338. }
  339. }else{
  340. $images = '';
  341. }
  342. if($result->audit==2){
  343. $audit = '已通过审核';
  344. }elseif ($result->audit==0){
  345. $audit = '审核未通过请修改';
  346. }else{
  347. $audit = '正在审核中';
  348. }
  349. $resume = [$result->title,$result->display?'公开':'不公开',$display_images,
  350. $result->complete_percent.'%',$audit,$result->talent?'高级':'普通',$result->created_at,$result->updated_at];
  351. $member_info = [];
  352. if($result->memberInfos){
  353. $data = $result->memberInfos;
  354. $member_info = [$data->realname,$data->sex_cn,date('Y')-($data->birthday),
  355. $data->height,$data->education_cn,$data->marriage_cn,$data->experience_cn,$data->householdaddress_cn,$data->phone,$data->email,$images];
  356. }
  357. $job_intention = [$result->nature_cn,$result->district_cn,
  358. $result->wage_cn,$result->intention_jobs,$result->trade_cn];
  359. $profile =[$result->specialty];
  360. $education = [];
  361. if(!$result->resumeEducation->isEmpty()){
  362. foreach ($result->resumeEducation as $resumeEducation){
  363. if($resumeEducation->todate){
  364. $time =$resumeEducation->startyear.'年'.$resumeEducation->startmonth.'月-'.'至今';
  365. }else{
  366. $time =$resumeEducation->startyear.'年'.$resumeEducation->startmonth.'月-'.$resumeEducation->endyear.'年'.$resumeEducation->endmonth.'月';
  367. }
  368. $education[]= [$time,$resumeEducation->school,$resumeEducation->speciality,$resumeEducation->education_cn];
  369. }
  370. }
  371. $work = [];
  372. if(!$result->resumeWork->isEmpty()){
  373. foreach ($result->resumeWork as $resumeWork){
  374. if($resumeWork->todate){
  375. $time =$resumeWork->startyear.'年'.$resumeWork->startmonth.'月-'.'至今';
  376. }else{
  377. $time =$resumeWork->startyear.'年'.$resumeWork->startmonth.'月-'.$resumeWork->endyear.'年'.$resumeWork->endmonth.'月';
  378. }
  379. $work[]= [$time,$resumeWork->companyname,$resumeWork->jobs];
  380. }
  381. }
  382. $train=[];
  383. if(!$result->resumeTrain->isEmpty()){
  384. foreach ($result->resumeTrain as $resumeTrain){
  385. if($resumeTrain->todate){
  386. $time =$resumeTrain->startyear.'年'.$resumeTrain->startmonth.'月-'.'至今';
  387. }else{
  388. $time =$resumeTrain->startyear.'年'.$resumeTrain->startmonth.'月-'.$resumeTrain->endyear.'年'.$resumeTrain->endmonth.'月';
  389. }
  390. $train[]= [$time,$resumeTrain->agency,$resumeTrain->course];
  391. }
  392. }
  393. $credent = [];
  394. if(!$result->resumeCredent->isEmpty()){
  395. foreach ($result->resumeCredent as $resumeCredent){
  396. $time =$resumeCredent->year.'年'.$resumeCredent->month.'月';
  397. $credent[]= [$time,$resumeCredent->name];
  398. }
  399. }
  400. $language = [];
  401. if(!$result->resumeLanguage->isEmpty()){
  402. foreach ($result->resumeLanguage as $resumeLanguage){
  403. $language[]= [$resumeLanguage->language_cn,$resumeLanguage->level_cn];
  404. }
  405. }
  406. $tag_cn = [$result->tag_cn];
  407. $title = [
  408. '基本设置',
  409. '基本信息',
  410. '求职意向',
  411. '个人简介',
  412. '教育经历',
  413. '工作经历',
  414. '培训经历',
  415. '获得证书',
  416. '语言能力',
  417. '特长标签',
  418. ];
  419. $tab_content=[];
  420. foreach ($title as $key => $val) {
  421. if ($key==0) {
  422. $headers = ['简历名称', '公开设置', '照片公开设置', '简历完整度','简历审核','简历等级','创建时间','刷新时间'];
  423. $rows = [
  424. $resume
  425. ];
  426. $table = new Table($headers, $rows);
  427. } elseif($key==1) {
  428. $headers = ['姓名', '性别', '年龄', '身高','学历','婚姻状况','工作经验','户籍','联系电话','联系邮箱','头像'];
  429. $rows = [
  430. $member_info
  431. ];
  432. $table = new Table($headers, $rows,['base_info']);
  433. } elseif($key==2) {
  434. $headers = ['期望岗位性质', '期望工作地', '期望月薪', '期望从事的岗位','期望从事的行业'];
  435. $rows = [
  436. $job_intention
  437. ];
  438. $table = new Table($headers, $rows);
  439. } elseif($key==3) {
  440. $headers = [];
  441. $rows = [
  442. $profile
  443. ];
  444. $table = new Table($headers, $rows);
  445. } elseif($key==4) {
  446. $headers = ['起止年月', '学校名称', '专业名称', '学历'];
  447. $rows = $education;
  448. $table = new Table($headers, $rows);
  449. } elseif($key==5) {
  450. $headers = ['起止年月', '公司名称', '职位名称'];
  451. $rows = $work;
  452. $table = new Table($headers, $rows);
  453. } elseif($key==6) {
  454. $headers = ['起止年月', '机构名称', '培训课程'];
  455. $rows = $train;
  456. $table = new Table($headers, $rows);
  457. }elseif($key==7) {
  458. $headers = ['起止年月', '证书名称'];
  459. $rows = $credent;
  460. $table = new Table($headers, $rows);
  461. }elseif($key==8) {
  462. $headers = ['语言类型', '语言等级'];
  463. $rows = $language;
  464. $table = new Table($headers, $rows);
  465. }elseif($key==9) {
  466. $headers = [];
  467. $rows = [$tag_cn];
  468. $table = new Table($headers, $rows);
  469. }
  470. $tab_content[$key]['type'] = $val;
  471. $tab_content[$key]['form'] = $table;
  472. }
  473. return view('admin.resume.detail')->with(['contents'=>$tab_content,'result'=>$result])->render();
  474. }
  475. /**
  476. * Make a form builder.
  477. *
  478. * @return Form
  479. */
  480. protected function form()
  481. {
  482. $form = new Form(new Resume);
  483. $form->display('ID');
  484. $form->display('Created at');
  485. $form->display('Updated at');
  486. return $form;
  487. }
  488. /**
  489. * @审核日志
  490. * @param Request $request
  491. * @return array
  492. */
  493. public function audit(Request $request)
  494. {
  495. $id = $request->id;
  496. $type = $request->type;
  497. $headers = ['status'=>'审核状态', 'tim'=>'审核时间', 'sec'=>'描述'];
  498. $res = AuditReason::where(['type_id'=>$id,'type'=>$type])->get();
  499. $data = [];
  500. foreach ($res as $k => $v) {
  501. if ($v['status']==0) {
  502. $data[$k]['status'] = '审核未通过';
  503. } elseif ($v['status']==2) {
  504. $data[$k]['status'] = '审核通过';
  505. } else {
  506. $data[$k]['status'] = '等待审核';
  507. }
  508. $data[$k]['tim'] = $v['created_at'];
  509. $data[$k]['sec'] = $v['audit_man'].'--'.$v['reason'];
  510. }
  511. $rows = $data;
  512. $table = new Table($headers, $rows);
  513. return ['html'=>$table->render(),'detail'=>'审核日志'];
  514. }
  515. public function manager(Request $request)
  516. {
  517. $uid = $request->uid;
  518. $fullname = $request->fullname;
  519. $members = Member::where(['id'=>$uid])->select(['id','username','email','mobile','utype'])->first();
  520. $header2 = ['会员管理'];
  521. $rows2 = '';
  522. /*$rows2 = [
  523. [
  524. '<div class="manitem"><a target="_blank" href="/admin/personal/managerRes/'.$members['id'].'">简历管理</a></div>',
  525. '<div class="manitem"><a target="_blank" href="/admin/personal/points?uid='.$members['id'].'&utype='.$members['utype'].'">积分管理</a></div>',
  526. '<div class="manitem"><a target="_blank" href="'.admin_base_path("/firm/order/personal")."?uid=".$members['id'].'">充值/订单</a></div>',
  527. '<div class="manitem"><a target="_blank" href="">简历推广</a></div>',
  528. '<div class="manitem"><a target="_blank" href="/admin/personal/applyJobs?personal_uid='.$members['id'].'">申请的职位</a></div>',
  529. '<div class="manitem"><a target="_blank" href="/admin/personal/members?id='.$members['id'].'">个人资料</a></div>',
  530. ]
  531. ];*/
  532. $header3 = ['分析统计'];
  533. $rows3= [
  534. [
  535. '<div class="manitem"><a target="_blank" href="">行为分析</a></div>',
  536. '<div class="manitem" ><a target="_blank" href="">会员日志</a></div>',
  537. ]
  538. ];
  539. $header4 = ['联系会员 (手机:'.$members['mobile'].',邮箱:'.$members['email'].')'];
  540. $sendSms = '';
  541. $sendEmail = '';
  542. $sendSys = '';
  543. if (Admin::user()->can('person_business_sms')) {
  544. $sendSms = '<div class="manitem"><a style="cursor:pointer" id="fa_sms" ls="'.$members['mobile'].'">发送短信</a></div>';
  545. }
  546. if (Admin::user()->can('person_business_email')) {
  547. $sendEmail = '<div class="manitem" ><a style="cursor:pointer" id="fa_email" ls="'.$members['email'].'">发送邮件</a></div>';
  548. }
  549. if (Admin::user()->can('person_business_sys')) {
  550. $sendSys = '<div class="manitem" ><a style="cursor:pointer" id="fa_sys" ls="'.$members['id'].'">发送站内信</a></div>';
  551. }
  552. $rows4= [
  553. [
  554. $sendSms,
  555. $sendEmail,
  556. $sendSys,
  557. ]
  558. ];
  559. $table2 = new Table($header2, $rows2);
  560. $table3 = new Table($header3, $rows3);
  561. $table3->style('width:180px');
  562. $table4 = new Table($header4, $rows4);
  563. $had = '';
  564. if (Admin::user()->can('person_business_login')) {
  565. $had = '<div style="height:30px;">对 <strong style="color:#FF6600">'. htmlspecialchars($fullname) .'</strong> 进行以下操作<span style="color: #999999;padding-left: 8px;">用户名:'.htmlspecialchars($members['username']).',uid:'.$uid.'</span>&nbsp;&nbsp;&nbsp;&nbsp;<a target="_blank" href="'.admin_base_path().'/personal/manager/into/'.$members['id'].'">进入会员中心&gt;&gt;</a></div>';
  566. }
  567. return json_encode(['html'=>[$table2->render(),$table3->render(),$table4->render()],'detail'=>'管理','had'=>$had]);
  568. }
  569. /**
  570. * 发送短信
  571. * return json
  572. */
  573. public function sms(Request $request)
  574. {
  575. $mobile = $request->mobile;
  576. $form = new \Encore\Admin\Widgets\Form();
  577. $form->action(route('admin.personal.uidSms'));
  578. $form->disableReset();
  579. $form->html('
  580. <strong style="color:#FF6600">
  581. <span>您当前配置的短信接口是【阿里大鱼】。</span>
  582. </strong>
  583. ');
  584. $form->mobile('mobile', '接受手机')->default($mobile);
  585. $form->textarea('message','消息');
  586. $form->hidden('sms_id')->default('sms_custom');
  587. return json_encode(['html'=>$form->render(),'detail'=>'发送短信']);
  588. }
  589. public function uidSms(Request $request)
  590. {
  591. $moile = $request->mobile;
  592. $sms_id = $request->sms_id;
  593. $message = $request->message;
  594. if (!$moile || !$sms_id || !$message) {
  595. admin_toastr('请把资料信息填写完整!', 'error');
  596. return back();
  597. }
  598. $SmsRule = SmsRule::where('alias', $sms_id)->first();
  599. if (isset($SmsRule->status) && !empty($SmsRule->status)) {
  600. $this->smsService->sendSms($moile, $sms_id, ['content'=>$message]);
  601. admin_toastr('短信发送成功', 'success');
  602. } else {
  603. admin_toastr('请先开启短信-短信规则配置!', 'error');
  604. }
  605. return back();
  606. }
  607. /**
  608. * 发送邮件.
  609. * return json
  610. */
  611. public function email(Request $request)
  612. {
  613. $email = $request->email;
  614. $form = new \Encore\Admin\Widgets\Form();
  615. $form->action(route('admin.personal.uidEmail'));
  616. $form->disableReset();
  617. $form->email('email', '收件地址')->default($email);
  618. $form->text('title', '邮件标题');
  619. $form->textarea('body', '邮件内容');
  620. return json_encode(['html'=>$form->render(),'detail'=>'发送邮件']);
  621. }
  622. public function uidEmail(Request $request)
  623. {
  624. $email = $request->email;
  625. $title = $request->title;
  626. $body = $request->body;
  627. if (!$email || !$title || !$body) {
  628. admin_toastr('请把资料信息填写完整!', 'error');
  629. return back();
  630. }
  631. $this->emailService->sendMail($email, EmailService::TEMPLATE_SEND_CONTENT, ['title'=>$title], ['content'=>$body]);
  632. admin_toastr('邮件发送成功', 'success');
  633. return back();
  634. }
  635. /**
  636. * 发送站内信
  637. * return json
  638. */
  639. public function sys(Request $request)
  640. {
  641. $uid = $request->uid;
  642. $form = new \Encore\Admin\Widgets\Form();
  643. $form->action(route('admin.personal.uidSend'));
  644. $form->disableReset();
  645. $form->hidden('uid')->default($uid);
  646. $form->textarea('body', '发送内容');
  647. return json_encode(['html'=>$form->render(),'detail'=>'发送站内信']);
  648. }
  649. public function uidSend(Request $request)
  650. {
  651. if (!$request->uid) {
  652. admin_toastr('数据异常', 'error');
  653. return back();
  654. }
  655. if (!$request->body) {
  656. admin_toastr('发送内容不能为空!', 'error');
  657. return back();
  658. }
  659. $data = [];
  660. $url = $request->route()->uri;
  661. $use_type = explode('/', $url)[1];
  662. if ($use_type=='personal') {
  663. $userManager = Member::findOrfail($request->uid);
  664. } else {
  665. $userManager = Company::findOrfail($request->uid);
  666. }
  667. if (!$userManager) {
  668. admin_toastr('该用户不存在!', 'error');
  669. return back();
  670. }
  671. $data['utype'] = $userManager->utype;
  672. $data['msgtype'] = 1;
  673. $data['msgfromuid'] = Admin::user()->id;
  674. $data['msgfrom'] = Admin::user()->username;
  675. $data['msgtoname'] = $userManager->username;
  676. $data['msgtouid'] = $userManager->id;
  677. $data['message'] = $request->body;
  678. if (Pms::create($data)) {
  679. admin_toastr('发送成功!', 'success');
  680. } else {
  681. admin_toastr('发送失败!', 'error');
  682. }
  683. return back();
  684. }
  685. /**
  686. * return json
  687. */
  688. public function auditResume(Request $request)
  689. {
  690. $id = $request->id;
  691. $form = new \Encore\Admin\Widgets\Form();
  692. $form->action(route('admin.personal.auditR'));
  693. $form->disableReset();
  694. $form->hidden('id', 'ID')->default($id);
  695. $form->radio('audit', '审核')->options([2=>'审核通过',0=>'审核未通过'])->default(2);
  696. $form->textarea('remark', '备注');
  697. $form->html('<label style="color: rgb(0, 153, 0)"><input type="checkbox" name="pms_notice" value="1" checked="checked">站内信通知</label>');
  698. return json_encode(['html'=>$form->render(),'detail'=>'审核简历']);
  699. }
  700. public function auditR(Request $request)
  701. {
  702. $id = $request->id;
  703. $audit = $request->audit;
  704. $remark = $request->remark;
  705. $pms_notice = $request->pms_notice;
  706. $arr = array_filter(explode(',', $id));
  707. if (empty($arr)) {
  708. admin_toastr('数据异常', 'error');
  709. return back();
  710. }
  711. $reus=Resume::with(['members:id,username,mobile'])->whereIn('id', $arr)->get();
  712. $mobile = [];
  713. foreach ($reus as $res) {
  714. if (isset($res->members->mobile)) {
  715. if (validator_check($res->members->mobile, new MobileRule())) {
  716. $mobile[] = $res->members->mobile;
  717. }
  718. }
  719. }
  720. $mobile = array_unique($mobile);
  721. $sms_id = $audit ? 'sms_resumeallow' : 'sms_resumenotallow';
  722. $result = Resume::whereIn('id', $arr)->update(['audit'=>$audit]);
  723. $data=[];
  724. foreach ($arr as $k => $v) {
  725. $data[$k]['type'] = 1;
  726. $data[$k]['type_id'] = $v;
  727. $data[$k]['status'] = $audit;
  728. $data[$k]['reason'] = $remark;
  729. $data[$k]['audit_man'] = Admin::user()->username;
  730. $data[$k]['created_at'] = date('Y-m-d H:i:s', time());
  731. $data[$k]['updated_at'] = date('Y-m-d H:i:s', time());
  732. }
  733. $this->auditReason($data);
  734. if ($pms_notice) {
  735. if ($audit==0) {
  736. $stat='审核未通过';
  737. } elseif ($audit==2) {
  738. $stat = '审核通过';
  739. } else {
  740. $stat='等待审核';
  741. }
  742. $da = [];
  743. foreach ($reus as $k => $v) {
  744. $da[$k]['uid'] = $v['members']['id'];
  745. $da[$k]['username'] = $v['members']['username'];
  746. $da[$k]['resume_title'] = $v->title;
  747. }
  748. foreach ($da as $k => $v) {
  749. $ds[$k]['msgtype'] = 1;
  750. $ds[$k]['msgfromuid'] = Admin::user()->id;
  751. $ds[$k]['msgfrom'] = Admin::user()->username;
  752. $ds[$k]['msgtoname'] = $v['username'] ? $v['username'] : 'admin';
  753. $ds[$k]['msgtouid'] = $v['uid'] ? $v['uid'] : 0;
  754. if ($v['resume_title']) {
  755. $resume_title = '('.$v['resume_title'].')';
  756. } else {
  757. $resume_title = '';
  758. }
  759. $ds[$k]['message'] = $remark ? '简历'.$resume_title.$stat.'<备注:'.$remark.'>' : '简历'.$resume_title.$stat;
  760. $ds[$k]['created_at'] = date('Y-m-d H:i:s', time());
  761. $ds[$k]['updated_at'] = date('Y-m-d H:i:s', time());
  762. }
  763. Pms::insert($ds);
  764. }
  765. if ($result) {
  766. event_search_update(Resume::class, (string)implode(',', $arr), 'update');
  767. $this->resumeSms($sms_id, $mobile);
  768. admin_toastr('审核成功', 'success');
  769. } else {
  770. admin_toastr('审核失败', 'error');
  771. }
  772. return back();
  773. }
  774. /**
  775. * CREAT 审核日志.
  776. * @param $type
  777. * @param $status
  778. * @param $reason
  779. * @param $audit_man
  780. * return arr
  781. */
  782. public function auditReason($data)
  783. {
  784. AuditReason::insert($data);
  785. }
  786. public function resumeSms($sms_id, $mobile)
  787. {
  788. $SmsRule = SmsRule::where('alias', $sms_id)->first();
  789. if (isset($SmsRule->status) && !empty($SmsRule->status)) {
  790. if ($mobile) {
  791. foreach ($mobile as $mobiles) {
  792. $this->smsService->sendSms($mobiles, $sms_id, ['sitename'=>config('aix.system.site.site.site_name'),'sitedomain'=>config('aix.system.site.site.site_domain')]);
  793. }
  794. }
  795. }
  796. }
  797. }