Ranking.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <?php
  2. namespace app\api\controller;
  3. use app\model\Customer;
  4. use app\model\Employee;
  5. use app\model\Org;
  6. use app\model\UserSignLog;
  7. use app\model\Medal;
  8. use app\model\EmployeeMedal;
  9. class Ranking extends Base
  10. {
  11. /**
  12. * 签到排名
  13. */
  14. public function sign($page = 1)
  15. {
  16. $token = $this->request->token;
  17. // 今日排名
  18. $today = UserSignLog::with(['employee'=>function($query) use ($token){
  19. $query->where('root_id',$token['root_org']);
  20. },'Users'])->field('user_id,TIME(addtime) as addtime')->where([['date', '=', date('Y-m-d')],['root_id','=',$token['root_org']]])
  21. ->page($page, 10)->order('addtime asc, user_id asc')->select();
  22. // 连续排名
  23. $nobreak = UserSignLog::with(['employee'=>function($query) use ($token){
  24. $query->where('root_id',$token['root_org']);
  25. },'Users'])->field('user_id,max(day) as day')
  26. ->where([['root_id','=',$token['root_org']],['date','in',[date('Y-m-d'),date('Y-m-d', strtotime('yesterday'))]]])
  27. // ->where([['date', '=', date('Y-m-d')],['root_id','=',request()->token['root_org']]])
  28. // ->whereOr([['date', '=', date('Y-m-d', strtotime('yesterday'))],['root_id','=',request()->token['root_org']]])
  29. ->page($page, 10)->group('user_id')->order('day desc, user_id asc')->select();
  30. // 总共排名
  31. $total = UserSignLog::with(['employee'=>function($query) use ($token){
  32. $query->where('root_id',$token['root_org']);
  33. },'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();
  34. $medals = $this->medals();
  35. $today = $this->medal($today,$medals);
  36. $nobreak = $this->medal($nobreak,$medals);
  37. $total = $this->medal($total,$medals);
  38. $data = [
  39. 'today_ranking' => $today,
  40. 'nobreak_ranking' => $nobreak,
  41. 'total_ranking' => $total
  42. ];
  43. return json(['code' => self::success, 'data' => $data, 'page' => $page]);
  44. }
  45. public function medal($data,$medals){
  46. foreach ($data as $k1 => $v1) {
  47. $v1->medal = isset($medals[$v1->uid]) ? $medals[$v1->uid] : [];
  48. }
  49. return $data;
  50. }
  51. //勋章体系
  52. public function medals(){
  53. $token = $this->request->token;
  54. //勋章体系
  55. $w[] = ['main','=',1];
  56. $w[] = ['root_id','=',$token['root_org']];
  57. $qw[] = ['root_id','=',$token['root_org']];
  58. $medal = EmployeeMedal::with(['medal'=>function($query){
  59. $query->visible(['title','remark'])->bind(['title','remark']);
  60. },'employee'=>function($query) use ($qw){
  61. $query->where($qw)->visible(['uid','id'])->bind(['uid','id']);
  62. }])->where($w)->field(['employee_id','medal_id'])->select();
  63. $medals = [];
  64. foreach ($medal as $v) {
  65. $medals[$v->uid] = ['title'=>$v->title,'remark'=>$v->remark];
  66. }
  67. return $medals;
  68. }
  69. public function signuserstage()
  70. {
  71. $today = date('Y-m-d');
  72. $yesterday = date('Y-m-d', strtotime('yesterday'));
  73. $signmarks = ['d_' . date('d') => false];
  74. for ($i = 1; $i <= 5; $i++) {
  75. $time = strtotime('-' . $i . ' day');
  76. $d = 'd_' . date('d', $time);
  77. $date = date('Y-m-d', $time);
  78. $signmarks[$d] = false;
  79. }
  80. $token = $this->request->token;
  81. // 最后一次签到
  82. $lastSign = UserSignLog::where([['user_id', '=', $token['uid']],['root_id','=',$token['root_org']]])->order('date desc, user_id asc')->find();
  83. if (empty($lastSign)) {
  84. $data = [
  85. 'signstage' => null, // 今日签到排名
  86. 'signallnum' => 0, // 累计签到次数
  87. 'signnobreaknum' => 0, // 连续签到天数
  88. 'signnobreakstage' => null, // 连续签到排名
  89. 'signtotalstage' => null, // 累计签到排名
  90. 'signmarks' => $signmarks // 签到日期
  91. ];
  92. return json(['code' => self::success, 'data' => $data]);
  93. }
  94. // 累计签到
  95. $signAllNum = UserSignLog::where([['user_id', '=', $token['uid']],['root_id','=',$token['root_org']]])->count();
  96. // 连续签到
  97. $daynobreak = ($lastSign['date'] == $today || $lastSign['date'] == $yesterday) ? $lastSign['day'] : null;
  98. // 今日签到排名
  99. $signstage = $lastSign['date'] != $today ? null : UserSignLog::where([['addtime', '<', $lastSign['addtime']], ['date', '=', $today], ['root_id','=',$token['root_org']]])->count() + 1;
  100. // 连续签到排名
  101. $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');
  102. //$signnobreakstage = ($lastSign['date'] == $today || $lastSign['date'] == $yesterday) ? count($nobreak) + 1 : null;
  103. $signnobreakstage = ($lastSign['date'] == $today || $lastSign['date'] == $yesterday) ? array_search($token['uid'], $nobreak) + 1 : null;
  104. // 累计签到排名
  105. $signtotal = UserSignLog::where('root_id',$token['root_org'])->group('user_id')->order('num desc, user_id asc')->column('count(id) as num');
  106. $signtotalstage = array_search($signAllNum, $signtotal);
  107. //$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');
  108. //$signtotalstage = array_search($this->request->token['uid'], array_values($signtotal));
  109. $signtotalstage !== false ? $signtotalstage++ : $signtotalstage = count($signtotal);
  110. // 签到日期与签到状态
  111. $lastSign['date'] != $today ?: $signmarks['d_' . date('d')] = true;
  112. $fiveDate = date('Y-m-d', strtotime('-5 day'));
  113. $marks = UserSignLog::where([['date', '>', $fiveDate], ['user_id', '=', $token['uid']], ['root_id','=',$token['root_org']]])->column('date');
  114. for ($i = 1; $i <= 5; $i++) {
  115. $time = strtotime('-' . $i . ' day');
  116. $d = 'd_' . date('d', $time);
  117. $date = date('Y-m-d', $time);
  118. !in_array($date, $marks) ?: $signmarks[$d] = true;
  119. }
  120. $data = [
  121. 'signstage' => $signstage, // 今日签到排名
  122. 'signallnum' => $signAllNum, // 累计签到次数
  123. 'signnobreaknum' => $daynobreak, // 连续签到天数
  124. 'signnobreakstage' => $signnobreakstage, // 连续签到排名
  125. 'signtotalstage' => $signtotalstage, // 累计签到排名
  126. 'signmarks' => $signmarks // 签到日期
  127. ];
  128. return json(['code' => self::success, 'data' => $data]);
  129. }
  130. /**
  131. * 获取个人签单排名
  132. */
  133. public function userstage()
  134. {
  135. $orgIdList = (new Org())->getClosetOrg($this->request->token['org_id']);
  136. $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');
  137. $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');
  138. $dingNum = $clueNum[$this->request->token['employee_id']] ?? 0;
  139. sort($clueNum);
  140. $dingStage = array_search($dingNum, $clueNum);
  141. $dingStage != false ?: $dingStage = count($clueNum);
  142. $signNum = $customerNum[$this->request->token['employee_id']] ?? 0;
  143. sort($customerNum);
  144. $signStage = array_search($signNum, $customerNum);
  145. $signStage != false ?: $signStage = count($customerNum);
  146. $data = [
  147. 'ding' => [
  148. 'num' => $dingNum,
  149. 'stage' => $dingStage
  150. ],
  151. 'sign' => [
  152. 'num' => $signNum,
  153. 'stage' => $signStage
  154. ]
  155. ];
  156. return json(['code' => self::success, 'data' => $data]);
  157. }
  158. /**
  159. * 显示资源列表
  160. *
  161. * @return \think\Response
  162. */
  163. public function rankinglist($page = 1)
  164. {
  165. $orgIdList = (new Org())->getClosetOrg($this->request->token['org_id']);
  166. $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();
  167. $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();
  168. $dingEmployee = Employee::with(['user' => function ($query) {
  169. return $query->field('id, headimgurl');
  170. }])->where([['id', 'in', array_column($ding, 'employee_id')]])->select()->toArray();
  171. $signEmployee = Employee::with(['user' => function ($query) {
  172. return $query->field('id, headimgurl');
  173. }])->where([['id', 'in', array_column($sign, 'employee_id')]])->select()->toArray();
  174. $dingEmployee = array_combine(array_column($dingEmployee, 'id'), $dingEmployee);
  175. $signEmployee = array_combine(array_column($signEmployee, 'id'), $signEmployee);
  176. foreach ($ding as &$d) {
  177. if (isset($dingEmployee[$d['employee_id']])) {
  178. $d['name'] = $dingEmployee[$d['employee_id']]['name'];
  179. $d['headimgurl'] = $dingEmployee[$d['employee_id']]['user']['headimgurl'];
  180. }
  181. }
  182. foreach ($sign as &$s) {
  183. if (isset($signEmployee[$d['employee_id']])) {
  184. $s['name'] = $signEmployee[$s['employee_id']]['name'];
  185. $s['headimgurl'] = $signEmployee[$s['employee_id']]['user']['headimgurl'];
  186. }
  187. }
  188. $data = [
  189. 'ding' => $ding,
  190. 'sign' => $sign
  191. ];
  192. return json(['code' => self::success, 'data' => $data, 'page' => $page]);
  193. }
  194. }