123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- <?php
- namespace app\api\controller;
- use app\model\Customer;
- use app\model\Employee;
- use app\model\Org;
- use app\model\UserSignLog;
- use app\model\Medal;
- use app\model\EmployeeMedal;
- class Ranking extends Base
- {
- /**
- * 签到排名
- */
- public function sign($page = 1)
- {
- $token = $this->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]);
- }
- }
|