flushQRCode($userWorkgroups); } if ($beforeTime==Cache::get('last_refresh_date')){ //刷新 更新cache $last_refresh_date=$beforeTime.strtotime('+'.$qrCode_refresh.'second'); Cache::put('last_refresh_date',$last_refresh_date); return $this->flushQRCode($userWorkgroups); } //每次刷新都标记一个cache 新建 每次刷新前判断这个标记时间 //直接去本地获取二维码 return $this->getQRCode($userWorkgroups); } //刷新二维码 public function flushQRCode($userWorkgroups){ foreach ($userWorkgroups as $userWorkgroup){ $url=url("personnel/checking-in/userDutyCheck/clock"); $url=$url."?userWorkgroupID=".$userWorkgroup->id; $qrCode=new QrCode($url); if ($userWorkgroup->id){ $fileURL=base_path('public/images/QRCodeIMG/'.$userWorkgroup->id.'.png'); $qrCode->writeFile($fileURL); $userWorkgroup->url=url('images/QRCodeIMG/'.$userWorkgroup->id.'.png'); } } return $userWorkgroups; } //获取二维码 public function getQRCode($userWorkgroups){ foreach ($userWorkgroups as $userWorkgroup){ $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday'); if ($qrCode_refresh_everyday){ $date=md5(date('Y-m-d')); $url=url("personnel/checking-in/userDutyCheck/clock?key=").$date; $url=$url."&&userWorkgroupID=".$userWorkgroup->id; }else{ $url=url("personnel/checking-in/userDutyCheck/clock"); $url=$url."?userWorkgroupID=".$userWorkgroup->id; } $qrCode=new QrCode($url); if ($userWorkgroup->id){ $fileURL=base_path('public/images/QRCodeIMG/'.$userWorkgroup->id.'.png'); if (file_exists($fileURL)){ $userWorkgroup->url=url('images/QRCodeIMG/'.$userWorkgroup->id.'.png'); continue; } $qrCode->writeFile($fileURL); $userWorkgroup->url=url('images/QRCodeIMG/'.$userWorkgroup->id.'.png'); } } return $userWorkgroups; } //进入刷新二维码页面 public function refreshQRCode(Request $request){ $beforeTime=$request->input('beforeTime'); $warehouseId=$request->input('warehouseId'); $userWorkgroups=UserWorkgroup::where('warehouse_id',$warehouseId)->get(); $userWorkgroups=$this->qrCode_refresh_time($userWorkgroups,$beforeTime); if (!$userWorkgroups)return view('exception.404',['error'=>'未找到工作组!']); return ['userWorkgroups'=>$userWorkgroups,'last_refresh_date'=>Cache::get('last_refresh_date'),]; } //第一次进入二维码显示页面 public function QRCode(Request $request){ $warehouseId=$request->input('warehouseId'); $userWorkgroups=UserWorkgroup::where('warehouse_id',$warehouseId)->get(); $beforeTime=date('Y-m-d H:i:s'); $userWorkgroups=$this->qrCode_refresh_time($userWorkgroups,$beforeTime); if (!$userWorkgroups)return view('exception.404',['error'=>'未找到工作组!']); return view('personnel/checking-in/QRcode',['warehouseId'=>$warehouseId,'userWorkgroups'=>$userWorkgroups,'last_refresh_date'=>Cache::get('last_refresh_date'),]); } //校验二维码进入打卡页面 public function clock(Request $request){ $userWorkgroupID=$request->input('userWorkgroupID'); $qrCode_refresh_everyday=config('hr.qrCode_refresh_everyday'); if ($qrCode_refresh_everyday){ $key=$request->input('key'); if (!$key) return "二维码失效!"; $date=md5(date('Y-m-d')); if ($key!=$date) return "二维码失效!"; } $userLaborToken=$request->cookie('userLaborToken'); if ($userLaborToken && Cache::has('tokenStr_'.$userLaborToken)) { $user_id=Cache::get('tokenStr_'.$userLaborToken); $userDetail=UserDetail::find($user_id); if (!$userDetail) return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$userDetail->mobile_phone)->with("userWorkgroupID",$userWorkgroupID); if ($userWorkgroupID){ $user=UserToken::getUser($userLaborToken); $user->userWorkgroups()->sync([$userWorkgroupID]); } $userDutyCheck=$this->dutyCheck($userDetail->user_id); if ($userDutyCheck&&$userDutyCheck->error)return "

重复打卡!

"; if (!$userDutyCheck)return "

打卡异常,请联系相关人员!

"; $userWorkgroups=$userDetail->user->userWorkgroups(); if($userWorkgroups->count()>0) $group_name=$userDetail->user->userWorkgroups->first()['name']; $laravelEchoPrefix = config('database.redis.options.prefix'); return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix]); } return view("personnel/checking-in/clock",compact('userWorkgroupID')); } //提交打卡 public function storeClock(Request $request){ $mobile_phone=$request->input('mobile_phone'); $userWorkgroupID=$request->input('userWorkgroupID'); $this->validator($request)->validate(); $userDetail=UserDetail::where('mobile_phone',$mobile_phone)->first(); if (!$userDetail) return redirect('personnel/checking-in/userDutyCheck/createUserDetail/'.$mobile_phone)->with("userWorkgroupID",$userWorkgroupID); $user=User::find($userDetail->user_id); if (Cache::has('tokenUser_'.$user->id))return "

请使用原有设备进行打卡,如无法使用原有设备请联系管理人员解绑设备!

"; if ($userWorkgroupID)$user->userWorkgroups()->sync([$userWorkgroupID]); $userDutyCheckOld=UserDutyCheck::where('user_id',$userDetail->user_id)->orderBy('checked_at','DESC')->limit(10)->first(); $date=date('Y-m-d H:i:s'); $lastDate=Carbon::parse($userDutyCheckOld->checked_at); $thisDate=Carbon::parse($date); $diffDate=$thisDate->diffInMinutes($lastDate); //七天未登录从新选择劳务所 if ($diffDate>7*1440){ return redirect('personnel/checking-in/userDutyCheck/updateUserDetail/'.$mobile_phone)->with("userWorkgroupID",$userWorkgroupID); } $userDutyCheck=$this->dutyCheck($userDetail->user_id); var_dump($userDutyCheck->type); if ($userDutyCheck->type=='登入'){ $this->createLaborReportData($userDetail,$userWorkgroupID,$userDutyCheck); } if ($userDutyCheck->type=='登出'){ $this->updateLaborReportData($userDetail,$userDutyCheck); } if ($userDutyCheck&&$userDutyCheck->error)return "

重复打卡!

"; if (!$userDutyCheck)return "

打卡异常,请联系相关人员!

"; $userLaborToken=$user->token(config('users.token_check_in_expire_minutes')); $group_name=$userDetail->user->userWorkgroups->first()['name']; $laravelEchoPrefix = config('database.redis.options.prefix'); return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix]) ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/'); } //去往登记资料页面 public function createUserDetail($mobile_phone){ $userWorkgroupID=session("userWorkgroupID"); $laborCompanies=LaborCompany::select('id','name')->get(); return view('personnel/checking-in/createUserDetail',['mobile_phone'=>$mobile_phone,'userWorkgroupID'=>$userWorkgroupID,'laborCompanies'=>$laborCompanies]); } //七天未打卡去往选择劳务所页面 public function updateUserDetail($mobile_phone){ $userWorkgroupID=session("userWorkgroupID"); $laborCompanies=LaborCompany::select('id','name')->get(); return view('personnel/checking-in/updateUserDetail',['mobile_phone'=>$mobile_phone,'userWorkgroupID'=>$userWorkgroupID,'laborCompanies'=>$laborCompanies]); } //提交修改资料 public function storeUpdateUserDetail(Request $request){ $this->validator($request)->validate(); $mobile_phone=$request->input('mobile_phone'); $userWorkgroupID=$request->input('userWorkgroupID'); $user=User::where('name',$mobile_phone)->first(); $userDetail=UserDetail::where('user_id',$user->id)->first(); if ($userWorkgroupID)$user->userWorkgroups()->sync([$userWorkgroupID]); $laborCompany=$request->input('laborCompany'); $labor_company_id=LaborCompany::where('name',$laborCompany)->value('id'); $userLabor=UserLabor::where('user_id',$user->id)->first(); $userLabor->update([ 'user_id'=>$user->id, 'labor_company_id'=>$labor_company_id, ]); $userDutyCheck=$this->dutyCheck($user->id); //添加临时工报表数据 $this->createLaborReportData($userDetail,$userWorkgroupID,$userDutyCheck); if ($userDutyCheck&&$userDutyCheck->error)return "

重复打卡!

"; if (!$userDutyCheck)return "

打卡异常,请联系相关人员!

"; $userLaborToken=$user->token(config('users.token_check_in_expire_minutes')); $this->log(__METHOD__,"录入临时工,用户,对应工作组,打卡记录".__FUNCTION__,json_encode($request->all())); $group_name=$userDetail->user->userWorkgroups->first()['name']; $laravelEchoPrefix = config('database.redis.options.prefix'); return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix]) ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/'); } //提交登记资料 public function storeUserDetail(Request $request){ $this->validator($request)->validate(); $mobile_phone=$request->input('mobile_phone'); $full_name=$request->input('full_name'); $identity_number=$request->input('identity_number'); $userWorkgroupID=$request->input('userWorkgroupID'); $user=new User([ 'name'=>$mobile_phone, 'password'=>Uuid::uuid1(), ]); $user->save(); if ($userWorkgroupID)$user->userWorkgroups()->sync([$userWorkgroupID]); $userDetail=new UserDetail([ 'user_id'=>$user->id, 'full_name'=>$full_name, 'identity_number'=>$identity_number, 'gender'=>$request->input('gender'), 'mobile_phone'=>$mobile_phone, 'type'=>'临时工', ]); $userDetail->save(); $laborCompany=$request->input('laborCompany'); $labor_company_id=LaborCompany::where('name',$laborCompany)->value('id'); $userLabor=new UserLabor([ 'user_id'=>$user->id, 'labor_company_id'=>$labor_company_id, ]); $userLabor->save(); $userDutyCheck=$this->dutyCheck($user->id); $this->createLaborReportData($userDetail,$userWorkgroupID,$userDutyCheck); if ($userDutyCheck&&$userDutyCheck->error)return "

重复打卡!

"; if (!$userDutyCheck)return "

打卡异常,请联系相关人员!

"; $userLaborToken=$user->token(config('users.token_check_in_expire_minutes')); $this->log(__METHOD__,"录入临时工,用户,对应工作组,打卡记录".__FUNCTION__,json_encode($request->all())); $group_name=$userDetail->user->userWorkgroups->first()['name']; $laravelEchoPrefix = config('database.redis.options.prefix'); return response()->view('personnel/checking-in/success',['group_name'=>$group_name??'','full_name'=>$userDetail->full_name,'checked_at'=>$userDutyCheck->checked_at,'type'=>$userDutyCheck->type,'laravelEchoPrefix'=>$laravelEchoPrefix]) ->cookie('userLaborToken',$userLaborToken,config('users.token_check_in_expire_minutes'),'/'); } //根据用户提交打卡记录 public function dutyCheck($user_id){ $userDutyCheckOld=UserDutyCheck::where('user_id',$user_id)->orderBy('checked_at','DESC')->limit(10)->first(); $date=date('Y-m-d H:i:s'); $userDutyCheck=new UserDutyCheck([ 'user_id'=>$user_id, 'checked_at'=>$date, 'source'=>'正常', 'verify_user_id'=>'', ]); if (!$userDutyCheckOld){ $userDutyCheck->type="登入"; $userDutyCheck->save(); $this->log(__METHOD__,"提交打卡记录__".__FUNCTION__,json_encode($userDutyCheck)); return $userDutyCheck; } $lastDate=Carbon::parse($userDutyCheckOld->checked_at); $thisDate=Carbon::parse($date); $diffDate=$thisDate->diffInMinutes($lastDate); if ($diffDate>7*1440){ $userDutyCheck->type="登入"; $userDutyCheck->save(); return $userDutyCheck; } if ($diffDate>=1380&&$diffDate<7*1440){ $userDutyCheck->verify_user_id=0; return $userDutyCheck; } if($diffDate<=5){ $userDutyCheck->error=true; return $userDutyCheck; } if ($userDutyCheckOld->type=="登入"){ switch ($diffDate){ case $diffDate<=20: $userDutyCheck->type="登入"; break; case $diffDate>=1380: $userDutyCheck->type="登入"; break; default: $userDutyCheck->type="登出"; } } if ($userDutyCheckOld->type=="登出"){ switch ($diffDate){ case $diffDate<=20: $userDutyCheck->type="登出"; break; default: $userDutyCheck->type="登入"; } } $userDutyCheck->save(); $this->log(__METHOD__,"提交打卡记录__".__FUNCTION__,json_encode($userDutyCheck)); return $userDutyCheck; } //添加临时工报表数据 public function createLaborReportData($userDetail,$userWorkgroupID,$userDutyCheck){ $user_id=$userDetail['user_id']; $name=$userDetail['full_name']; $mobile_phone=$userDetail['mobile_phone']; $identity_number=$userDetail['identity_number']; $labor_company_id=UserLabor::where('user_id',$user_id)->value('labor_company_id'); $labor_company=LaborCompany::where('id',$labor_company_id)->value('name'); if ($userDutyCheck->type=='登入'){ $check_in_at=$userDutyCheck['checked_at']; } $laborReport=new LaborReport([ 'enter_number'=>Uuid::uuid1(), 'user_workgroup_id'=>$userWorkgroupID, 'user_id'=>$user_id, 'name'=>$name, 'mobile_phone'=>$mobile_phone, 'identity_number'=>$identity_number, 'labor_company'=>$labor_company, 'check_in_at'=>$check_in_at, ]); $laborReport->save(); $number_id=$laborReport->id; $enter_number=$userWorkgroupID.date ("ymd").str_pad($number_id>99999?$number_id%99999:$number_id,4,"0",STR_PAD_LEFT); $laborReport->enter_number=$enter_number; $laborReport->update(); return; } //修改临时工报表数据 public function updateLaborReportData($userDetail,$userDutyCheck){ $check_in_at=UserDutyCheck::where('user_id',$userDetail->user_id)->where('type','登入')->value('checked_at'); var_dump($check_in_at); $laborReport=LaborReport::where('check_in_at',$check_in_at)->first(); var_dump($laborReport); $laborReport['check_out_at']=$userDutyCheck['checked_at']; var_dump($laborReport['check_out_at']); $checkInDate=Carbon::parse($check_in_at); $checkOutDate=Carbon::parse($userDutyCheck->checked_at); $diffDate=$checkOutDate->diffInHours($checkInDate); dd($diffDate); $laborReport['working_duration']=$diffDate; $laborReport->save(); return; } public function validator(Request $request){ $validator=Validator::make($request->input(),[ 'full_name'=>['filled'], 'gender'=>['filled'], 'mobile_phone'=>['required','integer','digits:11'], 'identity_number' => ['identitycards'], ],[],[]); return $validator; } }