KqService.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  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. $kq_time = bcdiv($v['max_crt_time'] - $v['min_crt_time'], 3600,2);
  68. $kq_time = bcadd($kq_time, $total['kq_time'],2);
  69. $total['kq_time'] = $kq_time;
  70. $begin_time = strtotime($v['date'].' '.$work_start_time);
  71. if($begin_time < $v['min_crt_time']){
  72. $total['later_day']++;
  73. $later_time = bcdiv($v['min_crt_time'] - $begin_time, 3600,2);
  74. $later_time = bcadd($later_time, $total['later_time'],2);
  75. $total['later_time'] = $later_time;
  76. }
  77. $end_time = strtotime($v['date'].' '.$work_end_time);
  78. if($end_time > $v['max_crt_time']){
  79. $total['early_day']++;
  80. $early_time = bcdiv($end_time - $v['max_crt_time'], 3600,2);
  81. $early_time = bcadd($early_time, $total['early_time'],2);
  82. $total['early_time'] = $early_time;
  83. }
  84. $overtime = strtotime($v['date'].' '.$work_end_time)+$overtime*3600;
  85. if($overtime < $v['max_crt_time']){
  86. $total['overtime_day']++;
  87. $overtime_time = bcdiv($overtime - $v['max_crt_time'], 3600,2);
  88. $overtime_time = bcadd($overtime_time, $total['overtime_time'],2);
  89. $total['overtime_time'] = $overtime_time;
  90. }
  91. $total_key[$v['number']] = $total;
  92. }
  93. sort($total_key);
  94. return $total_key;
  95. }
  96. }