RcgController.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. <?php
  2. namespace App\Http\Controllers\Mobile\Active;
  3. use Aix\Sms\Contracts\Smser;
  4. use App\Http\Controllers\Mobile\MobileBaseController;
  5. use App\Models\Resume;
  6. use App\Repositories\MemberRepository;
  7. use App\Services\Auth\AuthService;
  8. use App\Services\Auth\RegisterService;
  9. use App\Services\Common\CategoryService;
  10. use App\Services\Person\ResumeEducationService;
  11. use App\Services\Person\MemberInfoService;
  12. use App\Services\Person\ResumeService;
  13. use App\Validators\PersonValidatorRequest;
  14. use App\Validators\RegisterValidatorRequest;
  15. use Illuminate\Http\Request;
  16. use App\Services\Common\SmsService;
  17. use App\Services\Person\ResumeWorkService;
  18. use App\Services\Content\PolicyService;
  19. use Illuminate\Support\Facades\DB;
  20. use Illuminate\Support\Facades\Hash;
  21. use GuzzleHttp\Client;
  22. use Illuminate\Support\Facades\Cache;
  23. class RcgController extends MobileBaseController
  24. {
  25. protected $categoryService;
  26. private $smsService;
  27. private $registerService;
  28. private $authService;
  29. protected $memberRepository;
  30. protected $memberInfoService;
  31. protected $educationService;
  32. protected $resumeWorkService;
  33. protected $articleCategoryService;
  34. protected $httpClient;
  35. public function __construct(ResumeWorkService $resumeWorkService,ResumeEducationService $educationService,ResumeService $resumeService,AuthService $authService,CategoryService $categoryService,SmsService $smsService,RegisterService $registerService,MemberRepository $memberRepository,MemberInfoService $memberInfoService,PolicyService $articleCategoryService)
  36. {
  37. $this->categoryService = $categoryService;
  38. $this->smsService = $smsService;
  39. $this->registerService = $registerService;
  40. $this->authService = $authService;
  41. $this->memberRepository = $memberRepository;
  42. $this->memberInfoService = $memberInfoService;
  43. $this->resumeService = $resumeService;
  44. $this->educationService = $educationService;
  45. $this->resumeWorkService = $resumeWorkService;
  46. $this->articleCategoryService = $articleCategoryService;
  47. $this->httpClient=new Client([
  48. 'http_errors' => false
  49. ]);
  50. }
  51. /**
  52. * 人才港首页
  53. * @return array|\Illuminate\Contracts\View\Factory|\Illuminate\View\View
  54. */
  55. public function index()
  56. {
  57. return view('mobile.app.active.index');
  58. }
  59. public function addInfo()
  60. {
  61. $user = auth('web-member')->user();
  62. if(!$user){
  63. $is_login = 0;
  64. }else{
  65. $is_login = 1;
  66. }
  67. $district = $this->categoryService->getDefaultDistrict();
  68. return view('mobile.app.active.resume_add', [
  69. 'is_login'=>$is_login,
  70. 'user'=>$user,
  71. 'defaultCity'=>$district->defaultCity,
  72. 'disCity'=>$district->disCity,
  73. 'disHan'=>$district->disHan,
  74. 'wap_title'=>'信息登记'
  75. ]);
  76. }
  77. public function rcgCreate(PersonValidatorRequest $request)
  78. {
  79. //添加基础信息
  80. $resume_res = $this->resumeService->activeResumeCreate($request->except(['add_tag','_token']), auth('web-member')->user());
  81. if($resume_res['code'] == 1){
  82. $data = request()->all();
  83. $data['resume_id'] = $resume_res['info'];
  84. $data['id'] = $resume_res['info'];
  85. //添加教育信息
  86. $resume_edu = $this->educationService->activeResumeEducationAdd($data, auth('web-member')->user());
  87. //添加工作信息
  88. $resume_work = $this->resumeWorkService->activeResumeWorkAdd($data, auth('web-member')->user());
  89. //添加标签
  90. $resume_tag = $this->resumeService->tagSave($data);
  91. //添加自我描述
  92. $resume_specialty = $this->resumeService->updateSpecialty($data, auth('web-member')->user());
  93. if ($resume_res['code']==1) {
  94. $this->authService->logout();
  95. return $this->sendSuccessResponse(['id'=>$resume_res['info'],'tag'=>$request->add_tag]);
  96. } else {
  97. return $this->sendErrorResponse('更新简历失败', '', 400);
  98. }
  99. }else{
  100. return $this->sendErrorResponse($resume_res['info'], '', 400);
  101. }
  102. }
  103. public function upload()
  104. {
  105. $res = $this->memberInfoService->updateHead(request()->pic1, auth('web-member')->user());
  106. return response()->json($res);
  107. }
  108. public function quickReg(RegisterValidatorRequest $registerValidatorRequest)
  109. {
  110. if (!$this->smsService->checkAuthSms($registerValidatorRequest->mobile, Smser::TEMPLATE_AUTH_REGISTER, $registerValidatorRequest->mobile_vcode)) {
  111. return $this->sendErrorResponse("短信验证码不通过,请重新输入");
  112. }
  113. $data = $registerValidatorRequest->all();
  114. $member = $this->memberRepository->getMemberByAccount($data['mobile']);
  115. if(!$member){
  116. $member = $this->registerService->registerPerson($data);
  117. }else{
  118. $this->authService->login($member);
  119. }
  120. return $this->sendSuccessResponse(['msg'=>'注册/登录成功,请继续操作','reg_status'=>1]);
  121. }
  122. public function rcg()
  123. {
  124. return view('mobile.app.active.rcg');
  125. }
  126. public function serviceCode()
  127. {
  128. return view('mobile.app.active.service_code');
  129. }
  130. private function getPolicyCategory($pid){
  131. $list = DB::table('policy_category')->where(array('parent_id'=>$pid,'deleted_at'=>null))->orderBy('category_order','desc')->orderBy('id','asc')->select("*")->get()->toArray();
  132. if($list){
  133. foreach ($list as $k => $v){
  134. $subList = DB::table('policy_category')->where(array('parent_id'=>$v->id,'deleted_at'=>null))->orderBy('category_order','desc')->orderBy('id','asc')->select("*")->get()->toArray();
  135. if($subList){
  136. $list[$k]->children = $subList;
  137. $this->getPolicyCategory($v->id);
  138. }
  139. }
  140. }
  141. return $list;
  142. }
  143. public function chain(){
  144. $list = $this->getPolicyCategory(30);
  145. $res = [
  146. 'status' => 'ok',
  147. 'info' => '获取成功',
  148. 'data' => $list
  149. ];
  150. echo json_encode($res);
  151. }
  152. public function getChainList(Request $request){
  153. $id = $request->input('id');
  154. $keyword = $request->input('keyword');
  155. $page = $request->input('page');
  156. $where = [
  157. ['type_id', '=', intval($id)]
  158. ];
  159. if(!empty($keyword)){
  160. $map = ['title','like','%'.$keyword.'%'];
  161. array_push($where,$map);
  162. }
  163. $count = DB::table('policy')->where($where)->count();
  164. $list = DB::table('policy')->where($where)->offset(($page-1)*20)->limit($page*20)->select("*")->get()->toArray();
  165. $res['status'] = 'ok';
  166. $res['msg'] = '查询成功';
  167. $res['data'] = $list;
  168. $res['count'] = $count;
  169. echo json_encode($res);
  170. }
  171. public function getPolicyContent(Request $request){
  172. $id = $request->input('id');
  173. if(intval($id)){
  174. $info = DB::table('policy')->where(array('id'=>intval($id)))->select("*")->first();
  175. if($info){
  176. $res['status'] = 'ok';
  177. $res['msg'] = '查询成功';
  178. $res['data'] = [
  179. 'title' => $info->title,
  180. 'content' => $info->content,
  181. 'pid' => $info->type_id
  182. ];
  183. }else{
  184. $res['status'] = 'error';
  185. $res['msg'] = '找不到该文章';
  186. }
  187. }else{
  188. $res['status'] = 'error';
  189. $res['msg'] = '缺少参数';
  190. }
  191. echo json_encode($res);
  192. }
  193. public function putAppointment(Request $request)
  194. {
  195. $res['status'] = '';
  196. $res['msg'] = '';
  197. $data['card'] = $request->input('card');
  198. if(!$data['card']){
  199. $res['status'] = 'error';
  200. $res['msg'] = '身份证不能为空';
  201. echo json_encode($res);die;
  202. }
  203. if (strlen($data['card']) == 18 && !$this->isValid($data['card'])) {
  204. $res['status'] = 'error';
  205. $res['msg'] = '身份证格式不正确';
  206. echo json_encode($res);die;
  207. }
  208. $data['username'] = $request->input('username');
  209. if(!$data['username']){
  210. $res['status'] = 'error';
  211. $res['msg'] = '真实姓名不能为空';
  212. echo json_encode($res);die;
  213. }
  214. $data['phone'] = $request->input('phone');
  215. if(!$data['phone']){
  216. $res['status'] = 'error';
  217. $res['msg'] = '手机号码不能为空';
  218. echo json_encode($res);die;
  219. }
  220. $data['service'] = $request->input('picker');
  221. if(!$data['service']){
  222. $res['status'] = 'error';
  223. $res['msg'] = '服务事项不能为空';
  224. echo json_encode($res);die;
  225. }
  226. $data['value'] = $request->input('value');
  227. if(!$data['value']){
  228. $res['status'] = 'error';
  229. $res['msg'] = '服务事项不能为空';
  230. echo json_encode($res);die;
  231. }
  232. $info = DB::table('talent')->where('card',$data['card'])->first();
  233. if(!$info){
  234. $ch = curl_init ();
  235. curl_setopt( $ch, CURLOPT_URL, "http://rc.jucai.gov.cn/api/dataInterface/findTalentArrangeByIdCard?idCard={$data['card']}" );
  236. curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
  237. 'Content-Type: application/json; charset=utf-8' //json版本需要填写 Content-Type: application/json;
  238. )
  239. );
  240. curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); //若果报错 name lookup timed out 报错时添加这一行代码
  241. curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
  242. curl_setopt( $ch, CURLOPT_TIMEOUT,60);
  243. curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0);
  244. curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0);
  245. $result = curl_exec ( $ch );
  246. curl_close ( $ch );
  247. $ret = json_decode($result,true);
  248. if($ret['state'] == 1){
  249. $data['is_talent'] = 1;
  250. $data['status'] = 1;
  251. }else{
  252. $data['is_talent'] = 0;
  253. }
  254. }else{
  255. $data['is_talent'] = 1;
  256. $data['status'] = 1;
  257. }
  258. //增加全民健身季礼包领取
  259. if($data['value'] == 44){
  260. $libao = DB::table('lt_apppointment')->where('card',$data['card'])->where('value',44)->first();
  261. if($libao){
  262. $res['status'] = 'error';
  263. $res['msg'] = '您已领取过礼包,谢谢您的关注';
  264. echo json_encode($res);die;
  265. }
  266. }
  267. $data['createtime'] = date("Y-m-d H:i:s",time());
  268. $data['number'] = $this->findAvailableNo();
  269. $data['content'] = $request->input('content');
  270. DB::table('lt_apppointment')->insert($data);
  271. if($data['is_talent']){
  272. if(empty($data['content'])){
  273. $content = '无';
  274. }else{
  275. $content = $data['content'];
  276. }
  277. switch ($data['value']){
  278. case 1:
  279. $phone = '13808510338';
  280. break;
  281. case 2:
  282. $phone = '13960958777';
  283. break;
  284. case 3:
  285. $phone = '15280619456';
  286. break;
  287. case 4:
  288. $phone = '15375751022';
  289. break;
  290. case 5:
  291. $phone = '15905901858';
  292. break;
  293. case 6:
  294. $phone = '15985930919';//行政审批
  295. break;
  296. case 7:
  297. $phone = '15159851117';
  298. break;
  299. case 8:
  300. $phone = '';
  301. break;
  302. case 9:
  303. $phone = '13850726589';
  304. break;
  305. case 10:
  306. $phone = '13655931116';
  307. break;
  308. case 11:
  309. $phone = '13805919791';
  310. break;
  311. case 12:
  312. $phone = '13305057271';
  313. break;
  314. case 13:
  315. $phone = '13599248586';
  316. break;
  317. case 14:
  318. $phone = '15859592524';
  319. break;
  320. case 15:
  321. $phone = '13459587022';
  322. break;
  323. case 16:
  324. $phone = '13799592878';
  325. break;
  326. case 17:
  327. $phone = '15159778791';
  328. break;
  329. case 18:
  330. $phone = '15905900577';
  331. break;
  332. case 19:
  333. $phone = '17850958856';
  334. break;
  335. case 20:
  336. //$phone = '13788807070';//丁琦娜 13788807070
  337. $phone = [
  338. '13788807070',
  339. '13313837788',
  340. ];
  341. break;
  342. case 21:
  343. $phone = '13505986964';
  344. break;
  345. case 22:
  346. $phone = '15060600938';
  347. break;
  348. case 23:
  349. $phone = '13305073366';
  350. break;
  351. case 24:
  352. $phone = '15880738158';
  353. break;
  354. case 25:
  355. $phone = '13860706099';
  356. break;
  357. case 26:
  358. $phone = '17379989114';
  359. break;
  360. case 27:
  361. $phone = [
  362. '13788807070',
  363. '13599716573'
  364. ];
  365. break;
  366. case 28:
  367. $phone = [
  368. '13788807070',
  369. '13505023260'
  370. ];
  371. break;
  372. case 29:
  373. $phone = '18850541454';
  374. break;
  375. case 30:
  376. $phone = '18900399886';
  377. break;
  378. case 31:
  379. $phone = '13489858833';
  380. break;
  381. case 32:
  382. $phone = '13960457968';
  383. break;
  384. case 33:
  385. $phone = '18759973633';
  386. break;
  387. case 34:
  388. $phone = '15396576970';
  389. break;
  390. case 35:
  391. $phone = '15959501620';
  392. break;
  393. case 36:
  394. $phone = '13799858905';
  395. break;
  396. case 37:
  397. $phone = '13559621092';
  398. break;
  399. case 38:
  400. $phone = '13799592878';
  401. break;
  402. case 39:
  403. $phone = '13600737303';
  404. break;
  405. case 40:
  406. $phone = '15060910357';//姜自元
  407. break;
  408. case 41:
  409. $phone = '13489719977';
  410. break;
  411. case 42:
  412. $phone = '17750597113';
  413. break;
  414. case 43:
  415. $phone = '15959953335';
  416. break;
  417. case 44:
  418. $phone = '';
  419. break;
  420. default:
  421. $phone = '18060002035';
  422. break;
  423. }
  424. if(is_array($phone)){
  425. foreach ($phone as $v){
  426. $this->smsService->sendSms($v,'sms_custom',array('username'=>$data['username'],'phone'=>$data['phone'],'content'=>$content));
  427. }
  428. }else{
  429. if(!empty($phone)){
  430. $this->smsService->sendSms($phone,'sms_custom',array('username'=>$data['username'],'phone'=>$data['phone'],'content'=>$content));
  431. }
  432. }
  433. $res['status'] = 'ok';
  434. $res['msg'] = '预约登记成功';
  435. $this->smsService->sendSms($data['phone'],'sms_order_number',array('number'=>$data['number'],'service'=>$data['service']));
  436. }else{
  437. $res['status'] = 'ok';
  438. $res['msg'] = '服务咨询登记成功';
  439. }
  440. echo json_encode($res);die;
  441. }
  442. public function getAppointment(Request $request){
  443. $page = $request->input('page');
  444. $name = $request->input('name');
  445. $type = $request->input('type',99);
  446. $status = $request->input('status',99);
  447. $number = $request->input('number');
  448. $where = [];
  449. if(!empty($name)){
  450. $where[] = ['username','like',"%{$name}%"];
  451. }
  452. if(!empty($number)){
  453. $where[] = ['number','like',"%{$number}%"];
  454. }
  455. if($type != 99 ){
  456. $where[] = ['is_talent','=',$type];
  457. }
  458. if($status != 99){
  459. $where[] = ['status','=',$status];
  460. }else{
  461. $where[] = ['status','<','2'];
  462. }
  463. $count = DB::table('lt_apppointment')->where($where)->count();
  464. $list = DB::table('lt_apppointment')->where($where)->orderBy('id','desc')->orderBy('createtime','desc')->offset(($page-1)*20)->limit($page*20)->select("number","username",'phone','service','content','is_talent','status','evaluate')->get()->toArray();
  465. $res['status'] = 'ok';
  466. $res['msg'] = '查询成功';
  467. $res['list'] = $list;
  468. $res['total'] = $count;
  469. echo json_encode($res);die;
  470. }
  471. public function putEvaluate(Request $request){
  472. $number = $request->input('number');
  473. $message = $request->input('message');
  474. if(!$number || $number == '' || strlen($number) != 14){
  475. $res['status'] = 'error';
  476. $res['msg'] = '预约号不正确SR10-1';
  477. echo json_encode($res);die;
  478. }
  479. $info = DB::table('lt_apppointment')->where('number',$number)->first();
  480. if(!$info){
  481. $res['status'] = 'error';
  482. $res['msg'] = '预约号不存在SR10-2';
  483. echo json_encode($res);die;
  484. }
  485. if($info->evaluate){
  486. $res['status'] = 'error';
  487. $res['msg'] = '此服务预约已评价HA10-1';
  488. echo json_encode($res);die;
  489. }
  490. if(!$message || $message == ''){
  491. $res['status'] = 'error';
  492. $res['msg'] = '评价内容不能为空';
  493. echo json_encode($res);die;
  494. }
  495. DB::table('lt_apppointment')->where('number',$number)->update(['evaluate'=>$message]);
  496. $res['status'] = 'ok';
  497. $res['msg'] = '评价成功';
  498. echo json_encode($res);die;
  499. }
  500. public function putEvaluateMobile(Request $request)
  501. {
  502. $mobile = $request->input('mobile');
  503. $msg = $request->input('msg');
  504. if($mobile != '' && $msg != ''){
  505. $info = DB::table('lt_apppointment')->where('phone',$mobile)->orderBy('id','desc')->first();
  506. if($info){
  507. switch ($msg){
  508. case '1':
  509. $evaluate = "非常满意";
  510. break;
  511. case '2':
  512. $evaluate = "基本满意";
  513. break;
  514. case '3':
  515. $evaluate = "不满意";
  516. break;
  517. default:
  518. $evaluate = '短信回复有误,需要回访';
  519. break;
  520. }
  521. DB::table('lt_apppointment')->where('id',$info->id)->update(['evaluate'=>$evaluate]);
  522. }
  523. }
  524. echo json_encode(['clcode'=>'000000']);
  525. }
  526. public function sendSms(){
  527. // $list = DB::table('lt_apppointment')->where('value',44)->where('is_talent',1)->get();
  528. // foreach ($list as $k => $v){
  529. // $this->smsService->sendSms($v->phone,'sms_order_number',array('number'=>$v->number,'service'=>$v->service));
  530. // }
  531. }
  532. protected function findAvailableNo()
  533. {
  534. $prefix = date('Ymd');
  535. // 随机生成 6 位的数字,并创建订单号
  536. $no = $prefix.random_int(10000, 99999).substr(microtime(true),-2);
  537. // 判断是否已经存在
  538. if (!DB::table('lt_apppointment')->where('number', $no)->exists()) {
  539. return $no;
  540. }else{
  541. $this->findAvailableNo();
  542. }
  543. }
  544. public function checkCard(Request $request){
  545. $card = $request->input('card');
  546. if(strlen($card) == 18 && !$this->isValid($card)){
  547. $res['status'] = 'error';
  548. $res['msg'] = '身份证格式不正确';
  549. exit(json_encode($res));
  550. }
  551. $info = DB::table('talent')->where('card',$card)->first();
  552. if(!$info){
  553. $ch = curl_init ();
  554. curl_setopt( $ch, CURLOPT_URL, "http://rc.jucai.gov.cn/api/dataInterface/findTalentArrangeByIdCard?idCard={$card}" );
  555. curl_setopt( $ch, CURLOPT_HTTPHEADER, array(
  556. 'Content-Type: application/json; charset=utf-8' //json版本需要填写 Content-Type: application/json;
  557. )
  558. );
  559. curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); //若果报错 name lookup timed out 报错时添加这一行代码
  560. curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
  561. curl_setopt( $ch, CURLOPT_TIMEOUT,60);
  562. curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0);
  563. curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0);
  564. $result = curl_exec ( $ch );
  565. curl_close ( $ch );
  566. $ret = json_decode($result,true);
  567. $res['status'] = 'ok';
  568. $res['msg'] = '获取成功';
  569. $res['data'] = $ret;
  570. }else{
  571. $res['status'] = 'ok';
  572. $res['msg'] = '获取成功';
  573. $res['data'] = [
  574. 'msg' => '已认定人才',
  575. 'state' => 1,
  576. 'level' => $info->level
  577. ];
  578. }
  579. echo json_encode($res);
  580. }
  581. /**
  582. * 校验身份证号是否合法
  583. * @param string $num 待校验的身份证号
  584. * @return bool
  585. */
  586. protected function isValid(string $num)
  587. {
  588. //老身份证长度15位,新身份证长度18位
  589. $length = strlen($num);
  590. if ($length == 15) { //如果是15位身份证
  591. //15位身份证没有字母
  592. if (!is_numeric($num)) {
  593. return false;
  594. }
  595. // 省市县(6位)
  596. $areaNum = substr($num, 0, 6);
  597. // 出生年月(6位)
  598. $dateNum = substr($num, 6, 6);
  599. } else if ($length == 18) { //如果是18位身份证
  600. //基本格式校验
  601. if (!preg_match('/^\d{17}[0-9xX]$/', $num)) {
  602. return false;
  603. }
  604. // 省市县(6位)
  605. $areaNum = substr($num, 0, 6);
  606. // 出生年月日(8位)
  607. $dateNum = substr($num, 6, 8);
  608. } else { //假身份证
  609. return false;
  610. }
  611. //验证地区
  612. if (!$this->isAreaCodeValid($areaNum)) {
  613. return false;
  614. }
  615. //验证日期
  616. if (!$this->isDateValid($dateNum)) {
  617. return false;
  618. }
  619. //验证最后一位
  620. if (!$this->isVerifyCodeValid($num)) {
  621. return false;
  622. }
  623. return true;
  624. }
  625. /**
  626. * 省市自治区校验
  627. * @param string $area 省、直辖市代码
  628. * @return bool
  629. */
  630. private function isAreaCodeValid(string $area) {
  631. $provinceCode = substr($area, 0, 2);
  632. // 根据GB/T2260—999,省市代码11到65
  633. if (11 <= $provinceCode && $provinceCode <= 65) {
  634. return true;
  635. } else {
  636. return false;
  637. }
  638. }
  639. /**
  640. * 验证出生日期合法性
  641. * @param string $date 日期
  642. * @return bool
  643. */
  644. private function isDateValid(string $date) {
  645. if (strlen($date) == 6) { //15位身份证号没有年份,这里拼上年份
  646. $date = '19'.$date;
  647. }
  648. $year = intval(substr($date, 0, 4));
  649. $month = intval(substr($date, 4, 2));
  650. $day = intval(substr($date, 6, 2));
  651. //日期格式正确,但是逻辑存在问题(如:年份大于当前年)
  652. $currYear = date('Y');
  653. if ($year > $currYear) {
  654. return false;
  655. }
  656. return true;
  657. }
  658. /**
  659. * 验证18位身份证最后一位
  660. * @param string $num 待校验的身份证号
  661. * @return bool
  662. */
  663. private static function isVerifyCodeValid(string $num)
  664. {
  665. if (strlen($num) == 18) {
  666. $factor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  667. $tokens = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
  668. $checkSum = 0;
  669. for ($i = 0; $i < 17; $i++) {
  670. $checkSum += intval($num{$i}) * $factor[$i];
  671. }
  672. $mod = $checkSum % 11;
  673. $token = $tokens[$mod];
  674. $lastChar = strtoupper($num{17});
  675. if ($lastChar != $token) {
  676. return false;
  677. }
  678. }
  679. return true;
  680. }
  681. }