where(['id'=>$active_id,'is_show'=>1])->find(); if(!$active){ $this->error('不存在的活动'); } //时间判断 $time= time(); if($time > $active['end_time']){ $this->error('抽奖活动已结束'); } if($time < $active['start_time']){ $this->error('抽奖活动未开始,请耐心等待'); } //奖项参数 $money_arr = Db::name('actives_info')->field('id,name,info')->where(['active_id'=>$active['id'],'is_show'=>1])->order('sort asc,id asc')->limit(6)->select(); $key = rand(0,5); $this->success('success',$money_arr[$key]); } /** * @description 开始抽奖 * @return array */ public function choujiang() { //信息 $active_id = input('active_id',0); $active = Db::name('actives')->where(['id'=>$active_id,'is_show'=>1])->find(); if(!$active){ $this->error('不存在的活动'); } //时间判断 $time= time(); if($time > $active['end_time']){ $this->error('抽奖活动已结束'); } if($time < $active['start_time']){ $this->error('抽奖活动未开始,请耐心等待'); } //奖项参数 $conf_arr = Db::name('actives_info')->field('id,name,info,rate,number,gift_ids')->where(['active_id'=>$active['id'],'is_show'=>1])->order('sort asc,id asc')->limit(6)->select(); //目前已有奖项 $user_log = Db::name('actives_user_log')->field('active_info_id,count(id) as num')->where(['active_id'=>$active['id']])->group('active_info_id')->select(); $user_log_arr = []; foreach($user_log as $ulk => $ulv){ $user_log_arr[$ulv['active_info_id']] = $ulv['num']; } // dump($user_log_arr); //概率新数组 $gailv = []; $bei = 100; //小数变整数 foreach ($conf_arr as $key=>$value) { //受限 if($value['number'] > 0){ //已获此奖 && 已获次数 >= 计划数量 if(isset($user_log_arr[$value['id']]) && $user_log_arr[$value['id']] >= $value['number']){ //忽略此次 // dump($user_log_arr[$value['id']]); // dump($value['number']); continue; } } $gailv[$value['id']] = $value['rate']*$bei; } // dump($gailv); //奖项新数组 $conf_column = []; foreach ($conf_arr as $key=>$value) { unset($value['rate']); unset($value['number']); $conf_column[$value['id']] = $value; } // dump($conf_column); //抽 $rid = $this->getRand($gailv); //根据概率获取奖项id // dump($rid);exit; //返回结果 $result = $conf_column[$rid]; Db::startTrans(); //礼物id $gift_id = 0; $remark = $result['info']; if(!empty($result['gift_ids'])){ $gift_ids = explode(',',$result['gift_ids']); $gift_id = $gift_ids[rand(0,count($gift_ids)-1)]; $gift_info = Db::name('gift')->where('id',$gift_id)->find(); if(!empty($gift_info)){ //加入到背包 $back = [ 'user_id' => $this->auth->id, 'gift_id' => $gift_id, 'name' => $gift_info['name'], 'image' => $gift_info['image'], 'gif_image' => $gift_info['special'], 'value' => $gift_info['value'], 'number' => 1, 'is_use' => 0, 'use_time' => 0, 'get_way' => 1, 'createtime' => time(), ]; $gift_back = Db::name('gift_back')->insertGetId($back); if(!$gift_back){ Db::rollback(); $this->error('加入背包失败'); } $remark .= ':'.$gift_info['name']; }else{ $gift_id = 0; } } //插入抽奖记录 $data = []; $data['user_id'] = $this->auth->id; $data['active_id'] = $active['id']; $data['active_info_id'] = $result['id']; $data['gift_id'] = $gift_id; $data['name'] = $result['name']; $data['remark'] = $remark; $data['createtime'] = $time; $log_id = Db::name('actives_user_log')->insertGetId($data); if(!$log_id){ Db::rollback(); $this->error('抽奖记录更新有误'); } //无论是否中奖。抽奖消耗 $rs_wallet = model('wallet')->lockChangeAccountRemain($this->auth->id,10,'-',0,'大转盘抽奖一次',13,'jewel'); if ($rs_wallet['status'] === false) { Db::rollback(); $this->error($rs_wallet['msg']); } Db::commit(); unset($result['name']); unset($result['info']); unset($result['gift_ids']); $result['remark'] = $remark; $this->success('success',$result); } //概率获得算法 function getRand($proArr) { //概率数组的总概率精度 $proSum = array_sum($proArr); $key = rand(1, $proSum); // echo $key; $result = 0; $now = 0; foreach ($proArr as $k=>$v) { $now = $now + $v; if($key<=$now) { $result = $k; break; } } unset ($proArr); return $result; } /** * @description 获取大转盘信息 * @return array * @return_format array info 大转盘基本信息 * @return_format array conf 奖项 */ public function getactive() { //信息 $map = [ 'is_show' => 1, ]; $info = Db::name('actives')->field('id,name,image,start_time,end_time,content')->where($map)->find(); $info = info_domain_image($info,['image']); //获取奖项 $conf = Db::name('actives_info')->field('id,name,info')->where('active_id',$info['id'])->where('is_show',1)->order('sort asc,id asc')->limit(6)->select(); $rt = []; $rt['info'] = $info; $rt['conf'] = $conf; $rt['jewel'] = model('wallet')->getWallet($this->auth->id,'jewel'); $rt['jewel_price'] = 10; return $this->success('success',$rt); } //本次活动中奖纪录 public function activeuserlog(){ $active_id = input('active_id',0); $where = [ 'log.active_id' => $active_id, ]; $my = input('my',0); if($my){ $where['log.user_id'] = $this->auth->id; } $log = Db::name('actives_user_log log') ->field('log.user_id,log.name,log.remark,log.createtime,user.nickname,user.avatar') ->join('user','user.id = log.user_id','LEFT') ->where($where)->order('log.id desc')->autopage()->select(); foreach($log as $key => &$val){ $val['avatar'] = cdnurl($val['avatar']); // $val['mobile'] = str_replace(substr($val['mobile'],3,5),'****',$val['mobile']); } return $this->success('success',$log); } }