select("number","emp_fname as name","crt_time") ->orderBy('id','desc'); if(! empty($data['number'])) $model->where('number',$data['number']); if(! empty($data['name'])) $model->where('emp_fname', 'LIKE', '%'.$data['name'].'%'); $list = $this->limit($model,'',$data); $list = $this->fillData($list); return [true, $list]; } public function fillData($data){ if(empty($data['data'])) return $data; foreach ($data['data'] as $key => $value){ $data['data'][$key]['crt_time'] = date("Y-m-d H:i:s", $value['crt_time']); } return $data; } public function kqCollect($data,$user) { if(empty($data['crt_time'][0]) || empty($data['crt_time'][1])) return [false,'时间必须选择']; $return = $this->changeDateToTimeStampAboutRange($data['crt_time']); $model = KqList::KqClear($user,$data); if(! empty($data['number'])) $model->where('number',$data['number']); if(! empty($data['name'])) $model->where('emp_fname', 'LIKE', '%'.$data['name'].'%'); $list = $model->whereBetween('crt_time',[$return[0], $return[1]]) ->select('number',"emp_fname as name", DB::raw('FROM_UNIXTIME(crt_time, "%Y-%m-%d") as date'), DB::raw('MAX(crt_time) as max_crt_time'), DB::raw('MIN(crt_time) as min_crt_time')) ->groupBy('number', DB::raw('FROM_UNIXTIME(crt_time, "%Y-%m-%d")')) ->get() ->toArray(); $return = $this->fillKqCollectData($list); return [true, $return]; } public function fillKqCollectData($data){ if(empty($data)) return $data; //这边需要把数据处理成每人的总统计 //['考勤天数','总工时','迟到次数','迟到总工时','早退次数','早退总工时','加班次数','加班总工时'] $total_key = []; $work_start_time = '09:00:00'; $work_end_time = '18:00:00'; //超过2个小时算加班,并且+1 $overtime_hour = 1; $overtime = '2'; foreach ($data as $v){ if(!isset($total_key[$v['number']])){ $total_key[$v['number']] = [ 'number' => $v['number'], 'name' => $v['name'], 'kq_day' => 0, 'kq_time' => 0, 'later_day' => 0, 'later_time' => 0, 'early_day' => 0, 'early_time' => 0, 'overtime_day' => 0, 'overtime_time' => 0, ]; } //有数据就考勤+1, $total = $total_key[$v['number']]; $total['kq_day']++; $total['kq_time'] += floatval(sprintf('%.2f',($v['max_crt_time'] - $v['min_crt_time'])/3600)); $begin_time = strtotime($v['date'].' '.$work_start_time); if($begin_time < $v['min_crt_time']){ $total['later_day']++; $total['later_time'] += floatval(sprintf('%.2f',($v['min_crt_time'] - $begin_time)/3600));; } $end_time = strtotime($v['date'].' '.$work_end_time); if($end_time > $v['max_crt_time']){ $total['early_day']++; $total['early_time'] += floatval(sprintf('%.2f',($end_time - $v['max_crt_time'])/3600)); } $overtime = strtotime($v['date'].' '.$work_end_time)+$overtime*3600; if($overtime < $v['max_crt_time']){ $total['overtime_day']++; $total['overtime_time'] += floatval(sprintf('%.2f',($overtime - $v['max_crt_time']+$overtime_hour*3600)/3600)); } $total_key[$v['number']] = $total; } sort($total_key); return $total_key; } }