request->token; // 今日排名 $today = UserSignLog::with(['employee'=>function($query) use ($token){ $query->where('root_id',$token['root_org']); },'Users'])->field('user_id,TIME(addtime) as addtime')->where([['date', '=', date('Y-m-d')],['root_id','=',$token['root_org']]]) ->page($page, 10)->order('addtime asc, user_id asc')->select(); // 连续排名 $nobreak = UserSignLog::with(['employee'=>function($query) use ($token){ $query->where('root_id',$token['root_org']); },'Users'])->field('user_id,max(day) as day') ->where([['root_id','=',$token['root_org']],['date','in',[date('Y-m-d'),date('Y-m-d', strtotime('yesterday'))]]]) // ->where([['date', '=', date('Y-m-d')],['root_id','=',request()->token['root_org']]]) // ->whereOr([['date', '=', date('Y-m-d', strtotime('yesterday'))],['root_id','=',request()->token['root_org']]]) ->page($page, 10)->group('user_id')->order('day desc, user_id asc')->select(); // 总共排名 $total = UserSignLog::with(['employee'=>function($query) use ($token){ $query->where('root_id',$token['root_org']); },'Users'])->field('user_id,count(id) as num')->where('root_id',$token['root_org'])->order('num desc, user_id asc')->page($page, 10)->group('user_id')->select(); $medals = $this->medals(); $today = $this->medal($today,$medals); $nobreak = $this->medal($nobreak,$medals); $total = $this->medal($total,$medals); $data = [ 'today_ranking' => $today, 'nobreak_ranking' => $nobreak, 'total_ranking' => $total ]; return json(['code' => self::success, 'data' => $data, 'page' => $page]); } public function medal($data,$medals){ foreach ($data as $k1 => $v1) { $v1->medal = isset($medals[$v1->uid]) ? $medals[$v1->uid] : []; } return $data; } //勋章体系 public function medals(){ $token = $this->request->token; //勋章体系 $w[] = ['main','=',1]; $w[] = ['root_id','=',$token['root_org']]; $qw[] = ['root_id','=',$token['root_org']]; $medal = EmployeeMedal::with(['medal'=>function($query){ $query->visible(['title','remark'])->bind(['title','remark']); },'employee'=>function($query) use ($qw){ $query->where($qw)->visible(['uid','id'])->bind(['uid','id']); }])->where($w)->field(['employee_id','medal_id'])->select(); $medals = []; foreach ($medal as $v) { $medals[$v->uid] = ['title'=>$v->title,'remark'=>$v->remark]; } return $medals; } public function signuserstage() { $today = date('Y-m-d'); $yesterday = date('Y-m-d', strtotime('yesterday')); $signmarks = ['d_' . date('d') => false]; for ($i = 1; $i <= 5; $i++) { $time = strtotime('-' . $i . ' day'); $d = 'd_' . date('d', $time); $date = date('Y-m-d', $time); $signmarks[$d] = false; } $token = $this->request->token; // 最后一次签到 $lastSign = UserSignLog::where([['user_id', '=', $token['uid']],['root_id','=',$token['root_org']]])->order('date desc, user_id asc')->find(); if (empty($lastSign)) { $data = [ 'signstage' => null, // 今日签到排名 'signallnum' => 0, // 累计签到次数 'signnobreaknum' => 0, // 连续签到天数 'signnobreakstage' => null, // 连续签到排名 'signtotalstage' => null, // 累计签到排名 'signmarks' => $signmarks // 签到日期 ]; return json(['code' => self::success, 'data' => $data]); } // 累计签到 $signAllNum = UserSignLog::where([['user_id', '=', $token['uid']],['root_id','=',$token['root_org']]])->count(); // 连续签到 $daynobreak = ($lastSign['date'] == $today || $lastSign['date'] == $yesterday) ? $lastSign['day'] : null; // 今日签到排名 $signstage = $lastSign['date'] != $today ? null : UserSignLog::where([['addtime', '<', $lastSign['addtime']], ['date', '=', $today], ['root_id','=',$token['root_org']]])->count() + 1; // 连续签到排名 $nobreak = UserSignLog::whereOr([[['day', '>', $lastSign['day']], ['date', '=', $yesterday], ['root_id','=',$token['root_org']]], [['day', '>', $lastSign['day']], ['date', '=', $today],['root_id','=',$token['root_org']]]])->group('user_id')->order('user_id asc')->column('user_id'); //$signnobreakstage = ($lastSign['date'] == $today || $lastSign['date'] == $yesterday) ? count($nobreak) + 1 : null; $signnobreakstage = ($lastSign['date'] == $today || $lastSign['date'] == $yesterday) ? array_search($token['uid'], $nobreak) + 1 : null; // 累计签到排名 $signtotal = UserSignLog::where('root_id',$token['root_org'])->group('user_id')->order('num desc, user_id asc')->column('count(id) as num'); $signtotalstage = array_search($signAllNum, $signtotal); //$signtotal = UserSignLog::where('root_id',request()->token['root_org'])->group('user_id')->order('num desc, user_id asc')->column('count(id) as num','user_id'); //$signtotalstage = array_search($this->request->token['uid'], array_values($signtotal)); $signtotalstage !== false ? $signtotalstage++ : $signtotalstage = count($signtotal); // 签到日期与签到状态 $lastSign['date'] != $today ?: $signmarks['d_' . date('d')] = true; $fiveDate = date('Y-m-d', strtotime('-5 day')); $marks = UserSignLog::where([['date', '>', $fiveDate], ['user_id', '=', $token['uid']], ['root_id','=',$token['root_org']]])->column('date'); for ($i = 1; $i <= 5; $i++) { $time = strtotime('-' . $i . ' day'); $d = 'd_' . date('d', $time); $date = date('Y-m-d', $time); !in_array($date, $marks) ?: $signmarks[$d] = true; } $data = [ 'signstage' => $signstage, // 今日签到排名 'signallnum' => $signAllNum, // 累计签到次数 'signnobreaknum' => $daynobreak, // 连续签到天数 'signnobreakstage' => $signnobreakstage, // 连续签到排名 'signtotalstage' => $signtotalstage, // 累计签到排名 'signmarks' => $signmarks // 签到日期 ]; return json(['code' => self::success, 'data' => $data]); } /** * 获取个人签单排名 */ public function userstage() { $orgIdList = (new Org())->getClosetOrg($this->request->token['org_id']); $clueNum = Customer::where([['org_id', 'in', $orgIdList], ['state', 'in', Customer::changeState('定金', 'chaos')]])->group('employee_id')->order('num desc, employee_id asc')->column('count(id) num', 'employee_id'); $customerNum = Customer::where([['org_id', 'in', $orgIdList], ['state', 'in', Customer::changeState('签单', 'chaos')]])->group('employee_id')->order('num desc, employee_id asc')->column('count(id) num', 'employee_id'); $dingNum = $clueNum[$this->request->token['employee_id']] ?? 0; sort($clueNum); $dingStage = array_search($dingNum, $clueNum); $dingStage != false ?: $dingStage = count($clueNum); $signNum = $customerNum[$this->request->token['employee_id']] ?? 0; sort($customerNum); $signStage = array_search($signNum, $customerNum); $signStage != false ?: $signStage = count($customerNum); $data = [ 'ding' => [ 'num' => $dingNum, 'stage' => $dingStage ], 'sign' => [ 'num' => $signNum, 'stage' => $signStage ] ]; return json(['code' => self::success, 'data' => $data]); } /** * 显示资源列表 * * @return \think\Response */ public function rankinglist($page = 1) { $orgIdList = (new Org())->getClosetOrg($this->request->token['org_id']); $ding = Customer::field('employee_id, count(id) num')->where([['org_id', 'in', $orgIdList], ['state', 'in', Customer::changeState('定金', 'chaos')]])->group('employee_id')->order('num desc')->page($page, 10)->select()->toArray(); $sign = Customer::field('employee_id, count(id) num')->where([['org_id', 'in', $orgIdList], ['state', 'in', Customer::changeState('签单', 'chaos')]])->group('employee_id')->order('num desc')->page($page, 10)->select()->toArray(); $dingEmployee = Employee::with(['user' => function ($query) { return $query->field('id, headimgurl'); }])->where([['id', 'in', array_column($ding, 'employee_id')]])->select()->toArray(); $signEmployee = Employee::with(['user' => function ($query) { return $query->field('id, headimgurl'); }])->where([['id', 'in', array_column($sign, 'employee_id')]])->select()->toArray(); $dingEmployee = array_combine(array_column($dingEmployee, 'id'), $dingEmployee); $signEmployee = array_combine(array_column($signEmployee, 'id'), $signEmployee); foreach ($ding as &$d) { if (isset($dingEmployee[$d['employee_id']])) { $d['name'] = $dingEmployee[$d['employee_id']]['name']; $d['headimgurl'] = $dingEmployee[$d['employee_id']]['user']['headimgurl']; } } foreach ($sign as &$s) { if (isset($signEmployee[$d['employee_id']])) { $s['name'] = $signEmployee[$s['employee_id']]['name']; $s['headimgurl'] = $signEmployee[$s['employee_id']]['user']['headimgurl']; } } $data = [ 'ding' => $ding, 'sign' => $sign ]; return json(['code' => self::success, 'data' => $data, 'page' => $page]); } }