MemberController.php 46 KB

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