where('user_id', $userId)->where('day', $day)->find(); if ($info) { // 当日班次存在直接返回 return $info; } // 查看当日是否排班 $class = model('AttendanceGroupClass')->getClassByDay($userId); // 当日不存在,获取昨日未结束班次,看看昨日班次是否跨天 $info = Db::name('attendance_user_class')->where('user_id', $userId)->where('status', 0)->where('next', 1)->where('day', $yday)->find(); if ($info) { // 检查此跨天班次是否已结束 if (!$class) { // 今天没有班次 return $info; // 存在昨日跨天班次,直接返回 } $content = json_decode($class['content'], true); $date = $content['dates']; $firstTime = strtotime(date('Y-m-d') . $date[0]['stime']); if ($firstTime - 2 * 60 <= time()) { // 打卡前2分钟,结束上个班次,开启本班次 // 结束上个班次 $ycontent = json_decode($info['content'], true); foreach ($ycontent as $k => $v) { $ycontent[$k]['sstatus'] = 1; $ycontent[$k]['estatus'] = 1; } $res = Db::name('attendance_user_class')->where('id', $info['id'])->update([ 'content' => json_encode($ycontent), 'status' => 1, 'update_time' => date('Y-m-d H:i:s') ]); if (!$res) { // 状态修改失败,直接抛出错误,终止程序 \exception('状态修改失败'); } // 添加今日班次 $ret = $this->saveGroupClass($userId, $class); return $ret; } else { // 昨天班次可继续打卡 return $info; } } else { // 添加今日班次 if (!$class) { // 今天没有班次 return false; } $ret = $this->saveGroupClass($userId, $class); return $ret; } } public function saveGroupClass($userId,$class){ $day = date('Y-m-d'); $nday = date('Y-m-d',strtotime($day) + 86400); // 只添加记录,不牵扯打卡 $content = json_decode($class['content'],true); $dates = $content['dates']; $newdates = []; //[{"stime":"2021-03-22 08:00:00","etime":"2021-03-22 18:00:00","sstatus":0,"estatus":0,"ssign":"","esign":""}] $next = 0; foreach ($dates as $k=>$v){ $newdates[] = [ "stime" => $v['snext'] > 0?$nday .' '.$v['stime'].':00':$day.' '.$v['stime'].':00', "etime" => $v['enext'] > 0?$nday .' '.$v['etime'].':00':$day.' '.$v['etime'].':00', "sstatus" => 0, "estatus" => 0, "ssign" => "", "esign" => "" ]; if($v['snext'] == 1||$v['enext'] == 1){ $next = 1; } } $userData = [ 'user_id' => $userId, 'group_id' => $class['group_id'], 'class_id' => $class['class_id'], 'org_id' => $class['org_id'], 'content' => json_encode($newdates), 'create_time' => date('Y-m-d H:i:s'), 'day' => $day, 'next' => $next, 'status' => 0, 'duration' => 0 ]; $userClassId = Db::name('attendance_user_class')->insertGetId($userData); if(!$userClassId){ // 添加失败,直接抛出错误,终止程序 \exception('添加今日班次失败'); } $userData['id'] = $userClassId; return $userData; } // 生成某天未打卡人员固定班制的记录 public function attendanceReissueFixed($day){ $nday = date('Y-m-d',strtotime($day) + 24*60*60); // 下一天 // 已参与考勤人员 $userIds2 = Db::name('attendance_user_class') ->where('day',$day) ->column('user_id'); // 查询固定班制考勤组 $groups = Db::name('attendance_group')->where('type',1)->where('del',0)->select(); $w = date('w',strtotime($day)); // 是周几 foreach ($groups as $key=>$val){ $content = json_decode($val['content'],true); $week = $content['week']; $classId = 0; foreach ($week as $k=>$v){ if($w == $v['week']){ $classId = empty($v['class_id'])?0:$v['class_id']; } } // 今日是否有必打卡特殊日 $sign = $content['sign']?$content['sign']:[]; foreach ($sign as $k=>$v){ if($day == $v['day']){ $classId = empty($v['class_id'])?0:$v['class_id']; } } // 今日是否有不必打卡特殊日 $unsign = $content['unsign']?$content['unsign']:[]; foreach ($unsign as $k=>$v){ if($day == $v['day']){ $classId = 0; } } if($classId <= 0){ continue; } $map = []; $map[] = ['group_id','=',$val['id']]; if($userIds2){ $map[] = ['user_id','not in',$userIds2]; } $uids = Db::name('attendance_group_user')->where($map)->column('user_id'); $class = Db::name('attendance_class')->where('id',$classId)->find(); if(!$uids || !$class){ continue; } $content = json_decode($class['content'],true); $dates = $content['dates']; $newdates = []; //[{"stime":"2021-03-22 08:00:00","etime":"2021-03-22 18:00:00","sstatus":0,"estatus":0,"ssign":"","esign":""}] $next = 0; foreach ($dates as $k=>$v){ $newdates[] = [ "stime" => $v['snext'] > 0?$nday .' '.$v['stime'].':00':$day.' '.$v['stime'].':00', "etime" => $v['enext'] > 0?$nday .' '.$v['etime'].':00':$day.' '.$v['etime'].':00', "sstatus" => 0, "estatus" => 0, "ssign" => '', "esign" => '', ]; if($v['snext'] == 1||$v['enext'] == 1){ $next = 1; } } if($next == 0){ // 不跨天 foreach ($newdates as $k=>$v){ $newdates[$k]['sstatus'] = 1; $newdates[$k]['estatus'] = 1; } $status = 1; }else{ // 跨天 foreach ($newdates as $k=>$v){ if($v['stime'] >= $nday.' 00:00:00'){ $newdates[$k]['sstatus'] = 0; }else{ $newdates[$k]['sstatus'] = 1; } if($v['etime'] >= $nday.' 00:00:00'){ $newdates[$k]['estatus'] = 0; }else{ $newdates[$k]['estatus'] = 1; } } $status = 0; } foreach ($uids as $k=>$v){ Db::name('attendance_user_class')->insert([ 'org_id' => $class['org_id'], 'user_id' => $v, 'class_id' => $class['id'], 'group_id' => $val['id'], 'content' => json_encode($newdates), 'day' => $day, 'next' => $next, 'status' => $status, 'create_time' => date('Y-m-d H:i:s'), 'update_time' => date('Y-m-d H:i:s') ]); } } } // 生成某天未打卡人员排班制的记录 public function attendanceReissueClass($day){ $nday = date('Y-m-d',strtotime($day) + 24*60*60); // 下一天 // 已参与考勤人员 $userIds2 = Db::name('attendance_user_class') ->where('day',$day) ->column('user_id'); $map = []; $map[] = ['u.del','=',0]; $map[] = ['u.enable','=',1]; $map[] = ['g.del','=',0]; $map[] = ['agc.day','=',$day]; if($userIds2){ $map[] = ['u.id','not in',$userIds2]; } $lists = Db::name('attendance_group_user') ->alias('agu') ->join('attendance_group_class agc','agu.group_id = agc.group_id') ->join('user u','u.id = agu.user_id') ->join('attendance_group g','g.id = agu.group_id') ->join('attendance_class c','c.id = agc.class_id') ->where($map) ->field('agu.group_id,agu.user_id,agu.org_id,agc.class_id,c.content,agc.day') ->select(); $lists = $lists?$lists:[]; foreach ($lists as $key=>$val){ $content = json_decode($val['content'],true); $dates = $content['dates']; $newdates = []; $next = 0; foreach ($dates as $k=>$v){ $newdates[] = [ "stime" => $v['snext'] > 0?$nday .' '.$v['stime'].':00':$day.' '.$v['stime'].':00', "etime" => $v['enext'] > 0?$nday .' '.$v['etime'].':00':$day.' '.$v['etime'].':00', "sstatus" => 0, "estatus" => 0, "ssign" => '', "esign" => '', ]; if($v['snext'] == 1||$v['enext'] == 1){ $next = 1; } } if($next == 0){ // 不跨天 foreach ($newdates as $k=>$v){ $newdates[$k]['sstatus'] = 1; $newdates[$k]['estatus'] = 1; } $status = 1; }else{ // 跨天 foreach ($newdates as $k=>$v){ if($v['stime'] >= $day.' 00:00:00'){ $newdates[$k]['sstatus'] = 0; }else{ $newdates[$k]['sstatus'] = 1; } if($v['etime'] >= $day.' 00:00:00'){ $newdates[$k]['estatus'] = 0; }else{ $newdates[$k]['estatus'] = 1; } } $status = 0; } Db::name('attendance_user_class')->insert([ 'org_id' => $val['org_id'], 'user_id' => $val['user_id'], 'class_id' => $val['class_id'], 'group_id' => $val['group_id'], 'content' => json_encode($newdates), 'day' => $day, 'next' => $next, 'status' => $status, 'create_time' => date('Y-m-d H:i:s'), 'update_time' => date('Y-m-d H:i:s') ]); } } }