Subject.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Db;
  5. use think\cache;
  6. use app\utils\RedisKeyEnum;
  7. use app\utils\RedisUtil;
  8. use Exception;
  9. /**
  10. * 投票
  11. */
  12. class Subject extends Api
  13. {
  14. protected $noNeedLogin = ['info','playerlist','playerinfo','playerlist_votes','jigoulist_score'];
  15. protected $noNeedRight = ['*'];
  16. //进行中的唯一一个投票活动
  17. public function info(){
  18. $find = Db::name('vote_subject')->where('id',1)->find();
  19. if(!$find){
  20. $this->error('没有进行中的投票活动');
  21. }
  22. $find = info_domain_image($find,['image','paihang_image']);
  23. $this->success(1,$find);
  24. }
  25. //作品页,选手列表
  26. public function playerlist(){
  27. $subject_id = 1;
  28. $map = [
  29. 'subject_id' => $subject_id,
  30. 'status' => 1,
  31. ];
  32. //搜索
  33. $keyword = input('keyword','');
  34. if($keyword){
  35. $map['title|suozaidanwei|tuijiangonghui'] = ['LIKE','%'.$keyword.'%'];
  36. }
  37. //选手列表
  38. $lists = Db::name('vote_player')
  39. ->where($map)->orderRaw('RAND()')->select();
  40. $lists = list_domain_image($lists,['thumb_image']);
  41. $this->success(1,$lists);
  42. }
  43. //选手详情
  44. public function playerinfo(){
  45. $player_id = input('player_id','');
  46. if(!$player_id){
  47. $this->error();
  48. }
  49. $map = [
  50. 'id' => $player_id,
  51. ];
  52. $info = Db::name('vote_player')->where($map)->find();
  53. $info = info_domain_image($info,['thumb_image']);
  54. /*$info['thumb_image'] = '';
  55. if(!empty($info['video_file'])){
  56. $info['video_file'] = localpath_to_netpath($info['video_file']);
  57. $info['thumb_image'] = $info['video_file'].'?x-oss-process=video/snapshot,t_0,m_fast,f_jpg';
  58. }*/
  59. //获取播放地址和秒数
  60. $info['video_file'] = '';
  61. $info['video_seconds'] = 0;
  62. if(!empty($info['vodid'])){
  63. try{
  64. $videoVod = new \app\common\library\Video();
  65. $video_PlayInfo = $videoVod->getPlayInfo($info['vodid']);
  66. $video_PlayInfo = $video_PlayInfo->PlayInfoList->PlayInfo;
  67. $info['video_file'] = $video_PlayInfo[0]->PlayURL;
  68. $info['video_seconds'] = ceil($video_PlayInfo[0]->Duration);
  69. }catch(Exception $e){
  70. }
  71. }
  72. //名次
  73. /*$players = Db::name('vote_player')->where(['subject_id'=>$info['subject_id'],'status'=>1])->order('votes desc,id desc')->column('id,votes');
  74. $id_arr = array_keys($players);
  75. $mingci = 1; //名次
  76. $mingci = array_search($info['id'],$id_arr);
  77. $mingci++;
  78. $info['mingci'] = $mingci;*/
  79. $this->success(1,$info);
  80. }
  81. //用户详细资料
  82. public function getuserinfo(){
  83. $info = $this->auth->getUserinfo();
  84. //今天,投了几票
  85. $today_record = RedisUtil::getInstance(RedisKeyEnum::VOTE_RECORD.date('Y-m-d').':'.$this->auth->id)->get();
  86. //今天,免费的的票
  87. $gift_votes = config('site.gift_votes_user_eday');
  88. //今天,用户答对的次数,也就是答题获得的票数
  89. $question_vote = RedisUtil::getInstance(RedisKeyEnum::EAXM_RIGHT.date('Y-m-d').':'.$this->auth->id)->get();
  90. //今天,总答题次数
  91. $gift_question = config('site.exam_times_user_eday');
  92. //今天,已答题次数
  93. $submit_question = RedisUtil::getInstance(RedisKeyEnum::EAXM_TIMES.date('Y-m-d').':'.$this->auth->id)->get();
  94. //基础票数
  95. $jcps = $gift_votes - $today_record;
  96. if($jcps < 0){
  97. $jcps = 0;
  98. }
  99. //答题票数
  100. $dtps = $question_vote - ( ($today_record - $gift_votes) <= 0 ? 0 : ($today_record - $gift_votes) );
  101. if($dtps < 0){
  102. $dtps = 0;
  103. }
  104. //今日剩余票数
  105. $today_my_vote = $gift_votes + $question_vote - $today_record;
  106. if($today_my_vote < 0){
  107. $today_my_vote = 0;
  108. }
  109. //今日剩余答题次数
  110. $today_my_question = $gift_question - $submit_question;
  111. if($today_my_question < 0){
  112. $today_my_question = 0;
  113. }
  114. //
  115. $result = [
  116. 'info' => $info,
  117. 'jcps' => $jcps,
  118. 'dtps' => $dtps,
  119. 'today_my_vote' => $today_my_vote,
  120. 'today_my_question' => $today_my_question,
  121. ];
  122. $this->success(1,$result);
  123. }
  124. //今日投票记录
  125. public function my_vote_history(){
  126. //今日投票记录
  127. $player_ids = Db::name('vote_record')->where('user_id',$this->auth->id)->where('createdate',strtotime(date('Y-m-d')))->column('player_id');
  128. $map = [
  129. 'status' => 1,
  130. 'id' => ['IN',$player_ids]
  131. ];
  132. $lists = Db::name('vote_player')->field('id,title,votes')
  133. ->where($map)->order('votes desc,id desc')->select();
  134. $this->success(1,$lists);
  135. }
  136. //选手票数排行榜,按票
  137. public function playerlist_votes(){
  138. $subject_id = 1;
  139. $map = [
  140. 'subject_id' => $subject_id,
  141. 'status' => 1,
  142. ];
  143. $lists = Db::name('vote_player')->field('id,title,votes')
  144. ->where($map)->order('votes desc,id desc')->autopage()->select();
  145. $lists = $this->mingci_vote($subject_id,$lists);
  146. $this->success(1,$lists);
  147. }
  148. //机构答题分排行榜,按分
  149. //机构参与人数×0.7+平均分(机构总得分÷机构参与总人次)×0.3
  150. public function jigoulist_score(){
  151. $subject_id = 1;
  152. //各机构的绑定人数
  153. $user_jigou = Db::name('user')->where('status',1)->where('bind_jigou_id','NEQ',0)->column('bind_jigou_id');
  154. $user_jigou = array_count_values($user_jigou);
  155. //dump($user_jigou);
  156. //各个机构
  157. $map = [
  158. 'subject_id' => $subject_id,
  159. 'status' => 1,
  160. ];
  161. //vote_jigou表的score需要做一个纠正
  162. $lists = Db::name('vote_jigou')->field('id,title,score')->where($map)->order('score desc,id desc')->select();
  163. //dump($lists);
  164. //根据公式,重新计算排名分数
  165. foreach($lists as $key => $jigou){
  166. $jigou['newscore'] = 0;
  167. if(isset($user_jigou[$jigou['id']])){
  168. $usernumber = $user_jigou[$jigou['id']]; //机构人数
  169. $jigou['newscore'] = ($usernumber * 0.7) + ($jigou['score'] / $usernumber * 0.3); //公式
  170. $jigou['newscore'] = intval(round($jigou['newscore'],0)); //四舍五入
  171. }
  172. $lists[$key] = $jigou;
  173. }
  174. //dump($lists);
  175. $lists = $this->mingci_score($lists);
  176. $this->success(1,$lists);
  177. }
  178. //oss视频截贞 https://www.alibabacloud.com/help/zh/oss/user-guide/video-snapshots?spm=a2c63.p38356.0.0.6aaa4b78aOSpJH
  179. //使用fast模式截取视频7s处的内容,输出为JPG格式的图片,宽度为800,高度为600。
  180. //处理后的URL为:https://oss-console-img-demo-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/video.mp4?x-oss-process=video/snapshot,t_7000,f_jpg,w_800,h_600,m_fast
  181. //获得我的名次,票数导向
  182. private function mingci_vote($subject_id,$list){
  183. if(empty($list)){
  184. return $list;
  185. }
  186. //准备数据
  187. $players = Db::name('vote_player')->where(['subject_id'=>$subject_id,'status'=>1])->order('votes desc,id desc')->column('id,votes');
  188. $id_arr = array_keys($players);
  189. foreach($list as $key => $val)
  190. {
  191. $mingci = 1; //名次
  192. $mingci = array_search($val['id'],$id_arr);
  193. $mingci++;
  194. //赋值名次
  195. $list[$key]['mingci'] = $mingci;
  196. }
  197. return $list;
  198. }
  199. //获得我的名次,分数导向
  200. private function mingci_score($list){
  201. if(empty($list)){
  202. return $list;
  203. }
  204. //准备数据
  205. foreach($list as $key => $row){
  206. $field[$key] = $row['newscore'];
  207. }
  208. //dump($field);
  209. array_multisort($field,SORT_DESC,$list);
  210. //dump($list);
  211. foreach($list as $key => $val)
  212. {
  213. //赋值名次
  214. $val['mingci'] = $key + 1;
  215. $val['score'] = $val['newscore'];
  216. unset($val['newscore']);
  217. $list[$key] = $val;
  218. }
  219. return $list;
  220. }
  221. }