123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 |
- <?php
- namespace 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;
- }
-
- $lcontent = json_decode($info['content'],true);
- $lastTime = strtotime($lcontent[count($lcontent)-1]['etime']);
- $content = json_decode($class['content'],true);
- $date = $content['dates'];
- $firstTime = strtotime(date('Y-m-d').$date[0]['stime']);
- $fgTime = $lastTime + ($firstTime - $lastTime)/2;
- if($fgTime <= time()){
-
- $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 = [];
- $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 info($userId,$day){
-
- $info = Db::name('attendance_user_class')->where('user_id',$userId)->where('day',$day)->find();
- if($info){
- $info['content'] = json_decode($info['content'],true);
- }
- return $info;
- }
- public function info_old($userId,$day){
-
- $info = Db::name('attendance_user_class')->where('user_id',$userId)->where('day',$day)->find();
- if($info){
- $info['content'] = json_decode($info['content'],true);
- }
- return $info;
- }
-
- public function changeAttendance($data,$orgId){
- $info = Db::name('attendance_user_class')->where('id',$data['id'])->find();
- if(!$info){
- HelpHander::error('参数错误');
- }
- if($info['status'] == 0){
- HelpHander::error('无权限操作');
- }
- if($data['cate'] == 1){
- $ret = Db::name('attendance_record')
- ->where('user_id',$info['user_id'])
- ->where('create_time',$data['time'])
- ->where('cate',1)
- ->where('effective',1)
- ->where('status',0)
- ->find();
- if($ret){
- HelpHander::error('上班打卡为正常状态,不能修改');
- }
- }else if($data['cate'] == 2){
- $ret = Db::name('attendance_record')
- ->where('user_id',$info['user_id'])
- ->where('user_class_id',$data['id'])
- ->where('create_time',$data['time'])
- ->where('cate',2)
- ->where('effective',1)
- ->where('status',0)
- ->find();
- if($ret){
- HelpHander::error('下班打卡为正常状态,不能修改');
- }
- }
- if($data['type'] == 1){
- $data['min'] = 0;
- }
- $signdate = $data['time'];
- $status = 0;
- $result = '管理员修改为:正常';
- if($data['cate'] == 1 && $data['type'] == 2){
- $signdate = date('Y-m-d H:i:s',strtotime($data['time']) + $data['min']*60);
- $status = 1;
- $result = '管理员修改为:迟到';
- }else if($data['cate'] == 2 && $data['type'] == 2){
- $signdate = date('Y-m-d H:i:s',strtotime($data['time']) - $data['min']*60);
- $status = 2;
- $result = '管理员修改为:早退';
- }
- Db::startTrans();
- try{
- Db::name('attendance_record')
- ->where('user_class_id',$data['id'])
- ->where('user_id',$info['user_id'])
- ->where('kq_time',$data['time'])
- ->update(['effective' => 0,'result'=>"打卡无效:此记录已被更新"]);
- $rdata = [
- 'kq_time' => $data['time'],
- 'user_id' => $info['user_id'],
- 'org_id' => $info['org_id'],
- 'type' => 4,
- 'from' => '管理员修改',
- 'result' => $result,
- 'create_time' => $signdate,
- 'user_class_id' => $data['id'],
- 'effective' => 1,
- 'status' => $status,
- 'cate' => $data['cate'],
- 'duration' => $data['min']*60
- ];
- $ret = Db::name('attendance_record')->insert($rdata);
- if(!$ret){
- \exception('操作失败');
- }
- $dates = json_decode($info['content'],true);
- foreach ($dates as $k=>$v){
- if($rdata['cate'] == 1 && $v['stime'] == $rdata['kq_time']){
- $dates[$k]['ssign'] = $rdata['create_time'];
- }else if($rdata['cate'] == 2 && $v['etime'] == $rdata['kq_time']){
- $dates[$k]['esign'] = $rdata['create_time'];
- }
- }
- $userClassId = Db::name('attendance_user_class')->where('id',$info['id'])->update(['content' => json_encode($dates)]);
- if(!$userClassId){
- \exception('保存失败');
- }
- Db::commit();
- }catch (Exception $e){
- trace($e->getMessage());
- Db::rollback();
- HelpHander::error('操作失败'.$e->getMessage());
- }
- return true;
- }
-
- public function reissueList($userId,$orgId){
- $reissue_day = config('reissue_day');
- $start_time = date('Y-m-d',time() - $reissue_day * 86400);
- $end_time = date('Y-m-d');
- $lists = Db::name('attendance_user_class')
- ->where('user_id',$userId)
- ->where('org_id',$orgId)
- ->where('day','>=',$start_time)
- ->where('day','<',$end_time)
- ->where('status',1)
- ->field('id,user_id,content')
- ->select();
- $nlist = [];
- foreach ($lists as $k=>$v){
- $dates = json_decode($v['content'],true);
- foreach ($dates as $kk=>$vv){
- $record1 = Db::name('attendance_record')
- ->where('user_id',$v['user_id'])
- ->where('user_class_id',$v['id'])
- ->where('effective',1)
- ->where('kq_time',$vv['stime'])
- ->find();
- if(!$record1){
- $nlist[] = [
- 'id' => $vv['stime'],
- 'title' => '上班:'.$vv['stime']
- ];
- }
- $record2 = Db::name('attendance_record')
- ->where('user_id',$v['user_id'])
- ->where('user_class_id',$v['id'])
- ->where('effective',1)
- ->where('kq_time',$vv['etime'])
- ->find();
- if(!$record2){
- $nlist[] = [
- 'id' => $vv['etime'],
- 'title' => '下班:'.$vv['etime']
- ];
- }
- }
- }
- return $nlist;
- }
-
- 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[] = ['a.group_id','=',$val['id']];
- if($userIds2){
- $map[] = ['a.user_id','not in',$userIds2];
- }
- $map[] = ['b.enable','=',1];
- $map[] = ['b.del','=',0];
- $map[] = ['c.is_working','in',[0,1,2]];
- $uids = Db::name('attendance_group_user')
- ->alias('a')
- ->join('user b','b.id = a.user_id')
- ->join('user_info c','c.user_id = a.user_id')
- ->where($map)
- ->column('a.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 = [];
- $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[] = ['ui.is_working','in',[0,1,2]];
- $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('user_info ui','ui.user_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')
- ]);
- }
- }
- }
|