抽开奖

来源:互联网 发布:你踩着我数据了 编辑:程序博客网 时间:2024/05/17 07:32
controller: //确认抽奖     public function openRaffle(){         $this->isLogin(2);         $v_id = I('id');         $id=(int)cryptcode($v_id,'decode');         if(is_numeric($id)){             $product=$this->jifenShopProductModel->getOne($id);             if($product && $product['type']==2 ){                 //获取积分                 $rs =$this->user->getJf($this->uid,true);                 if( $rs['total'] < $product['md']*1){                     $return = array('message' => '发生了什么?面点不足,快去赚些再来!','code' =>7);                     $this->ajaxReturn($return, 'JSONP');                 }                 if($product['startime']>1 && time()<$product['startime'] ){                     $return = array('message' => '抽奖未开始','code' =>7);                     $this->ajaxReturn($return, 'JSONP');                 }elseif(time()>$product['endtime'] && (int) $product["endtime"] > 0){                     $return = array('message' => '抱歉,活动已经结束,下次早点来!','code' =>7);                     $this->ajaxReturn($return, 'JSONP');                 }else{                     //进行中                 }                 //判断是否拉入黑名单                 $existUid= $this->jifenRefuserModel->getExistUid($this->uid);                 if($existUid){                     $return = array('message' => '您已被拉入黑名单 !','code' =>10);                     $this->ajaxReturn($return, 'JSONP');                 }                 //可用于抽奖的个数                 $temp_stock=$product['stock']-$product['stock_record'];                 $temp_stock=$temp_stock<=0?0:$temp_stock;                 //判断时间是否为空                 if($product['startime']>1 && $product['endtime']>$product['startime']){                     //判断今天中奖个数是否已经用完 true可用 false不可用                     $raffleRateStatus= $this->jifenShopProductModel->raffleRateStatus($product);                     $rate= $this->_handleRate($product['rate'],$temp_stock,$product['stock']);                     if((!$raffleRateStatus) || ($temp_stock==0)){                         $rate['rateYes']=0;                     }                 }else{                     $rate= $this->_handleRate($product['rate'],$temp_stock,$product['stock']);                 }                 if(!$rate){                     $return = array('message' => 'rate失败','code' =>9);                     $this->ajaxReturn($return, 'JSONP');                 }                 $prize_arr = array(                     '0' => array('id'=>1,'prize'=>$product['name'],'v'=>$rate['rateYes']),                     '1' => array('id'=>2,'prize'=>'下次没准就能中哦','v'=>$rate['rateNo']),                 );                 $data=$this->_choujiang($prize_arr);//抽奖结果                 $result=$data['yes'];//抽奖结果 数组                 $this->jifenShopRecordModel->addWinningResult($product['id'],$this->uid,$result);//保存抽奖结果                 $redisRecordCode_pic=$this->jifenShopRecordModel->addRedisPicCode($id);                 //添加抽奖信息                 //$return=$this->_addRecordType2($id,$count_record,$redisRecordCode);                 $recordInfo=$this->_addRecordTypeRaffle($id);                 //code: 1添加成功  0添加失败                 if($recordInfo['code']==1){                     $total_dec= D("JifenTotal")->dec($this->uid,$product['md'],$product['type'],0); //扣积分                     $return = array('message' => 'ok','code' =>1,'code_pic'=>$redisRecordCode_pic,'rid'=>$recordInfo['id']);                     $this->jifenShopRecordModel->addZsetDefJifenUidKey($this->uid,cryptcode($recordInfo['id'],'decode'));                 }else{                     $return = array('code' =>0,'code_pic'=>$redisRecordCode_pic);                 }                 $this->ajaxReturn($return, 'JSONP');             }         }         $return = array('message' => '参数有误!','code' => 2);         $this->ajaxReturn($return, 'JSONP');     }/**     * 转换中奖率格式  得到中奖率     * @param $rate  格式:0.01  返回数组array('rate'=1,'rate_count'=100)表示百分之一的中奖率     * @param $stock  剩余库存数     * @param $count 总产品数     * @return mixed     */    private function _handleRate($rate,$stock,$count){        $rate=(float)$rate;        if($rate>=0 &&$rate<=1 && $stock>=0){            if($rate==0){                $arr['rateYes']=0;                $arr['rateNo']=$stock;            }elseif($rate==1){                $arr['rateYes']=$stock;                $arr['rateNo']=0;            }else{                $rateNo=1-$rate;                $rateMo_count=ceil($stock/$rate*$rateNo);                $arr['rateYes']=$stock;                $arr['rateNo']=$rateMo_count;            }            if($stock==0){                $arr['rateNo']=$count;            }            if($stock==0 && $count==0){                $arr['rateNo']=10;            }            return $arr;        }else{            return false;        }    }/**     * 抽奖     * @param $prize_arr  参与投资的数组     */    public function _choujiang($prize_arr){        foreach ($prize_arr as $key => $val) {            $arr[$val['id']] =(int)$val['v'];        }        $rid = $this->_get_rand($arr); //根据概率获取奖项id        $res['yes'] = $prize_arr[$rid-1]; //中奖项        unset($prize_arr[$rid-1]); //将中奖项从数组中剔除,剩下未中奖项        shuffle($prize_arr); //打乱数组顺序        for($i=0;$i<count($prize_arr);$i++){            $pr[] = $prize_arr[$i];        }        $res['no'] = $pr;        return $res;    }    /**     * 得到中奖的组ID     * @param $proArr 包含每个产品数据的数组     * @return int|string 返回中奖组ID     */    private  function _get_rand($proArr) {        $result = '';        //概率数组的总概率精度        $proSum = array_sum($proArr);        //概率数组循环        foreach ($proArr as $key => $proCur) {            $randNum = mt_rand(1, $proSum);            if ($randNum <= $proCur) {                $result = $key;                break;            } else {                $proSum -= $proCur;            }        }        unset ($proArr);        return $result;    }model:/**     * 判断当天的中奖数是否用完     * @param $product     * @return bool 还可以     */    public function raffleRateStatus($product){        $days=ceil(($product['endtime']-time())/3600/24) ;        $dayProduct_sum=ceil(($product['stock']-$product['stock_record'])/$days);        $winProductSumDay= $this->getWinProductSumDay($product['id']);//更新每天中奖数        $isEndDay= date('Ymd') == date('Ymd',$product['endtime']);//是否为最后一天        $status=true;        if($winProductSumDay>=$dayProduct_sum ){            //当天的中奖率已经用完,不可再中            if($isEndDay){                $status= true;            }else{                $status= false;            }        }else{            $status= true;        }        //return $status;        return true;//20150205关闭限制    }

0 0