weiphp 刮刮卡控制器代码2

  1 <?php
  2 
  3         // 权限判断
  4         unset ( $map );        //释放变量
  5         $map ['token'] = get_token ();        //设置数组token值
  6         $map ['openid'] = get_openid ();        //设置数组openid值
  7         $follow = M ( 'follow' )->where ( $map )->find ();        //查表
  8         $is_admin = is_login ();    //使用判断是否登陆方法
  9         $error = '';
 10         if ($data ['end_time'] <= time ()) {
 11             $error = '活动已结束';
 12         } else if ($data ['max_num'] > 0 && $data ['max_num'] <= $my_count) {        //控制抽奖次数
 13             $error = '您的刮卡机会已用完啦';
 14         } else if ($data ['follower_condtion'] > intval ( $follow ['status'] ) && ! $is_admin) {    //判断领取人权限
 15             switch ($data ['follower_condtion']) {
 16                 case 1 :
 17                     $error = '关注后才能参与';
 18                     break;
 19                 case 2 :
 20                     $error = '用户绑定后才能参与';
 21                     break;
 22                 case 3 :
 23                     $error = '领取会员卡后才能参与';
 24                     break;
 25             }
 26         } else if ($data ['credit_conditon'] > intval ( $follow ['score'] ) && ! $is_admin) {        //判断领取人财富值
 27             $error = '您的财富值不足';
 28         } else if ($data ['credit_bug'] > intval ( $follow ['score'] ) && ! $is_admin) {
 29             $error = '您的财富值不够扣除';
 30         } else if (! empty ( $data ['addon_condition'] )) {
 31             addon_condition_check ( $data ['addon_condition'] ) || $error = '您没权限参与';
 32         }
 33         $this->assign ( 'error', $error );
 34         // 抽奖算法
 35         empty ( $error ) && $this->_lottery ( $data, $prizes, $new_prizes, $my_count, $has, $no_count );
 36         
 37         $this->display ( 'show' );
 38     }
 39     
 40     
 41     // 抽奖算法 中奖概率 = 奖品总数/(预估活动人数*每人抽奖次数)
 42     function _lottery($data, $prizes, $new_prizes, $my_count = 0, $has = array(), $no_count = 0) {
 43         $max_num = empty ( $data ['max_num'] ) ? 1 : $data ['max_num'];
 44         $count = $data ['predict_num'] * $max_num; // 总基数
 45 
 46         foreach ( $prizes as $p ) {        // 获取已经中过的奖
 47             $prizesArr [$p ['id']] = $p;
 48             
 49             $prize_num = $p ['num'] - $has [$p ['id']];        //剩余中奖数
 50             for($i = 0; $i < $prize_num; $i ++) {
 51                 $rand [] = $p ['id']; // 中奖的记录,同时通过ID可以知道中的是哪个奖
 52             }
 53         }
 54         // dump ( $rand );
 55         // dump ( $prizesArr );
 56         
 57         if ($data ['predict_num'] != 1) {
 58             $remain = $count - count ( $rand ) - $no_count;
 59             $remain > 5000 && $remain = 5000; // 防止数组过大导致内存溢出
 60             for($i = 0; $i < $remain; $i ++) {
 61                 $rand [] = 0; // 不中奖的记录
 62             }
 63         }
 64         if (empty ( $rand )) {
 65             $rand [] = - 1;
 66         }
 67         
 68         shuffle ( $rand ); // 所有记录随机排序
 69         $prize_id = $rand [0]; // 第一个记录作为当前用户的中奖记录
 70         $prize = array ();
 71         
 72         if ($prize_id > 0) {        //判断中奖情况
 73             $prize = $prizesArr [$prize_id];
 74         } elseif ($prize_id == - 1) {
 75             $prize ['id'] = 0;
 76             $prize ['title'] = '奖品已抽完';
 77         } else {
 78             $prize ['id'] = 0;
 79             $prize ['title'] = '谢谢参与';
 80         }
 81 
 82         // 获取我的抽奖机会
 83         if (empty ( $data ['max_num'] )) {
 84             $prize ['count'] = 1;
 85         } else {
 86             $prize ['count'] = $max_num - $my_count - 1;
 87             $prize ['count'] < 0 && $prize ['count'] = 0;
 88         }
 89         
 90 //         dump ( $prize );
 91         $this->assign ( 'prize', $prize );
 92     }
 93     
 94     // 记录中奖数据到数据库
 95     function set_sn_code() {
 96         //设置数据数组
 97         $data ['sn'] = uniqid ();
 98         $data ['uid'] = $this->mid;
 99         $data ['cTime'] = time ();
100         $data ['addon'] = 'Scratch';
101         $data ['target_id'] = I ( 'id' );
102         
103         $data ['prize_id'] = $map ['id'] = I ( 'prize_id' );
104         
105         $title = '';
106         if (! empty ( $map ['id'] )) {    //确定奖品标题
107             $title = M ( 'prize' )->where ( $map )->getField ( 'title' );
108             $title || $title = '';
109         }
110         $data ['prize_title'] = $title;
111         // dump ( $data );
112         
113         $res = M ( 'sn_code' )->add ( $data );    //添加sn码
114         if ($res) {
115             // 更新获取数
116             M ( "scratch" )->where ( 'id=' . $data ['target_id'] )->setInc ( "collect_count" );
117             
118             // 扣除积分
119             $data = M ( 'scratch' )->find ( $data ['target_id'] );
120             if (! empty ( $data ['credit_bug'] )) {
121                 $credit ['score'] = $data ['credit_bug'];
122                 $credit ['experience'] = 0;
123                 add_credit ( 'scratch_credit_bug', 5, $credit );
124             }
125         }
126         echo $res;
127     }
128 }
原文地址:https://www.cnblogs.com/dennr/p/4606558.html