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->whereIn('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); return [true, $return]; } public function fillKqCollectData($data, $time){ if(empty($data)) return $data; //这边需要把数据处理成每人的总统计 //['考勤天数','总工时','迟到次数','迟到总工时','早退次数','早退总工时','加班次数','加班总工时'] $total_key = []; $work_start_time = '09:00:00'; $work_end_time = '18:00:00'; //超过2个小时算加班,并且+1 // $overtime = '2'; //加班数据 $overList = $this->getOverTimeData($data, $time); 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, ]; } //有数据 考勤天数加一 $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']++; $later_time = bcdiv($v['min_crt_time'] - $begin_time, 3600,2); $later_time = bcadd($later_time, $total['later_time'],2); $total['later_time'] = $later_time; } //早退 $end_time = strtotime($v['date'].' '.$work_end_time); if($end_time > $v['max_crt_time']){ $total['early_day']++; $early_time = bcdiv($end_time - $v['max_crt_time'], 3600,2); $early_time = bcadd($early_time, $total['early_time'],2); $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; // } $total_key[$v['number']] = $total; } foreach ($total_key as $key => $value){ if(!isset($overList[$key])) continue; //加班 $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]; try { DB::beginTransaction(); $model = KqLeave::where('id',$data['id'])->first(); $model->content = $data['content'] ?? ""; $model->type = $data['type'] ?? 0; $model->start_time = $data['start_time'] ?? 0; $model->end_time = $data['end_time'] ?? 0; $model->save(); DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true, '']; } public function kqForLeaveAdd($data,$user){ list($status,$msg) = $this->kqForLeaveRule($data, $user); if(! $status) return [$status,$msg]; try { DB::beginTransaction(); $model = new KqLeave(); $model->order_number = $data['order_number'] ?? ""; $model->content = $data['content'] ?? ""; $model->type = $data['type'] ?? 0; $model->start_time = $data['start_time'] ?? 0; $model->end_time = $data['end_time'] ?? 0; $model->crt_id = $user['id']; $model->save(); DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true, '']; } public function kqForLeaveDel($data,$user){ if($this->isEmpty($data,'id')) return [false,'请选择数据!']; $leave = KqLeave::where('id',$data['id'])->where('del_time',0)->first(); if(empty($leave)) return [false, '该请假记录不存在或已被删除']; $leave = $leave->toArray(); if($leave['state'] > KqLeave::STATE_ZERO) return [false, '该请假记录已无法删除']; try { DB::beginTransaction(); KqLeave::where('id',$data['id'])->update([ 'del_time'=> time() ]); DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true, '']; } public function kqForLeaveList($data,$user){ $model = KqLeave::where('del_time',0) ->select('content','id','order_number','type','start_time','end_time','state','crt_id','crt_time') ->orderby('id', 'desc'); if(! empty($data['id'])) $model->where('id', $data['id']); if(isset($data['type'])) $model->where('type', $data['type']); if(isset($data['state'])) $model->where('state', $data['state']); if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) { $return = $this->changeDateToTimeStampAboutRange($data['crt_time']); $model->where('crt_time','>=',$return[0]); $model->where('crt_time','<=',$return[1]); } $list = $this->limit($model,'',$data); $list = $this->fillLeaveData($list); return [true, $list]; } public function fillLeaveData($data){ if(empty($data['data'])) return $data; $emp = Employee::whereIn('id',array_unique(array_column($data['data'],'crt_id'))) ->pluck('emp_name','id') ->toArray(); foreach ($data['data'] as $key => $value){ $data['data'][$key]['crt_time'] = date("Y-m-d H:i:s", $value['crt_time']); $data['data'][$key]['start_time'] = $value['start_time'] ? date("Y-m-d H:i",$value['start_time']): ''; $data['data'][$key]['end_time'] = $value['end_time'] ? date("Y-m-d H:i",$value['end_time']): ''; $data['data'][$key]['type_title'] = KqLeave::$type_name[$value['type']] ?? ""; $data['data'][$key]['state_title'] = KqLeave::$name[$value['state']] ?? ""; $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? ''; } return $data; } public function kqForLeaveRule(&$data,$user,$is_add = true){ if(empty($data['type']) || ! isset(KqLeave::$type_name[$data['type']])) return [false,'请假类型不能为空或者该类型不存在']; if(empty($data['time'][0]) && empty($data['time'][1])) return [false, '请假时间不能为空']; $data['start_time'] = $this->changeDateToDateMin($data['time'][0]); $data['end_time'] = $this->changeDateToDateMin($data['time'][1]); if($is_add){ $data['order_number'] = (new OrderNoService())->createOrderNumber(KqLeave::$prefix); $bool = KqLeave::where('del_time',0) ->where('crt_id',$user['id']) ->where('start_time', '<=', $data['end_time']) ->where('end_time', '>=', $data['start_time']) ->exists(); }else{ if(empty($data['id'])) return [false,'ID不能为空']; $leave = KqLeave::where('del_time',0)->where('id',$data['id'])->first(); if(empty($leave)) return [false, '该请假记录不存在货已被删除']; $leave = $leave->toArray(); if($leave['state'] > KqLeave::STATE_ZERO) return [false, '该请假记录已无法编辑']; $bool = KqLeave::where('del_time',0) ->where('crt_id',$user['id']) ->where('start_time', '<=', $data['end_time']) ->where('end_time', '>=', $data['start_time']) ->where('id','<>',$data['id']) ->exists(); } if($bool) return [false, '该时间段内已存在请假记录']; return [true, '']; } public function kqForOvertimeEdit($data,$user){ list($status,$msg) = $this->kqForOvertimeRule($data, $user, false); if(! $status) return [$status,$msg]; try { DB::beginTransaction(); $model = KqOvertime::where('id',$data['id'])->first(); $model->content = $data['content'] ?? ""; $model->start_time = $data['start_time'] ?? 0; $model->end_time = $data['end_time'] ?? 0; $model->save(); DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true, '']; } public function kqForOvertimeAdd($data,$user){ list($status,$msg) = $this->kqForOvertimeRule($data, $user); if(! $status) return [$status,$msg]; try { DB::beginTransaction(); $model = new KqOvertime(); $model->order_number = $data['order_number'] ?? ""; $model->content = $data['content'] ?? ""; $model->start_time = $data['start_time'] ?? 0; $model->end_time = $data['end_time'] ?? 0; $model->crt_id = $user['id']; $model->save(); DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true, '']; } public function kqForOvertimeDel($data,$user){ if($this->isEmpty($data,'id')) return [false,'请选择数据!']; $overtime = KqOvertime::where('id',$data['id'])->where('del_time',0)->first(); if(empty($overtime)) return [false, '该加班申请不存在或已被删除']; $overtime = $overtime->toArray(); if($overtime['state'] > KqOvertime::STATE_ZERO) return [false, '该加班申请已无法删除']; try { DB::beginTransaction(); KqOvertime::where('id',$data['id'])->update([ 'del_time'=> time() ]); DB::commit(); }catch (\Exception $exception){ DB::rollBack(); return [false,$exception->getMessage()]; } return [true, '']; } public function kqForOvertimeList($data,$user){ $model = KqOvertime::where('del_time',0) ->select('content','id','order_number','start_time','end_time','state','crt_id','crt_time') ->orderby('id', 'desc'); if(! empty($data['id'])) $model->where('id', $data['id']); if(isset($data['state'])) $model->where('state', $data['state']); if(! empty($data['crt_time'][0]) && ! empty($data['crt_time'][1])) { $return = $this->changeDateToTimeStampAboutRange($data['crt_time']); $model->where('crt_time','>=',$return[0]); $model->where('crt_time','<=',$return[1]); } $list = $this->limit($model,'',$data); $list = $this->fillOvertimeData($list); return [true, $list]; } public function fillOvertimeData($data){ if(empty($data['data'])) return $data; $emp = Employee::whereIn('id',array_unique(array_column($data['data'],'crt_id'))) ->pluck('emp_name','id') ->toArray(); foreach ($data['data'] as $key => $value){ $data['data'][$key]['crt_time'] = date("Y-m-d H:i:s", $value['crt_time']); $data['data'][$key]['start_time'] = $value['start_time'] ? date("Y-m-d H:i",$value['start_time']): ''; $data['data'][$key]['end_time'] = $value['end_time'] ? date("Y-m-d H:i",$value['end_time']): ''; $data['data'][$key]['state_title'] = KqOvertime::$name[$value['state']] ?? ""; $data['data'][$key]['crt_name'] = $emp[$value['crt_id']] ?? ''; } return $data; } public function kqForOvertimeRule(&$data,$user,$is_add = true){ if(empty($data['time'][0]) && empty($data['time'][1])) return [false, '加班时间不能为空']; $data['start_time'] = $this->changeDateToDateMin($data['time'][0]); $data['end_time'] = $this->changeDateToDateMin($data['time'][1]); if($is_add){ $data['order_number'] = (new OrderNoService())->createOrderNumber(KqOvertime::$prefix); $bool = KqOvertime::where('del_time',0) ->where('crt_id',$user['id']) ->where('start_time', '<=', $data['end_time']) ->where('end_time', '>=', $data['start_time']) ->exists(); }else{ if(empty($data['id'])) return [false,'ID不能为空']; $Overtime = KqOvertime::where('del_time',0)->where('id',$data['id'])->first(); if(empty($Overtime)) return [false, '该加班申请不存在货已被删除']; $Overtime = $Overtime->toArray(); if($Overtime['state'] > KqOvertime::STATE_ZERO) return [false, '该加班申请已无法编辑']; $bool = KqOvertime::where('del_time',0) ->where('crt_id',$user['id']) ->where('start_time', '<=', $data['end_time']) ->where('end_time', '>=', $data['start_time']) ->where('id','<>',$data['id']) ->exists(); } if($bool) return [false, '该时间段内已存在加班申请']; return [true, '']; } }