實現功能:抽獎數組
需求:後臺控制每種中獎的機率、控制獎品數量app
備註:獎品是以優惠券的形式發放給用戶進行兌換,須要考慮到優惠券數量問題yii
以此爲例:
九宮格一個開始btn,一個謝謝參與,後臺設置七個獎品this
1.獲取每一個獎品中獎機率,及該獎品的id,我是以1000的總數機率來計算的url
/**獲取獎品及該獎品的中獎機率 * Created by PhpStorm. * User: Alisa * Date: 2018/12/6 * Time: 18:02 * @param $extract_prize_id * @return mixed */ public function user_prize ($extract_prize_id) { $prize = (new Query()) ->from(['p'=>Prize::tableName()]) ->leftJoin(['c'=>Coupon::tableName()],'c.id = p.coupon_id') ->select('p.prize_pro,p.id') ->where(['p.extract_prize_id'=>$extract_prize_id]) ->andWhere(['>','c.surplus_num',0]) ->all(); $sum = (new Query()) ->from(['p'=>Prize::tableName()]) ->leftJoin(['c'=>Coupon::tableName()],'c.id = p.coupon_id') ->where(['p.extract_prize_id'=>$extract_prize_id]) ->andWhere(['>','c.surplus_num',0]) ->sum('p.prize_pro'); $count = count($prize); foreach ($prize as $k=>$v){ $list[$k] = $v; } $list[$count] = [ "prize_pro"=>Math::sub(1000,$sum,0), "id"=>0 ]; $res = $this->get_rand($list); return $list[$res]['id']; }
2.進行抽獎計算,返回中獎的獎品id,id是0的話,表示謝謝參與spa
/**抽獎計算 * Created by PhpStorm. * User: Alisa * Date: 2018/12/6 * Time: 18:10 * @param $proArr * @return int|string */ public function get_rand($proArr){ $result = ''; foreach ($proArr as $key => $val) { $arr[$key] = $val['prize_pro']; } // 機率數組的總機率 $proSum = 1000; // 機率數組循環 foreach ($arr as $k => $v) { $randNum = mt_rand(1, $proSum); if ($randNum <= $v) { $result = $k; break; } else { $proSum -= $v; } } return $result; }
3.進行後續邏輯處理,判斷優惠券剩餘數量並減去、減去用戶抽獎冊數、增長用戶抽獎記錄、中獎的話優惠券到帳code
/**用戶抽獎 * @param $userId * @param $extract_prize_id * @return array|bool * @throws \yii\db\Exception */ public function extractPrize($userId,$extract_prize_id) { $prize_id = $this->user_prize($extract_prize_id); $coupon_id = 0; $prize_name = '謝謝參與'; $prize_url = ''; if($prize_id){ $coupon = (new Query()) ->select('c.id,c.name,c.rule,c.validity,c.surplus_num') ->from(['pr'=>Prize::tableName()]) ->leftJoin(['c'=>Coupon::tableName()],'c.id = pr.coupon_id') ->where(['pr.id'=>$prize_id]) ->one(); if($coupon['surplus_num'] > 0){ $coupon_id = $coupon['id']; $prize_name = $coupon['name']; $url = (new Query()) ->select('pi.url') ->from(['pr'=>Prize::tableName()]) ->leftJoin(['pi'=>Picture::tableName()],'pi.id = pr.img_id') ->where(['pr.id'=>$prize_id]) ->one(); $prize_url = $url['url']; } } $trans = Yii::$app->db->beginTransaction(); try{ $model = new ExtractPrizeRecord(); $model->prize_id = $prize_id; $model->coupon_id = $coupon_id; $model->prize_name = $prize_name; $model->user_id = $userId; $model->type = $extract_prize_id; $model->create_at = time(); $res_ex = $model->save(); if ( $res_ex ) { //減去用戶抽獎次數 \Yii::$app->db->createCommand("update users set $str = $str - 1 where $str > 0 and user_id = :user_id", [ ':user_id' => $userId, ] )->execute(); if(($coupon_id > 0) && ($coupon['surplus_num'] > 0)){ //減去優惠券剩餘數量 \Yii::$app->db->createCommand("update coupon set surplus_num = surplus_num -1 where id = :coupon_id and surplus_num > 0", [ ':coupon_id' => $coupon_id, ] )->execute(); $myModel = new MyCoupon(); $myModel->user_id = $userId; $myModel->name = $coupon['name']; $myModel->rule = $coupon['rule']; $myModel->coupon_id = $coupon_id; $myModel->create_at = time(); $myModel->update_at = time(); $myModel->start_at = time(); $myModel->end_at = time() + $coupon['validity']* 86400; $myModel->re_code = StringTools::randString(10); $myModel->coupon_number = date('YmdHis') . rand(10000000,99999999); $myModel->save(); } } else { return false; } $trans ->commit(); return ['prize_name'=>$prize_name,'prize_url'=>$prize_url]; }catch (\Throwable $t) { $trans->rollBack(); return false; } }
若是你以爲這篇文章還不錯,下角點個贊,是對我開源最大的鼓勵O(∩_∩)Oorm