| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 | <?phpnamespace app\common\model;use app\hander\HelpHander;use think\Db;use think\Exception;use think\Model;class AttendanceUserClass extends Model{    // 获取当前排班班次    public function getCurGroup($userId)    {        $day = date('Y-m-d');        $yday = date('Y-m-d', strtotime($day) - 1000);        $info = Db::name('attendance_user_class')->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')            ]);        }    }}
 |