ResumeController.php 33 KB

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