KqService.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <?php
  2. namespace App\Service;
  3. use App\Model\KqList;
  4. use Illuminate\Support\Facades\DB;
  5. class KqService extends Service
  6. {
  7. public function kqList($data,$user)
  8. {
  9. $model = KqList::KqClear($user, $data);
  10. $model->select("number","emp_fname as name","crt_time")
  11. ->orderBy('id','desc');
  12. if(! empty($data['number'])) $model->where('number',$data['number']);
  13. if(! empty($data['name'])) $model->where('emp_fname', 'LIKE', '%'.$data['name'].'%');
  14. $list = $this->limit($model,'',$data);
  15. $list = $this->fillData($list);
  16. return [true, $list];
  17. }
  18. public function fillData($data){
  19. if(empty($data['data'])) return $data;
  20. foreach ($data['data'] as $key => $value){
  21. $data['data'][$key]['crt_time'] = date("Y-m-d H:i:s", $value['crt_time']);
  22. }
  23. return $data;
  24. }
  25. public function kqCollect($data,$user) {
  26. if(empty($data['crt_time'][0]) || empty($data['crt_time'][1])) return [false,'时间必须选择'];
  27. $return = $this->changeDateToTimeStampAboutRange($data['crt_time']);
  28. $model = KqList::KqClear($user,$data);
  29. if(! empty($data['number'])) $model->where('number',$data['number']);
  30. if(! empty($data['name'])) $model->where('emp_fname', 'LIKE', '%'.$data['name'].'%');
  31. $list = $model->whereBetween('crt_time',[$return[0], $return[1]])
  32. ->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'))
  33. ->groupBy('number', DB::raw('FROM_UNIXTIME(crt_time, "%Y-%m-%d")'))
  34. ->get()
  35. ->toArray();
  36. $return = $this->fillKqCollectData($list);
  37. return [true, $return];
  38. }
  39. public function fillKqCollectData($data){
  40. if(empty($data)) return $data;
  41. //这边需要把数据处理成每人的总统计
  42. //['考勤天数','总工时','迟到次数','迟到总工时','早退次数','早退总工时','加班次数','加班总工时']
  43. $total_key = [];
  44. $work_start_time = '09:00:00';
  45. $work_end_time = '18:00:00';
  46. //超过2个小时算加班,并且+1
  47. $overtime_hour = 1;
  48. $overtime = '2';
  49. foreach ($data as $v){
  50. if(!isset($total_key[$v['number']])){
  51. $total_key[$v['number']] = [
  52. 'number' => $v['number'],
  53. 'name' => $v['name'],
  54. 'kq_day' => 0,
  55. 'kq_time' => 0,
  56. 'later_day' => 0,
  57. 'later_time' => 0,
  58. 'early_day' => 0,
  59. 'early_time' => 0,
  60. 'overtime_day' => 0,
  61. 'overtime_time' => 0,
  62. ];
  63. }
  64. //有数据就考勤+1,
  65. $total = $total_key[$v['number']];
  66. $total['kq_day']++;
  67. $total['kq_time'] += floatval(sprintf('%.2f',($v['max_crt_time'] - $v['min_crt_time'])/3600));
  68. $begin_time = strtotime($v['date'].' '.$work_start_time);
  69. if($begin_time < $v['min_crt_time']){
  70. $total['later_day']++;
  71. $total['later_time'] += floatval(sprintf('%.2f',($v['min_crt_time'] - $begin_time)/3600));;
  72. }
  73. $end_time = strtotime($v['date'].' '.$work_end_time);
  74. if($end_time > $v['max_crt_time']){
  75. $total['early_day']++;
  76. $total['early_time'] += floatval(sprintf('%.2f',($end_time - $v['max_crt_time'])/3600));
  77. }
  78. $overtime = strtotime($v['date'].' '.$work_end_time)+$overtime*3600;
  79. if($overtime < $v['max_crt_time']){
  80. $total['overtime_day']++;
  81. $total['overtime_time'] += floatval(sprintf('%.2f',($overtime - $v['max_crt_time']+$overtime_hour*3600)/3600));
  82. }
  83. $total_key[$v['number']] = $total;
  84. }
  85. sort($total_key);
  86. return $total_key;
  87. }
  88. }