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(){ if(self::$withoutAppends) { $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(){ if(self::$withoutAppends) { $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(){ if(self::$withoutAppends) { $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(){ if(self::$withoutAppends) { $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(self::$withoutAppends) { 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(self::$withoutAppends) { 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() { if(self::$withoutAppends) { $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() { if(self::$withoutAppends) { $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() { if(self::$withoutAppends) { $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(){ if(self::$withoutAppends) { $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; } }