cqp 11 luni în urmă
părinte
comite
1471ab7d21
2 a modificat fișierele cu 57 adăugiri și 15 ștergeri
  1. 0 1
      app/Service/EmployeeService.php
  2. 57 14
      app/Service/KqService.php

+ 0 - 1
app/Service/EmployeeService.php

@@ -337,7 +337,6 @@ class EmployeeService extends Service
                 ->select('employee_id')->get()->toArray();
             $model->whereIn('id',array_column($emp,'employee_id'));
         }
-        if($user['id'] != Employee::SPECIAL_ADMIN) $model->where('is_manager',0);
 
         $list = $this->limit($model,'',$data);
 

+ 57 - 14
app/Service/KqService.php

@@ -49,12 +49,12 @@ class KqService extends Service
             ->groupBy('number', DB::raw('FROM_UNIXTIME(crt_time, "%Y-%m-%d")'))
             ->get()
             ->toArray();
-        $return = $this->fillKqCollectData($list);
+        $return = $this->fillKqCollectData($list, $return);
 
         return [true, $return];
     }
 
-    public function fillKqCollectData($data){
+    public function fillKqCollectData($data, $time){
         if(empty($data)) return $data;
 
         //这边需要把数据处理成每人的总统计
@@ -63,11 +63,13 @@ class KqService extends Service
         $work_start_time = '09:00:00';
         $work_end_time = '18:00:00';
         //超过2个小时算加班,并且+1
-        $overtime_hour = 1;
-        $overtime = '2';
+//        $overtime = '2';
+
+        //加班数据
+        $overList = $this->getOverTimeData($data, $time);
 
         foreach ($data as $v){
-            if(!isset($total_key[$v['number']])){
+            if(! isset($total_key[$v['number']])){
                 $total_key[$v['number']] = [
                     'number' => $v['number'],
                     'name' => $v['name'],
@@ -81,14 +83,17 @@ class KqService extends Service
                     'overtime_time' => 0,
                 ];
             }
-            //有数据就考勤+1,
+            //有数据 考勤天数加一
             $total = $total_key[$v['number']];
             $total['kq_day']++;
 
+            //当天总时长
             $kq_time = bcdiv($v['max_crt_time'] - $v['min_crt_time'], 3600,2);
+            if($kq_time < 0) $kq_time = 0;
             $kq_time = bcadd($kq_time, $total['kq_time'],2);
             $total['kq_time'] = $kq_time;
 
+            //迟到
             $begin_time = strtotime($v['date'].' '.$work_start_time);
             if($begin_time < $v['min_crt_time']){
                 $total['later_day']++;
@@ -97,6 +102,7 @@ class KqService extends Service
                 $total['later_time'] = $later_time;
             }
 
+            //早退
             $end_time = strtotime($v['date'].' '.$work_end_time);
             if($end_time > $v['max_crt_time']){
                 $total['early_day']++;
@@ -105,22 +111,59 @@ class KqService extends Service
                 $total['early_time'] = $early_time;
             }
 
-            $overtime = strtotime($v['date'].' '.$work_end_time)+$overtime*3600;
-
-            if($overtime < $v['max_crt_time']){
-                $total['overtime_day']++;
-                $overtime_time = bcdiv($overtime - $v['max_crt_time'], 3600,2);
-                $overtime_time = bcadd($overtime_time, $total['overtime_time'],2);
-                $total['overtime_time'] = $overtime_time;
-            }
+//            $overtime = strtotime($v['date'].' '.$work_end_time)+$overtime*3600;
+//            if($overtime < $v['max_crt_time']){
+//                $total['overtime_day']++;
+//                $overtime_time = bcdiv($overtime - $v['max_crt_time'], 3600,2);
+//                $overtime_time = bcadd($overtime_time, $total['overtime_time'],2);
+//                $total['overtime_time'] = $overtime_time;
+//            }
 
             $total_key[$v['number']] = $total;
         }
 
+        foreach ($total_key as $key => $value){
+            //加班
+            $over = $overList[$key];
+            $total_key[$key]['overtime_day'] = $over['overtime_day'] ?? 0;
+            $total_key[$key]['overtime_time'] = $over['overtime_time'] ?? 0;
+        }
+
         sort($total_key);
         return $total_key;
     }
 
+    public function getOverTimeData($data, $time){
+        $emp = Employee::whereIn('number', array_column($data, 'number'))->select('id')->get()->toArray();
+        $emp_id = array_column($emp,'id');
+        $emp_map = array_column($emp,'number','id');
+        $overList = KqOvertime::where('del_time',0)
+            ->where('start_time','<=',$time[1])
+            ->where('end_time','>=',$time[0])
+            ->where('state', KqOvertime::STATE_TWO)
+            ->whereIn('crt_id',$emp_id)
+            ->get()->toArray();
+
+        $overtime_count = [];
+        foreach ($overList as $value){
+            $number = $emp_map[$value['crt_id']] ?? "";
+            if(! $number) continue;
+            $overtime_time = bcdiv($value['end_time'] - $value['start_time'], 3600,2);
+            if(isset($overtime_count[$number])){
+                $overtime_count[$number]['overtime_day'] += 1;
+                $overtime_time = bcadd($overtime_time, $overtime_count[$number]['overtime_time'],2);
+                $overtime_count[$number]['overtime_day'] = $overtime_time;
+            }else{
+                $overtime_count[$number] = [
+                    'overtime_day' => 1,
+                    'overtime_time' => $overtime_time
+                ];
+            }
+        }
+
+        return $overtime_count;
+    }
+
     public function kqForLeaveEdit($data,$user){
         list($status,$msg) = $this->kqForLeaveRule($data, $user, false);
         if(! $status) return [$status,$msg];