Grabgift.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Db;
  5. use Redis;
  6. /**
  7. * 示例接口
  8. */
  9. class Grabgift extends Api
  10. {
  11. protected $noNeedLogin = [];
  12. // 无需鉴权的接口,*表示全部
  13. protected $noNeedRight = ['*'];
  14. protected $redis;
  15. public function __construct()
  16. {
  17. parent::__construct();
  18. //redis
  19. $redis = new Redis();
  20. $redisconfig = config("redis");
  21. $redis->connect($redisconfig["host"], $redisconfig["port"]);
  22. if ($redisconfig['redis_pwd']) {
  23. $redis->auth($redisconfig['redis_pwd']);
  24. }
  25. if($redisconfig['redis_selectdb'] > 0){
  26. $redis->select($redisconfig['redis_selectdb']);
  27. }
  28. $this->redis = $redis;
  29. }
  30. //首页
  31. public function index()
  32. {
  33. $info = Db::name('grabgift')->where('status',0)->order('id desc')->find();
  34. if(empty($info)){
  35. $grabgift_data = [
  36. 'price' => config('site.grabgift_price'),
  37. 'gift_id' => config('site.grabgift_giftid'),
  38. 'status' => 0,
  39. 'grabtime' => 0,
  40. 'createtime' => time(),
  41. ];
  42. $grabgift_data['id'] = Db::name('grabgift')->insertGetId($grabgift_data);
  43. $info = $grabgift_data;
  44. //redis标记状态,未开奖
  45. $this->redis->set('kge_grabgift_'.$grabgift_data['id'],0);
  46. }
  47. $userlist = Db::name('grabgift_log')->alias('log')
  48. ->field('log.user_id,user.nickname,user.avatar')
  49. ->join('user','log.user_id = user.id','LEFT')
  50. ->where('log.grab_id',$info['id'])->order('log.id asc')->select();
  51. $userlist = list_domain_image($userlist,['avatar']);
  52. $result = [
  53. 'info' => $info,
  54. 'userlist' => $userlist,
  55. ];
  56. $this->success(1,$result);
  57. }
  58. //立即加入
  59. public function joinin(){
  60. $grab_id = input('grab_id',0);
  61. $kai_count = 5;
  62. //先用redis看开奖状态
  63. $status = $this->redis->get('kge_grabgift_'.$grab_id);
  64. //dump($status);
  65. if($status === false){
  66. $this->error('此期已开奖');
  67. }
  68. if($status == 1){
  69. $this->redis->del('kge_grabgift_'.$grab_id);
  70. $this->error('此期已经开奖了');
  71. }
  72. //先加入,再去重
  73. $is_joined = $this->redis->hSet('kge_grabgift_data_'.$grab_id,$this->auth->id,$this->auth->id);
  74. if($is_joined == 0){
  75. //第一次设置,返回1;二次覆盖,返回0
  76. $this->error('您已经参与了此期');
  77. }
  78. //数量限制
  79. $count = $this->redis->incr('kge_grabgift_num_'.$grab_id);
  80. if ($count > $kai_count) {
  81. $this->redis->decr('kge_grabgift_num_'.$grab_id);
  82. $this->redis->hDel('kge_grabgift_data_'.$grab_id,$this->auth->id);
  83. $this->error('此期人数已满');
  84. }
  85. //扣钱
  86. Db::startTrans();
  87. $grab_info = Db::name('grabgift')->where('id',$grab_id)->find();
  88. $rs_wallet = model('wallet')->lockChangeAccountRemain($this->auth->id,$grab_info['price'],'-',0,'抽礼物第'.$grab_id.'期',38,'jewel');
  89. if($rs_wallet['status'] === false){
  90. Db::rollback();
  91. $this->redis->decr('kge_grabgift_num_'.$grab_id);
  92. $this->redis->hDel('kge_grabgift_data_'.$grab_id,$this->auth->id);
  93. $this->error($rs_wallet['msg']);
  94. }
  95. //写入日志
  96. $log_data = [
  97. 'grab_id' => $grab_id,
  98. 'user_id' => $this->auth->id,
  99. 'price' => $grab_info['price'],
  100. 'gift_id' => $grab_info['gift_id'],
  101. 'createtime' => time(),
  102. 'grabstatus' => 0,
  103. 'grabtime' => 0,
  104. ];
  105. $log_id = Db::name('grabgift_log')->insertGetId($log_data);
  106. if(!$log_id){
  107. Db::rollback();
  108. $this->redis->decr('kge_grabgift_num_'.$grab_id);
  109. $this->redis->hDel('kge_grabgift_data_'.$grab_id,$this->auth->id);
  110. $this->error('参与失败');
  111. }
  112. //如果是最后一个,开奖
  113. if($count == $kai_count){
  114. $rand_data_new = [];
  115. $rand_data = $this->redis->hGetAll('kge_grabgift_data_'.$grab_id);
  116. foreach($rand_data as $uid => $val){
  117. $rand_data_new[] = $uid;
  118. }
  119. $zhongjiang_uid = $rand_data_new[rand(0,4)];
  120. //修改
  121. $nowtime = time();
  122. $rs1 = Db::name('grabgift_log')->where('grab_id',$grab_id)->update(['grabtime'=>$nowtime]);
  123. $rs2 = Db::name('grabgift_log')->where('grab_id',$grab_id)->where('user_id',$zhongjiang_uid)->update(['grabstatus'=>1]);
  124. $rs3 = Db::name('grabgift')->where('id',$grab_id)->update(['status'=>1,'grabtime'=>$nowtime]);
  125. //发放到背包
  126. $gift_info = Db::name('gift')->where('id',$grab_info['gift_id'])->find();
  127. if(!empty($gift_info)){
  128. $giftdata = [
  129. 'user_id' => $this->auth->id,
  130. 'gift_id' => $grab_info['gift_id'],
  131. 'name' => $gift_info['name'],
  132. 'image' => $gift_info['image'],
  133. 'gif_image' => $gift_info['special'],
  134. 'value' => $gift_info['value'],
  135. 'number' => 1,
  136. 'get_way' => 1,
  137. 'createtime' => $nowtime,
  138. ];
  139. $rs4 = Db::name('gift_back')->insertGetId($giftdata);
  140. }else{
  141. $rs4 = true;
  142. }
  143. if($rs1 === false || $rs2 === false || $rs3 === false || $rs4 === false){
  144. Db::rollback();
  145. $this->redis->decr('kge_grabgift_num_'.$grab_id);
  146. $this->redis->hDel('kge_grabgift_data_'.$grab_id,$this->auth->id);
  147. $this->error('参与失败');
  148. }
  149. //开奖了,用不到了
  150. $this->redis->del('kge_grabgift_num_'.$grab_id);
  151. $this->redis->del('kge_grabgift_data_'.$grab_id);
  152. $this->redis->del('kge_grabgift_'.$grab_id);
  153. }
  154. Db::commit();
  155. $result = [
  156. 'grab_id'=>$grab_id,
  157. 'count' => $count,
  158. 'is_finish' => $count == $kai_count ? 1 : 0,
  159. ];
  160. $this->success(1,$result);
  161. }
  162. //我的参与记录
  163. public function myjoinlog(){
  164. $userlist = Db::name('grabgift_log')->field('grab_id,grabtime,grabstatus')
  165. ->where('user_id',$this->auth->id)->order('id desc')->autopage()->select();
  166. $this->success(1,$userlist);
  167. }
  168. }