123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- <?php
- namespace App\Service;
- use App\Model\KqList;
- use Illuminate\Support\Facades\DB;
- class KqService extends Service
- {
- public function kqList($data,$user)
- {
- $model = KqList::KqClear($user, $data);
- $model->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;
- }
- }
|