MemberController.php 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010
  1. <?php
  2. namespace App\Admin\Controllers\Person;
  3. use App\Admin\Exports\Person\MemberExport;
  4. use App\Http\Controllers\Controller;
  5. use App\Models\CategoryMajor;
  6. use App\Models\CompanyInterView;
  7. use App\Models\Member;
  8. use App\Models\MemberInfo;
  9. use App\Models\MembersHandsel;
  10. use App\Models\MembersLog;
  11. use App\Models\Order;
  12. use App\Models\PersonalJobsApply;
  13. use App\Models\PersonalServiceStickLog;
  14. use App\Models\Resume;
  15. use App\Models\ResumeImg;
  16. use App\Models\SmsRule;
  17. use App\Models\Subsite;
  18. use App\Models\SubsiteResume;
  19. use App\Models\Category;
  20. use App\Models\CategoryDistrict;
  21. use App\Services\Common\SmsService;
  22. use Encore\Admin\Auth\Permission;
  23. use Encore\Admin\Controllers\HasResourceActions;
  24. use Encore\Admin\Facades\Admin;
  25. use Encore\Admin\Form;
  26. use Encore\Admin\Grid;
  27. use Encore\Admin\Layout\Content;
  28. use Encore\Admin\Show;
  29. use Encore\Admin\Widgets\Tab;
  30. use Illuminate\Http\Request;
  31. use Illuminate\Support\Facades\Cache;
  32. use Illuminate\Validation\Rule;
  33. use App\Admin\Extensions\Form\ValidateForm;
  34. use Illuminate\Support\Facades\DB;
  35. class MemberController extends Controller
  36. {
  37. use HasResourceActions;
  38. protected $smsService;
  39. public function __construct(SmsService $smsService)
  40. {
  41. $this->smsService = $smsService;
  42. }
  43. /**
  44. * Index interface.
  45. *
  46. * @param Content $content
  47. * @return Content
  48. */
  49. public function index(Content $content)
  50. {
  51. Permission::check('person_member');
  52. $grid=$this->grid()->render();
  53. return $content
  54. ->header('个人会员')
  55. ->description('列表')
  56. ->body(view('admin.members.index')->with('grid', $grid));
  57. }
  58. /**
  59. * Show interface.
  60. *
  61. * @param mixed $id
  62. * @param Content $content
  63. * @return Content
  64. */
  65. public function show($id, Content $content)
  66. {
  67. return $content
  68. ->header('个人会员')
  69. ->description('详情')
  70. ->body($this->detail($id));
  71. }
  72. /**
  73. * Edit interface.
  74. *
  75. * @param mixed $id
  76. * @param Content $content
  77. * @return Content
  78. */
  79. public function edit($id, Content $content)
  80. {
  81. Permission::check('person_member_edit');
  82. return $content
  83. ->header('个人会员')
  84. ->description('编辑')
  85. ->body($this->editForm($id)->edit($id));
  86. }
  87. /**
  88. * Create interface.
  89. *
  90. * @param Content $content
  91. * @return Content
  92. */
  93. public function create(Content $content)
  94. {
  95. Permission::check('person_member_add');
  96. return $content
  97. ->header('个人会员')
  98. ->description('新增')
  99. ->body($this->form());
  100. }
  101. /**
  102. * Make a grid builder.
  103. *
  104. * @return Grid
  105. */
  106. protected function grid()
  107. {
  108. $grid = new Grid(new Member);
  109. $grid->model()->when(get_subsite_id()>0, function ($query) {
  110. $query->where('subsite_id', get_subsite_id());
  111. $query->whereHas('subsite',function ($query){
  112. $query->where('effective', 1);
  113. });
  114. })->orderBy('id', 'desc');
  115. $grid->id('ID');
  116. $grid->username('用户名')->width(200);;
  117. $grid->mobile('手机')->width(100);
  118. $grid->email('Email')->width(150);
  119. if(get_subsite_open()){
  120. $grid->subsite_id('所属分站')->display(function ($subsite_id) {
  121. if ($subsite_id) {
  122. $Subsite = Subsite::find($subsite_id);
  123. return isset($Subsite->sitename) ? $Subsite->sitename : '未知';
  124. }
  125. return '总站';
  126. })->width(150);
  127. }
  128. $grid->reg_time('注册时间')->display(function ($reg_time) {
  129. return date('Y-m-d H:i:s', $reg_time);
  130. })->sortable();
  131. $grid->last_login_time('最后登录时间')->display(function ($last_login_time) {
  132. return $last_login_time ? date('Y-m-d H:i:s', $last_login_time) : '';
  133. })->sortable();
  134. if (Admin::user()->can('person_member_add')) {
  135. $grid->disableCreateButton(false);
  136. }
  137. $grid->actions(function ($actions) {
  138. if (Admin::user()->can('perosn_business')) {
  139. $actions->append("&nbsp;<button class='btn btn-primary btn-xs business' id=".$actions->row['id'].">业务</button>");
  140. }
  141. if (Admin::user()->can('person_member_delete')) {
  142. $actions->disableDelete(false);
  143. }
  144. if (Admin::user()->can('person_member_edit')) {
  145. $actions->disableEdit(false);
  146. }
  147. });
  148. $grid->tools(function ($tools) {
  149. if (Admin::user()->can('person_member_reset_password')) {
  150. $but = <<<EOT
  151. <div class="btn-group" data-toggle="buttons">
  152. <label class="btn btn-google btn-sm" id="update_password" title="重置密码">
  153. <i class="fa fa-audio-description"></i>
  154. <input type="radio" class="user-gender">重置密码
  155. </label>
  156. </div>
  157. EOT;
  158. $tools->append($but);
  159. }
  160. });
  161. if (Admin::user()->can('person_member_export')) {
  162. $grid->disableExport(false); //显示导出按钮
  163. $grid->exporter(new MemberExport()); //传入自己在第1步创建的导出类
  164. }
  165. $grid->filter(function ($filter) {
  166. $filter->column(1/2, function ($filter) {
  167. $filter->equal('id', '会员ID');
  168. $filter->like('username', '用户名');
  169. $filter->like('memberInfo.id_card', '身份证');
  170. $filter->between('created_at', '注册时间')->datetime();
  171. });
  172. $filter->column(1/2, function ($filter) {
  173. $filter->like('email', 'Email');
  174. $filter->like('mobile', '手机号码');
  175. if(get_subsite_id()==0 && get_subsite_open()){
  176. $filter->equal('subsite_id', '所属分站')->select(array_column(get_all_subsite(), 'sitename', 'id'));
  177. }
  178. });
  179. });
  180. return $grid;
  181. }
  182. /**
  183. * Make a show builder.
  184. *
  185. * @param mixed $id
  186. * @return Show
  187. */
  188. protected function detail($id)
  189. {
  190. $show = new Show(Member::findOrFail($id));
  191. $show->username('用户名');
  192. $show->mobile('mobile', '手机号');
  193. $show->email('email', '邮箱');
  194. $show->image('avatars', '用户头像');
  195. $show->reg_address('注册地址');
  196. $show->subsite_id('分站')->as(function ($subsite_id) {
  197. if ($subsite_id) {
  198. $Subsite = Subsite::find($subsite_id);
  199. return isset($Subsite->sitename) ? $Subsite->sitename : '未知';
  200. }
  201. return '总站';
  202. });
  203. $show->created_at('创建时间');
  204. return $show;
  205. }
  206. /**
  207. * Make a form builder.
  208. *
  209. * @return Form
  210. */
  211. protected function form()
  212. {
  213. $form = new ValidateForm(new Member);
  214. $form->tab('账号资料',function ($form) {
  215. $form->text('username', '用户名')->rules('required|between:6,16|regex:/^[a-zA-Z][a-zA-Z0-9]{6,16}+$/|unique:members', [
  216. 'required' => '会员名为必填信息',
  217. 'between' => '会员名长度为6~16个字符',
  218. 'regex' => '会员名为字母或字母+数字',
  219. 'unique' => '会员名已存在'
  220. ])->setWidth(3)->setMustMark();
  221. $form->mobile('mobile', '手机号')->rules('required|unique:members', [
  222. 'required' => '手机号为必填信息',
  223. 'unique' => '手机号已存在',
  224. ])->setWidth(3)->setMustMark();
  225. $form->radio('mobile_audit', '手机认证')->options([1 => '认证通过', 0 => '未认证'])->default(0);
  226. $form->email('email', 'Email')->rules('required|unique:members', [
  227. 'required' => 'Email为必填信息',
  228. 'unique' => 'Email已存在'
  229. ])->setWidth(3)->setMustMark();
  230. $form->radio('email_audit', '邮箱认证')->options([1 => '认证通过', 0 => '未认证'])->default(0);
  231. $form->password('password', '密码')->rules('required|confirmed|between:6,16', [
  232. 'required' => '密码为必填信息',
  233. 'between' => '密码长度要求为6~16'
  234. ])->setWidth(3)->setMustMark();
  235. $form->password('password_confirmation', '确认密码')->rules('required|between:6,16')->setWidth(3)->setMustMark();
  236. $form->radio('display_images', '是否显示头像')->options([1 => '显示', 2 => '隐藏'])->default(1);
  237. $form->image('avatars', '用户头像')->setWidth(4);
  238. })->tab('基本资料',function ($form) {
  239. $form->radio('display_name', '是否公开姓名')->setWidth(3)->options([1 => '公开', 3 => '隐藏'])->default(config('aix.personal_set.per_set.per_set.resume_display_default'))->setMustMark();
  240. $form->text('realname', '姓名')->setWidth(3)->rules('required', [
  241. 'required' => '姓名为必填信息'
  242. ])->setMustMark();
  243. $form->radio('sex', '性别')->setWidth(3)->options([1 => '男', 2 => '女'])->default(1)->setMustMark();
  244. $birthday = [];
  245. $year = date('Y')-16;
  246. for($i=1950;$i<$year;$i++){
  247. $birthday[$i] = $i;
  248. }
  249. $form->select('birthday', '出生年份')->setWidth(3)->options($birthday)->default(1990)->setMustMark();
  250. // $form->select('card_t_cn', '证件类型')->setWidth(3)->options(Category::where('alias','AIX_card_type')->pluck('demand','id'))->rules('required',[
  251. // 'required'=>'请选择证件类型'
  252. // ])->setMustMark();
  253. $form->text('id_card', '证件号')->setWidth(3)->rules('required|unique:member_infos', [
  254. 'required' => '证件号为必填信息',
  255. 'unique' => '该证件号已存在'
  256. ])->setMustMark();
  257. $form->select('province', '居住地省份')->options(CategoryDistrict::List()->pluck('name', 'id'))->setWidth(3)->load('city', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  258. 'required'=>'请选择居住地省份'
  259. ])->setMustMark();
  260. $form->select('city', '居住地城市')->setWidth(3)->load('area', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  261. 'required'=>'请选择居住地城市'
  262. ])->setMustMark();
  263. // $form->select('area', '居住地县区')->setWidth(3)->rules('required', [
  264. // 'required'=>'请选择居住地县区'
  265. // ])->setMustMark();
  266. $form->select('education', '最高学历')->setWidth(3)->options(Category::where('alias','AIX_education')->pluck('demand','id'))->rules('required', [
  267. 'required'=>'请选择最高学历'
  268. ])->setMustMark();
  269. $form->select('major1', '专业方向')->options(CategoryMajor::where('parent_id',0)->pluck('name', 'id'))->setWidth(3)->load('major2', admin_base_path("/sys/category/categoryMaj"));
  270. // $form->select('major2', '详细专业')->setWidth(3);
  271. $form->select('experience', '工作经验')->options(Category::where('alias','AIX_experience')->pluck('demand','id'))->setWidth(3)->rules('required', [
  272. 'required'=>'请选择工作经验'
  273. ])->setMustMark();
  274. })->tab('联系方式',function ($form) {
  275. $form->select('province1', '籍贯所属省份')->options(CategoryDistrict::List()->pluck('name', 'id'))->setWidth(3)->load('city1', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  276. 'required'=>'请选择籍贯所属省份'
  277. ])->setMustMark();
  278. $form->select('city1', '籍贯所属城市')->setWidth(3)->load('area1', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  279. 'required'=>'请选择籍贯所属城市'
  280. ])->setMustMark();
  281. // $form->select('area1', '籍贯所属县区')->setWidth(3)->rules('required', [
  282. // 'required'=>'请选择相籍贯所属县区'
  283. // ])->setMustMark();
  284. $form->number('height', '身高')->setWidth(3);
  285. $form->select('marriage', '婚姻状况')->options(['1'=>'未婚','2'=>'已婚','3'=>'保密'])->setWidth(3);
  286. $form->number('qq', 'QQ')->setWidth(3);
  287. $form->text('weixin', '微信')->setWidth(3);
  288. $form->hidden('subsite_id', '所属分站')->default(get_subsite_id());
  289. });
  290. return $form;
  291. }
  292. public function store(Request $request)
  293. {
  294. $data = $this->form()->getValidateInput();//这个方法会调用Form自带的验证和表单处理(文件上传等)验证错误会直接返回错误.不需要判断;
  295. if($data['password'] != $data['password_confirmation']) {
  296. admin_toastr('两次密码输入不同', 'error');
  297. return back();
  298. }
  299. $member_data = [
  300. 'username' => $data['username'],
  301. 'password' => bcrypt($data['password']),
  302. 'mobile' => $data['mobile'],
  303. 'mobile_audit' => $data['mobile_audit'],
  304. 'email' => $data['email'],
  305. 'email_audit' => $data['email_audit'],
  306. 'avatars' => $data['avatars'],
  307. 'subsite_id' => $data['subsite_id'],
  308. 'reg_time' => time(),
  309. 'reg_ip' => ip2long('127.0.0.1'),
  310. 'last_login_ip' => ip2long('127.0.0.1'),
  311. 'reg_address' => '本机地址',
  312. 'last_login_time' => time(),
  313. 'status' => 1,
  314. ];
  315. $member_info_data = [
  316. 'display_name'=>$data['display_name'],
  317. 'realname'=>$data['realname'],
  318. 'sex'=>$data['sex'],
  319. 'sex_cn'=>$data['sex']==1?'男':'女',
  320. 'birthday'=>$data['birthday'],
  321. 'card_t_cn'=>306,
  322. 'id_card'=>$data['id_card'],
  323. 'residence'=>$data['province'].'.'.$data['city'].'.0',
  324. 'education'=>$data['education'],
  325. 'education_cn'=>get_category($data['education']),
  326. 'experience'=>$data['experience'],
  327. 'experience_cn'=>get_category($data['experience']),
  328. 'phone'=>$data['mobile'],
  329. 'email'=>$data['email'],
  330. 'height'=>$data['height'],
  331. 'qq'=>$data['qq'],
  332. 'weixin'=>$data['weixin'],
  333. 'marriage'=>$data['marriage'],
  334. 'images'=>$data['avatars'],
  335. 'marriage_cn'=>$data['marriage']==1?'未婚':($data['marriage']==2?'已婚':'保密'),
  336. 'householdaddress'=>$data['province1'].'.'.$data['city1'].'.0',
  337. ];
  338. $member_info_data['residence_cn'] =get_district_cn($member_info_data['residence']);
  339. $member_info_data['householdaddress_cn'] =get_district_cn($member_info_data['householdaddress']);
  340. DB::beginTransaction();
  341. try {
  342. $member = Member::create($member_data);
  343. if(!$member){
  344. throw new \Exception('新增失败');
  345. }
  346. $member_info_data['uid'] = $member->id;
  347. if(!MemberInfo::create($member_info_data)){
  348. throw new \Exception('新增失败');
  349. }
  350. $this->memberSms('sms_quick_register', $data['mobile'],$data['username'], $data['password']);
  351. DB::commit();
  352. admin_toastr('新增成功', 'success');
  353. } catch (\Exception $e) {
  354. DB::rollback();
  355. admin_toastr($e->getMessage(), 'error');
  356. return back();
  357. }
  358. return redirect(route("members.index"));
  359. }
  360. protected function editForm($id)
  361. {
  362. $subsiteArr = [];
  363. $form = new ValidateForm(new Member);
  364. $user = Member::findOrFail($id);
  365. $userinfo = MemberInfo::where('uid',$id)->first();
  366. if(get_subsite_open()){
  367. $subsiteArr = array_column(get_all_subsite(), 'sitename', 'id');
  368. }
  369. $form->tab('账号资料',function ($form) use($user,$id ,$subsiteArr){
  370. $form->display('reg_time', '注册时间')->setWidth(2)->with(function ($reg_time) {
  371. return date('Y-m-d H:i:s', $reg_time);
  372. });
  373. $form->display('reg_ip', '注册IP')->setWidth(2)->with(function ($reg_ip) {
  374. return long2ip($reg_ip);
  375. });
  376. $form->display('last_login_time', '最后登录时间')->setWidth(2)->with(function ($last_login_time) {
  377. return $last_login_time ? date('Y-m-d H:i:s', $last_login_time) : '';
  378. });
  379. $form->display('last_login_ip', '最后登录IP')->setWidth(2)->with(function ($last_login_ip) {
  380. return long2ip($last_login_ip);
  381. });
  382. $form->display('reg_address', '注册地址')->setWidth(4);
  383. $form->html('基本信息');
  384. $form->text('username', '用户名')->rules(
  385. [
  386. 'required',
  387. 'between:6,16|regex:/^[a-zA-Z][a-zA-Z0-9]{6,16}+$/',
  388. Rule::unique('members')->ignore($id),
  389. ],
  390. [
  391. 'required' => '会员名为必填信息',
  392. 'between' => '会员名长度为6~16个字符',
  393. 'regex' => '会员名为字母或字母+数字',
  394. 'unique' => '会员名已存在'
  395. ]
  396. )->setWidth(3)->setMustMark();
  397. $form->mobile('mobile', '手机号')->rules(
  398. [
  399. 'required',
  400. Rule::unique('members')->ignore($id),
  401. ],
  402. [
  403. 'required' => '手机号码为必填信息',
  404. 'unique' => '手机号已存在',
  405. ]
  406. )->setWidth(4)->setMustMark();
  407. $form->radio('mobile_audit','手机认证')->options([1=>'认证通过',0=>'未认证'])->default($user->mobile_audit);
  408. $form->email('email', 'Email')->rules(
  409. [
  410. 'required',
  411. 'regex:/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',
  412. Rule::unique('members')->ignore($id),
  413. ],
  414. [
  415. 'required' => 'email为必填信息',
  416. 'regex' => 'email格式不正确',
  417. 'unique' => 'email已存在',
  418. ]
  419. )->setWidth(3)->setMustMark();
  420. $form->radio('email_audit','邮箱认证')->options([1=>'认证通过',0=>'未认证'])->default($user->email_audit);
  421. $form->switch('status', '用户状态');
  422. if (get_subsite_id()==0 && get_subsite_open()) {
  423. $form->radio('subsite_id', '分站')->options($subsiteArr)->default($user->subsite_id);
  424. } else {
  425. $form->hidden('subsite_id');
  426. }
  427. })->tab('基本资料',function ($form) use ($id,$userinfo){
  428. $form->radio('display_name', '是否公开姓名')->setWidth(3)->options([1 => '公开', 3 => '隐藏'])->default(isset($userinfo->display_name) ? $userinfo->display_name : '')->rules('required', [
  429. 'required' => '请选择是否公开姓名'
  430. ])->setMustMark();
  431. $form->text('realname', '姓名')->setWidth(3)->default(isset($userinfo->realname) ? $userinfo->realname : '')->rules('required', [
  432. 'required' => '姓名为必填信息'
  433. ])->setMustMark();
  434. $form->radio('sex', '性别')->setWidth(3)->options([1 => '男', 2 => '女'])->default(isset($userinfo->sex) ? $userinfo->sex : '')->rules('required', [
  435. 'required' => '请选择性别'
  436. ])->setMustMark();
  437. $birthday = [];
  438. $year = date('Y')-16;
  439. for($i=1950;$i<$year;$i++){
  440. $birthday[$i] = $i;
  441. }
  442. $form->select('birthday', '出生年份')->setWidth(3)->options($birthday)->default(isset($userinfo->birthday) ? $userinfo->birthday : '')->setMustMark();
  443. // $form->select('card_t_cn', '证件类型')->setWidth(3)->options(Category::where('alias','AIX_card_type')->pluck('demand','id'))->rules('required',[
  444. // 'required'=>'请选择证件类型'
  445. // ])->default(isset($userinfo->card_t_cn) ? $userinfo->card_t_cn : '')->setMustMark();
  446. $form->text('id_card', '证件号')->setWidth(3)->rules(
  447. [
  448. 'required',
  449. Rule::unique('member_infos')->ignore($id,'uid'),
  450. ],
  451. [
  452. 'required' => '证件号为必填信息',
  453. 'unique' => '证件号已存在',
  454. ]
  455. )->default(isset($userinfo->id_card) ? $userinfo->id_card : '')->setMustMark();
  456. if (isset($userinfo->residence)) {
  457. $residenceArr = string_to_array('.', $userinfo->residence);
  458. }
  459. if(isset($residenceArr)) {
  460. $form->select('province', '居住地省份')->setWidth(3)->options(CategoryDistrict::List()->pluck('name', 'id'))->setWidth(3)->load('city', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  461. 'required'=>'请选择居住地省份'
  462. ])->default(isset($residenceArr[0])?$residenceArr[0]:0)->setMustMark();
  463. $form->select('city', '居住地城市')->setWidth(3)->options(CategoryDistrict::categoryDis(isset($residenceArr[0])?$residenceArr[0]:0))->load('area', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  464. 'required'=>'请选择居住地城市'
  465. ])->default(isset($residenceArr[1])?$residenceArr[1]:0)->setMustMark();
  466. // $form->select('area', '居住地县区')->setWidth(3)->options(CategoryDistrict::categoryDis(isset($residenceArr[1])?$residenceArr[1]:0))->rules('required', [
  467. // 'required'=>'请选择居住地县区'
  468. // ])->default(isset($residenceArr[2])?$residenceArr[2]:0)->setMustMark();
  469. } else {
  470. $form->select('province', '居住地省份')->options(CategoryDistrict::List()->pluck('name', 'id'))->setWidth(3)->load('city', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  471. 'required'=>'请选择居住地省份'
  472. ])->setMustMark();
  473. $form->select('city', '居住地城市')->setWidth(3)->load('area', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  474. 'required'=>'请选择居住地城市'
  475. ])->setMustMark();
  476. // $form->select('area', '居住地县区')->setWidth(3)->rules('required', [
  477. // 'required'=>'请选择居住地县区'
  478. // ])->setMustMark();
  479. }
  480. $form->select('education', '最高学历')->setWidth(3)->options(Category::where('alias','AIX_education')->pluck('demand','id'))->rules('required', [
  481. 'required'=>'请选择最高学历'
  482. ])->default(isset($userinfo->education) ? $userinfo->education : '')->setMustMark();
  483. if(isset($userinfo->major)){
  484. $parent_id = CategoryMajor::where('id',$userinfo->major)->value('parent_id');
  485. $form->select('major1', '专业方向')->options(CategoryMajor::where('parent_id',0)->pluck('name', 'id'))->setWidth(3)->load('major2', admin_base_path("/sys/category/categoryMaj"))->default($parent_id);
  486. //$form->select('major2', '详细专业')->setWidth(3)->options(CategoryMajor::where('parent_id',$parent_id)->pluck('name', 'id'))->default($userinfo->major);
  487. } else {
  488. $form->select('major1', '专业方向')->options(CategoryMajor::where('parent_id',0)->pluck('name', 'id'))->setWidth(3)->load('major2', admin_base_path("/sys/category/categoryMaj"));
  489. //$form->select('major2', '详细专业')->setWidth(3);
  490. }
  491. $form->select('experience', '工作经验')->options(Category::where('alias','AIX_experience')->pluck('demand','id'))->setWidth(3)->rules('required', [
  492. 'required'=>'请选择工作经验'
  493. ])->default(isset($userinfo->experience) ? $userinfo->experience : '')->setMustMark();
  494. })->tab('联系方式',function ($form) use ($userinfo){
  495. if(isset($userinfo->householdaddress)) {
  496. $householdaddressArr = string_to_array('.', $userinfo->householdaddress);
  497. }
  498. if(isset($householdaddressArr)) {
  499. $form->select('province1', '籍贯所属省份')->setWidth(3)->options(CategoryDistrict::List()->pluck('name', 'id'))->setWidth(3)->load('city1', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  500. 'required'=>'请选择籍贯所属省份'
  501. ])->default(isset($householdaddressArr[0])?$householdaddressArr[0]:0)->setMustMark();
  502. $form->select('city1', '籍贯所属城市')->setWidth(3)->options(CategoryDistrict::categoryDis(isset($householdaddressArr[0])?$householdaddressArr[0]:0))->load('area1', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  503. 'required'=>'请选择籍贯所属城市'
  504. ])->default(isset($householdaddressArr[1])?$householdaddressArr[1]:0)->setMustMark();
  505. // $form->select('area1', '籍贯所属县区')->setWidth(3)->options(CategoryDistrict::categoryDis(isset($householdaddressArr[1])?$householdaddressArr[1]:0))->rules('required', [
  506. // 'required'=>'请选择相籍贯所属县区'
  507. // ])->default(isset($householdaddressArr[2])?$householdaddressArr[2]:0)->setMustMark();
  508. }else {
  509. $form->select('province1', '籍贯所属省份')->options(CategoryDistrict::List()->pluck('name', 'id'))->setWidth(3)->load('city1', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  510. 'required'=>'请选择籍贯所属省份'
  511. ])->setMustMark();
  512. $form->select('city1', '籍贯所属城市')->setWidth(3)->load('area1', admin_base_path("/sys/category/categoryDis"))->rules('required', [
  513. 'required'=>'请选择籍贯所属城市'
  514. ])->setMustMark();
  515. // $form->select('area1', '籍贯所属县区')->setWidth(3)->rules('required', [
  516. // 'required'=>'请选择相籍贯所属县区'
  517. // ])->setMustMark();
  518. }
  519. $form->number('height', '身高')->setWidth(3)->default(isset($userinfo->height) ? $userinfo->height : '');
  520. $form->select('marriage', '婚姻状况')->options(['1'=>'未婚','2'=>'已婚','3'=>'保密'])->setWidth(3)->default(isset($userinfo->marriage) ? $userinfo->marriage : '');
  521. $form->number('qq', 'QQ')->setWidth(3)->default(isset($userinfo->qq) ? $userinfo->qq : '');
  522. $form->text('weixin', '微信')->setWidth(3)->default(isset($userinfo->weixin) ? $userinfo->weixin : '');
  523. });
  524. return $form;
  525. }
  526. public function update($id)
  527. {
  528. $data = $this->editForm($id)->getValidateInput();//这个方法会调用Form自带的验证和表单处理(文件上传等)验证错误会直接返回错误.不需要判断;
  529. $member_data = [
  530. 'username' => $data['username'],
  531. 'mobile' => $data['mobile'],
  532. 'mobile_audit' => $data['mobile_audit'],
  533. 'email' => $data['email'],
  534. 'email_audit' => $data['email_audit'],
  535. 'subsite_id' => $data['subsite_id'],
  536. 'reg_time' => time(),
  537. 'reg_ip' => ip2long('127.0.0.1'),
  538. 'last_login_ip' => ip2long('127.0.0.1'),
  539. 'reg_address' => '本机地址',
  540. 'last_login_time' => time(),
  541. 'status' => 1,
  542. ];
  543. $member_info_data = [
  544. 'display_name'=>$data['display_name'],
  545. 'realname'=>$data['realname'],
  546. 'sex'=>$data['sex'],
  547. 'sex_cn'=>$data['sex']==1?'男':'女',
  548. 'birthday'=>$data['birthday'],
  549. 'card_t_cn'=>306,
  550. 'id_card'=>$data['id_card'],
  551. 'residence'=>$data['province'].'.'.$data['city'].'.0',
  552. 'education'=>$data['education'],
  553. 'education_cn'=>get_category($data['education']),
  554. 'experience'=>$data['experience'],
  555. 'experience_cn'=>get_category($data['experience']),
  556. 'phone'=>$data['mobile'],
  557. 'email'=>$data['email'],
  558. 'height'=>$data['height'],
  559. 'qq'=>$data['qq'],
  560. 'weixin'=>$data['weixin'],
  561. 'marriage'=>$data['marriage'],
  562. 'marriage_cn'=>$data['marriage']==1?'未婚':($data['marriage']==2?'已婚':'保密'),
  563. 'householdaddress'=>$data['province1'].'.'.$data['city1'].'.0',
  564. ];
  565. DB::beginTransaction();
  566. try {
  567. if (!Member::where('id', $id)->update($member_data)) {
  568. throw new \Exception('编辑失败');
  569. }
  570. if(MemberInfo::where('uid', $id)->first()) {
  571. if (!MemberInfo::where('uid', $id)->update($member_info_data)) {
  572. throw new \Exception('编辑失败');
  573. }
  574. }else {
  575. $member_info_data['uid'] = $id;
  576. if (!MemberInfo::create($member_info_data)) {
  577. throw new \Exception('编辑失败');
  578. }
  579. }
  580. $subsite_id =$data['subsite_id'];
  581. if ($subsite_id!==null) {
  582. $resume = Resume::where('uid', $id)->select('id', 'subsite_id')->get()->toArray();
  583. if (!empty($resume)) {
  584. $resume_id = array_column($resume, 'id');
  585. $subsite_id_arr = array_unique(array_column($resume, 'subsite_id'));
  586. Resume::whereIn('id', $resume_id)->update(['subsite_id'=>$subsite_id]);
  587. event_search_update(Resume::class, implode(',', $resume_id), 'update');
  588. $SubsiteResume = SubsiteResume::whereIn('resume_id', $resume_id)->where('subsite_id', $subsite_id)->select('id')->get()->toArray();
  589. if ($SubsiteResume) {
  590. SubsiteResume::destroy(array_column($SubsiteResume, 'id'));
  591. }
  592. SubsiteResume::whereIn('subsite_id', $subsite_id_arr)->whereIn('resume_id', $resume_id)->update(['subsite_id'=>$subsite_id]);
  593. }
  594. event_search_update(Resume::class, [['where','uid', $id]], 'update');
  595. }
  596. DB::commit();
  597. admin_toastr('编辑成功', 'success');
  598. } catch (\Exception $e) {
  599. DB::rollback();
  600. admin_toastr($e->getMessage(), 'error');
  601. return back();
  602. }
  603. return redirect(route("members.index"));
  604. }
  605. public function destroy($id)
  606. {
  607. if (!$id) {
  608. $data = [
  609. 'status' => false,
  610. 'message' => '会员信息不存在!!',
  611. ];
  612. return response()->json($data);
  613. }
  614. $id_arr = explode(',', $id);
  615. \DB::beginTransaction();
  616. try {
  617. Member::destroy($id_arr);
  618. MemberInfo::whereIn('uid', $id_arr)->delete();
  619. Resume::whereIn('uid', $id_arr)->delete();
  620. ResumeImg::whereIn('uid', $id_arr)->delete();
  621. $data = [
  622. 'status' => true,
  623. 'message' => '删除成功!',
  624. ];
  625. $condition = [['whereIn','uid', $id_arr]];
  626. event_search_update(Resume::class, $condition, 'delete');
  627. \DB::commit();
  628. return response()->json($data);
  629. } catch (\Exception $e) {
  630. \DB::rollback();
  631. $data = [
  632. 'status' => false,
  633. 'message' => '删除失败!',
  634. ];
  635. return response()->json($data);
  636. }
  637. }
  638. public function manager($id)
  639. {
  640. $member = Member::findOrFail($id);
  641. if (!$member) {
  642. return false;
  643. }
  644. return redirect()->route('person.resume');
  645. }
  646. public function managerInto($id)
  647. {
  648. $member = Member::findOrFail($id);
  649. if (!$member) {
  650. return false;
  651. }
  652. $key=uniqid();
  653. Cache::put($key, $member, 1);
  654. $url=route('auth.thirdlogin.background', ['ticket' => $key])."?redirect_url=".urlencode(route('person.index'));
  655. return redirect($url);
  656. }
  657. /**
  658. * return json
  659. */
  660. public function auditPassword(Request $request)
  661. {
  662. $id = $request->id;
  663. $form = new \Encore\Admin\Widgets\Form();
  664. $form->action(route('admin.personal.auditPass'));
  665. $form->disableReset();
  666. $form->hidden('id', 'ID')->default($id);
  667. $form->html('<div>重置的新密码为123456,是否重置?</div>');
  668. return json_encode(['html'=>$form->render(),'detail'=>'重置密码']);
  669. }
  670. public function auditPass(Request $request)
  671. {
  672. $id = $request->id;
  673. $arr = array_filter(explode(',', $id));
  674. if (empty($arr)) {
  675. admin_toastr('数据异常', 'error');
  676. return back();
  677. }
  678. $result = Member::whereIn('id', $arr)->update(['password'=>\Hash::make(123456)]);
  679. if ($result) {
  680. admin_toastr('重置成功', 'success');
  681. } else {
  682. admin_toastr('重置失败', 'error');
  683. }
  684. return back();
  685. }
  686. public function userInfoTab(Content $content, Request $request)
  687. {
  688. $uid = $request->uid;
  689. $utype = 2;
  690. $type = $request->type;
  691. if (empty($uid) ) {
  692. admin_toastr('数据异常', 'error');
  693. return back();
  694. }
  695. $tab = new Tab();
  696. $title = [
  697. 'points'=>'积分管理',
  698. 'order'=>'充值/订单',
  699. 'subscribe'=>'简历推广',
  700. 'apply'=>'申请的职位',
  701. 'interview'=>'面试邀请',
  702. 'log'=>'会员日志',
  703. ];
  704. foreach ($title as $key => $val) {
  705. switch ($key) {
  706. case 'points':
  707. $grid = new Grid(new MembersHandsel);
  708. $grid->model()->when(get_subsite_id()>0, function ($query) {
  709. $query->whereHas('members',function ($query){
  710. $query->where('subsite_id', get_subsite_id());
  711. });
  712. })->where(['uid'=>$uid,'utype'=>$utype])->orderBy('id', 'desc');
  713. $grid->id('ID');
  714. $grid->uid('会员ID');
  715. $grid->utype('会员类型')->display(function ($utype) {
  716. if ($utype==1) {
  717. return '企业';
  718. } else {
  719. return '个人';
  720. }
  721. })->width(100);
  722. $grid->points('操作积分')->display(function ($points) {
  723. if ($this->operate==1) {
  724. return "<span style='color:green;'>+".$points."</span>";
  725. } else {
  726. return "<span style='color:red;'>-".$points."</span>";
  727. }
  728. })->width(100);
  729. $grid->htype_cn('操作说明')->width(150);
  730. $grid->created_at('添加时间')->sortable();
  731. $grid->updated_at('更新时间')->sortable();
  732. $grid->disableTools();
  733. $grid->disableActions();
  734. $grid->setName($key);
  735. $grid->disableRowSelector();
  736. $grid->setPaginatorBaseUrl($key);
  737. break;
  738. case 'order':
  739. $grid = new Grid(new Order);
  740. $grid ->model()->where(['uid'=>$uid,'utype'=>$utype])
  741. ->when(get_subsite_id()>0, function ($querys) use ($utype) {
  742. if ($utype ==1) {
  743. $relations = 'companys';
  744. } else {
  745. $relations = 'members';
  746. }
  747. $querys->whereHas($relations, function ($query) {
  748. $query->where('subsite_id', get_subsite_id());
  749. });
  750. })->orderBy('created_at', 'desc')->orderBy("is_pay", 'asc');
  751. $grid->id('ID');
  752. $grid->is_pay('支付状态')->display(function ($is_pay) {
  753. if ($is_pay == 1) {
  754. return '待付款';
  755. } elseif ($is_pay == 2) {
  756. return "已付款";
  757. } else {
  758. return '已取消';
  759. }
  760. });
  761. $grid->amount('金额')->width(150);
  762. if ($utype == 1) {
  763. $grid->column('companys.companyname', '企业名称')->width(200);
  764. } else {
  765. $grid->column('members.username', '会员名称')->width(200);
  766. }
  767. $grid->service_name('说明')->width(150);;
  768. if ($utype == 1) {
  769. $grid->column('companys.username', '企业会员')->width(200);
  770. } else {
  771. $grid->column('members.username', '个人会员')->width(200);
  772. }
  773. $grid->oid('订单号')->width(200);
  774. $grid->payment_cn('支付方式')->width(150);
  775. $grid->created_at('申请时间')->sortable();
  776. $grid->disableTools();
  777. $grid->disableActions();
  778. $grid->setName($key);
  779. $grid->disableRowSelector();
  780. $grid->setPaginatorBaseUrl($key);
  781. break;
  782. case 'subscribe':
  783. $grid = new Grid(new PersonalServiceStickLog);
  784. $grid->model()->where('resume_uid',$uid)->when(get_subsite_id()>0, function ($query) {
  785. $query->whereHas('resume', function ($query) {
  786. $query->where('subsite_id', get_subsite_id());
  787. });
  788. })->orderBy('created_at', 'DESC');
  789. $grid->column('resume.fullname', '姓名')->width(200);;
  790. $grid->resume_uid('会员ID');
  791. $grid->days('推广天数')->width(100);
  792. $grid->addtime('开始时间')->display(function ($addtime) {
  793. return date('Y-m-d H:i:s', $addtime);
  794. })->sortable();
  795. $grid->endtime('结束时间')->display(function ($endtime) {
  796. return date('Y-m-d H:i:s', $endtime);
  797. })->sortable();
  798. $grid->disableTools();
  799. $grid->disableActions();
  800. $grid->setName($key);
  801. $grid->disableRowSelector();
  802. $grid->setPaginatorBaseUrl($key);
  803. break;
  804. case 'apply':
  805. $grid = new Grid(new PersonalJobsApply);
  806. $grid->model()->where('personal_uid',$uid)->when(get_subsite_id()>0, function ($query) {
  807. $query->whereHas('resumes', function ($query) {
  808. $query->where('subsite_id', get_subsite_id());
  809. });
  810. })->orderBy('id', 'desc');
  811. $grid->id('ID');
  812. $grid->jobs_name('职位名称')->width(200);
  813. $grid->company_name('公司名称')->width(200);
  814. $grid->resume_name('简历名称')->width(150);
  815. $grid->is_reply('反馈状态')->display(function ($is_reply) {
  816. switch ($is_reply) {
  817. case 1:
  818. $is_reply = '企业未查看';
  819. break;
  820. case 2:
  821. $is_reply = '待反馈';
  822. break;
  823. case 3:
  824. $is_reply = '合适';
  825. break;
  826. case 4:
  827. $is_reply = '不合适';
  828. break;
  829. case 5:
  830. $is_reply = '待定';
  831. break;
  832. case 6:
  833. $is_reply = '未接通';
  834. break;
  835. default:
  836. $is_reply = '企业未查看';
  837. break;
  838. }
  839. return $is_reply;
  840. });
  841. $grid->column('members.subsite_id', '所属分站')->display(function ($subsite_id) {
  842. if ($subsite_id) {
  843. $Subsite = Subsite::find($subsite_id);
  844. return isset($Subsite->sitename) ? $Subsite->sitename : '未知';
  845. }
  846. return '总站';
  847. })->width(150);
  848. $grid->created_at('申请时间')->sortable();
  849. $grid->updated_at('更新时间')->sortable();
  850. $grid->disableTools();
  851. $grid->disableActions();
  852. $grid->setName($key);
  853. $grid->disableRowSelector();
  854. $grid->setPaginatorBaseUrl($key);
  855. break;
  856. case 'interview':
  857. $grid = new Grid(new CompanyInterView);
  858. $grid->model()->where('resume_uid',$uid)->when(get_subsite_id()>0, function ($query) {
  859. $query->whereHas('resumes', function ($query) {
  860. $query->where('subsite_id', get_subsite_id());
  861. });
  862. })->orderBy('id', 'desc');
  863. $grid->id('ID');
  864. $grid->jobs_name('职位名称')->width(200);
  865. $grid->company_name('公司名称')->width(200);
  866. $grid->resume_name('简历名称')->width(150);
  867. $grid->personal_look('查看状态')->display(function ($personal_look) {
  868. switch ($personal_look) {
  869. case 1:
  870. $personal_look = '未查看';
  871. break;
  872. case 2:
  873. $personal_look = '已查看';
  874. break;
  875. default:
  876. $personal_look = '未查看';
  877. break;
  878. }
  879. return $personal_look;
  880. });
  881. $grid->interview_time('邀请时间')->display(function ($interview_time) {
  882. return date('Y-m-d H:i:s', $interview_time);
  883. })->sortable();
  884. $grid->column('members.subsite_id', '所属分站')->display(function ($subsite_id) {
  885. if ($subsite_id) {
  886. $Subsite = Subsite::find($subsite_id);
  887. return isset($Subsite->sitename) ? $Subsite->sitename : '未知';
  888. }
  889. return '总站';
  890. })->width(150);
  891. $grid->created_at('申请时间')->sortable();
  892. $grid->updated_at('更新时间')->sortable();
  893. $grid->disableTools();
  894. $grid->disableActions();
  895. $grid->setName($key);
  896. $grid->disableRowSelector();
  897. $grid->setPaginatorBaseUrl($key);
  898. break;
  899. case 'log':
  900. $grid = new Grid(new MembersLog);
  901. $grid->model()->where(['log_uid'=>$uid,'log_utype'=>$utype])->when(get_subsite_id()>0, function ($query) {
  902. $query->whereHas('members', function ($query) {
  903. $query->where('subsite_id', get_subsite_id());
  904. });
  905. })->orderBy('id', 'desc');
  906. $grid->id('ID');
  907. $grid->log_username('用户名')->width(200);
  908. $grid->log_value('日志说明')->width(300);
  909. $grid->log_ip('ip')->display(function ($log_ip){
  910. return long2ip($log_ip);
  911. })->width(150);
  912. $grid->log_address('登录地址')->width(150);
  913. $grid->log_utype('会员类型')->display(function ($log_utype) {
  914. if($log_utype==1){
  915. return '企业';
  916. }else{
  917. return '个人';
  918. }
  919. });
  920. $grid->log_source('操作途径')->width(150);
  921. $grid->created_at('申请时间')->sortable();
  922. $grid->updated_at('更新时间')->sortable();
  923. $grid->disableTools();
  924. $grid->disableActions();
  925. $grid->setName($key);
  926. $grid->disableRowSelector();
  927. $grid->setPaginatorBaseUrl($key);
  928. break;
  929. }
  930. $tab->add($val, view('admin.company.content')->with('contents', $grid), $type == $key);
  931. }
  932. return $content
  933. ->header('会员信息')
  934. ->description('列表')
  935. ->body($tab);
  936. }
  937. protected function memberSms($sms_id, $mobile, $username, $password)
  938. {
  939. $SmsRule = SmsRule::where('alias', $sms_id)->first();
  940. if (isset($SmsRule->status) && !empty($SmsRule->status)) {
  941. if ($mobile) {
  942. $this->smsService->sendSms($mobile, $sms_id, ['username'=>$username,'password'=>$password]);
  943. }
  944. }
  945. }
  946. }