| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 | <?phpnamespace 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;        }        return sort($total_key);    }}
 |