format('Y-m-d')); } public function userWorkgroup(){ return $this->hasOne('App\UserWorkgroup','id','user_workgroup_id'); } public function laborCompany(){ return $this->hasOne('App\LaborCompany','id','labor_company_id'); } public function user(){ return $this->hasOne('App\User','id','group_user_id'); } public function userDutyCheck(){ return $this->hasOne('App\UserDutyCheck','id','user_duty_check_id'); } public function laborReportStatus(){ return $this->hasMany('App\LaborReportStatus','labor_report_id','id'); } public function getRoundCheckInAtAttribute(){ if (!$this['check_in_at'])return null; $round_check_in_at=Carbon::parse($this['check_in_at'])->format('i'); if ($round_check_in_at>=0&&$round_check_in_at<=5) return Carbon::parse($this['check_in_at'])->clone()->setMinutes(00)->setSeconds(00)->format('Y-m-d H:i:s'); if ($round_check_in_at>5&&$round_check_in_at<=35) return Carbon::parse($this['check_in_at'])->clone()->setMinutes(30)->setSeconds(00)->format('Y-m-d H:i:s'); if ($round_check_in_at>35&&$round_check_in_at<=59) return Carbon::parse($this['check_in_at'])->clone()->addHour()->setMinutes(00)->setSeconds(00)->format('Y-m-d H:i:s'); } public function getRoundCheckOutAtAttribute(){ if (!$this['check_out_at'])return null; $round_check_out_at=Carbon::parse($this['check_out_at'])->format('i'); if ($round_check_out_at>=0&&$round_check_out_at<25) return Carbon::parse($this['check_out_at'])->clone()->setMinutes(00)->setSeconds(00)->format('Y-m-d H:i:s'); if ($round_check_out_at>=25&&$round_check_out_at<=55) return Carbon::parse($this['check_out_at'])->clone()->setMinutes(30)->setSeconds(00)->format('Y-m-d H:i:s'); if ($round_check_out_at>55&&$round_check_out_at<=59) return Carbon::parse($this['check_out_at'])->clone()->addHour()->setMinutes(00)->setSeconds(00)->format('Y-m-d H:i:s'); } //has_group_verify_right' public function getHasGroupVerifyRightAttribute(){ if (!Gate::allows('人事管理-临时工报表')){return null; } if (Gate::allows('人事管理-临时工报表-管理全部组')){return true;} $user=Auth::user(); $userWorkgroupIds=$user->getPermittingWorkgroupIds($allowAll=false); if (count($userWorkgroupIds)!=0) return in_array($this['user_workgroup_id'],$userWorkgroupIds); } public function getIsExportGroupAttribute(){ return $this['check_out_at']? true:false; } public function getVerifyPersonAttribute(){ if ($this['group_user_id']&&$this['group_user_id']==Auth::user()['id']) return Auth::user()['name']; } public function getUserDutyCheckVerifyUserIdAttribute(){ return $this['userDutyCheck']['verify_user_id']?$this['userDutyCheck']['verify_user_id']:''; } //总在线时长 public function getTotalOnlineTimeAttribute(){ $laborReports=LaborReport::where('enter_number',$this['enter_number'])->get(); $totalOnlineTime=$laborReports->reduce(function ($value,$laborReport){ return ($value??0)+$laborReport['thisRecordOnlineTime']; }); return $totalOnlineTime; } //总工作时长 public function getTotalWorkingTimeAttribute(){ $laborReports=LaborReport::where('enter_number',$this['enter_number'])->orderBy('id','asc')->get(); $totalWorkingTime=$laborReports->reduce(function ($value,$laborReport){ return ($value??0)+$laborReport['thisRecordWorkingTime']; }); return $totalWorkingTime; } //本轮工作起始时间 public function getThisRoundOnlineStartTimeAttribute(){ $laborReports=LaborReport::where('enter_number',$this['enter_number'])->orderBy('id','asc')->get(); foreach ($laborReports as $laborReport){ if ($laborReport['enter_at']&&$laborReport['check_in_at']) return $laborReport['check_in_at']; } } //本轮工作结束时间 public function getThisRoundOnlineEndTimeAttribute(){ $laborReports=LaborReport::where('enter_number',$this['enter_number'])->get(); foreach ($laborReports as $laborReport){ if ($laborReport['exit_at']&&$laborReport['check_out_at']) return $laborReport['check_out_at']; } } //本次在线时长 public function getThisRecordOnlineTimeAttribute(){ if($this['enter_at']&&!$this['check_out_at']&&!$this['exit_at']) return round(Carbon::parse(Carbon::now())->diffInSeconds(Carbon::parse($this['enter_at']))/3600,2); if ($this['enter_at']&&$this['check_out_at']&&!$this['exit_at']) return round(Carbon::parse($this['check_out_at'])->diffInSeconds(Carbon::parse($this['enter_at']))/3600,2); if ($this['enter_at']&&$this['exit_at']) return round(Carbon::parse($this['exit_at'])->diffInSeconds(Carbon::parse($this['enter_at']))/3600,2); if ($this['check_in_at']&&!$this['enter_at']&&!$this['check_out_at']&&!$this['exit_at']) return round(Carbon::parse(Carbon::now())->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2); if ($this['check_in_at']&&!$this['enter_at']&&$this['check_out_at']&&!$this['exit_at']) return round(Carbon::parse($this['check_out_at'])->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2); if ($this['check_in_at']&&!$this['enter_at']&&$this['exit_at']) return round(Carbon::parse($this['exit_at'])->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2); } //本次工作时长 public function getThisRecordWorkingTimeAttribute(){ if ($this['check_in_at']&&!$this['check_out_at']&&!$this['relax_time']){ $workingTime=round(Carbon::parse(Carbon::now())->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2); $checkInTime=Carbon::parse($this['check_in_at']); $checkOutTime=Carbon::parse(Carbon::now())->format('H'); return $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime); } if ($this['check_in_at']&&$this['check_out_at']&&!$this['relax_time']){ $workingTime=round(Carbon::parse($this['check_out_at'])->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2); $checkInTime=Carbon::parse($this['check_in_at']); $checkOutTime=Carbon::parse($this['check_out_at'])->format('H'); return $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime); } if ($this['check_in_at']&&$this['check_out_at']&&$this['relax_time']){ $workingTime=round(Carbon::parse($this['check_out_at'])->diffInSeconds(Carbon::parse($this['check_in_at']))/3600,2); $checkInTime=Carbon::parse($this['check_in_at']); $checkOutTime=Carbon::parse($this['check_out_at'])->format('H'); return $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime)-$this['relax_time']/60; } } //本次取整工作时长 public function getThisRoundRecordWorkingTimeAttribute(){ if ($this['round_check_in_at']&&!$this['round_check_out_at']&&!$this['relax_time']){ $workingTime=round(Carbon::parse(Carbon::now())->diffInSeconds(Carbon::parse($this['round_check_in_at']))/3600,2); $checkInTime=Carbon::parse($this['round_check_in_at']); $checkOutTime=Carbon::parse(Carbon::now())->format('H'); return $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime); } if ($this['round_check_in_at']&&$this['round_check_out_at']&&!$this['relax_time']){ $workingTime=round(Carbon::parse($this['round_check_out_at'])->diffInSeconds(Carbon::parse($this['round_check_in_at']))/3600,2); $checkInTime=Carbon::parse($this['round_check_in_at']); $checkOutTime=Carbon::parse($this['round_check_out_at'])->format('H'); return $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime); } if ($this['round_check_in_at']&&$this['round_check_out_at']&&$this['relax_time']){ $workingTime=round(Carbon::parse($this['round_check_out_at'])->diffInSeconds(Carbon::parse($this['round_check_in_at']))/3600,2); $checkInTime=Carbon::parse($this['round_check_in_at']); $checkOutTime=Carbon::parse($this['round_check_out_at'])->format('H'); return $this->minusLunchTime($checkInTime,$checkOutTime,$workingTime)-$this['relax_time']/60; } } //工作时长减午饭休息时间 public function minusLunchTime($checkInTime,$checkOutTime,$hour){ if ($checkInTime->lessThanOrEqualTo($checkInTime->clone()->setHours(11)->setMinutes(30))&&(int)$checkOutTime>=13){ $hour=$hour-1; } return $hour; } //转场序号 public function getSequenceAttribute() { if(Arr::has($this->tempFields,'sequence'))return $this->tempFields['sequence']; $laborReports=LaborReport::where('enter_number',$this['enter_number'])->orderBy('id','asc')->get(); foreach($laborReports as $i=>$laborReport){ if($laborReport['id']==$this['id']){ $this->tempFields['sequence']=$i+1; return $this->tempFields['sequence']; } } } public function getAmountOfJoinedAttribute() { if(Arr::has($this->tempFields,'amountOfJoined'))return $this->tempFields['amountOfJoined']; $this->tempFields['amountOfJoined']=LaborReport::where('enter_number',$this['enter_number'])->orderBy('id','asc')->count(); return $this->tempFields['amountOfJoined']; } //进场时间 public function getEnterAtAttribute() { $laborReportStatus=LaborReportStatus::where('labor_report_id',$this['id'])->where('status','未审核')->orderBy('id','desc')->first(); if (empty($laborReportStatus))return null; return Carbon::parse($laborReportStatus['created_at'])->format('Y-m-d H:i:s'); } public function getEnteringRecordAttribute() { $laborReport=LaborReport::with(['laborReportStatus'=>function($query){ return $query->whereIn('status',['已入场','未审核']); }])->where('user_id',$this['user_id'])->orderBy('id','desc')->first(); if(empty($laborReport))return null; return $laborReport; } public function getExitAtAttribute() { $laborReportStatus=LaborReportStatus::where('labor_report_id',$this['id'])->where('status','已退场')->orderBy('id','desc')->first(); if (empty($laborReportStatus))return null; return Carbon::parse($laborReportStatus['created_at'])->format('Y-m-d H:i:s'); } //创建或获取进场编号 public function makeOrGetEnteringNumber() { if($this['enteringRecord']&&$this['enteringRecord']['enter_number']) return $this['enteringRecord']['enter_number']; $enteringNumber=date("ymd").str_pad($this['id']>99999?$this['id']%99999:$this['id'],4,"0",STR_PAD_LEFT); $this['enter_number']=$enteringNumber; return $enteringNumber; } public function getIsExportAttribute(){ $laborReportStatus=$this->laborReportStatus()->where('labor_report_id',$this['id'])->orderBy('id','desc')->first(); return $laborReportStatus['status']=='已退场'?true:false; } //出场更新临时工报表信息 static function exitAndChangeLaborReport($laborReport,$userDutyCheck){ $laborReportStatus=new LaborReportStatus([ 'labor_report_id'=>$laborReport['id'], 'status'=>'已退场', ]); $laborReportStatus->save(); $check_in_at=$laborReport->check_in_at??null; $exit_at=$userDutyCheck->checked_at; $online_duration=round(Carbon::parse($exit_at)->diffInSeconds(Carbon::parse($check_in_at))/3600,2); $laborReport->user_duty_check_id=$userDutyCheck->id; if ($laborReport->enter_at){ $enter_at=$laborReport['enter_at']; $laborReport->online_duration=round(Carbon::parse($exit_at)->diffInSeconds(Carbon::parse($enter_at))/3600,2); }else{ $laborReport->online_duration=$online_duration; } $laborReport->update(); $laborReport->is_export=$laborReport->getIsExportAttribute(); return $laborReport; } /** * 是否成年 * @param 身份证号 * @return int 0 成年,1未成年 */ public function getIsAdultAttribute(){ $flag = 0; $tyear=intval(substr($this['identity_number'],6,4)); $tmonth=intval(substr($this['identity_number'],10,2)); $tday=intval(substr($this['identity_number'],12,2)); if($tyear>date("Y")||$tyear<(date("Y")-100)){ $flag=0; }elseif($tmonth<0||$tmonth>12){ $flag=0; }elseif($tday<0||$tday>31){ $flag=0; }else{ $day_sum = self::full_year_day($tyear,$tmonth,16); if((time()-mktime(0,0,0,$tmonth,$tday,$tyear))>$day_sum*24*60*60){ $flag=0; }else{ $flag=1; } } return $flag; } /** * n周岁的天数 * @param $tyear * @param $tmonth * @return int */ public static function full_year_day($tyear,$tmonth,$type=16){ $sum=365*$type; for($i=$tyear+1;$i<$tyear+$type;$i++)//考虑中间年份 { if(self::is_leap_year($i)) $sum++; } if(self::is_leap_year($tyear)&&$tmonth<=2)//考虑初末两年 $sum++; if(self::is_leap_year($tyear+$type)&&$tmonth>=3){ $sum++; } return $sum; } /** * @param $year * @return int 1是闰年,0不是闰年 */ public static function is_leap_year($year){ if(($year%4==0&&$year%100!=0)||$year%400==0) return 1; else return 0; } }